[PATCH V2] USB: dwc2: add support for the reset_controller api

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We need this for dwc2 to work on older ralink SoC like the rt3052. Without, we
see the following when loading the driver:

[    0.760000] dwc2 101c0000.usb: Bad value for GSNPSID: 0x00000000

Signed-off-by: John Crispin <blogic@xxxxxxxxxxx>
---
Changes since V1
* move the OF lookup call into the platform code
* add code to the cleanup path that puts the core back into reset

 drivers/usb/dwc2/core.h     |    3 +++
 drivers/usb/dwc2/hcd.c      |   11 +++++++++++
 drivers/usb/dwc2/platform.c |    5 +++++
 3 files changed, 19 insertions(+)

diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 1efd10c..8dfd16a 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -42,6 +42,7 @@
 #include <linux/usb/gadget.h>
 #include <linux/usb/otg.h>
 #include <linux/usb/phy.h>
+#include <linux/reset.h>
 #include "hw.h"
 
 #ifdef DWC2_LOG_WRITES
@@ -596,6 +597,8 @@ struct dwc2_hsotg {
 	unsigned int queuing_high_bandwidth:1;
 	unsigned int srp_success:1;
 
+	struct reset_control *reset_control;
+
 	struct workqueue_struct *wq_otg;
 	struct work_struct wf_otg;
 	struct timer_list wkp_timer;
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index 4d918ed..ff2ca4b 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -2764,6 +2764,14 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
 
 	dev_dbg(hsotg->dev, "DWC OTG HCD INIT\n");
 
+	/* bring the device out of reset */
+	if (hsotg->reset_control) {
+		int retval = reset_control_deassert(hsotg->reset_control);
+
+		if (retval)
+			return retval;
+	}
+
 	/* Detect config values from hardware */
 	retval = dwc2_get_hwparams(hsotg);
 
@@ -2973,6 +2981,9 @@ void dwc2_hcd_remove(struct dwc2_hsotg *hsotg)
 	dwc2_hcd_release(hsotg);
 	usb_put_hcd(hcd);
 
+	if (hsotg->reset_control)
+		reset_control_assert(hsotg->reset_control);
+
 #ifdef CONFIG_USB_DWC2_TRACK_MISSED_SOFS
 	kfree(hsotg->last_frame_num_array);
 	kfree(hsotg->frame_num_array);
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index a10e7a3..6d74583 100644
--- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c
@@ -120,6 +120,7 @@ static int dwc2_driver_probe(struct platform_device *dev)
 	const struct dwc2_core_params *params;
 	struct dwc2_core_params defparams;
 	struct dwc2_hsotg *hsotg;
+	struct reset_control *reset_control;
 	struct resource *res;
 	int retval;
 	int irq;
@@ -171,6 +172,10 @@ static int dwc2_driver_probe(struct platform_device *dev)
 	dev_dbg(&dev->dev, "mapped PA %08lx to VA %p\n",
 		(unsigned long)res->start, hsotg->regs);
 
+	reset_control = devm_reset_control_get(&dev->dev, NULL);
+	if (!IS_ERR(reset_control))
+		hsotg->reset_control = reset_control;
+
 	retval = dwc2_hcd_init(hsotg, irq, params);
 	if (retval)
 		return retval;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux