summaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2021-10-12 09:33:49 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-10-12 10:22:08 +0200
commit53b8106a66cf64b9110d7ffa58a71fe44c660c45 (patch)
tree0ac61150ba715846cba6e03909e285b03f7b3d11 /drivers/usb
parent7aabb508bc3e2d507b6b4bee18be6f53d32dc2e1 (diff)
downloadbarebox-53b8106a66cf64b9110d7ffa58a71fe44c660c45.tar.gz
barebox-53b8106a66cf64b9110d7ffa58a71fe44c660c45.tar.xz
usb: dwc3: reset controller before using it
Some dwc3 controllers have a reset assigned to them. Request it and reset the device before using it. Linux upstream driver uses an array of resets here, but in barebox we currently do have this functionality, so for now use the first reset only. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Link: https://lore.barebox.org/20211012073352.4071559-6-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/dwc3/core.c11
-rw-r--r--drivers/usb/dwc3/core.h2
2 files changed, 13 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 04b700d12d..f618435cb6 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -14,6 +14,7 @@
#include <dma.h>
#include <driver.h>
#include <init.h>
+#include <linux/reset.h>
#include "gadget.h"
#include "core.h"
@@ -1125,6 +1126,16 @@ static int dwc3_probe(struct device_d *dev)
if (ret)
return ret;
+ dwc->reset = reset_control_get(dev, NULL);
+ if (IS_ERR(dwc->reset)) {
+ dev_err(dev, "Failed to get reset control: %pe\n", dwc->reset);
+ return PTR_ERR(dwc->reset);
+ }
+
+ reset_control_assert(dwc->reset);
+ mdelay(1);
+ reset_control_deassert(dwc->reset);
+
dwc3_coresoft_reset(dwc);
dwc3_cache_hwparams(dwc);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index f2f7a311d1..94cc594920 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -1003,6 +1003,8 @@ struct dwc3 {
struct clk_bulk_data *clks;
int num_clks;
+ struct reset_control *reset;
+
struct phy *usb2_generic_phy;
struct phy *usb3_generic_phy;