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: Russell King <li...@arm.linux.org.uk>
Cc: Chris Ball <c...@laptop.org>
Cc: linux-...@vger.kernel.org
Signed-off-by: Lee Jones <lee.jo...@linaro.org>

diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index 372e921..45dda46 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -304,10 +304,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;
@@ -316,30 +314,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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to