> From: linux-usb-owner@xxxxxxxxxxxxxxx [mailto:linux-usb-owner@xxxxxxxxxxxxxxx] On Behalf Of John Crispin > Sent: Thursday, October 16, 2014 1:34 PM > > 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; > + Please also add a kerneldoc header for this to the comment block. > 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; > + I guess you also need a patch to the platform code / dt bindings, to enable this? Or is it already there? Also, please CC Felipe (balbi@xxxxxx) on all dwc2 patches, since they are now going through his tree. -- Paul -- 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