> -----Original Message----- > From: Lars-Peter Clausen <lars@xxxxxxxxxx> > Sent: Wednesday, December 8, 2021 5:12 PM > To: Vinod Koul <vkoul@xxxxxxxxxx> > Cc: Michal Simek <michals@xxxxxxxxxx>; Radhey Shyam Pandey > <radheys@xxxxxxxxxx>; dmaengine@xxxxxxxxxxxxxxx; Lars-Peter Clausen > <lars@xxxxxxxxxx> > Subject: [PATCH] dmaengine: xilinx: Handle IRQ mapping errors > > Handle errors when trying to map the IRQ for the DMA channels. > > The main motivation here is to be able to handle probe deferral. E.g. when > using DT overlays it is possible that the DMA controller is probed before > interrupt controller, depending on the order in the DT. > > In order to support this switch from irq_of_parse_and_map() to of_irq_get(), > which internally does the same, but it will return EPROBE_DEFER when the > interrupt controller is not yet available. > > As a result other errors, such as an invalid IRQ specification, or missing IRQ are > also properly handled. > > Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx> Reviewed-by: Radhey Shyam Pandey <radhey.shyam.pandey@xxxxxxxxxx> Thanks! > --- > drivers/dma/xilinx/xilinx_dma.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c > index 61618148f9d4..cd62bbb50e8b 100644 > --- a/drivers/dma/xilinx/xilinx_dma.c > +++ b/drivers/dma/xilinx/xilinx_dma.c > @@ -2980,7 +2980,9 @@ static int xilinx_dma_chan_probe(struct > xilinx_dma_device *xdev, > } > > /* Request the interrupt */ > - chan->irq = irq_of_parse_and_map(node, chan->tdest); > + chan->irq = of_irq_get(node, chan->tdest); > + if (chan->irq < 0) > + return dev_err_probe(xdev->dev, chan->irq, "failed to get > irq\n"); > err = request_irq(chan->irq, xdev->dma_config->irq_handler, > IRQF_SHARED, "xilinx-dma-controller", chan); > if (err) { > @@ -3054,8 +3056,11 @@ static int xilinx_dma_child_probe(struct > xilinx_dma_device *xdev, > if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA && ret < > 0) > dev_warn(xdev->dev, "missing dma-channels property\n"); > > - for (i = 0; i < nr_channels; i++) > - xilinx_dma_chan_probe(xdev, node); > + for (i = 0; i < nr_channels; i++) { > + ret = xilinx_dma_chan_probe(xdev, node); > + if (ret) > + return ret; > + } > > return 0; > } > -- > 2.30.2