diff options
author | Peter Chen <peter.chen@freescale.com> | 2014-12-24 06:48:03 +0100 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-01-12 19:13:28 +0100 |
commit | f78c0957674bda6687992058554c07683418ebc2 (patch) | |
tree | 5a2340a5287c1f6fe093606a9858df9d155ad6c4 /drivers/usb/phy/phy-mxs-usb.c | |
parent | usb: phy: phy-mxs-usb: add power down and disable wakeup for .shutdown (diff) | |
download | linux-f78c0957674bda6687992058554c07683418ebc2.tar.xz linux-f78c0957674bda6687992058554c07683418ebc2.zip |
usb: phy: phy-mxs-usb: do not depend on speed for disconnect notifier
For some user cases, like plug out and replug in usb device during
the system suspend, the speed negotiation will be error due to host
doesn't know the device's disconnection, and it still hopes the
high speed device, but the device backs to "powered" state which
its high speed termination is not enabled, the usb core calls
the PHY's disconnect notifier with "full speed", it will NOT
take effect at all.
If the usb core calls disconnect notifer, the port change must happen,
so it is safe to disable high speed disconenct detector, since
connect notifier will be called soon if the device is still connected
on the port, and we will enable high speed disconnect detector at that
time.
Acked-by: Li Jun <b47624@freescale.com>
Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/phy/phy-mxs-usb.c')
-rw-r--r-- | drivers/usb/phy/phy-mxs-usb.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index eaf94b036571..58cae78b12a4 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c @@ -370,7 +370,9 @@ static int mxs_phy_on_disconnect(struct usb_phy *phy, dev_dbg(phy->dev, "%s device has disconnected\n", (speed == USB_SPEED_HIGH) ? "HS" : "FS/LS"); - if (speed == USB_SPEED_HIGH) + /* Sometimes, the speed is not high speed when the error occurs */ + if (readl(phy->io_priv + HW_USBPHY_CTRL) & + BM_USBPHY_CTRL_ENHOSTDISCONDETECT) writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, phy->io_priv + HW_USBPHY_CTRL_CLR); |