diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index dc33bad9f1061f92bd2b18ffa815bfb799522457..3800a754033027344c77fbd5a0896834c70c539f 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -520,11 +520,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev) } pci_restore_state(pci_dev); - if (!(pci_dev->vendor == PCI_VENDOR_ID_ZHAOXIN && - pci_dev->device == 0x3104 && - (pci_dev->revision & 0xf0) == 0x90 && - pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)) - pci_pme_restore(pci_dev); + pci_pme_restore(pci_dev); return 0; } diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 0daa6d98f9b91567a66d5811b828b5fedf9b8bc4..ae0c24d18a4e6eab374f40beffbf777d3a69f138 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1077,6 +1077,26 @@ static void ehci_remove_device(struct usb_hcd *hcd, struct usb_device *udev) #ifdef CONFIG_PM +/* Clear wakeup signal locked in zhaoxin platform when device plug in. */ +static void ehci_zx_wakeup_clear(struct ehci_hcd *ehci) +{ + u32 __iomem *reg = &ehci->regs->port_status[4]; + u32 t1 = ehci_readl(ehci, reg); + + t1 &= (u32)~0xf0000; + t1 |= PORT_TEST_FORCE; + ehci_writel(ehci, t1, reg); + t1 = ehci_readl(ehci, reg); + msleep(1); + t1 &= (u32)~0xf0000; + ehci_writel(ehci, t1, reg); + ehci_readl(ehci, reg); + msleep(1); + t1 = ehci_readl(ehci, reg); + ehci_writel(ehci, t1 | PORT_CSC, reg); + ehci_readl(ehci, reg); +} + /* suspend/resume, section 4.3 */ /* These routines handle the generic parts of controller suspend/resume */ @@ -1110,27 +1130,6 @@ int ehci_suspend(struct usb_hcd *hcd, bool do_wakeup) return -EBUSY; } - /* Clear wakeup signal locked in S0 state when device plug in */ - if (ehci->zx_wakeup_clear == 1) { - u32 __iomem *reg = &ehci->regs->port_status[4]; - u32 t1 = ehci_readl(ehci, reg); - - t1 &= (u32)~0xf0000; - t1 |= PORT_TEST_FORCE; - ehci_writel(ehci, t1, reg); - t1 = ehci_readl(ehci, reg); - usleep_range(1000, 2000); - t1 &= (u32)~0xf0000; - ehci_writel(ehci, t1, reg); - usleep_range(1000, 2000); - t1 = ehci_readl(ehci, reg); - ehci_writel(ehci, t1 | PORT_CSC, reg); - udelay(500); - t1 = ehci_readl(ehci, &ehci->regs->status); - ehci_writel(ehci, t1 & STS_PCD, &ehci->regs->status); - ehci_readl(ehci, &ehci->regs->status); - } - return 0; } EXPORT_SYMBOL_GPL(ehci_suspend); @@ -1149,6 +1148,9 @@ int ehci_resume(struct usb_hcd *hcd, bool force_reset) if (ehci->shutdown) return 0; /* Controller is dead */ + if (ehci->zx_wakeup_clear_needed) + ehci_zx_wakeup_clear(ehci); + /* * If CF is still set and reset isn't forced * then we maintained suspend power. diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 357dc140e91402d93bdb000f802442bc048e5f99..a1eeb6d34fbad7154b2f540e295e0e8666386236 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -218,7 +218,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd) break; case PCI_VENDOR_ID_ZHAOXIN: if (pdev->device == 0x3104 && (pdev->revision & 0xf0) == 0x90) - ehci->zx_wakeup_clear = 1; + ehci->zx_wakeup_clear_needed = 1; break; } diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 9625b6030757858cb029eb191c8f19f72a823080..df4a13733c40a76456cac4936bd0aca04720d809 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -218,7 +218,7 @@ struct ehci_hcd { /* one per controller */ unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */ unsigned need_oc_pp_cycle:1; /* MPC834X port power */ unsigned imx28_write_fix:1; /* For Freescale i.MX28 */ - unsigned zx_wakeup_clear:1; + unsigned zx_wakeup_clear_needed:1; /* required for usb32 quirk */ #define OHCI_CTRL_HCFS (3 << 6)