| From e269a3b04e790e2b0c18d19a64358706363f9ace Mon Sep 17 00:00:00 2001 |
| From: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
| Date: Tue, 30 Aug 2011 18:26:39 +0200 |
| Subject: mmc: sh_mmcif: simplify platform data |
| |
| Provide platforms with a simplified way to specify MMCIF DMA slave IDs in |
| a way, similar to SDHI and other sh_dma clients. |
| |
| Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
| Signed-off-by: Chris Ball <cjb@laptop.org> |
| (cherry picked from commit 714c4a6e3a0f730834ec8a8bc83b2a6da33f54dc) |
| |
| Signed-off-by: Simon Horman <horms@verge.net.au> |
| --- |
| drivers/mmc/host/sh_mmcif.c | 20 ++++++++++++++++---- |
| include/linux/mmc/sh_mmcif.h | 4 +++- |
| 2 files changed, 19 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c |
| index 557886b..bd91c94 100644 |
| --- a/drivers/mmc/host/sh_mmcif.c |
| +++ b/drivers/mmc/host/sh_mmcif.c |
| @@ -165,6 +165,8 @@ struct sh_mmcif_host { |
| struct mmc_host *mmc; |
| struct mmc_data *data; |
| struct platform_device *pd; |
| + struct sh_dmae_slave dma_slave_tx; |
| + struct sh_dmae_slave dma_slave_rx; |
| struct clk *hclk; |
| unsigned int clk; |
| int bus_width; |
| @@ -323,25 +325,35 @@ static bool sh_mmcif_filter(struct dma_chan *chan, void *arg) |
| static void sh_mmcif_request_dma(struct sh_mmcif_host *host, |
| struct sh_mmcif_plat_data *pdata) |
| { |
| + struct sh_dmae_slave *tx, *rx; |
| host->dma_active = false; |
| |
| /* We can only either use DMA for both Tx and Rx or not use it at all */ |
| if (pdata->dma) { |
| + dev_warn(&host->pd->dev, |
| + "Update your platform to use embedded DMA slave IDs\n"); |
| + tx = &pdata->dma->chan_priv_tx; |
| + rx = &pdata->dma->chan_priv_rx; |
| + } else { |
| + tx = &host->dma_slave_tx; |
| + tx->slave_id = pdata->slave_id_tx; |
| + rx = &host->dma_slave_rx; |
| + rx->slave_id = pdata->slave_id_rx; |
| + } |
| + if (tx->slave_id > 0 && rx->slave_id > 0) { |
| dma_cap_mask_t mask; |
| |
| dma_cap_zero(mask); |
| dma_cap_set(DMA_SLAVE, mask); |
| |
| - host->chan_tx = dma_request_channel(mask, sh_mmcif_filter, |
| - &pdata->dma->chan_priv_tx); |
| + host->chan_tx = dma_request_channel(mask, sh_mmcif_filter, tx); |
| dev_dbg(&host->pd->dev, "%s: TX: got channel %p\n", __func__, |
| host->chan_tx); |
| |
| if (!host->chan_tx) |
| return; |
| |
| - host->chan_rx = dma_request_channel(mask, sh_mmcif_filter, |
| - &pdata->dma->chan_priv_rx); |
| + host->chan_rx = dma_request_channel(mask, sh_mmcif_filter, rx); |
| dev_dbg(&host->pd->dev, "%s: RX: got channel %p\n", __func__, |
| host->chan_rx); |
| |
| diff --git a/include/linux/mmc/sh_mmcif.h b/include/linux/mmc/sh_mmcif.h |
| index 0222cd8..04ff452 100644 |
| --- a/include/linux/mmc/sh_mmcif.h |
| +++ b/include/linux/mmc/sh_mmcif.h |
| @@ -41,7 +41,9 @@ struct sh_mmcif_plat_data { |
| void (*set_pwr)(struct platform_device *pdev, int state); |
| void (*down_pwr)(struct platform_device *pdev); |
| int (*get_cd)(struct platform_device *pdef); |
| - struct sh_mmcif_dma *dma; |
| + struct sh_mmcif_dma *dma; /* Deprecated. Instead */ |
| + unsigned int slave_id_tx; /* use embedded slave_id_[tr]x */ |
| + unsigned int slave_id_rx; |
| u8 sup_pclk; /* 1 :SH7757, 0: SH7724/SH7372 */ |
| unsigned long caps; |
| u32 ocr; |
| -- |
| 1.7.10.2.565.gbd578b5 |
| |