summaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc2
diff options
context:
space:
mode:
authorStefan Wahren <stefan.wahren@i2se.com>2015-11-12 16:08:34 -0500
committerFelipe Balbi <balbi@ti.com>2015-11-20 10:29:47 -0500
commitf74875dc36135ebae82a8e005f4b7f52289d2c40 (patch)
tree5c6d6d7c9a600b47cdcc32deacd49da6e38bfead /drivers/usb/dwc2
parent5c256b68348e9717c8ba23521ef52ef7f69d4448 (diff)
usb: dwc2: fix kernel oops during driver probe
This patch make sure that all necessary members of dwc2_hsotg are initialized before the irq handler is requested. So the kernel oops triggered by dwc2_handle_common_intr has been fixed. dwc2 20980000.usb: Configuration mismatch. Forcing host mode dwc2 20980000.usb: no platform data or transceiver defined Unable to handle kernel paging request at virtual address cc860040 pgd = c0004000 [cc860040] *pgd=0b41e811, *pte=00000000, *ppte=00000000 Internal error: Oops: 7 [#1] ARM CPU: 0 PID: 1 Comm: swapper Not tainted 4.3.0-rc3+ #19 Hardware name: BCM2835 task: cb494000 ti: cb4d0000 task.ti: cb4d0000 PC is at dwc2_is_controller_alive+0x18/0x34 LR is at dwc2_handle_common_intr+0x24/0xb60 Acked-by: John Youn <johnyoun@synopsys.com> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc2')
-rw-r--r--drivers/usb/dwc2/platform.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index 91e2e6b86c7c..39c1cbf0e75d 100644
--- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c
@@ -367,20 +367,6 @@ static int dwc2_driver_probe(struct platform_device *dev)
367 if (retval) 367 if (retval)
368 return retval; 368 return retval;
369 369
370 irq = platform_get_irq(dev, 0);
371 if (irq < 0) {
372 dev_err(&dev->dev, "missing IRQ resource\n");
373 return irq;
374 }
375
376 dev_dbg(hsotg->dev, "registering common handler for irq%d\n",
377 irq);
378 retval = devm_request_irq(hsotg->dev, irq,
379 dwc2_handle_common_intr, IRQF_SHARED,
380 dev_name(hsotg->dev), hsotg);
381 if (retval)
382 return retval;
383
384 res = platform_get_resource(dev, IORESOURCE_MEM, 0); 370 res = platform_get_resource(dev, IORESOURCE_MEM, 0);
385 hsotg->regs = devm_ioremap_resource(&dev->dev, res); 371 hsotg->regs = devm_ioremap_resource(&dev->dev, res);
386 if (IS_ERR(hsotg->regs)) 372 if (IS_ERR(hsotg->regs))
@@ -415,6 +401,20 @@ static int dwc2_driver_probe(struct platform_device *dev)
415 401
416 dwc2_set_all_params(hsotg->core_params, -1); 402 dwc2_set_all_params(hsotg->core_params, -1);
417 403
404 irq = platform_get_irq(dev, 0);
405 if (irq < 0) {
406 dev_err(&dev->dev, "missing IRQ resource\n");
407 return irq;
408 }
409
410 dev_dbg(hsotg->dev, "registering common handler for irq%d\n",
411 irq);
412 retval = devm_request_irq(hsotg->dev, irq,
413 dwc2_handle_common_intr, IRQF_SHARED,
414 dev_name(hsotg->dev), hsotg);
415 if (retval)
416 return retval;
417
418 retval = dwc2_lowlevel_hw_enable(hsotg); 418 retval = dwc2_lowlevel_hw_enable(hsotg);
419 if (retval) 419 if (retval)
420 return retval; 420 return retval;