Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1616980 > unrolled thread

[PATCH 0/3] rockchip dwc2: Turn off vbus on shutdown

Started bySjoerd Simons <sjoerd.simons@collabora.co.uk>
First post2017-04-05 16:20 +0200
Last post2017-04-06 12:40 +0200
Articles 4 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 0/3] rockchip dwc2: Turn off vbus on shutdown Sjoerd Simons <sjoerd.simons@collabora.co.uk> - 2017-04-05 16:20 +0200
    [PATCH 3/3] usb: dwc2: Power off the phy on shutdown Sjoerd Simons <sjoerd.simons@collabora.co.uk> - 2017-04-05 16:20 +0200
    [PATCH 1/3] phy: rockchip-usb: Add vbus regulator support. Sjoerd Simons <sjoerd.simons@collabora.co.uk> - 2017-04-05 16:20 +0200
      Re: [PATCH 1/3] phy: rockchip-usb: Add vbus regulator support. Kishon Vijay Abraham I <kishon@ti.com> - 2017-04-06 12:40 +0200

#1616980 — [PATCH 0/3] rockchip dwc2: Turn off vbus on shutdown

FromSjoerd Simons <sjoerd.simons@collabora.co.uk>
Date2017-04-05 16:20 +0200
Subject[PATCH 0/3] rockchip dwc2: Turn off vbus on shutdown
Message-ID<tsTNg-3DV-33@gated-at.bofh.it>
A board I'm working on seems to get its usb->sata bridge in a rather
confused state during reboot, which unfortunately can't be recovered on
the next boot (only hard reset helps).

This seems to be avoidable by turning off vbus, which turns the internal
usb hub off on shutdown.

First patch add the ability to describe vbus regulators for the rockchip
usb phy, second one starts using that on the rock2 square board and
while the final one adds the actual workaround of turning off the phy on
shutdown.


Sjoerd Simons (3):
  phy: rockchip-usb: Add vbus regulator support.
  ARM: dts: rockchip: rock2: Setup usb vbus-supply
  usb: dwc2: Power off the phy on shutdown

 .../devicetree/bindings/phy/rockchip-usb-phy.txt      |  1 +
 arch/arm/boot/dts/rk3288-rock2-square.dts             |  8 ++++----
 drivers/phy/phy-rockchip-usb.c                        | 19 +++++++++++++++++++
 drivers/usb/dwc2/platform.c                           |  3 +++
 4 files changed, 27 insertions(+), 4 deletions(-)

-- 
2.11.0

[toc] | [next] | [standalone]


#1616982 — [PATCH 3/3] usb: dwc2: Power off the phy on shutdown

FromSjoerd Simons <sjoerd.simons@collabora.co.uk>
Date2017-04-05 16:20 +0200
Subject[PATCH 3/3] usb: dwc2: Power off the phy on shutdown
Message-ID<tsTWV-3H6-3@gated-at.bofh.it>
In reply to#1616980
On a board with a usb->sata bridge behind a usb hub, the bridge only
appears on cold boot and becomes non-functional after a reboot. Testing
thusfar shows that it gets confused during reboot if the usb hub is left
on (Interestingly a similar setup without the usb hub in between doesn't
have the issue).  This can be avoided by turning off the phy (thus vbus)
during shutdown, which turns off the usb hub.

For devices where this isn't required, powering down the phy is harmless
so we can do this unconditionally.

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>

---

 drivers/usb/dwc2/platform.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index 9564bc76c56f..b5bbc433c94d 100644
--- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c
@@ -348,6 +348,9 @@ static void dwc2_driver_shutdown(struct platform_device *dev)
 {
 	struct dwc2_hsotg *hsotg = platform_get_drvdata(dev);
 
+	if (hsotg->phy)
+		phy_power_off(hsotg->phy);
+
 	disable_irq(hsotg->irq);
 }
 
-- 
2.11.0

[toc] | [prev] | [next] | [standalone]


#1616986 — [PATCH 1/3] phy: rockchip-usb: Add vbus regulator support.

FromSjoerd Simons <sjoerd.simons@collabora.co.uk>
Date2017-04-05 16:20 +0200
Subject[PATCH 1/3] phy: rockchip-usb: Add vbus regulator support.
Message-ID<tsTWW-3H6-19@gated-at.bofh.it>
In reply to#1616980
On rockchip devices vbus is supplied by a separate power supply, often
through a regulator. Add support for describing the the regulator in
device-tree following the same convention as several other usb phy's.

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
---

 .../devicetree/bindings/phy/rockchip-usb-phy.txt      |  1 +
 drivers/phy/phy-rockchip-usb.c                        | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt b/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt
index 57dc388e2fa2..4ed569046daf 100644
--- a/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt
+++ b/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt
@@ -30,6 +30,7 @@ Optional Properties:
 - reset-names: Only allow the following entries:
  - phy-reset
 - resets: Must contain an entry for each entry in reset-names.
+- vbus-supply: power-supply phandle for vbus power source
 
 Example:
 
diff --git a/drivers/phy/phy-rockchip-usb.c b/drivers/phy/phy-rockchip-usb.c
index 734987fa0ad7..3378eeb7a562 100644
--- a/drivers/phy/phy-rockchip-usb.c
+++ b/drivers/phy/phy-rockchip-usb.c
@@ -66,6 +66,7 @@ struct rockchip_usb_phy {
 	struct phy	*phy;
 	bool		uart_enabled;
 	struct reset_control *reset;
+	struct regulator *vbus;
 };
 
 static int rockchip_usb_phy_power(struct rockchip_usb_phy *phy,
@@ -88,6 +89,9 @@ static void rockchip_usb_phy480m_disable(struct clk_hw *hw)
 						    struct rockchip_usb_phy,
 						    clk480m_hw);
 
+	if (phy->vbus)
+		regulator_disable(phy->vbus);
+
 	/* Power down usb phy analog blocks by set siddq 1 */
 	rockchip_usb_phy_power(phy, 1);
 }
@@ -143,6 +147,14 @@ static int rockchip_usb_phy_power_on(struct phy *_phy)
 	if (phy->uart_enabled)
 		return -EBUSY;
 
+	if (phy->vbus) {
+		int ret;
+
+		ret = regulator_enable(phy->vbus);
+		if (ret)
+			return ret;
+	}
+
 	return clk_prepare_enable(phy->clk480m);
 }
 
@@ -268,6 +280,13 @@ static int rockchip_usb_phy_init(struct rockchip_usb_phy_base *base,
 	}
 	phy_set_drvdata(rk_phy->phy, rk_phy);
 
+	rk_phy->vbus = devm_regulator_get_optional(&rk_phy->phy->dev, "vbus");
+	if (IS_ERR(rk_phy->vbus)) {
+		if (PTR_ERR(rk_phy->vbus) == -EPROBE_DEFER)
+			return PTR_ERR(rk_phy->vbus);
+		rk_phy->vbus = NULL;
+	}
+
 	/*
 	 * When acting as uart-pipe, just keep clock on otherwise
 	 * only power up usb phy when it use, so disable it when init
-- 
2.11.0

[toc] | [prev] | [next] | [standalone]


#1617861 — Re: [PATCH 1/3] phy: rockchip-usb: Add vbus regulator support.

FromKishon Vijay Abraham I <kishon@ti.com>
Date2017-04-06 12:40 +0200
SubjectRe: [PATCH 1/3] phy: rockchip-usb: Add vbus regulator support.
Message-ID<ttcZA-7iO-27@gated-at.bofh.it>
In reply to#1616986

On Wednesday 05 April 2017 07:36 PM, Sjoerd Simons wrote:
> On rockchip devices vbus is supplied by a separate power supply, often
> through a regulator. Add support for describing the the regulator in
> device-tree following the same convention as several other usb phy's.
> 
merged, thanks.

-Kishon
> Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
> ---
> 
>  .../devicetree/bindings/phy/rockchip-usb-phy.txt      |  1 +
>  drivers/phy/phy-rockchip-usb.c                        | 19 +++++++++++++++++++
>  2 files changed, 20 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt b/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt
> index 57dc388e2fa2..4ed569046daf 100644
> --- a/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt
> +++ b/Documentation/devicetree/bindings/phy/rockchip-usb-phy.txt
> @@ -30,6 +30,7 @@ Optional Properties:
>  - reset-names: Only allow the following entries:
>   - phy-reset
>  - resets: Must contain an entry for each entry in reset-names.
> +- vbus-supply: power-supply phandle for vbus power source
>  
>  Example:
>  
> diff --git a/drivers/phy/phy-rockchip-usb.c b/drivers/phy/phy-rockchip-usb.c
> index 734987fa0ad7..3378eeb7a562 100644
> --- a/drivers/phy/phy-rockchip-usb.c
> +++ b/drivers/phy/phy-rockchip-usb.c
> @@ -66,6 +66,7 @@ struct rockchip_usb_phy {
>  	struct phy	*phy;
>  	bool		uart_enabled;
>  	struct reset_control *reset;
> +	struct regulator *vbus;
>  };
>  
>  static int rockchip_usb_phy_power(struct rockchip_usb_phy *phy,
> @@ -88,6 +89,9 @@ static void rockchip_usb_phy480m_disable(struct clk_hw *hw)
>  						    struct rockchip_usb_phy,
>  						    clk480m_hw);
>  
> +	if (phy->vbus)
> +		regulator_disable(phy->vbus);
> +
>  	/* Power down usb phy analog blocks by set siddq 1 */
>  	rockchip_usb_phy_power(phy, 1);
>  }
> @@ -143,6 +147,14 @@ static int rockchip_usb_phy_power_on(struct phy *_phy)
>  	if (phy->uart_enabled)
>  		return -EBUSY;
>  
> +	if (phy->vbus) {
> +		int ret;
> +
> +		ret = regulator_enable(phy->vbus);
> +		if (ret)
> +			return ret;
> +	}
> +
>  	return clk_prepare_enable(phy->clk480m);
>  }
>  
> @@ -268,6 +280,13 @@ static int rockchip_usb_phy_init(struct rockchip_usb_phy_base *base,
>  	}
>  	phy_set_drvdata(rk_phy->phy, rk_phy);
>  
> +	rk_phy->vbus = devm_regulator_get_optional(&rk_phy->phy->dev, "vbus");
> +	if (IS_ERR(rk_phy->vbus)) {
> +		if (PTR_ERR(rk_phy->vbus) == -EPROBE_DEFER)
> +			return PTR_ERR(rk_phy->vbus);
> +		rk_phy->vbus = NULL;
> +	}
> +
>  	/*
>  	 * When acting as uart-pipe, just keep clock on otherwise
>  	 * only power up usb phy when it use, so disable it when init
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web