mmc: sdhi/tmio: make DMA filter implementation specific
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Fri, 26 Apr 2013 15:47:17 +0000 (17:47 +0200)
committerChris Ball <cjb@laptop.org>
Sun, 26 May 2013 18:23:19 +0000 (14:23 -0400)
So far only the SDHI implementation uses TMIO MMC with DMA. That way a DMA
channel filter function, defined in the TMIO driver wasn't a problem.
However, such a filter function is DMA controller specific. Since the SDHI
glue is only running on systems with the SHDMA DMA controller, the filter
function can safely be provided by it. Move it into SDHI.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski+renesas@gmail.com>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sh_mobile_sdhi.c
drivers/mmc/host/tmio_mmc_dma.c
include/linux/mfd/tmio.h

index fe90853900b47787fe060937aea2fda9d30e65bf..e0088d7f5f85f91f5fd9ee9cd77691760b5c46b6 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <linux/kernel.h>
 #include <linux/clk.h>
+#include <linux/dmaengine.h>
 #include <linux/slab.h>
 #include <linux/mod_devicetable.h>
 #include <linux/module.h>
@@ -124,6 +125,13 @@ static void sh_mobile_sdhi_cd_wakeup(const struct platform_device *pdev)
        mmc_detect_change(dev_get_drvdata(&pdev->dev), msecs_to_jiffies(100));
 }
 
+static bool sh_mobile_sdhi_filter(struct dma_chan *chan, void *arg)
+{
+       dev_dbg(chan->device->dev, "%s: slave data %p\n", __func__, arg);
+       chan->private = arg;
+       return true;
+}
+
 static const struct sh_mobile_sdhi_ops sdhi_ops = {
        .cd_wakeup = sh_mobile_sdhi_cd_wakeup,
 };
@@ -191,6 +199,7 @@ static int sh_mobile_sdhi_probe(struct platform_device *pdev)
                        priv->dma_priv.chan_priv_tx = &priv->param_tx.shdma_slave;
                        priv->dma_priv.chan_priv_rx = &priv->param_rx.shdma_slave;
                        priv->dma_priv.alignment_shift = 1; /* 2-byte alignment */
+                       priv->dma_priv.filter = sh_mobile_sdhi_filter;
                        mmc_data->dma = &priv->dma_priv;
                }
        }
index fff9286048594fa7dad59922ea382af76901450b..dc4b10b9c72accfc7291ec00548067810233d884 100644 (file)
@@ -261,14 +261,6 @@ out:
        spin_unlock_irq(&host->lock);
 }
 
-/* It might be necessary to make filter MFD specific */
-static bool tmio_mmc_filter(struct dma_chan *chan, void *arg)
-{
-       dev_dbg(chan->device->dev, "%s: slave data %p\n", __func__, arg);
-       chan->private = arg;
-       return true;
-}
-
 void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdata)
 {
        /* We can only either use DMA for both Tx and Rx or not use it at all */
@@ -281,7 +273,7 @@ void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdat
                dma_cap_zero(mask);
                dma_cap_set(DMA_SLAVE, mask);
 
-               host->chan_tx = dma_request_channel(mask, tmio_mmc_filter,
+               host->chan_tx = dma_request_channel(mask, pdata->dma->filter,
                                                    pdata->dma->chan_priv_tx);
                dev_dbg(&host->pdev->dev, "%s: TX: got channel %p\n", __func__,
                        host->chan_tx);
@@ -289,7 +281,7 @@ void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdat
                if (!host->chan_tx)
                        return;
 
-               host->chan_rx = dma_request_channel(mask, tmio_mmc_filter,
+               host->chan_rx = dma_request_channel(mask, pdata->dma->filter,
                                                    pdata->dma->chan_priv_rx);
                dev_dbg(&host->pdev->dev, "%s: RX: got channel %p\n", __func__,
                        host->chan_rx);
index 99bf3e6659977e183977b5429cb34a1dfa87e0c6..0990d8a2dbd732825094ada47070cba84cb5e78c 100644 (file)
@@ -81,10 +81,13 @@ int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);
 void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);
 void tmio_core_mmc_clk_div(void __iomem *cnf, int shift, int state);
 
+struct dma_chan;
+
 struct tmio_mmc_dma {
        void *chan_priv_tx;
        void *chan_priv_rx;
        int alignment_shift;
+       bool (*filter)(struct dma_chan *chan, void *arg);
 };
 
 struct tmio_mmc_host;
This page took 0.027884 seconds and 5 git commands to generate.