diff options
author | Jules Maselbas <jmaselbas@kalray.eu> | 2020-12-10 11:31:01 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-12-16 09:20:27 +0100 |
commit | 58a3a9c8fd96bdf7017ed69f485206ccfa5ba27d (patch) | |
tree | 75f4617339e2374a57deebd9cc2aa9b7121afadc | |
parent | 3dabf45ec41774b3555ba4715cf93a203582f426 (diff) | |
download | barebox-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.h | 2 | ||||
-rw-r--r-- | drivers/usb/dwc2/dwc2.c | 25 | ||||
-rw-r--r-- | drivers/usb/dwc2/dwc2.h | 1 |
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" |