mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
mmc: sdhi/tmio: make DMA filter implementation specific
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>
This commit is contained in:
parent
fc79a4d6df
commit
03a0675b2a
3 changed files with 14 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -261,14 +261,6 @@ static void tmio_mmc_tasklet_fn(unsigned long arg)
|
|||
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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue