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
quoted hunk
@@ -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
quoted hunk
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?
quoted hunk
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