]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: dwc3: drd: extend dwc3_pre_set_role() to extcon and otg usecase
authorXu Yang <xu.yang_2@nxp.com>
Thu, 8 Jan 2026 08:14:31 +0000 (16:14 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jan 2026 14:58:31 +0000 (15:58 +0100)
Call dwc3_pre_set_role() to support both extcon and otg usecase, so that
the glue driver can do proper action in case of role changes.

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
Link: https://patch.msgid.link/20260108081433.2119328-1-xu.yang_2@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/drd.c

index 589bbeb2745419331770b91919934c9524391e41..031cfd12300a4913ec60439447b2659d0bff0805 100644 (file)
@@ -381,6 +381,7 @@ void dwc3_otg_update(struct dwc3 *dwc, bool ignore_idstatus)
                dwc3_otgregs_init(dwc);
                dwc3_otg_host_init(dwc);
                spin_unlock_irqrestore(&dwc->lock, flags);
+               dwc3_pre_set_role(dwc, USB_ROLE_HOST);
                ret = dwc3_host_init(dwc);
                if (ret) {
                        dev_err(dwc->dev, "failed to initialize host\n");
@@ -406,6 +407,7 @@ void dwc3_otg_update(struct dwc3 *dwc, bool ignore_idstatus)
                        otg_set_vbus(dwc->usb2_phy->otg, false);
                if (dwc->usb2_generic_phy[0])
                        phy_set_mode(dwc->usb2_generic_phy[0], PHY_MODE_USB_DEVICE);
+               dwc3_pre_set_role(dwc, USB_ROLE_DEVICE);
                ret = dwc3_gadget_init(dwc);
                if (ret)
                        dev_err(dwc->dev, "failed to initialize peripheral\n");
@@ -433,10 +435,12 @@ static int dwc3_drd_notifier(struct notifier_block *nb,
                             unsigned long event, void *ptr)
 {
        struct dwc3 *dwc = container_of(nb, struct dwc3, edev_nb);
+       u32 mode = event ? DWC3_GCTL_PRTCAP_HOST : DWC3_GCTL_PRTCAP_DEVICE;
+       enum usb_role role = mode == DWC3_GCTL_PRTCAP_HOST ?
+                                    USB_ROLE_HOST : USB_ROLE_DEVICE;
 
-       dwc3_set_mode(dwc, event ?
-                     DWC3_GCTL_PRTCAP_HOST :
-                     DWC3_GCTL_PRTCAP_DEVICE);
+       dwc3_pre_set_role(dwc, role);
+       dwc3_set_mode(dwc, mode);
 
        return NOTIFY_DONE;
 }