Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 135b3c43 authored by Yunzhi Li's avatar Yunzhi Li Committed by Felipe Balbi
Browse files

usb: dwc2: platform: add generic PHY framework support



Get PHY parameters from devicetree and power off usb PHY during
system suspend.

Acked-by: default avatarPaul Zimmerman <paulz@synopsys.com>
Signed-off-by: default avatarYunzhi Li <lyz@rock-chips.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 46919a23
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
@@ -3410,8 +3410,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
{
	struct device *dev = hsotg->dev;
	struct s3c_hsotg_plat *plat = dev->platform_data;
	struct phy *phy;
	struct usb_phy *uphy;
	struct s3c_hsotg_ep *eps;
	int epnum;
	int ret;
@@ -3421,14 +3419,10 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
	hsotg->phyif = GUSBCFG_PHYIF16;

	/*
	 * Attempt to find a generic PHY, then look for an old style
	 * USB PHY, finally fall back to pdata
	 */
	phy = devm_phy_get(dev, "usb2-phy");
	if (IS_ERR(phy)) {
		uphy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
		if (IS_ERR(uphy)) {
			/* Fallback for pdata */
	 * If platform probe couldn't find a generic PHY or an old style
	 * USB PHY, fall back to pdata
	 */
	if (IS_ERR_OR_NULL(hsotg->phy) && IS_ERR_OR_NULL(hsotg->uphy)) {
		plat = dev_get_platdata(dev);
		if (!plat) {
			dev_err(dev,
@@ -3436,15 +3430,12 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
			return -EPROBE_DEFER;
		}
		hsotg->plat = plat;
		} else
			hsotg->uphy = uphy;
	} else {
		hsotg->phy = phy;
	} else if (hsotg->phy) {
		/*
		 * If using the generic PHY framework, check if the PHY bus
		 * width is 8-bit and set the phyif appropriately.
		 */
		if (phy_get_bus_width(phy) == 8)
		if (phy_get_bus_width(hsotg->phy) == 8)
			hsotg->phyif = GUSBCFG_PHYIF8;
	}

+34 −2
Original line number Diff line number Diff line
@@ -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;
}