]> git.itanic.dy.fi Git - linux-stable/commitdiff
dmaengine: dw-edma: Release requested IRQs on failure
authorSerge Semin <Sergey.Semin@baikalelectronics.ru>
Fri, 13 Jan 2023 17:13:44 +0000 (20:13 +0300)
committerLorenzo Pieralisi <lpieralisi@kernel.org>
Fri, 27 Jan 2023 16:15:33 +0000 (17:15 +0100)
If dw_edma_irq_request() fails to initialize an IRQ handler, any previously
requested IRQs will be left initialized.

Release the previously requested IRQs in the cleanup-on-error path of
dw_edma_irq_request().

Link: https://lore.kernel.org/r/20230113171409.30470-3-Sergey.Semin@baikalelectronics.ru
Fixes: e63d79d1ffcd ("dmaengine: Add Synopsys eDMA IP core driver")
Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Acked-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/dw-edma/dw-edma-core.c

index c54b24ff5206a39c93c2422b54f79864456f796a..a8c1bd9c7ae9bc5ee9837349bd18a4dc1f5d82ac 100644 (file)
@@ -893,10 +893,8 @@ static int dw_edma_irq_request(struct dw_edma *dw,
                                                dw_edma_interrupt_read,
                                          IRQF_SHARED, dw->name,
                                          &dw->irq[i]);
-                       if (err) {
-                               dw->nr_irqs = i;
-                               return err;
-                       }
+                       if (err)
+                               goto err_irq_free;
 
                        if (irq_get_msi_desc(irq))
                                get_cached_msi_msg(irq, &dw->irq[i].msi);
@@ -905,6 +903,14 @@ static int dw_edma_irq_request(struct dw_edma *dw,
                dw->nr_irqs = i;
        }
 
+       return 0;
+
+err_irq_free:
+       for  (i--; i >= 0; i--) {
+               irq = chip->ops->irq_vector(dev, i);
+               free_irq(irq, &dw->irq[i]);
+       }
+
        return err;
 }