|
@@ -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
|