Hi Sandeep, On Tue, Mar 22, 2022 at 02:02:21PM +0530, Pavan Kondeti wrote: > Hi Sandeep, > > On Tue, Mar 22, 2022 at 12:37:53PM +0530, Sandeep Maheswaram wrote: > > During suspend read the status of all port and make sure the PHYs > > are in the correct mode based on current speed. > > Phy interrupt masks are set based on this mode. Keep track of the mode > > of the HS PHY to be able to configure wakeup properly. > > > > Also check during suspend if any wakeup capable devices are > > connected to the controller (directly or through hubs), if there > > are none set a flag to indicate that the PHY is powered > > down during suspend. > > > > Signed-off-by: Sandeep Maheswaram <quic_c_sanm@xxxxxxxxxxx> > > --- > > drivers/usb/dwc3/core.c | 54 ++++++++++++++++++++++++++++++++++++++++--------- > > 1 file changed, 45 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > > index 1170b80..232a734 100644 > > --- a/drivers/usb/dwc3/core.c > > +++ b/drivers/usb/dwc3/core.c > > @@ -32,12 +32,14 @@ > > #include <linux/usb/gadget.h> > > #include <linux/usb/of.h> > > #include <linux/usb/otg.h> > > +#include <linux/usb/hcd.h> > > > > #include "core.h" > > #include "gadget.h" > > #include "io.h" > > > > #include "debug.h" > > +#include "../host/xhci.h" > > > > #define DWC3_DEFAULT_AUTOSUSPEND_DELAY 5000 /* ms */ > > > > @@ -1861,10 +1863,36 @@ static int dwc3_core_init_for_resume(struct dwc3 *dwc) > > return ret; > > } > > > > +static void dwc3_set_phy_speed_mode(struct dwc3 *dwc) > > +{ > > + > > + int i, num_ports; > > + u32 reg; > > + struct usb_hcd *hcd = platform_get_drvdata(dwc->xhci); > > + struct xhci_hcd *xhci_hcd = hcd_to_xhci(hcd); > > + > > + dwc->hs_phy_mode = 0; > > + > > + reg = readl(&xhci_hcd->cap_regs->hcs_params1); > > + > > + num_ports = HCS_MAX_PORTS(reg); > > + for (i = 0; i < num_ports; i++) { > > + reg = readl(&xhci_hcd->op_regs->port_status_base + i * 0x04); > > + if (reg & PORT_PE) { > > + if (DEV_HIGHSPEED(reg) || DEV_FULLSPEED(reg)) > > + dwc->hs_phy_mode |= PHY_MODE_USB_HOST_HS; > > + else if (DEV_LOWSPEED(reg)) > > + dwc->hs_phy_mode |= PHY_MODE_USB_HOST_LS; > > + } > > + } > > + phy_set_mode(dwc->usb2_generic_phy, dwc->hs_phy_mode); > > +} > > Are these flags cleared somewhere? Also qcom-snps-hs phy driver checks > for (hsphy->mode == PHY_MODE_USB_HOST) condition in qcom_snps_hsphy_suspend > to enable auto-resume. PHY_MODE_USB_HOST_HS/PHY_MODE_USB_HOST_LS flags > are different from PHY_MODE_USB_HOST. Currently this flag is set from > __dwc3_set_mode() when entering host mode. Can you clarify your intention > in calling phy_set_mode() here. I think re-purposing phy_set_mode() to override PHY_MODE_USB_HOST with PHY_MODE_USB_HOST_HS/PHY_MODE_USB_HOST_LS might break other drivers. All most all the phy drivers are checking against PHY_MODE_USB_HOST. Why do we need to set phy_set_mode() here? The next patch in this series only uses dwc->hs_phy_mode. can we drop phy_set_mode() call here? Thanks, Pavan