| From ef8781989a1bcd05aa47e853917c37df44917194 Mon Sep 17 00:00:00 2001 |
| From: Ludovic Desroches <ludovic.desroches@atmel.com> |
| Date: Thu, 9 Feb 2012 16:33:53 +0100 |
| Subject: mmc: atmel-mci: don't use dma features when using DMA with no chan available |
| |
| From: Ludovic Desroches <ludovic.desroches@atmel.com> |
| |
| commit ef8781989a1bcd05aa47e853917c37df44917194 upstream. |
| |
| Some callbacks are set too early -- i.e. we can have dma capabilities but |
| we can't get a dma channel. So wait to get the dma channel before setting |
| callbacks and change logs consequently. |
| |
| Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com> |
| Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> |
| Signed-off-by: Chris Ball <cjb@laptop.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mmc/host/atmel-mci.c | 21 ++++++++++----------- |
| 1 file changed, 10 insertions(+), 11 deletions(-) |
| |
| --- a/drivers/mmc/host/atmel-mci.c |
| +++ b/drivers/mmc/host/atmel-mci.c |
| @@ -1944,12 +1944,12 @@ static bool atmci_filter(struct dma_chan |
| } |
| } |
| |
| -static void atmci_configure_dma(struct atmel_mci *host) |
| +static bool atmci_configure_dma(struct atmel_mci *host) |
| { |
| struct mci_platform_data *pdata; |
| |
| if (host == NULL) |
| - return; |
| + return false; |
| |
| pdata = host->pdev->dev.platform_data; |
| |
| @@ -1966,12 +1966,15 @@ static void atmci_configure_dma(struct a |
| host->dma.chan = |
| dma_request_channel(mask, atmci_filter, pdata->dma_slave); |
| } |
| - if (!host->dma.chan) |
| - dev_notice(&host->pdev->dev, "DMA not available, using PIO\n"); |
| - else |
| + if (!host->dma.chan) { |
| + dev_warn(&host->pdev->dev, "no DMA channel available\n"); |
| + return false; |
| + } else { |
| dev_info(&host->pdev->dev, |
| "Using %s for DMA transfers\n", |
| dma_chan_name(host->dma.chan)); |
| + return true; |
| + } |
| } |
| |
| static inline unsigned int atmci_get_version(struct atmel_mci *host) |
| @@ -2081,8 +2084,7 @@ static int __init atmci_probe(struct pla |
| |
| /* Get MCI capabilities and set operations according to it */ |
| atmci_get_cap(host); |
| - if (host->caps.has_dma) { |
| - dev_info(&pdev->dev, "using DMA\n"); |
| + if (host->caps.has_dma && atmci_configure_dma(host)) { |
| host->prepare_data = &atmci_prepare_data_dma; |
| host->submit_data = &atmci_submit_data_dma; |
| host->stop_transfer = &atmci_stop_transfer_dma; |
| @@ -2092,15 +2094,12 @@ static int __init atmci_probe(struct pla |
| host->submit_data = &atmci_submit_data_pdc; |
| host->stop_transfer = &atmci_stop_transfer_pdc; |
| } else { |
| - dev_info(&pdev->dev, "no DMA, no PDC\n"); |
| + dev_info(&pdev->dev, "using PIO\n"); |
| host->prepare_data = &atmci_prepare_data; |
| host->submit_data = &atmci_submit_data; |
| host->stop_transfer = &atmci_stop_transfer; |
| } |
| |
| - if (host->caps.has_dma) |
| - atmci_configure_dma(host); |
| - |
| platform_set_drvdata(pdev, host); |
| |
| /* We need at least one slot to succeed */ |