aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/phy/phy-mxs-usb.c
diff options
context:
space:
mode:
authorLi Jun <b47624@freescale.com>2015-01-16 05:28:59 -0500
committerFelipe Balbi <balbi@ti.com>2015-01-27 10:40:42 -0500
commit7b09e67639d6857439bae0d6276d443a7c2c9c40 (patch)
tree8ed4118b3fee8ea43758cf08db1618e7024962d2 /drivers/usb/phy/phy-mxs-usb.c
parentdd811ba7427f7e6b7e521f3738a5313d00319675 (diff)
usb: phy: mxs: refine mxs_phy_disconnect_line
For non-otg mode, we keep the usage of disconnect line between phy analog and digital unchanging; for otg mode, at peripheral role, we keep the usage unchanging too, at host role, the digital part needs to know dp/dm change to respond device's data pulse when it is at low power mode. Signed-off-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Li Jun <b47624@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.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c
index fcadbd2d65a8..eb746051eda4 100644
--- a/drivers/usb/phy/phy-mxs-usb.c
+++ b/drivers/usb/phy/phy-mxs-usb.c
@@ -40,6 +40,7 @@
40 40
41#define BM_USBPHY_CTRL_SFTRST BIT(31) 41#define BM_USBPHY_CTRL_SFTRST BIT(31)
42#define BM_USBPHY_CTRL_CLKGATE BIT(30) 42#define BM_USBPHY_CTRL_CLKGATE BIT(30)
43#define BM_USBPHY_CTRL_OTG_ID_VALUE BIT(27)
43#define BM_USBPHY_CTRL_ENAUTOSET_USBCLKS BIT(26) 44#define BM_USBPHY_CTRL_ENAUTOSET_USBCLKS BIT(26)
44#define BM_USBPHY_CTRL_ENAUTOCLR_USBCLKGATE BIT(25) 45#define BM_USBPHY_CTRL_ENAUTOCLR_USBCLKGATE BIT(25)
45#define BM_USBPHY_CTRL_ENVBUSCHG_WKUP BIT(23) 46#define BM_USBPHY_CTRL_ENVBUSCHG_WKUP BIT(23)
@@ -255,6 +256,18 @@ static void __mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool disconnect)
255 usleep_range(500, 1000); 256 usleep_range(500, 1000);
256} 257}
257 258
259static bool mxs_phy_is_otg_host(struct mxs_phy *mxs_phy)
260{
261 void __iomem *base = mxs_phy->phy.io_priv;
262 u32 phyctrl = readl(base + HW_USBPHY_CTRL);
263
264 if (IS_ENABLED(CONFIG_USB_OTG) &&
265 !(phyctrl & BM_USBPHY_CTRL_OTG_ID_VALUE))
266 return true;
267
268 return false;
269}
270
258static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on) 271static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on)
259{ 272{
260 bool vbus_is_on = false; 273 bool vbus_is_on = false;
@@ -269,7 +282,7 @@ static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on)
269 282
270 vbus_is_on = mxs_phy_get_vbus_status(mxs_phy); 283 vbus_is_on = mxs_phy_get_vbus_status(mxs_phy);
271 284
272 if (on && !vbus_is_on) 285 if (on && !vbus_is_on && !mxs_phy_is_otg_host(mxs_phy))
273 __mxs_phy_disconnect_line(mxs_phy, true); 286 __mxs_phy_disconnect_line(mxs_phy, true);
274 else 287 else
275 __mxs_phy_disconnect_line(mxs_phy, false); 288 __mxs_phy_disconnect_line(mxs_phy, false);