ata/pata_arasan_cf: fill dma chan->private from pdata->dma_priv
authorViresh Kumar <viresh.kumar@st.com>
Fri, 4 Mar 2011 11:09:29 +0000 (16:39 +0530)
committerJeff Garzik <jgarzik@pobox.com>
Mon, 14 Mar 2011 06:58:03 +0000 (02:58 -0400)
Some DMA controllers (eg: drivers/dma/dw_dmac*) allow platform specific
configuration for dma transfers. User drivers need to set chan->private field
of channel with pointer to configuration data. This patch takes dma_priv data
from platform data and passes it to chan->private_data, in order to pass
platform specific configuration to DMAC controller.

Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/ata/pata_arasan_cf.c
include/linux/pata_arasan_cf_data.h

index 8b060c44bbe10f2ebd3356b4253b3a3656d9357a..65cee74605b4d53b29b7849559513fe51c4491a0 100644 (file)
@@ -210,6 +210,8 @@ struct arasan_cf_dev {
        struct dma_chan *dma_chan;
        /* Mask for DMA transfers */
        dma_cap_mask_t mask;
+       /* dma channel private data */
+       void *dma_priv;
        /* DMA transfer work */
        struct work_struct work;
        /* DMA delayed finish work */
@@ -356,6 +358,7 @@ static void dma_callback(void *dev)
 
 static bool filter(struct dma_chan *chan, void *slave)
 {
+       chan->private = slave;
        return true;
 }
 
@@ -526,7 +529,8 @@ static void data_xfer(struct work_struct *work)
 
        /* request dma channels */
        /* dma_request_channel may sleep, so calling from process context */
-       acdev->dma_chan = dma_request_channel(acdev->mask, filter, NULL);
+       acdev->dma_chan = dma_request_channel(acdev->mask, filter,
+                       acdev->dma_priv);
        if (!acdev->dma_chan) {
                dev_err(acdev->host->dev, "Unable to get dma_chan\n");
                goto chan_request_fail;
@@ -853,6 +857,7 @@ static int __devinit arasan_cf_probe(struct platform_device *pdev)
        INIT_WORK(&acdev->work, data_xfer);
        INIT_DELAYED_WORK(&acdev->dwork, delayed_finish);
        dma_cap_set(DMA_MEMCPY, acdev->mask);
+       acdev->dma_priv = pdata->dma_priv;
 
        /* Handle platform specific quirks */
        if (pdata->quirk) {
index d979fe6887968b97f103aba05b9cdf91f1405efd..a6ee9aa898bb7122e682ade64172fc568d98abd6 100644 (file)
@@ -37,6 +37,8 @@ struct arasan_cf_pdata {
        #define CF_BROKEN_PIO                   (1)
        #define CF_BROKEN_MWDMA                 (1 << 1)
        #define CF_BROKEN_UDMA                  (1 << 2)
+       /* This is platform specific data for the DMA controller */
+       void *dma_priv;
 };
 
 static inline void