summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJules Maselbas <jmaselbas@kalray.eu>2020-12-10 11:31:01 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2020-12-16 09:20:27 +0100
commit58a3a9c8fd96bdf7017ed69f485206ccfa5ba27d (patch)
tree75f4617339e2374a57deebd9cc2aa9b7121afadc
parent3dabf45ec41774b3555ba4715cf93a203582f426 (diff)
downloadbarebox-58a3a9c8fd96bdf7017ed69f485206ccfa5ba27d.tar.gz
barebox-58a3a9c8fd96bdf7017ed69f485206ccfa5ba27d.tar.xz
usb: dwc2: Add support for optional usb phy
Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/usb/dwc2/core.h2
-rw-r--r--drivers/usb/dwc2/dwc2.c25
-rw-r--r--drivers/usb/dwc2/dwc2.h1
3 files changed, 28 insertions, 0 deletions
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 090ca15fec..b9845b5524 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -466,6 +466,8 @@ struct dwc2 {
struct dwc2_hw_params hw_params;
struct dwc2_core_params params;
+ struct phy *phy; /* optional */
+
#ifdef CONFIG_USB_DWC2_HOST
struct usb_host host;
u8 in_data_toggle[MAX_DEVICE][MAX_ENDPOINT];
diff --git a/drivers/usb/dwc2/dwc2.c b/drivers/usb/dwc2/dwc2.c
index 282e6754b0..059e7d0e16 100644
--- a/drivers/usb/dwc2/dwc2.c
+++ b/drivers/usb/dwc2/dwc2.c
@@ -50,6 +50,19 @@ static int dwc2_probe(struct device_d *dev)
dwc2->regs = IOMEM(iores->start);
dwc2->dev = dev;
+ dwc2->phy = phy_optional_get(dev, "usb2-phy");
+ if (IS_ERR(dwc2->phy)) {
+ ret = PTR_ERR(dwc2->phy);
+ return ret;
+ }
+
+ ret = phy_init(dwc2->phy);
+ if (ret)
+ goto err_phy_init;
+ ret = phy_power_on(dwc2->phy);
+ if (ret)
+ goto err_phy_power;
+
ret = dwc2_core_snpsid(dwc2);
if (ret)
goto error;
@@ -77,7 +90,16 @@ static int dwc2_probe(struct device_d *dev)
else
ret = dwc2_set_mode(dwc2, dwc2->dr_mode);
+ if (ret)
+ goto error;
+
+ return 0;
error:
+ phy_power_off(dwc2->phy);
+err_phy_power:
+ phy_exit(dwc2->phy);
+err_phy_init:
+
return ret;
}
@@ -87,6 +109,9 @@ static void dwc2_remove(struct device_d *dev)
dwc2_host_uninit(dwc2);
dwc2_gadget_uninit(dwc2);
+
+ phy_power_off(dwc2->phy);
+ phy_exit(dwc2->phy);
}
static const struct of_device_id dwc2_platform_dt_ids[] = {
diff --git a/drivers/usb/dwc2/dwc2.h b/drivers/usb/dwc2/dwc2.h
index 30ad906656..196f4a07fa 100644
--- a/drivers/usb/dwc2/dwc2.h
+++ b/drivers/usb/dwc2/dwc2.h
@@ -2,6 +2,7 @@
#include <usb/usb.h>
#include <usb/usb_defs.h>
#include <usb/gadget.h>
+#include <linux/phy/phy.h>
#include "regs.h"
#include "core.h"