diff options
| author | Yunzhi Li <lyz@rock-chips.com> | 2014-12-08 17:46:26 +0800 | 
|---|---|---|
| committer | Felipe Balbi <balbi@ti.com> | 2015-01-12 12:13:26 -0600 | 
| commit | 135b3c4304dacd8bb01f1aa6fe4165126bee3812 (patch) | |
| tree | 18fe9b680f018c97bca993fd6ffed9f7cecc432c /drivers/usb/dwc2/platform.c | |
| parent | 46919a23ee87bbc4eeb6d958471174e26836f0e1 (diff) | |
usb: dwc2: platform: add generic PHY framework support
Get PHY parameters from devicetree and power off usb PHY during
system suspend.
Acked-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Yunzhi Li <lyz@rock-chips.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc2/platform.c')
| -rw-r--r-- | drivers/usb/dwc2/platform.c | 36 | 
1 files changed, 34 insertions, 2 deletions
| diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index 6a795aa2ff05..ae095f009b4f 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -155,6 +155,8 @@ static int dwc2_driver_probe(struct platform_device *dev)  	struct dwc2_core_params defparams;  	struct dwc2_hsotg *hsotg;  	struct resource *res; +	struct phy *phy; +	struct usb_phy *uphy;  	int retval;  	int irq; @@ -212,6 +214,24 @@ static int dwc2_driver_probe(struct platform_device *dev)  	hsotg->dr_mode = of_usb_get_dr_mode(dev->dev.of_node); +	/* +	 * Attempt to find a generic PHY, then look for an old style +	 * USB PHY +	 */ +	phy = devm_phy_get(&dev->dev, "usb2-phy"); +	if (IS_ERR(phy)) { +		hsotg->phy = NULL; +		uphy = devm_usb_get_phy(&dev->dev, USB_PHY_TYPE_USB2); +		if (IS_ERR(uphy)) +			hsotg->uphy = NULL; +		else +			hsotg->uphy = uphy; +	} else { +		hsotg->phy = phy; +		phy_power_on(hsotg->phy); +		phy_init(hsotg->phy); +	} +  	spin_lock_init(&hsotg->lock);  	mutex_init(&hsotg->init_mutex);  	retval = dwc2_gadget_init(hsotg, irq); @@ -231,8 +251,15 @@ static int __maybe_unused dwc2_suspend(struct device *dev)  	struct dwc2_hsotg *dwc2 = dev_get_drvdata(dev);  	int ret = 0; -	if (dwc2_is_device_mode(dwc2)) +	if (dwc2_is_device_mode(dwc2)) {  		ret = s3c_hsotg_suspend(dwc2); +	} else { +		if (dwc2->lx_state == DWC2_L0) +			return 0; +		phy_exit(dwc2->phy); +		phy_power_off(dwc2->phy); + +	}  	return ret;  } @@ -241,8 +268,13 @@ static int __maybe_unused dwc2_resume(struct device *dev)  	struct dwc2_hsotg *dwc2 = dev_get_drvdata(dev);  	int ret = 0; -	if (dwc2_is_device_mode(dwc2)) +	if (dwc2_is_device_mode(dwc2)) {  		ret = s3c_hsotg_resume(dwc2); +	} else { +		phy_power_on(dwc2->phy); +		phy_init(dwc2->phy); + +	}  	return ret;  } | 
