]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
dmaengine: imx-sdma: add a test for imx8mq multi sdma devices
authorAngus Ainslie (Purism) <angus@akkea.ca>
Mon, 28 Jan 2019 16:03:22 +0000 (09:03 -0700)
committerVinod Koul <vkoul@kernel.org>
Mon, 25 Feb 2019 17:55:51 +0000 (23:25 +0530)
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>
Tested-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/imx-sdma.c
include/linux/platform_data/dma-imx.h

index fc8bc80617d87c3ddf943eba3f5456e2a448604a..8fb0cd293b54b20e7db4f754346f432e508ff759 100644 (file)
@@ -1913,11 +1913,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;
 
@@ -1945,6 +1950,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);
 }
index 7d964e787299e88f7450d8d0d8b1ebf58d57b78e..9daea8d42a10bf91697f4ec9183232956ed3598a 100644 (file)
@@ -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)