]> rtime.felk.cvut.cz Git - vajnamar/linux-xlnx.git/blobdiff - drivers/dma/pl330.c
Merge tag 'v3.10' into master-next
[vajnamar/linux-xlnx.git] / drivers / dma / pl330.c
index a17553f7c02809325b06830d6eb1e36a4c95e435..2222d3e99a4e21c2812f0c3475b5b40f348ae05f 100644 (file)
@@ -587,6 +587,8 @@ struct dma_pl330_dmac {
 
        /* Peripheral channels connected to this DMAC */
        struct dma_pl330_chan *peripherals; /* keep at end */
+
+       u32 dma_channels;
 };
 
 struct dma_pl330_desc {
@@ -2910,11 +2912,17 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
 
        amba_set_drvdata(adev, pdmac);
 
-       irq = adev->irq[0];
-       ret = request_irq(irq, pl330_irq_handler, 0,
-                       dev_name(&adev->dev), pi);
-       if (ret)
-               return ret;
+       of_property_read_u32(adev->dev.of_node,
+                            "#dma-channels", &pdmac->dma_channels);
+
+       /* irq 0 is abort IRQ */
+       for (i = 1; i <= pdmac->dma_channels ; i++) {
+               irq = adev->irq[i];
+               ret = request_irq(irq, pl330_irq_handler, 0,
+                               dev_name(&adev->dev), pi);
+               if (ret)
+                       goto probe_err1;
+       }
 
        ret = pl330_add(pi);
        if (ret)
@@ -3022,7 +3030,8 @@ probe_err3:
 probe_err2:
        pl330_del(pi);
 probe_err1:
-       free_irq(irq, pi);
+       for (i = 1; i <= pdmac->dma_channels ; i++)
+               free_irq(adev->irq[i], pi);
 
        return ret;
 }
@@ -3032,7 +3041,7 @@ static int pl330_remove(struct amba_device *adev)
        struct dma_pl330_dmac *pdmac = amba_get_drvdata(adev);
        struct dma_pl330_chan *pch, *_p;
        struct pl330_info *pi;
-       int irq;
+       int i;
 
        if (!pdmac)
                return 0;
@@ -3059,8 +3068,8 @@ static int pl330_remove(struct amba_device *adev)
 
        pl330_del(pi);
 
-       irq = adev->irq[0];
-       free_irq(irq, pi);
+       for (i = 1; i <= pdmac->dma_channels ; i++)
+               free_irq(adev->irq[i], pi);
 
        return 0;
 }