diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2012-04-23 13:54:36 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-04-23 15:05:44 -0400 |
commit | 3d9545cc375d117554a9b35dfddadf9189c62775 (patch) | |
tree | b01707d2e0901665f20bae0f0c5a0930af69651a /drivers/usb/host/ehci-hub.c | |
parent | 09091a4d5f2dd378dcf71de50b48cdacc58a8ac0 (diff) |
EHCI: maintain the ehci->command value properly
The ehci-hcd driver is a little haphazard about keeping track of the
state of the USBCMD register. The ehci->command field is supposed to
hold the register's value (apart from a few special bits) at all
times, but it isn't maintained properly.
This patch (as1543) cleans up the situation. It keeps ehci->command
up-to-date, and uses that value rather than reading the register from
the hardware whenever possible.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/host/ehci-hub.c')
-rw-r--r-- | drivers/usb/host/ehci-hub.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 402e766df2fe..fc9e7cc6ac9b 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -233,7 +233,6 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
233 | /* stop schedules, clean any completed work */ | 233 | /* stop schedules, clean any completed work */ |
234 | if (ehci->rh_state == EHCI_RH_RUNNING) | 234 | if (ehci->rh_state == EHCI_RH_RUNNING) |
235 | ehci_quiesce (ehci); | 235 | ehci_quiesce (ehci); |
236 | ehci->command = ehci_readl(ehci, &ehci->regs->command); | ||
237 | ehci_work(ehci); | 236 | ehci_work(ehci); |
238 | 237 | ||
239 | /* Unlike other USB host controller types, EHCI doesn't have | 238 | /* Unlike other USB host controller types, EHCI doesn't have |
@@ -374,6 +373,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
374 | ehci_writel(ehci, (u32) ehci->async->qh_dma, &ehci->regs->async_next); | 373 | ehci_writel(ehci, (u32) ehci->async->qh_dma, &ehci->regs->async_next); |
375 | 374 | ||
376 | /* restore CMD_RUN, framelist size, and irq threshold */ | 375 | /* restore CMD_RUN, framelist size, and irq threshold */ |
376 | ehci->command |= CMD_RUN; | ||
377 | ehci_writel(ehci, ehci->command, &ehci->regs->command); | 377 | ehci_writel(ehci, ehci->command, &ehci->regs->command); |
378 | ehci->rh_state = EHCI_RH_RUNNING; | 378 | ehci->rh_state = EHCI_RH_RUNNING; |
379 | 379 | ||