usb: phy: phy-mxs-usb: do not depend on speed for disconnect notifier
authorPeter Chen <peter.chen@freescale.com>
Wed, 24 Dec 2014 05:48:03 +0000 (13:48 +0800)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Jan 2015 18:13:28 +0000 (12:13 -0600)
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>
drivers/usb/phy/phy-mxs-usb.c

index eaf94b036571579dc1d60f425388d6818c05d018..58cae78b12a4d0d6cfe8a2d68b5ad5245d4f9112 100644 (file)
@@ -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);