aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/mmp_pdma.c
diff options
context:
space:
mode:
authorDaniel Mack <zonque@gmail.com>2013-08-10 12:52:18 -0400
committerVinod Koul <vinod.koul@intel.com>2013-08-14 04:25:15 -0400
commit13b3006b8ebd60926a60fc378ff6fe8affa9a194 (patch)
tree93c92d4f95fc53ab9f8e5e14ee7c2e21e2141781 /drivers/dma/mmp_pdma.c
parent1ac0e845c10685f3643fe81a08c13be4b9416bce (diff)
dma: mmp_pdma: add filter function
PXA peripherals need to obtain specific DMA request ids which will eventually be stored in the DRCMR register. Currently, clients are expected to store that number inside the slave config block as slave_id, which is unfortunately incompatible with the way DMA resources are handled in DT environments. This patch adds a filter function which stores the filter parameter passed in by of-dma.c into the channel's drcmr register. For backward compatability, cfg->slave_id is still used if set to a non-zero value. Signed-off-by: Daniel Mack <zonque@gmail.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/mmp_pdma.c')
-rw-r--r--drivers/dma/mmp_pdma.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/dma/mmp_pdma.c b/drivers/dma/mmp_pdma.c
index eb75d4b4bafe..dd024d4759e7 100644
--- a/drivers/dma/mmp_pdma.c
+++ b/drivers/dma/mmp_pdma.c
@@ -19,6 +19,7 @@
19#include <linux/dmapool.h> 19#include <linux/dmapool.h>
20#include <linux/of_device.h> 20#include <linux/of_device.h>
21#include <linux/of.h> 21#include <linux/of.h>
22#include <linux/dma/mmp-pdma.h>
22 23
23#include "dmaengine.h" 24#include "dmaengine.h"
24 25
@@ -635,8 +636,13 @@ static int mmp_pdma_control(struct dma_chan *dchan, enum dma_ctrl_cmd cmd,
635 chan->dcmd |= DCMD_BURST32; 636 chan->dcmd |= DCMD_BURST32;
636 637
637 chan->dir = cfg->direction; 638 chan->dir = cfg->direction;
638 chan->drcmr = cfg->slave_id;
639 chan->dev_addr = addr; 639 chan->dev_addr = addr;
640 /* FIXME: drivers should be ported over to use the filter
641 * function. Once that's done, the following two lines can
642 * be removed.
643 */
644 if (cfg->slave_id)
645 chan->drcmr = cfg->slave_id;
640 break; 646 break;
641 default: 647 default:
642 return -ENOSYS; 648 return -ENOSYS;
@@ -877,6 +883,19 @@ static struct platform_driver mmp_pdma_driver = {
877 .remove = mmp_pdma_remove, 883 .remove = mmp_pdma_remove,
878}; 884};
879 885
886bool mmp_pdma_filter_fn(struct dma_chan *chan, void *param)
887{
888 struct mmp_pdma_chan *c = to_mmp_pdma_chan(chan);
889
890 if (chan->device->dev->driver != &mmp_pdma_driver.driver)
891 return false;
892
893 c->drcmr = *(unsigned int *) param;
894
895 return true;
896}
897EXPORT_SYMBOL_GPL(mmp_pdma_filter_fn);
898
880module_platform_driver(mmp_pdma_driver); 899module_platform_driver(mmp_pdma_driver);
881 900
882MODULE_DESCRIPTION("MARVELL MMP Periphera DMA Driver"); 901MODULE_DESCRIPTION("MARVELL MMP Periphera DMA Driver");