Hi, Aswath Govindraju wrote: > In AM62x SoC, the USB controller supports USB role switching by using the > extcon drd notifiers. The current implementation does not accommodate this. > If usb role switching is enabled then drd notifiers are not added. If usb > role switching is not enabled then the dr_mode is forced to peripheral > (dwc3_get_dr_mode) and role switching will not be possible(dwc3_set_mode). > > Therefore, rearrange the "if else" logic such that extcon drd notifiers can > be added even with usb role switching enabled. > > Signed-off-by: Aswath Govindraju <a-govindraju@xxxxxx> > --- > drivers/usb/dwc3/drd.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c > index b919ea3d87f2..0e86b1d8b50c 100644 > --- a/drivers/usb/dwc3/drd.c > +++ b/drivers/usb/dwc3/drd.c > @@ -583,12 +583,7 @@ int dwc3_drd_init(struct dwc3 *dwc) > if (IS_ERR(dwc->edev)) > return PTR_ERR(dwc->edev); > > - if (ROLE_SWITCH && > - device_property_read_bool(dwc->dev, "usb-role-switch")) { > - ret = dwc3_setup_role_switch(dwc); > - if (ret < 0) > - return ret; > - } else if (dwc->edev) { > + if (dwc->edev) { > dwc->edev_nb.notifier_call = dwc3_drd_notifier; > ret = extcon_register_notifier(dwc->edev, EXTCON_USB_HOST, > &dwc->edev_nb); > @@ -598,7 +593,14 @@ int dwc3_drd_init(struct dwc3 *dwc) > } > > dwc3_drd_update(dwc); > - } else { > + } > + > + if (ROLE_SWITCH && > + device_property_read_bool(dwc->dev, "usb-role-switch")) { > + ret = dwc3_setup_role_switch(dwc); > + if (ret < 0) > + return ret; > + } else if (!dwc->edev) { > dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_OTG); > > /* use OTG block to get ID event */ Please check the patch by Andrey Smirnov and see if it works for you: https://lore.kernel.org/linux-usb/20220221192020.346622-1-andrew.smirnov@xxxxxxxxx/ Thanks, Thinh