diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/usb/dwc2/platform.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/usb/dwc2/platform.c')
| -rw-r--r-- | drivers/usb/dwc2/platform.c | 54 | 
1 files changed, 37 insertions, 17 deletions
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index 23ef75996823..5aee284018c0 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -91,13 +91,6 @@ static int dwc2_get_dr_mode(struct dwc2_hsotg *hsotg)  	return 0;  } -static void __dwc2_disable_regulators(void *data) -{ -	struct dwc2_hsotg *hsotg = data; - -	regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); -} -  static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)  {  	struct platform_device *pdev = to_platform_device(hsotg->dev); @@ -108,15 +101,16 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)  	if (ret)  		return ret; -	ret = devm_add_action_or_reset(&pdev->dev, -				       __dwc2_disable_regulators, hsotg); -	if (ret) -		return ret; +	if (hsotg->utmi_clk) { +		ret = clk_prepare_enable(hsotg->utmi_clk); +		if (ret) +			goto err_dis_reg; +	}  	if (hsotg->clk) {  		ret = clk_prepare_enable(hsotg->clk);  		if (ret) -			return ret; +			goto err_dis_utmi_clk;  	}  	if (hsotg->uphy) { @@ -125,10 +119,29 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)  		ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type);  	} else {  		ret = phy_init(hsotg->phy); -		if (ret == 0) +		if (ret == 0) {  			ret = phy_power_on(hsotg->phy); +			if (ret) +				phy_exit(hsotg->phy); +		}  	} +	if (ret) +		goto err_dis_clk; + +	return 0; + +err_dis_clk: +	if (hsotg->clk) +		clk_disable_unprepare(hsotg->clk); + +err_dis_utmi_clk: +	if (hsotg->utmi_clk) +		clk_disable_unprepare(hsotg->utmi_clk); + +err_dis_reg: +	regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); +  	return ret;  } @@ -168,7 +181,10 @@ static int __dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg)  	if (hsotg->clk)  		clk_disable_unprepare(hsotg->clk); -	return 0; +	if (hsotg->utmi_clk) +		clk_disable_unprepare(hsotg->utmi_clk); + +	return regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);  }  /** @@ -244,6 +260,11 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)  	if (IS_ERR(hsotg->clk))  		return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->clk), "cannot get otg clock\n"); +	hsotg->utmi_clk = devm_clk_get_optional(hsotg->dev, "utmi"); +	if (IS_ERR(hsotg->utmi_clk)) +		return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->utmi_clk), +				     "cannot get utmi clock\n"); +  	/* Regulators */  	for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++)  		hsotg->supplies[i].supply = dwc2_hsotg_supply_names[i]; @@ -576,8 +597,7 @@ static int dwc2_driver_probe(struct platform_device *dev)  	dwc2_debugfs_init(hsotg);  	/* Gadget code manages lowlevel hw on its own */ -	if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL || -	    (hsotg->dr_mode == USB_DR_MODE_OTG && dwc2_is_device_mode(hsotg))) +	if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)  		dwc2_lowlevel_hw_disable(hsotg);  #if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \ @@ -608,7 +628,7 @@ error_init:  	if (hsotg->params.activate_stm_id_vb_detection)  		regulator_disable(hsotg->usb33d);  error: -	if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) +	if (hsotg->ll_hw_enabled)  		dwc2_lowlevel_hw_disable(hsotg);  	return retval;  }  |