On Fri, Jun 21, 2024 at 06:49:32PM +0800, Joy Zou wrote: > Check src ID to detect misuse of same src ID for multiple DMA channels. > > Signed-off-by: Joy Zou <joy.zou@xxxxxxx> Reviewed-by: Frank Li <Frank.Li@xxxxxxx> > --- > drivers/dma/fsl-edma-main.c | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c > index d4f29ece69f5..47939d010e59 100644 > --- a/drivers/dma/fsl-edma-main.c > +++ b/drivers/dma/fsl-edma-main.c > @@ -100,6 +100,22 @@ static irqreturn_t fsl_edma_irq_handler(int irq, void *dev_id) > return fsl_edma_err_handler(irq, dev_id); > } > > +static bool fsl_edma_srcid_in_use(struct fsl_edma_engine *fsl_edma, u32 srcid) > +{ > + struct fsl_edma_chan *fsl_chan; > + int i; > + > + for (i = 0; i < fsl_edma->n_chans; i++) { > + fsl_chan = &fsl_edma->chans[i]; > + > + if (fsl_chan->srcid && srcid == fsl_chan->srcid) { > + dev_err(&fsl_chan->pdev->dev, "The srcid is using! Can't use repeatly."); > + return true; > + } > + } > + return false; > +} > + > static struct dma_chan *fsl_edma_xlate(struct of_phandle_args *dma_spec, > struct of_dma *ofdma) > { > @@ -117,6 +133,10 @@ static struct dma_chan *fsl_edma_xlate(struct of_phandle_args *dma_spec, > list_for_each_entry_safe(chan, _chan, &fsl_edma->dma_dev.channels, device_node) { > if (chan->client_count) > continue; > + > + if (fsl_edma_srcid_in_use(fsl_edma, dma_spec->args[1])) > + return NULL; > + > if ((chan->chan_id / chans_per_mux) == dma_spec->args[0]) { > chan = dma_get_slave_channel(chan); > if (chan) { > @@ -161,6 +181,8 @@ static struct dma_chan *fsl_edma3_xlate(struct of_phandle_args *dma_spec, > continue; > > fsl_chan = to_fsl_edma_chan(chan); > + if (fsl_edma_srcid_in_use(fsl_edma, dma_spec->args[0])) > + return NULL; > i = fsl_chan - fsl_edma->chans; > > fsl_chan->priority = dma_spec->args[1]; > -- > 2.37.1 >