diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-24 20:12:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-24 20:12:54 -0400 |
commit | c511dc1fb6bee58363eb203d53393784f2589d02 (patch) | |
tree | 20d91e01aec30c462965fba27cfea0c80744d7ed /drivers/mmc/host | |
parent | 9161c3b796a2841a9a7be3d9c9dd121269ce90e8 (diff) | |
parent | 634332502366554849fe37e88d05ec0a13e550c8 (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')
-rw-r--r-- | drivers/mmc/host/sh_mmcif.c | 88 | ||||
-rw-r--r-- | drivers/mmc/host/sh_mobile_sdhi.c | 8 |
2 files changed, 52 insertions, 44 deletions
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index b2af7136cd27..5d8142773fac 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 | ||
376 | static 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 | |||
383 | static void sh_mmcif_request_dma(struct sh_mmcif_host *host, | 374 | static 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 | |||
430 | ecfgrx: | ||
431 | dma_release_channel(host->chan_rx); | ||
432 | host->chan_rx = NULL; | ||
433 | erqrx: | ||
434 | ecfgtx: | ||
435 | dma_release_channel(host->chan_tx); | ||
436 | host->chan_tx = NULL; | ||
429 | } | 437 | } |
430 | 438 | ||
431 | static void sh_mmcif_release_dma(struct sh_mmcif_host *host) | 439 | static void sh_mmcif_release_dma(struct sh_mmcif_host *host) |
diff --git a/drivers/mmc/host/sh_mobile_sdhi.c b/drivers/mmc/host/sh_mobile_sdhi.c index a842939e4655..0bdc146178db 100644 --- a/drivers/mmc/host/sh_mobile_sdhi.c +++ b/drivers/mmc/host/sh_mobile_sdhi.c | |||
@@ -169,10 +169,10 @@ static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev) | |||
169 | mmc_data->get_cd = sh_mobile_sdhi_get_cd; | 169 | mmc_data->get_cd = sh_mobile_sdhi_get_cd; |
170 | 170 | ||
171 | if (p->dma_slave_tx > 0 && p->dma_slave_rx > 0) { | 171 | if (p->dma_slave_tx > 0 && p->dma_slave_rx > 0) { |
172 | priv->param_tx.slave_id = p->dma_slave_tx; | 172 | priv->param_tx.shdma_slave.slave_id = p->dma_slave_tx; |
173 | priv->param_rx.slave_id = p->dma_slave_rx; | 173 | priv->param_rx.shdma_slave.slave_id = p->dma_slave_rx; |
174 | priv->dma_priv.chan_priv_tx = &priv->param_tx; | 174 | priv->dma_priv.chan_priv_tx = &priv->param_tx.shdma_slave; |
175 | priv->dma_priv.chan_priv_rx = &priv->param_rx; | 175 | priv->dma_priv.chan_priv_rx = &priv->param_rx.shdma_slave; |
176 | priv->dma_priv.alignment_shift = 1; /* 2-byte alignment */ | 176 | priv->dma_priv.alignment_shift = 1; /* 2-byte alignment */ |
177 | mmc_data->dma = &priv->dma_priv; | 177 | mmc_data->dma = &priv->dma_priv; |
178 | } | 178 | } |