diff options
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 | } |