* [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator
@ 2015-12-07 12:49 Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists Jisheng Zhang
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 UTC (permalink / raw)
To: linux-arm-kernel
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.
Since v1:
- fix NULL pointer dereference in [PATCH 7/7]
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(-)
--
2.6.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
@ 2015-12-07 12:49 ` Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd Jisheng Zhang
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 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] 8+ messages in thread
* [PATCH v2 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists Jisheng Zhang
@ 2015-12-07 12:49 ` Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists Jisheng Zhang
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 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] 8+ messages in thread
* [PATCH v2 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd Jisheng Zhang
@ 2015-12-07 12:49 ` Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 4/7] usb: xhci: plat: sort the headers in alphabetic order Jisheng Zhang
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 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] 8+ messages in thread
* [PATCH v2 4/7] usb: xhci: plat: sort the headers in alphabetic order
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (2 preceding siblings ...)
2015-12-07 12:49 ` [PATCH v2 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists Jisheng Zhang
@ 2015-12-07 12:49 ` Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path Jisheng Zhang
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 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] 8+ messages in thread
* [PATCH v2 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (3 preceding siblings ...)
2015-12-07 12:49 ` [PATCH v2 4/7] usb: xhci: plat: sort the headers in alphabetic order Jisheng Zhang
@ 2015-12-07 12:49 ` Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 6/7] usb: xhci: plat: add generic PHY support Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 7/7] usb: xhci: plat: add vbus regulator control Jisheng Zhang
6 siblings, 0 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 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] 8+ messages in thread
* [PATCH v2 6/7] usb: xhci: plat: add generic PHY support
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (4 preceding siblings ...)
2015-12-07 12:49 ` [PATCH v2 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path Jisheng Zhang
@ 2015-12-07 12:49 ` Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 7/7] usb: xhci: plat: add vbus regulator control Jisheng Zhang
6 siblings, 0 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 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] 8+ messages in thread
* [PATCH v2 7/7] usb: xhci: plat: add vbus regulator control
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
` (5 preceding siblings ...)
2015-12-07 12:49 ` [PATCH v2 6/7] usb: xhci: plat: add generic PHY support Jisheng Zhang
@ 2015-12-07 12:49 ` Jisheng Zhang
6 siblings, 0 replies; 8+ messages in thread
From: Jisheng Zhang @ 2015-12-07 12:49 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..c03e8d5 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 if (vbus) {
+ 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] 8+ messages in thread
end of thread, other threads:[~2015-12-07 12:49 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-07 12:49 [PATCH v2 0/7] usb: xhci-plat: support generic PHY and vbus regulator Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 1/7] usb: xhci: plat: Fix suspend/resume when the optional clk exists Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 2/7] usb: xhci: plat: attach the usb_phy to the correct hcd Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 3/7] usb: xhci: plat: Fix suspend/resume when the optional usb_phy exists Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 4/7] usb: xhci: plat: sort the headers in alphabetic order Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 5/7] usb: xhci: plat: Remove checks for optional clock in error/remove path Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 6/7] usb: xhci: plat: add generic PHY support Jisheng Zhang
2015-12-07 12:49 ` [PATCH v2 7/7] usb: xhci: plat: add vbus regulator control Jisheng Zhang
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).