Commit 60a230e4 authored by Viresh Kumar's avatar Viresh Kumar Committed by Jeff Garzik

ata/pata_arasan_cf: fill dma chan->private from pdata->dma_priv

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: default avatarViresh Kumar <viresh.kumar@st.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 8d7b1c70
...@@ -210,6 +210,8 @@ struct arasan_cf_dev { ...@@ -210,6 +210,8 @@ struct arasan_cf_dev {
struct dma_chan *dma_chan; struct dma_chan *dma_chan;
/* Mask for DMA transfers */ /* Mask for DMA transfers */
dma_cap_mask_t mask; dma_cap_mask_t mask;
/* dma channel private data */
void *dma_priv;
/* DMA transfer work */ /* DMA transfer work */
struct work_struct work; struct work_struct work;
/* DMA delayed finish work */ /* DMA delayed finish work */
...@@ -356,6 +358,7 @@ static void dma_callback(void *dev) ...@@ -356,6 +358,7 @@ static void dma_callback(void *dev)
static bool filter(struct dma_chan *chan, void *slave) static bool filter(struct dma_chan *chan, void *slave)
{ {
chan->private = slave;
return true; return true;
} }
...@@ -526,7 +529,8 @@ static void data_xfer(struct work_struct *work) ...@@ -526,7 +529,8 @@ static void data_xfer(struct work_struct *work)
/* request dma channels */ /* request dma channels */
/* dma_request_channel may sleep, so calling from process context */ /* 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) { if (!acdev->dma_chan) {
dev_err(acdev->host->dev, "Unable to get dma_chan\n"); dev_err(acdev->host->dev, "Unable to get dma_chan\n");
goto chan_request_fail; goto chan_request_fail;
...@@ -853,6 +857,7 @@ static int __devinit arasan_cf_probe(struct platform_device *pdev) ...@@ -853,6 +857,7 @@ static int __devinit arasan_cf_probe(struct platform_device *pdev)
INIT_WORK(&acdev->work, data_xfer); INIT_WORK(&acdev->work, data_xfer);
INIT_DELAYED_WORK(&acdev->dwork, delayed_finish); INIT_DELAYED_WORK(&acdev->dwork, delayed_finish);
dma_cap_set(DMA_MEMCPY, acdev->mask); dma_cap_set(DMA_MEMCPY, acdev->mask);
acdev->dma_priv = pdata->dma_priv;
/* Handle platform specific quirks */ /* Handle platform specific quirks */
if (pdata->quirk) { if (pdata->quirk) {
......
...@@ -37,6 +37,8 @@ struct arasan_cf_pdata { ...@@ -37,6 +37,8 @@ struct arasan_cf_pdata {
#define CF_BROKEN_PIO (1) #define CF_BROKEN_PIO (1)
#define CF_BROKEN_MWDMA (1 << 1) #define CF_BROKEN_MWDMA (1 << 1)
#define CF_BROKEN_UDMA (1 << 2) #define CF_BROKEN_UDMA (1 << 2)
/* This is platform specific data for the DMA controller */
void *dma_priv;
}; };
static inline void static inline void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment