/* Peripheral channels connected to this DMAC */
struct dma_pl330_chan *peripherals; /* keep at end */
+
+ u32 dma_channels;
};
struct dma_pl330_desc {
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)
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;
}
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;
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;
}