Message ID | 20190128160323.28170-3-angus@akkea.ca (mailing list archive) |
---|---|
State | Mainlined, archived |
Commit | de7b7dca8735f720793dae8ad818091309979c39 |
Headers | show |
Series | dmaengine: imx-sdma: add the sdma engine to the imx8mq | expand |
On Mon, Jan 28, 2019 at 6:04 PM Angus Ainslie (Purism) <angus@akkea.ca> wrote: > > On i.mx8mq, there are two sdma instances, and the common dma framework > will get a channel dynamically from any available sdma instance whether > it's the first sdma device or the second sdma device. Some IPs like > SAI only work with sdma2 not sdma1. To make sure the sdma channel is from > the correct sdma device, use the node pointer to match. > > Signed-off-by: Angus Ainslie (Purism) <angus@akkea.ca> > Reviewed-by: Lucas Stach <l.stach@pengutronix.de> Thanks Angus for the patch! Tested-by: Daniel Baluta <daniel.baluta@nxp.com> > --- > drivers/dma/imx-sdma.c | 6 ++++++ > include/linux/platform_data/dma-imx.h | 1 + > 2 files changed, 7 insertions(+) > > diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c > index 757fad2fbfae..d2fae53be689 100644 > --- a/drivers/dma/imx-sdma.c > +++ b/drivers/dma/imx-sdma.c > @@ -1914,11 +1914,16 @@ static int sdma_init(struct sdma_engine *sdma) > static bool sdma_filter_fn(struct dma_chan *chan, void *fn_param) > { > struct sdma_channel *sdmac = to_sdma_chan(chan); > + struct sdma_engine *sdma = sdmac->sdma; > struct imx_dma_data *data = fn_param; > > if (!imx_dma_is_general_purpose(chan)) > return false; > > + /* return false if it's not the right device */ > + if (sdma->dev->of_node != data->of_node) > + return false; > + > sdmac->data = *data; > chan->private = &sdmac->data; > > @@ -1946,6 +1951,7 @@ static struct dma_chan *sdma_xlate(struct of_phandle_args *dma_spec, > * be set to sdmac->event_id1. > */ > data.dma_request2 = 0; > + data.of_node = ofdma->of_node; > > return dma_request_channel(mask, sdma_filter_fn, &data); > } > diff --git a/include/linux/platform_data/dma-imx.h b/include/linux/platform_data/dma-imx.h > index 7d964e787299..9daea8d42a10 100644 > --- a/include/linux/platform_data/dma-imx.h > +++ b/include/linux/platform_data/dma-imx.h > @@ -55,6 +55,7 @@ struct imx_dma_data { > int dma_request2; /* secondary DMA request line */ > enum sdma_peripheral_type peripheral_type; > int priority; > + struct device_node *of_node; > }; > > static inline int imx_dma_is_ipu(struct dma_chan *chan) > -- > 2.17.1 >
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index 757fad2fbfae..d2fae53be689 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c @@ -1914,11 +1914,16 @@ static int sdma_init(struct sdma_engine *sdma) static bool sdma_filter_fn(struct dma_chan *chan, void *fn_param) { struct sdma_channel *sdmac = to_sdma_chan(chan); + struct sdma_engine *sdma = sdmac->sdma; struct imx_dma_data *data = fn_param; if (!imx_dma_is_general_purpose(chan)) return false; + /* return false if it's not the right device */ + if (sdma->dev->of_node != data->of_node) + return false; + sdmac->data = *data; chan->private = &sdmac->data; @@ -1946,6 +1951,7 @@ static struct dma_chan *sdma_xlate(struct of_phandle_args *dma_spec, * be set to sdmac->event_id1. */ data.dma_request2 = 0; + data.of_node = ofdma->of_node; return dma_request_channel(mask, sdma_filter_fn, &data); } diff --git a/include/linux/platform_data/dma-imx.h b/include/linux/platform_data/dma-imx.h index 7d964e787299..9daea8d42a10 100644 --- a/include/linux/platform_data/dma-imx.h +++ b/include/linux/platform_data/dma-imx.h @@ -55,6 +55,7 @@ struct imx_dma_data { int dma_request2; /* secondary DMA request line */ enum sdma_peripheral_type peripheral_type; int priority; + struct device_node *of_node; }; static inline int imx_dma_is_ipu(struct dma_chan *chan)