diff options
Diffstat (limited to 'drivers/usb/host/ehci-hcd.c')
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 23 | 
1 files changed, 23 insertions, 0 deletions
| diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 3d82e0b853be..684164fa9716 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1103,6 +1103,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 */ @@ -1154,6 +1174,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. |