diff options
author | Li Jun <b47624@freescale.com> | 2015-01-16 05:28:59 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-01-27 10:40:42 -0500 |
commit | 7b09e67639d6857439bae0d6276d443a7c2c9c40 (patch) | |
tree | 8ed4118b3fee8ea43758cf08db1618e7024962d2 /drivers/usb/phy/phy-mxs-usb.c | |
parent | dd811ba7427f7e6b7e521f3738a5313d00319675 (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.c | 15 |
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 | ||
259 | static 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 | |||
258 | static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on) | 271 | static 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); |