ARM: 7713/1: mmc: mmci: Allow MMCI to request channels with information acquired...
authorLee Jones <lee.jones@linaro.org>
Fri, 3 May 2013 11:51:17 +0000 (12:51 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 22 May 2013 23:07:04 +0000 (00:07 +0100)
Currently, if DMA information isn't passed from platform data, then DMA
will not be used. This patch allows DMA information obtained though Device
Tree to be used as well.

Cc: Chris Ball <cjb@laptop.org>
Cc: linux-mmc@vger.kernel.org
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/mmc/host/mmci.c

index 9df8b84..c6d8b62 100644 (file)
@@ -310,10 +310,8 @@ static void mmci_dma_setup(struct mmci_host *host)
        const char *rxname, *txname;
        dma_cap_mask_t mask;
 
-       if (!plat || !plat->dma_filter) {
-               dev_info(mmc_dev(host->mmc), "no DMA platform data\n");
-               return;
-       }
+       host->dma_rx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "rx");
+       host->dma_tx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "tx");
 
        /* initialize pre request cookie */
        host->next_data.cookie = 1;
@@ -322,30 +320,33 @@ static void mmci_dma_setup(struct mmci_host *host)
        dma_cap_zero(mask);
        dma_cap_set(DMA_SLAVE, mask);
 
-       /*
-        * If only an RX channel is specified, the driver will
-        * attempt to use it bidirectionally, however if it is
-        * is specified but cannot be located, DMA will be disabled.
-        */
-       if (plat->dma_rx_param) {
-               host->dma_rx_channel = dma_request_channel(mask,
+       if (plat && plat->dma_filter) {
+               if (!host->dma_rx_channel && plat->dma_rx_param) {
+                       host->dma_rx_channel = dma_request_channel(mask,
                                                           plat->dma_filter,
                                                           plat->dma_rx_param);
-               /* E.g if no DMA hardware is present */
-               if (!host->dma_rx_channel)
-                       dev_err(mmc_dev(host->mmc), "no RX DMA channel\n");
-       }
+                       /* E.g if no DMA hardware is present */
+                       if (!host->dma_rx_channel)
+                               dev_err(mmc_dev(host->mmc), "no RX DMA channel\n");
+               }
 
-       if (plat->dma_tx_param) {
-               host->dma_tx_channel = dma_request_channel(mask,
+               if (!host->dma_tx_channel && plat->dma_tx_param) {
+                       host->dma_tx_channel = dma_request_channel(mask,
                                                           plat->dma_filter,
                                                           plat->dma_tx_param);
-               if (!host->dma_tx_channel)
-                       dev_warn(mmc_dev(host->mmc), "no TX DMA channel\n");
-       } else {
-               host->dma_tx_channel = host->dma_rx_channel;
+                       if (!host->dma_tx_channel)
+                               dev_warn(mmc_dev(host->mmc), "no TX DMA channel\n");
+               }
        }
 
+       /*
+        * If only an RX channel is specified, the driver will
+        * attempt to use it bidirectionally, however if it is
+        * is specified but cannot be located, DMA will be disabled.
+        */
+       if (host->dma_rx_channel && !host->dma_tx_channel)
+               host->dma_tx_channel = host->dma_rx_channel;
+
        if (host->dma_rx_channel)
                rxname = dma_chan_name(host->dma_rx_channel);
        else