aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/sh_mmcif.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-07-24 20:12:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-07-24 20:12:54 -0400
commitc511dc1fb6bee58363eb203d53393784f2589d02 (patch)
tree20d91e01aec30c462965fba27cfea0c80744d7ed /drivers/mmc/host/sh_mmcif.c
parent9161c3b796a2841a9a7be3d9c9dd121269ce90e8 (diff)
parent634332502366554849fe37e88d05ec0a13e550c8 (diff)
Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma
Pull slave-dmaengine update from Vinod Koul: "This time we have a new dmaengine driver from the tegra folks. Also we have Guennadi's cleanup of sh drivers which incudes a library for sh drivers. And the usual odd fixes in bunch of drivers and some nice cleanup of dw_dmac from Andy." Fix up conflicts in drivers/mmc/host/sh_mmcif.c * 'next' of git://git.infradead.org/users/vkoul/slave-dma: (46 commits) dmaengine: Cleanup logging messages mmc: sh_mmcif: switch to the new DMA channel allocation and configuration dma: sh: provide a migration path for slave drivers to stop using .private dma: sh: use an integer slave ID to improve API compatibility dmaengine: shdma: prepare to stop using struct dma_chan::private sh: remove unused DMA device pointer from SIU platform data ASoC: siu: don't use DMA device for channel filtering dmaengine: shdma: (cosmetic) simplify a static function dmaengine: at_hdmac: add a few const qualifiers dw_dmac: use 'u32' for LLI structure members, not dma_addr_t dw_dmac: mark dwc_dump_lli inline dma: mxs-dma: Export missing symbols from mxs-dma.c dma: shdma: convert to the shdma base library ASoC: fsi: prepare for conversion to the shdma base library usb: renesas_usbhs: prepare for conversion to the shdma base library ASoC: siu: prepare for conversion to the shdma base library serial: sh-sci: prepare for conversion to the shdma base library mmc: sh_mobile_sdhi: prepare for conversion to the shdma base library mmc: sh_mmcif: remove unneeded struct sh_mmcif_dma, prepare to shdma conversion dma: shdma: prepare for conversion to the shdma base library ...
Diffstat (limited to 'drivers/mmc/host/sh_mmcif.c')
-rw-r--r--drivers/mmc/host/sh_mmcif.c88
1 files changed, 48 insertions, 40 deletions
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
index b2af7136cd2..5d8142773fa 100644
--- a/drivers/mmc/host/sh_mmcif.c
+++ b/drivers/mmc/host/sh_mmcif.c
@@ -213,8 +213,6 @@ struct sh_mmcif_host {
213 struct mmc_host *mmc; 213 struct mmc_host *mmc;
214 struct mmc_request *mrq; 214 struct mmc_request *mrq;
215 struct platform_device *pd; 215 struct platform_device *pd;
216 struct sh_dmae_slave dma_slave_tx;
217 struct sh_dmae_slave dma_slave_rx;
218 struct clk *hclk; 216 struct clk *hclk;
219 unsigned int clk; 217 unsigned int clk;
220 int bus_width; 218 int bus_width;
@@ -373,59 +371,69 @@ static void sh_mmcif_start_dma_tx(struct sh_mmcif_host *host)
373 desc, cookie); 371 desc, cookie);
374} 372}
375 373
376static bool sh_mmcif_filter(struct dma_chan *chan, void *arg)
377{
378 dev_dbg(chan->device->dev, "%s: slave data %p\n", __func__, arg);
379 chan->private = arg;
380 return true;
381}
382
383static void sh_mmcif_request_dma(struct sh_mmcif_host *host, 374static void sh_mmcif_request_dma(struct sh_mmcif_host *host,
384 struct sh_mmcif_plat_data *pdata) 375 struct sh_mmcif_plat_data *pdata)
385{ 376{
386 struct sh_dmae_slave *tx, *rx; 377 struct resource *res = platform_get_resource(host->pd, IORESOURCE_MEM, 0);
378 struct dma_slave_config cfg;
379 dma_cap_mask_t mask;
380 int ret;
381
387 host->dma_active = false; 382 host->dma_active = false;
388 383
389 if (!pdata) 384 if (!pdata)
390 return; 385 return;
391 386
387 if (pdata->slave_id_tx <= 0 || pdata->slave_id_rx <= 0)
388 return;
389
392 /* We can only either use DMA for both Tx and Rx or not use it at all */ 390 /* We can only either use DMA for both Tx and Rx or not use it at all */
393 if (pdata->dma) { 391 dma_cap_zero(mask);
394 dev_warn(&host->pd->dev, 392 dma_cap_set(DMA_SLAVE, mask);
395 "Update your platform to use embedded DMA slave IDs\n");
396 tx = &pdata->dma->chan_priv_tx;
397 rx = &pdata->dma->chan_priv_rx;
398 } else {
399 tx = &host->dma_slave_tx;
400 tx->slave_id = pdata->slave_id_tx;
401 rx = &host->dma_slave_rx;
402 rx->slave_id = pdata->slave_id_rx;
403 }
404 if (tx->slave_id > 0 && rx->slave_id > 0) {
405 dma_cap_mask_t mask;
406 393
407 dma_cap_zero(mask); 394 host->chan_tx = dma_request_channel(mask, shdma_chan_filter,
408 dma_cap_set(DMA_SLAVE, mask); 395 (void *)pdata->slave_id_tx);
396 dev_dbg(&host->pd->dev, "%s: TX: got channel %p\n", __func__,
397 host->chan_tx);
409 398
410 host->chan_tx = dma_request_channel(mask, sh_mmcif_filter, tx); 399 if (!host->chan_tx)
411 dev_dbg(&host->pd->dev, "%s: TX: got channel %p\n", __func__, 400 return;
412 host->chan_tx);
413 401
414 if (!host->chan_tx) 402 cfg.slave_id = pdata->slave_id_tx;
415 return; 403 cfg.direction = DMA_MEM_TO_DEV;
404 cfg.dst_addr = res->start + MMCIF_CE_DATA;
405 cfg.src_addr = 0;
406 ret = dmaengine_slave_config(host->chan_tx, &cfg);
407 if (ret < 0)
408 goto ecfgtx;
416 409
417 host->chan_rx = dma_request_channel(mask, sh_mmcif_filter, rx); 410 host->chan_rx = dma_request_channel(mask, shdma_chan_filter,
418 dev_dbg(&host->pd->dev, "%s: RX: got channel %p\n", __func__, 411 (void *)pdata->slave_id_rx);
419 host->chan_rx); 412 dev_dbg(&host->pd->dev, "%s: RX: got channel %p\n", __func__,
413 host->chan_rx);
420 414
421 if (!host->chan_rx) { 415 if (!host->chan_rx)
422 dma_release_channel(host->chan_tx); 416 goto erqrx;
423 host->chan_tx = NULL;
424 return;
425 }
426 417
427 init_completion(&host->dma_complete); 418 cfg.slave_id = pdata->slave_id_rx;
428 } 419 cfg.direction = DMA_DEV_TO_MEM;
420 cfg.dst_addr = 0;
421 cfg.src_addr = res->start + MMCIF_CE_DATA;
422 ret = dmaengine_slave_config(host->chan_rx, &cfg);
423 if (ret < 0)
424 goto ecfgrx;
425
426 init_completion(&host->dma_complete);
427
428 return;
429
430ecfgrx:
431 dma_release_channel(host->chan_rx);
432 host->chan_rx = NULL;
433erqrx:
434ecfgtx:
435 dma_release_channel(host->chan_tx);
436 host->chan_tx = NULL;
429} 437}
430 438
431static void sh_mmcif_release_dma(struct sh_mmcif_host *host) 439static void sh_mmcif_release_dma(struct sh_mmcif_host *host)