Commit 2c1c3c4c authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman

[PATCH] USB: EHCI updates (4/4) driver model wakeup flags

This teaches the EHCI driver to use the new driver model wakeup flags,
replacing the similar ones in the HCD glue.  It also adds a workaround
for the current glitch whereby PCI init doesn't init the wakeup flags
from the PCI PM capabilities.  (EHCI controllers don't worry about
legacy mode; the PCI PM capability would always do the job.)
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8d7802ed
...@@ -624,7 +624,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs) ...@@ -624,7 +624,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs)
} }
/* remote wakeup [4.3.1] */ /* remote wakeup [4.3.1] */
if ((status & STS_PCD) && hcd->remote_wakeup) { if ((status & STS_PCD) && device_may_wakeup(&hcd->self.root_hub->dev)) {
unsigned i = HCS_N_PORTS (ehci->hcs_params); unsigned i = HCS_N_PORTS (ehci->hcs_params);
/* resume root hub? */ /* resume root hub? */
......
...@@ -59,7 +59,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) ...@@ -59,7 +59,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
if ((t1 & PORT_PE) && !(t1 & PORT_OWNER)) if ((t1 & PORT_PE) && !(t1 & PORT_OWNER))
t2 |= PORT_SUSPEND; t2 |= PORT_SUSPEND;
if (hcd->remote_wakeup) if (device_may_wakeup(&hcd->self.root_hub->dev))
t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E; t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E;
else else
t2 &= ~(PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E); t2 &= ~(PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E);
...@@ -517,7 +517,7 @@ static int ehci_hub_control ( ...@@ -517,7 +517,7 @@ static int ehci_hub_control (
if ((temp & PORT_PE) == 0 if ((temp & PORT_PE) == 0
|| (temp & PORT_RESET) != 0) || (temp & PORT_RESET) != 0)
goto error; goto error;
if (hcd->remote_wakeup) if (device_may_wakeup(&hcd->self.root_hub->dev))
temp |= PORT_WAKE_BITS; temp |= PORT_WAKE_BITS;
writel (temp | PORT_SUSPEND, writel (temp | PORT_SUSPEND,
&ehci->regs->port_status [wIndex]); &ehci->regs->port_status [wIndex]);
......
...@@ -210,7 +210,16 @@ static int ehci_pci_setup(struct usb_hcd *hcd) ...@@ -210,7 +210,16 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
/* Serial Bus Release Number is at PCI 0x60 offset */ /* Serial Bus Release Number is at PCI 0x60 offset */
pci_read_config_byte(pdev, 0x60, &ehci->sbrn); pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
/* REVISIT: per-port wake capability (PCI 0x62) currently unused */ /* Workaround current PCI init glitch: wakeup bits aren't
* being set from PCI PM capability.
*/
if (!device_can_wakeup(&pdev->dev)) {
u16 port_wake;
pci_read_config_word(pdev, 0x62, &port_wake);
if (port_wake & 0x0001)
device_init_wakeup(&pdev->dev, 1);
}
retval = ehci_pci_reinit(ehci, pdev); retval = ehci_pci_reinit(ehci, pdev);
done: done:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment