* [PATCH 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
@ 2015-12-04 14:10 ` Jisheng Zhang
2015-12-04 14:13 ` Jisheng Zhang
2015-12-04 14:10 ` [PATCH 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd Jisheng Zhang
` (6 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:10 UTC (permalink / raw)
To: linux-arm-kernel
Commit 4718c1774051 ("usb: host: xhci-plat: add clock support") adds
optional clk support, but it forgets to prepare/disable and
enable/unprepare the clk in the resume/suspend path. This path fixes
this issue by adding missing clk related calls.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
Fixes: 4718c1774051 ("usb: host: xhci-plat: add clock support")
---
drivers/usb/host/xhci-plat.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 05647e6..b566304 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -226,6 +226,7 @@ static int xhci_plat_remove(struct platform_device *dev)
#ifdef CONFIG_PM_SLEEP
static int xhci_plat_suspend(struct device *dev)
{
+ int ret;
struct usb_hcd *hcd = dev_get_drvdata(dev);
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
@@ -237,14 +238,25 @@ static int xhci_plat_suspend(struct device *dev)
* reconsider this when xhci_plat_suspend enlarges its scope, e.g.,
* also applies to runtime suspend.
*/
- return xhci_suspend(xhci, device_may_wakeup(dev));
+ ret = xhci_suspend(xhci, device_may_wakeup(dev));
+ if (ret)
+ return ret;
+
+ clk_disable_unprepare(xhci->clk);
+
+ return ret;
}
static int xhci_plat_resume(struct device *dev)
{
+ int ret;
struct usb_hcd *hcd = dev_get_drvdata(dev);
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+ ret = clk_prepare_enable(xhci->clk);
+ if (ret)
+ return ret;
+
return xhci_resume(xhci, 0);
}
--
2.6.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists
2015-12-04 14:10 ` [PATCH 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists Jisheng Zhang
@ 2015-12-04 14:13 ` Jisheng Zhang
0 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:13 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
On Fri, 4 Dec 2015 22:10:46 +0800
Jisheng Zhang wrote:
> Commit 4718c1774051 ("usb: host: xhci-plat: add clock support") adds
> optional clk support, but it forgets to prepare/disable and
> enable/unprepare the clk in the resume/suspend path. This path fixes
> this issue by adding missing clk related calls.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> Fixes: 4718c1774051 ("usb: host: xhci-plat: add clock support")
> ---
> drivers/usb/host/xhci-plat.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index 05647e6..b566304 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -226,6 +226,7 @@ static int xhci_plat_remove(struct platform_device *dev)
> #ifdef CONFIG_PM_SLEEP
> static int xhci_plat_suspend(struct device *dev)
> {
> + int ret;
> struct usb_hcd *hcd = dev_get_drvdata(dev);
> struct xhci_hcd *xhci = hcd_to_xhci(hcd);
>
> @@ -237,14 +238,25 @@ static int xhci_plat_suspend(struct device *dev)
> * reconsider this when xhci_plat_suspend enlarges its scope, e.g.,
> * also applies to runtime suspend.
> */
> - return xhci_suspend(xhci, device_may_wakeup(dev));
> + ret = xhci_suspend(xhci, device_may_wakeup(dev));
> + if (ret)
> + return ret;
> +
> + clk_disable_unprepare(xhci->clk);
> +
> + return ret;
> }
>
> static int xhci_plat_resume(struct device *dev)
> {
> + int ret;
> struct usb_hcd *hcd = dev_get_drvdata(dev);
> struct xhci_hcd *xhci = hcd_to_xhci(hcd);
>
> + ret = clk_prepare_enable(xhci->clk);
> + if (ret)
> + return ret;
> +
> return xhci_resume(xhci, 0);
> }
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
2015-12-04 14:10 ` [PATCH 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists Jisheng Zhang
@ 2015-12-04 14:10 ` Jisheng Zhang
2015-12-04 14:14 ` Jisheng Zhang
2015-12-04 14:10 ` [PATCH 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists Jisheng Zhang
` (5 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:10 UTC (permalink / raw)
To: linux-arm-kernel
Commit 7b8ef22ea547 ("usb: xhci: plat: Add USB phy support") adds the
usb_phy for usb3, but it attached the usb_phy to incorrect hcd. The
xhci->shared_hcd is the hcd for usb3, this patch fixes this issue
by attach the usb_phy to the xhci->shared_hcd.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
drivers/usb/host/xhci-plat.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index b566304..a8c465a 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -82,6 +82,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
struct resource *res;
struct usb_hcd *hcd;
struct clk *clk;
+ struct usb_phy *usb_phy;
int ret;
int irq;
@@ -162,17 +163,18 @@ static int xhci_plat_probe(struct platform_device *pdev)
if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
xhci->shared_hcd->can_do_streams = 1;
- hcd->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
- if (IS_ERR(hcd->usb_phy)) {
- ret = PTR_ERR(hcd->usb_phy);
+ usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
+ if (IS_ERR(usb_phy)) {
+ ret = PTR_ERR(usb_phy);
if (ret == -EPROBE_DEFER)
goto put_usb3_hcd;
- hcd->usb_phy = NULL;
+ usb_phy = NULL;
} else {
- ret = usb_phy_init(hcd->usb_phy);
+ ret = usb_phy_init(usb_phy);
if (ret)
goto put_usb3_hcd;
}
+ xhci->shared_hcd->usb_phy = usb_phy;
ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (ret)
@@ -189,7 +191,7 @@ dealloc_usb2_hcd:
usb_remove_hcd(hcd);
disable_usb_phy:
- usb_phy_shutdown(hcd->usb_phy);
+ usb_phy_shutdown(usb_phy);
put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);
@@ -211,7 +213,7 @@ static int xhci_plat_remove(struct platform_device *dev)
struct clk *clk = xhci->clk;
usb_remove_hcd(xhci->shared_hcd);
- usb_phy_shutdown(hcd->usb_phy);
+ usb_phy_shutdown(xhci->shared_hcd->usb_phy);
usb_remove_hcd(hcd);
usb_put_hcd(xhci->shared_hcd);
--
2.6.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd
2015-12-04 14:10 ` [PATCH 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd Jisheng Zhang
@ 2015-12-04 14:14 ` Jisheng Zhang
0 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:14 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
On Fri, 4 Dec 2015 22:10:47 +0800
Jisheng Zhang wrote:
> Commit 7b8ef22ea547 ("usb: xhci: plat: Add USB phy support") adds the
> usb_phy for usb3, but it attached the usb_phy to incorrect hcd. The
> xhci->shared_hcd is the hcd for usb3, this patch fixes this issue
> by attach the usb_phy to the xhci->shared_hcd.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
> drivers/usb/host/xhci-plat.c | 16 +++++++++-------
> 1 file changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index b566304..a8c465a 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -82,6 +82,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
> struct resource *res;
> struct usb_hcd *hcd;
> struct clk *clk;
> + struct usb_phy *usb_phy;
> int ret;
> int irq;
>
> @@ -162,17 +163,18 @@ static int xhci_plat_probe(struct platform_device *pdev)
> if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
> xhci->shared_hcd->can_do_streams = 1;
>
> - hcd->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
> - if (IS_ERR(hcd->usb_phy)) {
> - ret = PTR_ERR(hcd->usb_phy);
> + usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
> + if (IS_ERR(usb_phy)) {
> + ret = PTR_ERR(usb_phy);
> if (ret == -EPROBE_DEFER)
> goto put_usb3_hcd;
> - hcd->usb_phy = NULL;
> + usb_phy = NULL;
> } else {
> - ret = usb_phy_init(hcd->usb_phy);
> + ret = usb_phy_init(usb_phy);
> if (ret)
> goto put_usb3_hcd;
> }
> + xhci->shared_hcd->usb_phy = usb_phy;
>
> ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
> if (ret)
> @@ -189,7 +191,7 @@ dealloc_usb2_hcd:
> usb_remove_hcd(hcd);
>
> disable_usb_phy:
> - usb_phy_shutdown(hcd->usb_phy);
> + usb_phy_shutdown(usb_phy);
>
> put_usb3_hcd:
> usb_put_hcd(xhci->shared_hcd);
> @@ -211,7 +213,7 @@ static int xhci_plat_remove(struct platform_device *dev)
> struct clk *clk = xhci->clk;
>
> usb_remove_hcd(xhci->shared_hcd);
> - usb_phy_shutdown(hcd->usb_phy);
> + usb_phy_shutdown(xhci->shared_hcd->usb_phy);
>
> usb_remove_hcd(hcd);
> usb_put_hcd(xhci->shared_hcd);
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
2015-12-04 14:10 ` [PATCH 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists Jisheng Zhang
2015-12-04 14:10 ` [PATCH 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd Jisheng Zhang
@ 2015-12-04 14:10 ` Jisheng Zhang
2015-12-04 14:15 ` Jisheng Zhang
2015-12-04 14:10 ` [PATCH 4/7] usb: xhci: plat: sort the headers in alphabetic order Jisheng Zhang
` (4 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:10 UTC (permalink / raw)
To: linux-arm-kernel
Commit 7b8ef22ea547 ("usb: xhci: plat: Add USB phy support") adds the
usb_phy for usb3, but it forgets to shutdown/init the usb_phy in the
suspend/resume path. This patch fixes this issue by adding missing
usb_phy related calls.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
drivers/usb/host/xhci-plat.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index a8c465a..cd49ae5 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -244,6 +244,7 @@ static int xhci_plat_suspend(struct device *dev)
if (ret)
return ret;
+ usb_phy_shutdown(xhci->shared_hcd->usb_phy);
clk_disable_unprepare(xhci->clk);
return ret;
@@ -259,6 +260,10 @@ static int xhci_plat_resume(struct device *dev)
if (ret)
return ret;
+ ret = usb_phy_init(xhci->shared_hcd->usb_phy);
+ if (ret)
+ return ret;
+
return xhci_resume(xhci, 0);
}
--
2.6.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists
2015-12-04 14:10 ` [PATCH 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists Jisheng Zhang
@ 2015-12-04 14:15 ` Jisheng Zhang
0 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:15 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
On Fri, 4 Dec 2015 22:10:48 +0800
Jisheng Zhang wrote:
> Commit 7b8ef22ea547 ("usb: xhci: plat: Add USB phy support") adds the
> usb_phy for usb3, but it forgets to shutdown/init the usb_phy in the
> suspend/resume path. This patch fixes this issue by adding missing
> usb_phy related calls.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
> drivers/usb/host/xhci-plat.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index a8c465a..cd49ae5 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -244,6 +244,7 @@ static int xhci_plat_suspend(struct device *dev)
> if (ret)
> return ret;
>
> + usb_phy_shutdown(xhci->shared_hcd->usb_phy);
> clk_disable_unprepare(xhci->clk);
>
> return ret;
> @@ -259,6 +260,10 @@ static int xhci_plat_resume(struct device *dev)
> if (ret)
> return ret;
>
> + ret = usb_phy_init(xhci->shared_hcd->usb_phy);
> + if (ret)
> + return ret;
> +
> return xhci_resume(xhci, 0);
> }
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 4/7] usb: xhci: plat: sort the headers in alphabetic order
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (2 preceding siblings ...)
2015-12-04 14:10 ` [PATCH 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists Jisheng Zhang
@ 2015-12-04 14:10 ` Jisheng Zhang
2015-12-04 14:18 ` Jisheng Zhang
2015-12-04 14:10 ` [PATCH 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path Jisheng Zhang
` (3 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:10 UTC (permalink / raw)
To: linux-arm-kernel
Sorting the headers in alphabetic order will help to reduce the conflict
when adding new headers later.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
drivers/usb/host/xhci-plat.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index cd49ae5..d990135 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -11,15 +11,15 @@
* version 2 as published by the Free Software Foundation.
*/
+#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/dma-mapping.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
-#include <linux/usb/phy.h>
#include <linux/slab.h>
+#include <linux/usb/phy.h>
#include <linux/usb/xhci_pdriver.h>
-#include <linux/acpi.h>
#include "xhci.h"
#include "xhci-mvebu.h"
--
2.6.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 4/7] usb: xhci: plat: sort the headers in alphabetic order
2015-12-04 14:10 ` [PATCH 4/7] usb: xhci: plat: sort the headers in alphabetic order Jisheng Zhang
@ 2015-12-04 14:18 ` Jisheng Zhang
0 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:18 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
On Fri, 4 Dec 2015 22:10:49 +0800
Jisheng Zhang wrote:
> Sorting the headers in alphabetic order will help to reduce the conflict
> when adding new headers later.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
> drivers/usb/host/xhci-plat.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index cd49ae5..d990135 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -11,15 +11,15 @@
> * version 2 as published by the Free Software Foundation.
> */
>
> +#include <linux/acpi.h>
> #include <linux/clk.h>
> #include <linux/dma-mapping.h>
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/platform_device.h>
> -#include <linux/usb/phy.h>
> #include <linux/slab.h>
> +#include <linux/usb/phy.h>
> #include <linux/usb/xhci_pdriver.h>
> -#include <linux/acpi.h>
>
> #include "xhci.h"
> #include "xhci-mvebu.h"
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (3 preceding siblings ...)
2015-12-04 14:10 ` [PATCH 4/7] usb: xhci: plat: sort the headers in alphabetic order Jisheng Zhang
@ 2015-12-04 14:10 ` Jisheng Zhang
2015-12-04 14:19 ` Jisheng Zhang
2015-12-04 14:10 ` [PATCH 6/7] usb: xhci: plat: add generic PHY support Jisheng Zhang
` (2 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:10 UTC (permalink / raw)
To: linux-arm-kernel
Commit 63589e92c2d9 ("clk: Ignore error and NULL pointers passed to
clk_{unprepare, disable}()") allows NULL or error pointer to be passed
unconditionally.
This patch is to simplify probe error and remove code paths.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
drivers/usb/host/xhci-plat.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index d990135..62f02e5 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -197,8 +197,7 @@ put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);
disable_clk:
- if (!IS_ERR(clk))
- clk_disable_unprepare(clk);
+ clk_disable_unprepare(clk);
put_hcd:
usb_put_hcd(hcd);
@@ -218,8 +217,7 @@ static int xhci_plat_remove(struct platform_device *dev)
usb_remove_hcd(hcd);
usb_put_hcd(xhci->shared_hcd);
- if (!IS_ERR(clk))
- clk_disable_unprepare(clk);
+ clk_disable_unprepare(clk);
usb_put_hcd(hcd);
return 0;
--
2.6.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path
2015-12-04 14:10 ` [PATCH 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path Jisheng Zhang
@ 2015-12-04 14:19 ` Jisheng Zhang
0 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:19 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
On Fri, 4 Dec 2015 22:10:50 +0800
Jisheng Zhang wrote:
> Commit 63589e92c2d9 ("clk: Ignore error and NULL pointers passed to
> clk_{unprepare, disable}()") allows NULL or error pointer to be passed
> unconditionally.
>
> This patch is to simplify probe error and remove code paths.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
> drivers/usb/host/xhci-plat.c | 6 ++----
> 1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index d990135..62f02e5 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -197,8 +197,7 @@ put_usb3_hcd:
> usb_put_hcd(xhci->shared_hcd);
>
> disable_clk:
> - if (!IS_ERR(clk))
> - clk_disable_unprepare(clk);
> + clk_disable_unprepare(clk);
>
> put_hcd:
> usb_put_hcd(hcd);
> @@ -218,8 +217,7 @@ static int xhci_plat_remove(struct platform_device *dev)
> usb_remove_hcd(hcd);
> usb_put_hcd(xhci->shared_hcd);
>
> - if (!IS_ERR(clk))
> - clk_disable_unprepare(clk);
> + clk_disable_unprepare(clk);
> usb_put_hcd(hcd);
>
> return 0;
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 6/7] usb: xhci: plat: add generic PHY support
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (4 preceding siblings ...)
2015-12-04 14:10 ` [PATCH 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path Jisheng Zhang
@ 2015-12-04 14:10 ` Jisheng Zhang
2015-12-04 14:20 ` Jisheng Zhang
2015-12-04 14:10 ` [PATCH 7/7] usb: xhci: plat: add vbus regulator control Jisheng Zhang
2015-12-04 14:13 ` [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
7 siblings, 1 reply; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:10 UTC (permalink / raw)
To: linux-arm-kernel
Marvell BG4CT SoC needs two phy: one for usb2 and another for usb3. Add
the calls to retrieve generic PHY to xhci plat in order to support this.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
drivers/usb/host/xhci-plat.c | 87 ++++++++++++++++++++++++++++++++++++++------
1 file changed, 75 insertions(+), 12 deletions(-)
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 62f02e5..bb972a6 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -16,6 +16,7 @@
#include <linux/dma-mapping.h>
#include <linux/module.h>
#include <linux/of.h>
+#include <linux/phy/phy.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/usb/phy.h>
@@ -73,6 +74,37 @@ static int xhci_plat_start(struct usb_hcd *hcd)
return xhci_run(hcd);
}
+static int xhci_plat_phy_init(struct usb_hcd *hcd)
+{
+ int ret;
+
+ if (hcd->phy) {
+ ret = phy_init(hcd->phy);
+ if (ret)
+ return ret;
+
+ ret = phy_power_on(hcd->phy);
+ if (ret) {
+ phy_exit(hcd->phy);
+ return ret;
+ }
+ } else {
+ ret = usb_phy_init(hcd->usb_phy);
+ }
+
+ return ret;
+}
+
+static void xhci_plat_phy_exit(struct usb_hcd *hcd)
+{
+ if (hcd->phy) {
+ phy_power_off(hcd->phy);
+ phy_exit(hcd->phy);
+ } else {
+ usb_phy_shutdown(hcd->usb_phy);
+ }
+}
+
static int xhci_plat_probe(struct platform_device *pdev)
{
struct device_node *node = pdev->dev.of_node;
@@ -83,6 +115,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
struct usb_hcd *hcd;
struct clk *clk;
struct usb_phy *usb_phy;
+ struct phy *phy;
int ret;
int irq;
@@ -163,22 +196,44 @@ static int xhci_plat_probe(struct platform_device *pdev)
if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
xhci->shared_hcd->can_do_streams = 1;
+ hcd->phy = devm_phy_get(&pdev->dev, "usb2-phy");
+ if (IS_ERR(hcd->phy)) {
+ ret = PTR_ERR(hcd->phy);
+ if (ret == -EPROBE_DEFER)
+ goto put_usb3_hcd;
+ hcd->phy = NULL;
+ }
+
+ phy = devm_phy_get(&pdev->dev, "usb-phy");
+ if (IS_ERR(phy)) {
+ ret = PTR_ERR(phy);
+ if (ret == -EPROBE_DEFER)
+ goto put_usb3_hcd;
+ phy = NULL;
+ }
+
usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
if (IS_ERR(usb_phy)) {
ret = PTR_ERR(usb_phy);
if (ret == -EPROBE_DEFER)
goto put_usb3_hcd;
usb_phy = NULL;
- } else {
- ret = usb_phy_init(usb_phy);
- if (ret)
- goto put_usb3_hcd;
}
+
xhci->shared_hcd->usb_phy = usb_phy;
+ xhci->shared_hcd->phy = phy;
+
+ ret = xhci_plat_phy_init(hcd);
+ if (ret)
+ goto put_usb3_hcd;
+
+ ret = xhci_plat_phy_init(xhci->shared_hcd);
+ if (ret)
+ goto disable_usb2_phy;
ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (ret)
- goto disable_usb_phy;
+ goto disable_usb3_phy;
ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
if (ret)
@@ -190,8 +245,11 @@ static int xhci_plat_probe(struct platform_device *pdev)
dealloc_usb2_hcd:
usb_remove_hcd(hcd);
-disable_usb_phy:
- usb_phy_shutdown(usb_phy);
+disable_usb3_phy:
+ xhci_plat_phy_exit(xhci->shared_hcd);
+
+disable_usb2_phy:
+ xhci_plat_phy_exit(hcd);
put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);
@@ -212,11 +270,11 @@ static int xhci_plat_remove(struct platform_device *dev)
struct clk *clk = xhci->clk;
usb_remove_hcd(xhci->shared_hcd);
- usb_phy_shutdown(xhci->shared_hcd->usb_phy);
-
- usb_remove_hcd(hcd);
+ xhci_plat_phy_exit(xhci->shared_hcd);
usb_put_hcd(xhci->shared_hcd);
+ usb_remove_hcd(hcd);
+ xhci_plat_phy_exit(hcd);
clk_disable_unprepare(clk);
usb_put_hcd(hcd);
@@ -242,7 +300,8 @@ static int xhci_plat_suspend(struct device *dev)
if (ret)
return ret;
- usb_phy_shutdown(xhci->shared_hcd->usb_phy);
+ xhci_plat_phy_exit(xhci->shared_hcd);
+ xhci_plat_phy_exit(hcd);
clk_disable_unprepare(xhci->clk);
return ret;
@@ -258,7 +317,11 @@ static int xhci_plat_resume(struct device *dev)
if (ret)
return ret;
- ret = usb_phy_init(xhci->shared_hcd->usb_phy);
+ ret = xhci_plat_phy_init(hcd);
+ if (ret)
+ return ret;
+
+ ret = xhci_plat_phy_init(xhci->shared_hcd);
if (ret)
return ret;
--
2.6.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 6/7] usb: xhci: plat: add generic PHY support
2015-12-04 14:10 ` [PATCH 6/7] usb: xhci: plat: add generic PHY support Jisheng Zhang
@ 2015-12-04 14:20 ` Jisheng Zhang
0 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:20 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
On Fri, 4 Dec 2015 22:10:51 +0800
Jisheng Zhang wrote:
> Marvell BG4CT SoC needs two phy: one for usb2 and another for usb3. Add
> the calls to retrieve generic PHY to xhci plat in order to support this.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
> drivers/usb/host/xhci-plat.c | 87 ++++++++++++++++++++++++++++++++++++++------
> 1 file changed, 75 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index 62f02e5..bb972a6 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -16,6 +16,7 @@
> #include <linux/dma-mapping.h>
> #include <linux/module.h>
> #include <linux/of.h>
> +#include <linux/phy/phy.h>
> #include <linux/platform_device.h>
> #include <linux/slab.h>
> #include <linux/usb/phy.h>
> @@ -73,6 +74,37 @@ static int xhci_plat_start(struct usb_hcd *hcd)
> return xhci_run(hcd);
> }
>
> +static int xhci_plat_phy_init(struct usb_hcd *hcd)
> +{
> + int ret;
> +
> + if (hcd->phy) {
> + ret = phy_init(hcd->phy);
> + if (ret)
> + return ret;
> +
> + ret = phy_power_on(hcd->phy);
> + if (ret) {
> + phy_exit(hcd->phy);
> + return ret;
> + }
> + } else {
> + ret = usb_phy_init(hcd->usb_phy);
> + }
> +
> + return ret;
> +}
> +
> +static void xhci_plat_phy_exit(struct usb_hcd *hcd)
> +{
> + if (hcd->phy) {
> + phy_power_off(hcd->phy);
> + phy_exit(hcd->phy);
> + } else {
> + usb_phy_shutdown(hcd->usb_phy);
> + }
> +}
> +
> static int xhci_plat_probe(struct platform_device *pdev)
> {
> struct device_node *node = pdev->dev.of_node;
> @@ -83,6 +115,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
> struct usb_hcd *hcd;
> struct clk *clk;
> struct usb_phy *usb_phy;
> + struct phy *phy;
> int ret;
> int irq;
>
> @@ -163,22 +196,44 @@ static int xhci_plat_probe(struct platform_device *pdev)
> if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
> xhci->shared_hcd->can_do_streams = 1;
>
> + hcd->phy = devm_phy_get(&pdev->dev, "usb2-phy");
> + if (IS_ERR(hcd->phy)) {
> + ret = PTR_ERR(hcd->phy);
> + if (ret == -EPROBE_DEFER)
> + goto put_usb3_hcd;
> + hcd->phy = NULL;
> + }
> +
> + phy = devm_phy_get(&pdev->dev, "usb-phy");
> + if (IS_ERR(phy)) {
> + ret = PTR_ERR(phy);
> + if (ret == -EPROBE_DEFER)
> + goto put_usb3_hcd;
> + phy = NULL;
> + }
> +
> usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
> if (IS_ERR(usb_phy)) {
> ret = PTR_ERR(usb_phy);
> if (ret == -EPROBE_DEFER)
> goto put_usb3_hcd;
> usb_phy = NULL;
> - } else {
> - ret = usb_phy_init(usb_phy);
> - if (ret)
> - goto put_usb3_hcd;
> }
> +
> xhci->shared_hcd->usb_phy = usb_phy;
> + xhci->shared_hcd->phy = phy;
> +
> + ret = xhci_plat_phy_init(hcd);
> + if (ret)
> + goto put_usb3_hcd;
> +
> + ret = xhci_plat_phy_init(xhci->shared_hcd);
> + if (ret)
> + goto disable_usb2_phy;
>
> ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
> if (ret)
> - goto disable_usb_phy;
> + goto disable_usb3_phy;
>
> ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
> if (ret)
> @@ -190,8 +245,11 @@ static int xhci_plat_probe(struct platform_device *pdev)
> dealloc_usb2_hcd:
> usb_remove_hcd(hcd);
>
> -disable_usb_phy:
> - usb_phy_shutdown(usb_phy);
> +disable_usb3_phy:
> + xhci_plat_phy_exit(xhci->shared_hcd);
> +
> +disable_usb2_phy:
> + xhci_plat_phy_exit(hcd);
>
> put_usb3_hcd:
> usb_put_hcd(xhci->shared_hcd);
> @@ -212,11 +270,11 @@ static int xhci_plat_remove(struct platform_device *dev)
> struct clk *clk = xhci->clk;
>
> usb_remove_hcd(xhci->shared_hcd);
> - usb_phy_shutdown(xhci->shared_hcd->usb_phy);
> -
> - usb_remove_hcd(hcd);
> + xhci_plat_phy_exit(xhci->shared_hcd);
> usb_put_hcd(xhci->shared_hcd);
>
> + usb_remove_hcd(hcd);
> + xhci_plat_phy_exit(hcd);
> clk_disable_unprepare(clk);
> usb_put_hcd(hcd);
>
> @@ -242,7 +300,8 @@ static int xhci_plat_suspend(struct device *dev)
> if (ret)
> return ret;
>
> - usb_phy_shutdown(xhci->shared_hcd->usb_phy);
> + xhci_plat_phy_exit(xhci->shared_hcd);
> + xhci_plat_phy_exit(hcd);
> clk_disable_unprepare(xhci->clk);
>
> return ret;
> @@ -258,7 +317,11 @@ static int xhci_plat_resume(struct device *dev)
> if (ret)
> return ret;
>
> - ret = usb_phy_init(xhci->shared_hcd->usb_phy);
> + ret = xhci_plat_phy_init(hcd);
> + if (ret)
> + return ret;
> +
> + ret = xhci_plat_phy_init(xhci->shared_hcd);
> if (ret)
> return ret;
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 7/7] usb: xhci: plat: add vbus regulator control
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (5 preceding siblings ...)
2015-12-04 14:10 ` [PATCH 6/7] usb: xhci: plat: add generic PHY support Jisheng Zhang
@ 2015-12-04 14:10 ` Jisheng Zhang
2015-12-04 14:20 ` Jisheng Zhang
2015-12-04 14:13 ` [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
7 siblings, 1 reply; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:10 UTC (permalink / raw)
To: linux-arm-kernel
The Marvell BG4CT STB board has board level vbus control through gpio.
This patch adds the vbus regulator control to support this board.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
---
drivers/usb/host/xhci-plat.c | 39 ++++++++++++++++++++++++++++++++++++++-
drivers/usb/host/xhci.h | 2 ++
2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index bb972a6..9bf44569 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -18,6 +18,7 @@
#include <linux/of.h>
#include <linux/phy/phy.h>
#include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <linux/usb/phy.h>
#include <linux/usb/xhci_pdriver.h>
@@ -116,6 +117,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
struct clk *clk;
struct usb_phy *usb_phy;
struct phy *phy;
+ struct regulator *vbus;
int ret;
int irq;
@@ -179,14 +181,31 @@ static int xhci_plat_probe(struct platform_device *pdev)
device_wakeup_enable(hcd->self.controller);
+ vbus = devm_regulator_get(&pdev->dev, "vbus");
+ if (PTR_ERR(vbus) == -ENODEV) {
+ vbus = NULL;
+ } else if (IS_ERR(vbus)) {
+ ret = PTR_ERR(vbus);
+ goto disable_clk;
+ } else {
+ ret = regulator_enable(vbus);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "failed to enable usb vbus regulator: %d\n",
+ ret);
+ goto disable_clk;
+ }
+ }
+
xhci = hcd_to_xhci(hcd);
xhci->clk = clk;
+ xhci->vbus = vbus;
xhci->main_hcd = hcd;
xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev,
dev_name(&pdev->dev), hcd);
if (!xhci->shared_hcd) {
ret = -ENOMEM;
- goto disable_clk;
+ goto disable_vbus;
}
if ((node && of_property_read_bool(node, "usb3-lpm-capable")) ||
@@ -254,6 +273,10 @@ disable_usb2_phy:
put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);
+disable_vbus:
+ if (!vbus)
+ regulator_disable(vbus);
+
disable_clk:
clk_disable_unprepare(clk);
@@ -268,6 +291,7 @@ static int xhci_plat_remove(struct platform_device *dev)
struct usb_hcd *hcd = platform_get_drvdata(dev);
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
struct clk *clk = xhci->clk;
+ struct regulator *vbus = xhci->vbus;
usb_remove_hcd(xhci->shared_hcd);
xhci_plat_phy_exit(xhci->shared_hcd);
@@ -278,6 +302,9 @@ static int xhci_plat_remove(struct platform_device *dev)
clk_disable_unprepare(clk);
usb_put_hcd(hcd);
+ if (!vbus)
+ regulator_disable(vbus);
+
return 0;
}
@@ -287,6 +314,7 @@ static int xhci_plat_suspend(struct device *dev)
int ret;
struct usb_hcd *hcd = dev_get_drvdata(dev);
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+ struct regulator *vbus = xhci->vbus;
/*
* xhci_suspend() needs `do_wakeup` to know whether host is allowed
@@ -303,6 +331,8 @@ static int xhci_plat_suspend(struct device *dev)
xhci_plat_phy_exit(xhci->shared_hcd);
xhci_plat_phy_exit(hcd);
clk_disable_unprepare(xhci->clk);
+ if (!vbus)
+ ret = regulator_disable(vbus);
return ret;
}
@@ -312,11 +342,18 @@ static int xhci_plat_resume(struct device *dev)
int ret;
struct usb_hcd *hcd = dev_get_drvdata(dev);
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+ struct regulator *vbus = xhci->vbus;
ret = clk_prepare_enable(xhci->clk);
if (ret)
return ret;
+ if (!vbus) {
+ ret = regulator_enable(vbus);
+ if (ret)
+ return ret;
+ }
+
ret = xhci_plat_phy_init(hcd);
if (ret)
return ret;
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 0b94512..1355d2a 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1541,6 +1541,8 @@ struct xhci_hcd {
struct msix_entry *msix_entries;
/* optional clock */
struct clk *clk;
+ /* optional regulator */
+ struct regulator *vbus;
/* data structures */
struct xhci_device_context_array *dcbaa;
struct xhci_ring *cmd_ring;
--
2.6.2
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 7/7] usb: xhci: plat: add vbus regulator control
2015-12-04 14:10 ` [PATCH 7/7] usb: xhci: plat: add vbus regulator control Jisheng Zhang
@ 2015-12-04 14:20 ` Jisheng Zhang
0 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:20 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
On Fri, 4 Dec 2015 22:10:52 +0800
Jisheng Zhang wrote:
> The Marvell BG4CT STB board has board level vbus control through gpio.
> This patch adds the vbus regulator control to support this board.
>
> Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
> ---
> drivers/usb/host/xhci-plat.c | 39 ++++++++++++++++++++++++++++++++++++++-
> drivers/usb/host/xhci.h | 2 ++
> 2 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index bb972a6..9bf44569 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -18,6 +18,7 @@
> #include <linux/of.h>
> #include <linux/phy/phy.h>
> #include <linux/platform_device.h>
> +#include <linux/regulator/consumer.h>
> #include <linux/slab.h>
> #include <linux/usb/phy.h>
> #include <linux/usb/xhci_pdriver.h>
> @@ -116,6 +117,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
> struct clk *clk;
> struct usb_phy *usb_phy;
> struct phy *phy;
> + struct regulator *vbus;
> int ret;
> int irq;
>
> @@ -179,14 +181,31 @@ static int xhci_plat_probe(struct platform_device *pdev)
>
> device_wakeup_enable(hcd->self.controller);
>
> + vbus = devm_regulator_get(&pdev->dev, "vbus");
> + if (PTR_ERR(vbus) == -ENODEV) {
> + vbus = NULL;
> + } else if (IS_ERR(vbus)) {
> + ret = PTR_ERR(vbus);
> + goto disable_clk;
> + } else {
> + ret = regulator_enable(vbus);
> + if (ret) {
> + dev_err(&pdev->dev,
> + "failed to enable usb vbus regulator: %d\n",
> + ret);
> + goto disable_clk;
> + }
> + }
> +
> xhci = hcd_to_xhci(hcd);
> xhci->clk = clk;
> + xhci->vbus = vbus;
> xhci->main_hcd = hcd;
> xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev,
> dev_name(&pdev->dev), hcd);
> if (!xhci->shared_hcd) {
> ret = -ENOMEM;
> - goto disable_clk;
> + goto disable_vbus;
> }
>
> if ((node && of_property_read_bool(node, "usb3-lpm-capable")) ||
> @@ -254,6 +273,10 @@ disable_usb2_phy:
> put_usb3_hcd:
> usb_put_hcd(xhci->shared_hcd);
>
> +disable_vbus:
> + if (!vbus)
> + regulator_disable(vbus);
> +
> disable_clk:
> clk_disable_unprepare(clk);
>
> @@ -268,6 +291,7 @@ static int xhci_plat_remove(struct platform_device *dev)
> struct usb_hcd *hcd = platform_get_drvdata(dev);
> struct xhci_hcd *xhci = hcd_to_xhci(hcd);
> struct clk *clk = xhci->clk;
> + struct regulator *vbus = xhci->vbus;
>
> usb_remove_hcd(xhci->shared_hcd);
> xhci_plat_phy_exit(xhci->shared_hcd);
> @@ -278,6 +302,9 @@ static int xhci_plat_remove(struct platform_device *dev)
> clk_disable_unprepare(clk);
> usb_put_hcd(hcd);
>
> + if (!vbus)
> + regulator_disable(vbus);
> +
> return 0;
> }
>
> @@ -287,6 +314,7 @@ static int xhci_plat_suspend(struct device *dev)
> int ret;
> struct usb_hcd *hcd = dev_get_drvdata(dev);
> struct xhci_hcd *xhci = hcd_to_xhci(hcd);
> + struct regulator *vbus = xhci->vbus;
>
> /*
> * xhci_suspend() needs `do_wakeup` to know whether host is allowed
> @@ -303,6 +331,8 @@ static int xhci_plat_suspend(struct device *dev)
> xhci_plat_phy_exit(xhci->shared_hcd);
> xhci_plat_phy_exit(hcd);
> clk_disable_unprepare(xhci->clk);
> + if (!vbus)
> + ret = regulator_disable(vbus);
>
> return ret;
> }
> @@ -312,11 +342,18 @@ static int xhci_plat_resume(struct device *dev)
> int ret;
> struct usb_hcd *hcd = dev_get_drvdata(dev);
> struct xhci_hcd *xhci = hcd_to_xhci(hcd);
> + struct regulator *vbus = xhci->vbus;
>
> ret = clk_prepare_enable(xhci->clk);
> if (ret)
> return ret;
>
> + if (!vbus) {
> + ret = regulator_enable(vbus);
> + if (ret)
> + return ret;
> + }
> +
> ret = xhci_plat_phy_init(hcd);
> if (ret)
> return ret;
> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> index 0b94512..1355d2a 100644
> --- a/drivers/usb/host/xhci.h
> +++ b/drivers/usb/host/xhci.h
> @@ -1541,6 +1541,8 @@ struct xhci_hcd {
> struct msix_entry *msix_entries;
> /* optional clock */
> struct clk *clk;
> + /* optional regulator */
> + struct regulator *vbus;
> /* data structures */
> struct xhci_device_context_array *dcbaa;
> struct xhci_ring *cmd_ring;
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator
2015-12-04 14:10 [PATCH 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (6 preceding siblings ...)
2015-12-04 14:10 ` [PATCH 7/7] usb: xhci: plat: add vbus regulator control Jisheng Zhang
@ 2015-12-04 14:13 ` Jisheng Zhang
7 siblings, 0 replies; 16+ messages in thread
From: Jisheng Zhang @ 2015-12-04 14:13 UTC (permalink / raw)
To: linux-arm-kernel
cc linux-usb at vger.kernel.org
Sorry, I forget to do so. Will cc linux-usb in the future.
On Fri, 4 Dec 2015 22:10:45 +0800
Jisheng Zhang wrote:
> The Marvell BG4CT has xhci controller. This controller has two phys:
> one for usb2 and another for usb3. BG4CT boards have board level vbus
> control through gpio.
>
> I plan to add the xhci support in two steps: first of all, add generic
> PHY and vbus regulator control support to the xhci-plat driver. Then
> add the usb2 and usb3 phy drivers, after that, we add the phy and xhci
> nodes in the dtsi.
>
> This series takes the first step. The first three patches are bug fix.
> Then two clean up patches. The last two patches add generic PHY and
> vbus regulator control support.
>
>
> Jisheng Zhang (7):
> usb: xhci: plat: Fix suspend/resume when the optional clk exists
> usb: xhci: plat: attach the usb_phy to the correct hcd
> usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists
> usb: xhci: plat: sort the headers in alphabetic order
> usb: xhci: plat: Remove checks for optional clock in error/remove path
> usb: xhci: plat: add generic PHY support
> usb: xhci: plat: add vbus regulator control
>
> drivers/usb/host/xhci-plat.c | 159 +++++++++++++++++++++++++++++++++++++------
> drivers/usb/host/xhci.h | 2 +
> 2 files changed, 140 insertions(+), 21 deletions(-)
>
^ permalink raw reply [flat|nested] 16+ messages in thread