[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