Browse Source

usb: phy: mxs: add delay before set phyctrl.clkgate

There is a request from IC engineer that if we doesn't
set phypwd as 0xffffffff, we need to delay about five
32Khz cycles before set phy's pwd register, otherwise,
the wakeup signal may can't wake up controller.

Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Peter Chen 10 năm trước cách đây
mục cha
commit
e235f7b86f
1 tập tin đã thay đổi với 9 bổ sung3 xóa
  1. 9 3
      drivers/usb/phy/phy-mxs-usb.c

+ 9 - 3
drivers/usb/phy/phy-mxs-usb.c

@@ -371,10 +371,16 @@ static int mxs_phy_suspend(struct usb_phy *x, int suspend)
 		 * connect. The low speed connection will have problem at
 		 * connect. The low speed connection will have problem at
 		 * very rare cases during usb suspend and resume process.
 		 * very rare cases during usb suspend and resume process.
 		 */
 		 */
-		if (low_speed_connection & vbus_is_on)
-			writel(0xfffbffff, x->io_priv + HW_USBPHY_PWD);
-		else
+		if (low_speed_connection & vbus_is_on) {
+			/*
+			 * If value to be set as pwd value is not 0xffffffff,
+			 * several 32Khz cycles are needed.
+			 */
+			mxs_phy_clock_switch_delay();
+			writel(0xffbfffff, x->io_priv + HW_USBPHY_PWD);
+		} else {
 			writel(0xffffffff, x->io_priv + HW_USBPHY_PWD);
 			writel(0xffffffff, x->io_priv + HW_USBPHY_PWD);
+		}
 		writel(BM_USBPHY_CTRL_CLKGATE,
 		writel(BM_USBPHY_CTRL_CLKGATE,
 		       x->io_priv + HW_USBPHY_CTRL_SET);
 		       x->io_priv + HW_USBPHY_CTRL_SET);
 		clk_disable_unprepare(mxs_phy->clk);
 		clk_disable_unprepare(mxs_phy->clk);