[PATCH V2] dma: imx-dma: Add oftree support
Arnd Bergmann
arnd at arndb.de
Sat Feb 23 17:16:21 EST 2013
On Saturday 23 February 2013, Markus Pargmann wrote:
> +Required properties:
> +- compatible : Should be "fsl,<chip>-dma". chip can be imx1, imx21 or imx27
> +- reg : Should contain DMA registers location and length
> +- interrupts : First item should be DMA interrupt, second one is optional and
> + should contain DMA Error interrupt
> +- #dma-cells : Has to be 1. imx-dma does not support anything else.
Hmm, so #dma-cells is 1
> @@ -996,13 +1020,33 @@ static void imxdma_issue_pending(struct dma_chan *chan)
> spin_unlock_irqrestore(&imxdma->lock, flags);
> }
>
> +bool imxdma_filter_fn(struct dma_chan *chan, void *param)
> +{
> + struct imx_dma_data *data = kzalloc(sizeof(*data), GFP_KERNEL);
> + printk("%s\n", __func__);
> +
> + if (!data)
> + return false;
> +
> + data->dma_request = *(unsigned *) param;
> + data->alloc_ctl_filter = true;
> + chan->private = data;
> +
> + return true;
> +}
which matches the usage here, but
> diff --git a/include/linux/platform_data/dma-imx.h b/include/linux/platform_data/dma-imx.h
> index f6d30cc..762a7d0 100644
> --- a/include/linux/platform_data/dma-imx.h
> +++ b/include/linux/platform_data/dma-imx.h
> @@ -51,6 +51,9 @@ struct imx_dma_data {
> int dma_request; /* DMA request line */
> enum sdma_peripheral_type peripheral_type;
> int priority;
> +
> + /* Did the controller's filter function allocated this object? */
> + bool alloc_ctl_filter;
> };
There are actually two more members in the imx_dma_data structure. Shouldn't those
be encoded in the dma specifier as well?
> static inline int imx_dma_is_ipu(struct dma_chan *chan)
> @@ -63,7 +66,8 @@ static inline int imx_dma_is_general_purpose(struct dma_chan *chan)
> return strstr(dev_name(chan->device->dev), "sdma") ||
> !strcmp(dev_name(chan->device->dev), "imx1-dma") ||
> !strcmp(dev_name(chan->device->dev), "imx21-dma") ||
> - !strcmp(dev_name(chan->device->dev), "imx27-dma");
> + !strcmp(dev_name(chan->device->dev), "imx27-dma") ||
> + !strcmp(chan->device->dev->driver->name, "imx-dma");
> }
Also, your filter function does not actually check
imx_dma_is_general_purpose() as the old style filter functions
in the slave drivers do, which breaks when you have more than one dma engine
in the system.
I think you have to provide your own xlate function, and pass the controller
and multiple cells into the filter function, or use no filter at all but instead
find a way to get a channel directly.
Arnd
More information about the linux-arm-kernel
mailing list