From: Igor Opaniuk <[email protected]>
We only have below cases to disconnect line when suspend:
1. Device mode without connection to any host/charger(no vbus).
2. Device mode connect to a charger, usb suspend when
system is entering suspend.
This patch can fix cases, when usb phy wrongly does disconnect
line in case usb host enters suspend but vbus is off.
Signed-off-by: Li Jun <[email protected]>
Signed-off-by: Igor Opaniuk <[email protected]>
---
drivers/usb/phy/phy-mxs-usb.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c
index 70b8c8248caf..d996666e09e6 100644
--- a/drivers/usb/phy/phy-mxs-usb.c
+++ b/drivers/usb/phy/phy-mxs-usb.c
@@ -204,6 +204,7 @@ struct mxs_phy {
int port_id;
u32 tx_reg_set;
u32 tx_reg_mask;
+ enum usb_current_mode mode;
};
static inline bool is_imx6q_phy(struct mxs_phy *mxs_phy)
@@ -386,17 +387,6 @@ static void __mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool disconnect)
usleep_range(500, 1000);
}
-static bool mxs_phy_is_otg_host(struct mxs_phy *mxs_phy)
-{
- void __iomem *base = mxs_phy->phy.io_priv;
- u32 phyctrl = readl(base + HW_USBPHY_CTRL);
-
- if (IS_ENABLED(CONFIG_USB_OTG) &&
- !(phyctrl & BM_USBPHY_CTRL_OTG_ID_VALUE))
- return true;
-
- return false;
-}
static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on)
{
@@ -412,13 +402,26 @@ static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on)
vbus_is_on = mxs_phy_get_vbus_status(mxs_phy);
- if (on && !vbus_is_on && !mxs_phy_is_otg_host(mxs_phy))
+ if (on && ((!vbus_is_on && mxs_phy->mode != USB_MODE_HOST)))
__mxs_phy_disconnect_line(mxs_phy, true);
else
__mxs_phy_disconnect_line(mxs_phy, false);
}
+/*
+ * Set the usb current role for phy.
+ */
+static int mxs_phy_set_mode(struct usb_phy *phy,
+ enum usb_current_mode mode)
+{
+ struct mxs_phy *mxs_phy = to_mxs_phy(phy);
+
+ mxs_phy->mode = mode;
+
+ return 0;
+}
+
static int mxs_phy_init(struct usb_phy *phy)
{
int ret;
@@ -796,6 +799,7 @@ static int mxs_phy_probe(struct platform_device *pdev)
mxs_phy->phy.notify_disconnect = mxs_phy_on_disconnect;
mxs_phy->phy.type = USB_PHY_TYPE_USB2;
mxs_phy->phy.set_wakeup = mxs_phy_set_wakeup;
+ mxs_phy->phy.set_mode = mxs_phy_set_mode;
mxs_phy->phy.charger_detect = mxs_phy_charger_detect;
mxs_phy->clk = clk;
--
2.17.1
Hi Igor,
On Mon, Oct 7, 2019 at 9:47 AM Igor Opaniuk <[email protected]> wrote:
>
> From: Igor Opaniuk <[email protected]>
>
> We only have below cases to disconnect line when suspend:
> 1. Device mode without connection to any host/charger(no vbus).
> 2. Device mode connect to a charger, usb suspend when
> system is entering suspend.
>
> This patch can fix cases, when usb phy wrongly does disconnect
> line in case usb host enters suspend but vbus is off.
>
> Signed-off-by: Li Jun <[email protected]>
> Signed-off-by: Igor Opaniuk <[email protected]>
Who is the original author of this patch, is it you or Li Jun?
If it is Li Jun, then his name should appear in the From field.
Also, it seems a Fixes tag is needed here.
HI Fabio,
On Mon, Oct 7, 2019 at 3:51 PM Fabio Estevam <[email protected]> wrote:
>
> Hi Igor,
>
> On Mon, Oct 7, 2019 at 9:47 AM Igor Opaniuk <[email protected]> wrote:
> >
> > From: Igor Opaniuk <[email protected]>
> >
> > We only have below cases to disconnect line when suspend:
> > 1. Device mode without connection to any host/charger(no vbus).
> > 2. Device mode connect to a charger, usb suspend when
> > system is entering suspend.
> >
> > This patch can fix cases, when usb phy wrongly does disconnect
> > line in case usb host enters suspend but vbus is off.
> >
> > Signed-off-by: Li Jun <[email protected]>
> > Signed-off-by: Igor Opaniuk <[email protected]>
>
> Who is the original author of this patch, is it you or Li Jun?
>
> If it is Li Jun, then his name should appear in the From field.
right, it's Li Jun, will fix in v1.
>
> Also, it seems a Fixes tag is needed here.
right, will do.
--
Best regards - Freundliche GrĂ¼sse - Meilleures salutations
Igor Opaniuk
mailto: [email protected]
skype: igor.opanyuk
+380 (93) 836 40 67
http://ua.linkedin.com/in/iopaniuk