linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
@ 2018-01-11 10:38 Roger Quadros
  2018-02-12  8:45 ` Felipe Balbi
  2018-02-12 13:30 ` [PATCH v2 RESEND] " Roger Quadros
  0 siblings, 2 replies; 9+ messages in thread
From: Roger Quadros @ 2018-01-11 10:38 UTC (permalink / raw)
  To: balbi
  Cc: vigneshr, gregkh, linux-usb, linux-kernel, Roger Quadros,
	linux-stable # = v4 . 13

In order for ULPI PHYs to work, dwc3_phy_setup() and dwc3_ulpi_init()
must be doene before dwc3_core_get_phy().

commit 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
broke this.

The other issue is that dwc3_core_get_phy() and dwc3_ulpi_init() should
be called only once during the life cycle of the driver. However,
as dwc3_core_init() is called during system suspend/resume it will
result in multiple calls to dwc3_core_get_phy() and dwc3_ulpi_init()
which is wrong.

Fix this by moving dwc3_ulpi_init() out of dwc3_phy_setup()
into dwc3_core_ulpi_init(). Use a flag 'ulpi_ready' to ensure that
dwc3_core_ulpi_init() is called only once from dwc3_core_init().

Use another flag 'phys_ready' to call dwc3_core_get_phy() only once from
dwc3_core_init().

Fixes: 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
Fixes: f54edb539c11 ("usb: dwc3: core: initialize ULPI before trying to get the PHY")
Cc: linux-stable <stable@vger.kernel.org> # >= v4.13
Signed-off-by: Roger Quadros <rogerq@ti.com>
---

Changelog:
v2:
- don't break ULPI case. Also take into consideration suspend/resume for ULPI case.

 drivers/usb/dwc3/core.c | 47 ++++++++++++++++++++++++++++++++++++-----------
 drivers/usb/dwc3/core.h |  5 +++++
 2 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 0783250..84382f6 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -482,6 +482,22 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
 	parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8);
 }
 
+static int dwc3_core_ulpi_init(struct dwc3 *dwc)
+{
+	int intf;
+	int ret = 0;
+
+	intf = DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3);
+
+	if (intf == DWC3_GHWPARAMS3_HSPHY_IFC_ULPI ||
+	    (intf == DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI &&
+	     dwc->hsphy_interface &&
+	     !strncmp(dwc->hsphy_interface, "ulpi", 4)))
+		ret = dwc3_ulpi_init(dwc);
+
+	return ret;
+}
+
 /**
  * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
  * @dwc: Pointer to our controller context structure
@@ -493,7 +509,6 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
 static int dwc3_phy_setup(struct dwc3 *dwc)
 {
 	u32 reg;
-	int ret;
 
 	reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
 
@@ -564,9 +579,6 @@ static int dwc3_phy_setup(struct dwc3 *dwc)
 		}
 		/* FALLTHROUGH */
 	case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI:
-		ret = dwc3_ulpi_init(dwc);
-		if (ret)
-			return ret;
 		/* FALLTHROUGH */
 	default:
 		break;
@@ -723,6 +735,7 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc)
 }
 
 static int dwc3_core_get_phy(struct dwc3 *dwc);
+static int dwc3_core_ulpi_init(struct dwc3 *dwc);
 
 /**
  * dwc3_core_init - Low-level initialization of DWC3 Core
@@ -754,17 +767,27 @@ static int dwc3_core_init(struct dwc3 *dwc)
 			dwc->maximum_speed = USB_SPEED_HIGH;
 	}
 
-	ret = dwc3_core_get_phy(dwc);
+	ret = dwc3_phy_setup(dwc);
 	if (ret)
 		goto err0;
 
-	ret = dwc3_core_soft_reset(dwc);
-	if (ret)
-		goto err0;
+	if (!dwc->ulpi_ready) {
+		ret = dwc3_core_ulpi_init(dwc);
+		if (ret)
+			goto err0;
+		dwc->ulpi_ready = true;
+	}
 
-	ret = dwc3_phy_setup(dwc);
+	if (!dwc->phys_ready) {
+		ret = dwc3_core_get_phy(dwc);
+		if (ret)
+			goto err0a;
+		dwc->phys_ready = true;
+	}
+
+	ret = dwc3_core_soft_reset(dwc);
 	if (ret)
-		goto err0;
+		goto err0a;
 
 	dwc3_core_setup_global_control(dwc);
 	dwc3_core_num_eps(dwc);
@@ -837,6 +860,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
 	phy_exit(dwc->usb2_generic_phy);
 	phy_exit(dwc->usb3_generic_phy);
 
+err0a:
+	dwc3_ulpi_exit(dwc);
+
 err0:
 	return ret;
 }
@@ -1229,7 +1255,6 @@ static int dwc3_probe(struct platform_device *pdev)
 
 err3:
 	dwc3_free_event_buffers(dwc);
-	dwc3_ulpi_exit(dwc);
 
 err2:
 	pm_runtime_allow(&pdev->dev);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 4a4a4c9..6b202e3 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -795,7 +795,9 @@ struct dwc3_scratchpad_array {
  * @usb3_phy: pointer to USB3 PHY
  * @usb2_generic_phy: pointer to USB2 PHY
  * @usb3_generic_phy: pointer to USB3 PHY
+ * @phys_ready: flag to indicate that PHYs are ready
  * @ulpi: pointer to ulpi interface
+ * @ulpi_ready: flag to indicate that ULPI is initialized
  * @isoch_delay: wValue from Set Isochronous Delay request;
  * @u2sel: parameter from Set SEL request.
  * @u2pel: parameter from Set SEL request.
@@ -893,7 +895,10 @@ struct dwc3 {
 	struct phy		*usb2_generic_phy;
 	struct phy		*usb3_generic_phy;
 
+	bool			phys_ready;
+
 	struct ulpi		*ulpi;
+	bool			ulpi_ready;
 
 	void __iomem		*regs;
 	size_t			regs_size;
-- 
cheers,
-roger

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-01-11 10:38 [PATCH v2] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume Roger Quadros
@ 2018-02-12  8:45 ` Felipe Balbi
  2018-02-12 13:30 ` [PATCH v2 RESEND] " Roger Quadros
  1 sibling, 0 replies; 9+ messages in thread
From: Felipe Balbi @ 2018-02-12  8:45 UTC (permalink / raw)
  To: Roger Quadros
  Cc: vigneshr, gregkh, linux-usb, linux-kernel, Roger Quadros,
	linux-stable # = v4 . 13

[-- Attachment #1: Type: text/plain, Size: 1341 bytes --]

Roger Quadros <rogerq@ti.com> writes:

> In order for ULPI PHYs to work, dwc3_phy_setup() and dwc3_ulpi_init()
> must be doene before dwc3_core_get_phy().
>
> commit 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
> broke this.
>
> The other issue is that dwc3_core_get_phy() and dwc3_ulpi_init() should
> be called only once during the life cycle of the driver. However,
> as dwc3_core_init() is called during system suspend/resume it will
> result in multiple calls to dwc3_core_get_phy() and dwc3_ulpi_init()
> which is wrong.
>
> Fix this by moving dwc3_ulpi_init() out of dwc3_phy_setup()
> into dwc3_core_ulpi_init(). Use a flag 'ulpi_ready' to ensure that
> dwc3_core_ulpi_init() is called only once from dwc3_core_init().
>
> Use another flag 'phys_ready' to call dwc3_core_get_phy() only once from
> dwc3_core_init().
>
> Fixes: 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
> Fixes: f54edb539c11 ("usb: dwc3: core: initialize ULPI before trying to get the PHY")
> Cc: linux-stable <stable@vger.kernel.org> # >= v4.13
> Signed-off-by: Roger Quadros <rogerq@ti.com>

unfortunately, this doesn't apply anymore. Care to rebase on
testing/fixes? (give me a couple hours though, I'm still applying
patches :-)

cheers

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2 RESEND] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-01-11 10:38 [PATCH v2] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume Roger Quadros
  2018-02-12  8:45 ` Felipe Balbi
@ 2018-02-12 13:30 ` Roger Quadros
  2018-11-14 16:11   ` Todor Tomov
  1 sibling, 1 reply; 9+ messages in thread
From: Roger Quadros @ 2018-02-12 13:30 UTC (permalink / raw)
  To: balbi
  Cc: vigneshr, gregkh, linux-usb, linux-kernel,
	linux-stable # = v4 . 13, rogerq

In order for ULPI PHYs to work, dwc3_phy_setup() and dwc3_ulpi_init()
must be doene before dwc3_core_get_phy().

commit 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
broke this.

The other issue is that dwc3_core_get_phy() and dwc3_ulpi_init() should
be called only once during the life cycle of the driver. However,
as dwc3_core_init() is called during system suspend/resume it will
result in multiple calls to dwc3_core_get_phy() and dwc3_ulpi_init()
which is wrong.

Fix this by moving dwc3_ulpi_init() out of dwc3_phy_setup()
into dwc3_core_ulpi_init(). Use a flag 'ulpi_ready' to ensure that
dwc3_core_ulpi_init() is called only once from dwc3_core_init().

Use another flag 'phys_ready' to call dwc3_core_get_phy() only once from
dwc3_core_init().

Fixes: 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
Fixes: f54edb539c11 ("usb: dwc3: core: initialize ULPI before trying to get the PHY")
Cc: linux-stable <stable@vger.kernel.org> # >= v4.13
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
Rebased on Felipe's testing/fixes branch.

 drivers/usb/dwc3/core.c | 47 ++++++++++++++++++++++++++++++++++++-----------
 drivers/usb/dwc3/core.h |  5 +++++
 2 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 59511f2..f1d838a 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -486,6 +486,22 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
 	parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8);
 }
 
+static int dwc3_core_ulpi_init(struct dwc3 *dwc)
+{
+	int intf;
+	int ret = 0;
+
+	intf = DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3);
+
+	if (intf == DWC3_GHWPARAMS3_HSPHY_IFC_ULPI ||
+	    (intf == DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI &&
+	     dwc->hsphy_interface &&
+	     !strncmp(dwc->hsphy_interface, "ulpi", 4)))
+		ret = dwc3_ulpi_init(dwc);
+
+	return ret;
+}
+
 /**
  * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
  * @dwc: Pointer to our controller context structure
@@ -497,7 +513,6 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
 static int dwc3_phy_setup(struct dwc3 *dwc)
 {
 	u32 reg;
-	int ret;
 
 	reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
 
@@ -568,9 +583,6 @@ static int dwc3_phy_setup(struct dwc3 *dwc)
 		}
 		/* FALLTHROUGH */
 	case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI:
-		ret = dwc3_ulpi_init(dwc);
-		if (ret)
-			return ret;
 		/* FALLTHROUGH */
 	default:
 		break;
@@ -727,6 +739,7 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc)
 }
 
 static int dwc3_core_get_phy(struct dwc3 *dwc);
+static int dwc3_core_ulpi_init(struct dwc3 *dwc);
 
 /**
  * dwc3_core_init - Low-level initialization of DWC3 Core
@@ -758,17 +771,27 @@ static int dwc3_core_init(struct dwc3 *dwc)
 			dwc->maximum_speed = USB_SPEED_HIGH;
 	}
 
-	ret = dwc3_core_get_phy(dwc);
+	ret = dwc3_phy_setup(dwc);
 	if (ret)
 		goto err0;
 
-	ret = dwc3_core_soft_reset(dwc);
-	if (ret)
-		goto err0;
+	if (!dwc->ulpi_ready) {
+		ret = dwc3_core_ulpi_init(dwc);
+		if (ret)
+			goto err0;
+		dwc->ulpi_ready = true;
+	}
 
-	ret = dwc3_phy_setup(dwc);
+	if (!dwc->phys_ready) {
+		ret = dwc3_core_get_phy(dwc);
+		if (ret)
+			goto err0a;
+		dwc->phys_ready = true;
+	}
+
+	ret = dwc3_core_soft_reset(dwc);
 	if (ret)
-		goto err0;
+		goto err0a;
 
 	dwc3_core_setup_global_control(dwc);
 	dwc3_core_num_eps(dwc);
@@ -841,6 +864,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
 	phy_exit(dwc->usb2_generic_phy);
 	phy_exit(dwc->usb3_generic_phy);
 
+err0a:
+	dwc3_ulpi_exit(dwc);
+
 err0:
 	return ret;
 }
@@ -1235,7 +1261,6 @@ static int dwc3_probe(struct platform_device *pdev)
 
 err3:
 	dwc3_free_event_buffers(dwc);
-	dwc3_ulpi_exit(dwc);
 
 err2:
 	pm_runtime_allow(&pdev->dev);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 185b960..860d2bc 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -797,7 +797,9 @@ struct dwc3_scratchpad_array {
  * @usb3_phy: pointer to USB3 PHY
  * @usb2_generic_phy: pointer to USB2 PHY
  * @usb3_generic_phy: pointer to USB3 PHY
+ * @phys_ready: flag to indicate that PHYs are ready
  * @ulpi: pointer to ulpi interface
+ * @ulpi_ready: flag to indicate that ULPI is initialized
  * @u2sel: parameter from Set SEL request.
  * @u2pel: parameter from Set SEL request.
  * @u1sel: parameter from Set SEL request.
@@ -895,7 +897,10 @@ struct dwc3 {
 	struct phy		*usb2_generic_phy;
 	struct phy		*usb3_generic_phy;
 
+	bool			phys_ready;
+
 	struct ulpi		*ulpi;
+	bool			ulpi_ready;
 
 	void __iomem		*regs;
 	size_t			regs_size;
-- 
cheers,
-roger

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 RESEND] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-02-12 13:30 ` [PATCH v2 RESEND] " Roger Quadros
@ 2018-11-14 16:11   ` Todor Tomov
  2018-11-15  8:09     ` Felipe Balbi
  0 siblings, 1 reply; 9+ messages in thread
From: Todor Tomov @ 2018-11-14 16:11 UTC (permalink / raw)
  To: Roger Quadros, balbi, linux-usb
  Cc: vigneshr, gregkh, linux-kernel, linux-stable # = v4 . 13

Hello,

After I apply this patch on 4.14 (or receive it with 4.14.70) I see a regression with
the Qualcomm QUSB2 phy driver. I'm testing on a Dragonboard 820c.
In boot log I get:

[    4.525502] phy phy-7412000.phy.6: QUSB2PHY pll lock failed: status reg = 0
[    4.529232] phy phy-7412000.phy.6: phy init failed --> -16
[    4.536170] dwc3 7600000.dwc3: failed to initialize core
[    4.541743] dwc3: probe of 7600000.dwc3 failed with error -16
[    4.549979] phy phy-7411000.phy.5: QUSB2PHY pll lock failed: status reg = 0
[    4.552843] phy phy-7411000.phy.5: phy init failed --> -16
[    4.559606] dwc3 6a00000.dwc3: failed to initialize core
[    4.565181] dwc3: probe of 6a00000.dwc3 failed with error -16

I can provide a full log if needed.

Best regards,
Todor



On 12.02.2018 15:30, Roger Quadros wrote:
> In order for ULPI PHYs to work, dwc3_phy_setup() and dwc3_ulpi_init()
> must be doene before dwc3_core_get_phy().
> 
> commit 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
> broke this.
> 
> The other issue is that dwc3_core_get_phy() and dwc3_ulpi_init() should
> be called only once during the life cycle of the driver. However,
> as dwc3_core_init() is called during system suspend/resume it will
> result in multiple calls to dwc3_core_get_phy() and dwc3_ulpi_init()
> which is wrong.
> 
> Fix this by moving dwc3_ulpi_init() out of dwc3_phy_setup()
> into dwc3_core_ulpi_init(). Use a flag 'ulpi_ready' to ensure that
> dwc3_core_ulpi_init() is called only once from dwc3_core_init().
> 
> Use another flag 'phys_ready' to call dwc3_core_get_phy() only once from
> dwc3_core_init().
> 
> Fixes: 541768b08a40 ("usb: dwc3: core: Call dwc3_core_get_phy() before initializing phys")
> Fixes: f54edb539c11 ("usb: dwc3: core: initialize ULPI before trying to get the PHY")
> Cc: linux-stable <stable@vger.kernel.org> # >= v4.13
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
> Rebased on Felipe's testing/fixes branch.
> 
>  drivers/usb/dwc3/core.c | 47 ++++++++++++++++++++++++++++++++++++-----------
>  drivers/usb/dwc3/core.h |  5 +++++
>  2 files changed, 41 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 59511f2..f1d838a 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -486,6 +486,22 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
>  	parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8);
>  }
>  
> +static int dwc3_core_ulpi_init(struct dwc3 *dwc)
> +{
> +	int intf;
> +	int ret = 0;
> +
> +	intf = DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3);
> +
> +	if (intf == DWC3_GHWPARAMS3_HSPHY_IFC_ULPI ||
> +	    (intf == DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI &&
> +	     dwc->hsphy_interface &&
> +	     !strncmp(dwc->hsphy_interface, "ulpi", 4)))
> +		ret = dwc3_ulpi_init(dwc);
> +
> +	return ret;
> +}
> +
>  /**
>   * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
>   * @dwc: Pointer to our controller context structure
> @@ -497,7 +513,6 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
>  static int dwc3_phy_setup(struct dwc3 *dwc)
>  {
>  	u32 reg;
> -	int ret;
>  
>  	reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
>  
> @@ -568,9 +583,6 @@ static int dwc3_phy_setup(struct dwc3 *dwc)
>  		}
>  		/* FALLTHROUGH */
>  	case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI:
> -		ret = dwc3_ulpi_init(dwc);
> -		if (ret)
> -			return ret;
>  		/* FALLTHROUGH */
>  	default:
>  		break;
> @@ -727,6 +739,7 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc)
>  }
>  
>  static int dwc3_core_get_phy(struct dwc3 *dwc);
> +static int dwc3_core_ulpi_init(struct dwc3 *dwc);
>  
>  /**
>   * dwc3_core_init - Low-level initialization of DWC3 Core
> @@ -758,17 +771,27 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  			dwc->maximum_speed = USB_SPEED_HIGH;
>  	}
>  
> -	ret = dwc3_core_get_phy(dwc);
> +	ret = dwc3_phy_setup(dwc);
>  	if (ret)
>  		goto err0;
>  
> -	ret = dwc3_core_soft_reset(dwc);
> -	if (ret)
> -		goto err0;
> +	if (!dwc->ulpi_ready) {
> +		ret = dwc3_core_ulpi_init(dwc);
> +		if (ret)
> +			goto err0;
> +		dwc->ulpi_ready = true;
> +	}
>  
> -	ret = dwc3_phy_setup(dwc);
> +	if (!dwc->phys_ready) {
> +		ret = dwc3_core_get_phy(dwc);
> +		if (ret)
> +			goto err0a;
> +		dwc->phys_ready = true;
> +	}
> +
> +	ret = dwc3_core_soft_reset(dwc);
>  	if (ret)
> -		goto err0;
> +		goto err0a;
>  
>  	dwc3_core_setup_global_control(dwc);
>  	dwc3_core_num_eps(dwc);
> @@ -841,6 +864,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  	phy_exit(dwc->usb2_generic_phy);
>  	phy_exit(dwc->usb3_generic_phy);
>  
> +err0a:
> +	dwc3_ulpi_exit(dwc);
> +
>  err0:
>  	return ret;
>  }
> @@ -1235,7 +1261,6 @@ static int dwc3_probe(struct platform_device *pdev)
>  
>  err3:
>  	dwc3_free_event_buffers(dwc);
> -	dwc3_ulpi_exit(dwc);
>  
>  err2:
>  	pm_runtime_allow(&pdev->dev);
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index 185b960..860d2bc 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -797,7 +797,9 @@ struct dwc3_scratchpad_array {
>   * @usb3_phy: pointer to USB3 PHY
>   * @usb2_generic_phy: pointer to USB2 PHY
>   * @usb3_generic_phy: pointer to USB3 PHY
> + * @phys_ready: flag to indicate that PHYs are ready
>   * @ulpi: pointer to ulpi interface
> + * @ulpi_ready: flag to indicate that ULPI is initialized
>   * @u2sel: parameter from Set SEL request.
>   * @u2pel: parameter from Set SEL request.
>   * @u1sel: parameter from Set SEL request.
> @@ -895,7 +897,10 @@ struct dwc3 {
>  	struct phy		*usb2_generic_phy;
>  	struct phy		*usb3_generic_phy;
>  
> +	bool			phys_ready;
> +
>  	struct ulpi		*ulpi;
> +	bool			ulpi_ready;
>  
>  	void __iomem		*regs;
>  	size_t			regs_size;
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 RESEND] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-11-14 16:11   ` Todor Tomov
@ 2018-11-15  8:09     ` Felipe Balbi
  2018-11-16 17:01       ` Todor Tomov
  0 siblings, 1 reply; 9+ messages in thread
From: Felipe Balbi @ 2018-11-15  8:09 UTC (permalink / raw)
  To: Todor Tomov, Roger Quadros, linux-usb
  Cc: vigneshr, gregkh, linux-kernel, linux-stable # = v4 . 13


Hi,

Todor Tomov <todor.tomov@linaro.org> writes:

> Hello,
>
> After I apply this patch on 4.14 (or receive it with 4.14.70) I see a regression with
> the Qualcomm QUSB2 phy driver. I'm testing on a Dragonboard 820c.
> In boot log I get:
>
> [    4.525502] phy phy-7412000.phy.6: QUSB2PHY pll lock failed: status reg = 0
> [    4.529232] phy phy-7412000.phy.6: phy init failed --> -16
> [    4.536170] dwc3 7600000.dwc3: failed to initialize core
> [    4.541743] dwc3: probe of 7600000.dwc3 failed with error -16
> [    4.549979] phy phy-7411000.phy.5: QUSB2PHY pll lock failed: status reg = 0
> [    4.552843] phy phy-7411000.phy.5: phy init failed --> -16
> [    4.559606] dwc3 6a00000.dwc3: failed to initialize core
> [    4.565181] dwc3: probe of 6a00000.dwc3 failed with error -16
>
> I can provide a full log if needed.

please do. Also, try mainline and let us know if the problem
persists. Why do you get -EBUSY from the PHY driver?

- 
balbi

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 RESEND] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-11-15  8:09     ` Felipe Balbi
@ 2018-11-16 17:01       ` Todor Tomov
  2018-11-26  8:27         ` Todor Tomov
  0 siblings, 1 reply; 9+ messages in thread
From: Todor Tomov @ 2018-11-16 17:01 UTC (permalink / raw)
  To: Felipe Balbi, Roger Quadros, linux-usb
  Cc: vigneshr, gregkh, linux-kernel, linux-stable # = v4 . 13

Hi,

On 15.11.2018 10:09, Felipe Balbi wrote:
> 
> Hi,
> 
> Todor Tomov <todor.tomov@linaro.org> writes:
> 
>> Hello,
>>
>> After I apply this patch on 4.14 (or receive it with 4.14.70) I see a regression with
>> the Qualcomm QUSB2 phy driver. I'm testing on a Dragonboard 820c.
>> In boot log I get:
>>
>> [    4.525502] phy phy-7412000.phy.6: QUSB2PHY pll lock failed: status reg = 0
>> [    4.529232] phy phy-7412000.phy.6: phy init failed --> -16
>> [    4.536170] dwc3 7600000.dwc3: failed to initialize core
>> [    4.541743] dwc3: probe of 7600000.dwc3 failed with error -16
>> [    4.549979] phy phy-7411000.phy.5: QUSB2PHY pll lock failed: status reg = 0
>> [    4.552843] phy phy-7411000.phy.5: phy init failed --> -16
>> [    4.559606] dwc3 6a00000.dwc3: failed to initialize core
>> [    4.565181] dwc3: probe of 6a00000.dwc3 failed with error -16
>>
>> I can provide a full log if needed.
> 
> please do. Also, try mainline and let us know if the problem

This is the full log on 4.14.69 + this patch: https://paste.ubuntu.com/p/N5WdHw47QC/
I also managed to get a log from 4.20.0-rc2 and I see the same error: https://paste.ubuntu.com/p/jz6fvYyZh6/

> persists. Why do you get -EBUSY from the PHY driver?

Maybe I could have proposed a fix if I knew but I don't know.

Best regards,
Todor

> 
> - 
> balbi
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 RESEND] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-11-16 17:01       ` Todor Tomov
@ 2018-11-26  8:27         ` Todor Tomov
  2018-11-26 17:14           ` Todor Tomov
  0 siblings, 1 reply; 9+ messages in thread
From: Todor Tomov @ 2018-11-26  8:27 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: Roger Quadros, linux-usb, vigneshr, gregkh, linux-kernel,
	linux-stable # = v4 . 13

Hi Felipe,

On 16.11.2018 19:01, Todor Tomov wrote:
> Hi,
> 
> On 15.11.2018 10:09, Felipe Balbi wrote:
>>
>> Hi,
>>
>> Todor Tomov <todor.tomov@linaro.org> writes:
>>
>>> Hello,
>>>
>>> After I apply this patch on 4.14 (or receive it with 4.14.70) I see a regression with
>>> the Qualcomm QUSB2 phy driver. I'm testing on a Dragonboard 820c.
>>> In boot log I get:
>>>
>>> [    4.525502] phy phy-7412000.phy.6: QUSB2PHY pll lock failed: status reg = 0
>>> [    4.529232] phy phy-7412000.phy.6: phy init failed --> -16
>>> [    4.536170] dwc3 7600000.dwc3: failed to initialize core
>>> [    4.541743] dwc3: probe of 7600000.dwc3 failed with error -16
>>> [    4.549979] phy phy-7411000.phy.5: QUSB2PHY pll lock failed: status reg = 0
>>> [    4.552843] phy phy-7411000.phy.5: phy init failed --> -16
>>> [    4.559606] dwc3 6a00000.dwc3: failed to initialize core
>>> [    4.565181] dwc3: probe of 6a00000.dwc3 failed with error -16
>>>
>>> I can provide a full log if needed.
>>
>> please do. Also, try mainline and let us know if the problem
> 
> This is the full log on 4.14.69 + this patch: https://paste.ubuntu.com/p/N5WdHw47QC/
> I also managed to get a log from 4.20.0-rc2 and I see the same error: https://paste.udwc3_phy_setupbuntu.com/p/jz6fvYyZh6/
> 
>> persists. Why do you get -EBUSY from the PHY driver?
> 
> Maybe I could have proposed a fix if I knew but I don't know.

I have done some debugging but I still cannot understand it completely.

What I see is that if the PHY interface is configured first (dwc3_phy_setup)
then the PHY init (qusb2_phy_init called by dwc3_core_soft_reset) fails
with "pll lock failed". If we move dwc3_phy_setup after dwc3_core_soft_reset
as it was before this patch, it works.

Do you have any ideas why this happens or how to solve it?

Thank you.
Best regards,
Todor

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 RESEND] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-11-26  8:27         ` Todor Tomov
@ 2018-11-26 17:14           ` Todor Tomov
  2018-11-27  8:59             ` Felipe Balbi
  0 siblings, 1 reply; 9+ messages in thread
From: Todor Tomov @ 2018-11-26 17:14 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: Roger Quadros, linux-usb, vigneshr, gregkh, linux-kernel,
	linux-stable # = v4 . 13

Hi Felipe,

On 26.11.2018 10:27, Todor Tomov wrote:
> Hi Felipe,
> 
> On 16.11.2018 19:01, Todor Tomov wrote:
>> Hi,
>>
>> On 15.11.2018 10:09, Felipe Balbi wrote:
>>>
>>> Hi,
>>>
>>> Todor Tomov <todor.tomov@linaro.org> writes:
>>>
>>>> Hello,
>>>>
>>>> After I apply this patch on 4.14 (or receive it with 4.14.70) I see a regression with
>>>> the Qualcomm QUSB2 phy driver. I'm testing on a Dragonboard 820c.
>>>> In boot log I get:
>>>>
>>>> [    4.525502] phy phy-7412000.phy.6: QUSB2PHY pll lock failed: status reg = 0
>>>> [    4.529232] phy phy-7412000.phy.6: phy init failed --> -16
>>>> [    4.536170] dwc3 7600000.dwc3: failed to initialize core
>>>> [    4.541743] dwc3: probe of 7600000.dwc3 failed with error -16
>>>> [    4.549979] phy phy-7411000.phy.5: QUSB2PHY pll lock failed: status reg = 0
>>>> [    4.552843] phy phy-7411000.phy.5: phy init failed --> -16
>>>> [    4.559606] dwc3 6a00000.dwc3: failed to initialize core
>>>> [    4.565181] dwc3: probe of 6a00000.dwc3 failed with error -16
>>>>
>>>> I can provide a full log if needed.
>>>
>>> please do. Also, try mainline and let us know if the problem
>>
>> This is the full log on 4.14.69 + this patch: https://paste.ubuntu.com/p/N5WdHw47QC/
>> I also managed to get a log from 4.20.0-rc2 and I see the same error: https://paste.udwc3_phy_setupbuntu.com/p/jz6fvYyZh6/
>>
>>> persists. Why do you get -EBUSY from the PHY driver?
>>
>> Maybe I could have proposed a fix if I knew but I don't know.
> 
> I have done some debugging but I still cannot understand it completely.
> 
> What I see is that if the PHY interface is configured first (dwc3_phy_setup)
> then the PHY init (qusb2_phy_init called by dwc3_core_soft_reset) fails
> with "pll lock failed". If we move dwc3_phy_setup after dwc3_core_soft_reset
> as it was before this patch, it works.

I have found that during dwc3_phy_setup the PHY interface is configured
to suspend and this is what breaks the QUSB2 PHY initialization.
It seems that it can be fixed by adding the "snps,dis_u2_susphy_quirk"
quirk in device tree. If this approach proves correct, I'll send the
patch upstream.

Best regards,
Todor

> 
> Do you have any ideas why this happens or how to solve it?
> 
> Thank you.
> Best regards,
> Todor
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 RESEND] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume
  2018-11-26 17:14           ` Todor Tomov
@ 2018-11-27  8:59             ` Felipe Balbi
  0 siblings, 0 replies; 9+ messages in thread
From: Felipe Balbi @ 2018-11-27  8:59 UTC (permalink / raw)
  To: Todor Tomov
  Cc: Roger Quadros, linux-usb, vigneshr, gregkh, linux-kernel,
	linux-stable # = v4 . 13

[-- Attachment #1: Type: text/plain, Size: 2058 bytes --]


Hi,

Todor Tomov <todor.tomov@linaro.org> writes:
>>>>> After I apply this patch on 4.14 (or receive it with 4.14.70) I see a regression with
>>>>> the Qualcomm QUSB2 phy driver. I'm testing on a Dragonboard 820c.
>>>>> In boot log I get:
>>>>>
>>>>> [    4.525502] phy phy-7412000.phy.6: QUSB2PHY pll lock failed: status reg = 0
>>>>> [    4.529232] phy phy-7412000.phy.6: phy init failed --> -16
>>>>> [    4.536170] dwc3 7600000.dwc3: failed to initialize core
>>>>> [    4.541743] dwc3: probe of 7600000.dwc3 failed with error -16
>>>>> [    4.549979] phy phy-7411000.phy.5: QUSB2PHY pll lock failed: status reg = 0
>>>>> [    4.552843] phy phy-7411000.phy.5: phy init failed --> -16
>>>>> [    4.559606] dwc3 6a00000.dwc3: failed to initialize core
>>>>> [    4.565181] dwc3: probe of 6a00000.dwc3 failed with error -16
>>>>>
>>>>> I can provide a full log if needed.
>>>>
>>>> please do. Also, try mainline and let us know if the problem
>>>
>>> This is the full log on 4.14.69 + this patch: https://paste.ubuntu.com/p/N5WdHw47QC/
>>> I also managed to get a log from 4.20.0-rc2 and I see the same error: https://paste.udwc3_phy_setupbuntu.com/p/jz6fvYyZh6/
>>>
>>>> persists. Why do you get -EBUSY from the PHY driver?
>>>
>>> Maybe I could have proposed a fix if I knew but I don't know.
>> 
>> I have done some debugging but I still cannot understand it completely.
>> 
>> What I see is that if the PHY interface is configured first (dwc3_phy_setup)
>> then the PHY init (qusb2_phy_init called by dwc3_core_soft_reset) fails
>> with "pll lock failed". If we move dwc3_phy_setup after dwc3_core_soft_reset
>> as it was before this patch, it works.
>
> I have found that during dwc3_phy_setup the PHY interface is configured
> to suspend and this is what breaks the QUSB2 PHY initialization.
> It seems that it can be fixed by adding the "snps,dis_u2_susphy_quirk"
> quirk in device tree. If this approach proves correct, I'll send the
> patch upstream.

That's the correct way, yes.

Thanks

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2018-11-27  8:59 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-11 10:38 [PATCH v2] usb: dwc3: core: Fix ULPI PHYs and prevent phy_get/ulpi_init during suspend/resume Roger Quadros
2018-02-12  8:45 ` Felipe Balbi
2018-02-12 13:30 ` [PATCH v2 RESEND] " Roger Quadros
2018-11-14 16:11   ` Todor Tomov
2018-11-15  8:09     ` Felipe Balbi
2018-11-16 17:01       ` Todor Tomov
2018-11-26  8:27         ` Todor Tomov
2018-11-26 17:14           ` Todor Tomov
2018-11-27  8:59             ` Felipe Balbi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).