On Tue, Oct 29, 2019 at 2:21 AM Felipe Balbi <balbi@xxxxxxxxxx> wrote: > John Stultz <john.stultz@xxxxxxxxxx> writes: > > From: Yu Chen <chenyu56@xxxxxxxxxx> > > > > The Type-C drivers use USB role switch API to inform the > > system about the negotiated data role, so registering a role > > switch in the DRD code in order to support platforms with > > USB Type-C connectors. > > > > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > > Cc: Rob Herring <robh+dt@xxxxxxxxxx> > > Cc: Mark Rutland <mark.rutland@xxxxxxx> > > CC: ShuFan Lee <shufan_lee@xxxxxxxxxxx> > > Cc: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > > Cc: Suzuki K Poulose <suzuki.poulose@xxxxxxx> > > Cc: Chunfeng Yun <chunfeng.yun@xxxxxxxxxxxx> > > Cc: Yu Chen <chenyu56@xxxxxxxxxx> > > Cc: Felipe Balbi <balbi@xxxxxxxxxx> > > Cc: Hans de Goede <hdegoede@xxxxxxxxxx> > > Cc: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> > > Cc: Jun Li <lijun.kernel@xxxxxxxxx> > > Cc: Valentin Schneider <valentin.schneider@xxxxxxx> > > Cc: Jack Pham <jackp@xxxxxxxxxxxxxx> > > Cc: linux-usb@xxxxxxxxxxxxxxx > > Cc: devicetree@xxxxxxxxxxxxxxx > > Suggested-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > > Signed-off-by: Yu Chen <chenyu56@xxxxxxxxxx> > > Signed-off-by: John Stultz <john.stultz@xxxxxxxxxx> > > --- > > v2: Fix role_sw and role_switch_default_mode descriptions as > > reported by kbuild test robot <lkp@xxxxxxxxx> > > > > v3: Split out the role-switch-default-host logic into its own > > patch > > --- > > drivers/usb/dwc3/Kconfig | 1 + > > drivers/usb/dwc3/core.h | 3 ++ > > drivers/usb/dwc3/drd.c | 66 +++++++++++++++++++++++++++++++++++++++- > > 3 files changed, 69 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig > > index 89abc6078703..1104745c41a9 100644 > > --- a/drivers/usb/dwc3/Kconfig > > +++ b/drivers/usb/dwc3/Kconfig > > @@ -44,6 +44,7 @@ config USB_DWC3_DUAL_ROLE > > bool "Dual Role mode" > > depends on ((USB=y || USB=USB_DWC3) && (USB_GADGET=y || USB_GADGET=USB_DWC3)) > > depends on (EXTCON=y || EXTCON=USB_DWC3) > > + select USB_ROLE_SWITCH > > so even those using DWC3 as a peripheral-only or host-only driver will > need role switch? So, just to clarify, the select is added to the CONFIG_USB_DWC3_DUAL_ROLE, wouldn't peripheral-only or host-only drivers select USB_DWC3_GADGET or USB_DWC3_HOST instead? Even so, if you'd prefer I can avoid the select, and add more #ifdef CONFIG_USB_ROLE_SWITCH around the logic added in this patch. I just worry it makes getting a valid config for some devices more complex and clutters the logic a touch. > > +static int dwc3_usb_role_switch_set(struct device *dev, enum usb_role role) > > +{ > > + struct dwc3 *dwc = dev_get_drvdata(dev); > > + u32 mode; > > + > > + switch (role) { > > + case USB_ROLE_HOST: > > + mode = DWC3_GCTL_PRTCAP_HOST; > > + break; > > + case USB_ROLE_DEVICE: > > + mode = DWC3_GCTL_PRTCAP_DEVICE; > > + break; > > + default: > > + mode = DWC3_GCTL_PRTCAP_DEVICE; > > + break; > > + } > > + > > + dwc3_set_mode(dwc, mode); > > + return 0; > > +} > > role switching is starting to get way too complicated in DWC3. We now > have a function that queues a work on the system_freezable_wq that will > configure PHY and change PRTCAP. Is there a way we can simplify some of > this a little? I'm sorry, could you expand a bit on this point? I'm not sure I quite see what you are envisioning as a simpler role_switch set handler? Is the objection that I'm calling dwc3_set_mode() and instead should be calling some non-static variant of __dwc3_set_mode() directly?