Commit e02264af authored by Xu Yang's avatar Xu Yang Committed by Greg Kroah-Hartman
Browse files

usb: dwc3: drd: extend dwc3_pre_set_role() to extcon and otg usecase



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: default avatarFrank Li <Frank.Li@nxp.com>
Acked-by: default avatarThinh Nguyen <Thinh.Nguyen@synopsys.com>
Signed-off-by: default avatarXu Yang <xu.yang_2@nxp.com>
Link: https://patch.msgid.link/20260108081433.2119328-1-xu.yang_2@nxp.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0145e7ac
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -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;
}