| From 38397fe2c0a5e15d6f932ecac5495e8fa2a5421d Mon Sep 17 00:00:00 2001 |
| From: Aaro Koskinen <aaro.koskinen@iki.fi> |
| Date: Sun, 25 Nov 2018 00:17:04 +0200 |
| Subject: USB: omap_udc: use devm_request_irq() |
| |
| [ Upstream commit 286afdde1640d8ea8916a0f05e811441fbbf4b9d ] |
| |
| The current code fails to release the third irq on the error path |
| (observed by reading the code), and we get also multiple WARNs with |
| failing gadget drivers due to duplicate IRQ releases. Fix by using |
| devm_request_irq(). |
| |
| Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/gadget/udc/omap_udc.c | 37 +++++++++---------------------- |
| 1 file changed, 10 insertions(+), 27 deletions(-) |
| |
| diff --git a/drivers/usb/gadget/udc/omap_udc.c b/drivers/usb/gadget/udc/omap_udc.c |
| index dcdfea46003b..b1f64608c373 100644 |
| --- a/drivers/usb/gadget/udc/omap_udc.c |
| +++ b/drivers/usb/gadget/udc/omap_udc.c |
| @@ -2865,8 +2865,8 @@ static int omap_udc_probe(struct platform_device *pdev) |
| udc->clr_halt = UDC_RESET_EP; |
| |
| /* USB general purpose IRQ: ep0, state changes, dma, etc */ |
| - status = request_irq(pdev->resource[1].start, omap_udc_irq, |
| - 0, driver_name, udc); |
| + status = devm_request_irq(&pdev->dev, pdev->resource[1].start, |
| + omap_udc_irq, 0, driver_name, udc); |
| if (status != 0) { |
| ERR("can't get irq %d, err %d\n", |
| (int) pdev->resource[1].start, status); |
| @@ -2874,20 +2874,20 @@ static int omap_udc_probe(struct platform_device *pdev) |
| } |
| |
| /* USB "non-iso" IRQ (PIO for all but ep0) */ |
| - status = request_irq(pdev->resource[2].start, omap_udc_pio_irq, |
| - 0, "omap_udc pio", udc); |
| + status = devm_request_irq(&pdev->dev, pdev->resource[2].start, |
| + omap_udc_pio_irq, 0, "omap_udc pio", udc); |
| if (status != 0) { |
| ERR("can't get irq %d, err %d\n", |
| (int) pdev->resource[2].start, status); |
| - goto cleanup2; |
| + goto cleanup1; |
| } |
| #ifdef USE_ISO |
| - status = request_irq(pdev->resource[3].start, omap_udc_iso_irq, |
| - 0, "omap_udc iso", udc); |
| + status = devm_request_irq(&pdev->dev, pdev->resource[3].start, |
| + omap_udc_iso_irq, 0, "omap_udc iso", udc); |
| if (status != 0) { |
| ERR("can't get irq %d, err %d\n", |
| (int) pdev->resource[3].start, status); |
| - goto cleanup3; |
| + goto cleanup1; |
| } |
| #endif |
| if (cpu_is_omap16xx() || cpu_is_omap7xx()) { |
| @@ -2900,22 +2900,11 @@ static int omap_udc_probe(struct platform_device *pdev) |
| create_proc_file(); |
| status = usb_add_gadget_udc_release(&pdev->dev, &udc->gadget, |
| omap_udc_release); |
| - if (status) |
| - goto cleanup4; |
| - |
| - return 0; |
| + if (!status) |
| + return 0; |
| |
| -cleanup4: |
| remove_proc_file(); |
| |
| -#ifdef USE_ISO |
| -cleanup3: |
| - free_irq(pdev->resource[2].start, udc); |
| -#endif |
| - |
| -cleanup2: |
| - free_irq(pdev->resource[1].start, udc); |
| - |
| cleanup1: |
| kfree(udc); |
| udc = NULL; |
| @@ -2959,12 +2948,6 @@ static int omap_udc_remove(struct platform_device *pdev) |
| |
| remove_proc_file(); |
| |
| -#ifdef USE_ISO |
| - free_irq(pdev->resource[3].start, udc); |
| -#endif |
| - free_irq(pdev->resource[2].start, udc); |
| - free_irq(pdev->resource[1].start, udc); |
| - |
| if (udc->dc_clk) { |
| if (udc->clk_requested) |
| omap_udc_enable_clock(0); |
| -- |
| 2.19.1 |
| |