Message ID | 20191007124607.20618-3-igor.opaniuk@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [RFC,v1,1/3] usb: phy: add usb mode for usb_phy | expand |
Hi Igor, On Mon, Oct 7, 2019 at 9:47 AM Igor Opaniuk <igor.opaniuk@gmail.com> wrote: > > From: Igor Opaniuk <igor.opaniuk@toradex.com> > > 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 <jun.li@nxp.com> > Signed-off-by: Igor Opaniuk <igor.opaniuk@toradex.com> 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 <festevam@gmail.com> wrote: > > Hi Igor, > > On Mon, Oct 7, 2019 at 9:47 AM Igor Opaniuk <igor.opaniuk@gmail.com> wrote: > > > > From: Igor Opaniuk <igor.opaniuk@toradex.com> > > > > 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 <jun.li@nxp.com> > > Signed-off-by: Igor Opaniuk <igor.opaniuk@toradex.com> > > 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.
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;