mmc: atmel-mci: map DMA sglist on the DMA engine
[firefly-linux-kernel-4.4.55.git] / drivers / mmc / host / atmel-mci.c
index 301351a5d83853f877953a1ecd10553ecc8f5c22..045bdbbe3720a3ad200763be003650931c740225 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/stat.h>
 
 #include <linux/mmc/host.h>
+#include <linux/mmc/sdio.h>
 
 #include <mach/atmel-mci.h>
 #include <linux/atmel-mci.h>
@@ -532,12 +533,17 @@ static u32 atmci_prepare_command(struct mmc_host *mmc,
        data = cmd->data;
        if (data) {
                cmdr |= MCI_CMDR_START_XFER;
-               if (data->flags & MMC_DATA_STREAM)
-                       cmdr |= MCI_CMDR_STREAM;
-               else if (data->blocks > 1)
-                       cmdr |= MCI_CMDR_MULTI_BLOCK;
-               else
-                       cmdr |= MCI_CMDR_BLOCK;
+
+               if (cmd->opcode == SD_IO_RW_EXTENDED) {
+                       cmdr |= MCI_CMDR_SDIO_BLOCK;
+               } else {
+                       if (data->flags & MMC_DATA_STREAM)
+                               cmdr |= MCI_CMDR_STREAM;
+                       else if (data->blocks > 1)
+                               cmdr |= MCI_CMDR_MULTI_BLOCK;
+                       else
+                               cmdr |= MCI_CMDR_BLOCK;
+               }
 
                if (data->flags & MMC_DATA_READ)
                        cmdr |= MCI_CMDR_TRDIR_READ;
@@ -572,7 +578,8 @@ static void atmci_dma_cleanup(struct atmel_mci *host)
        struct mmc_data                 *data = host->data;
 
        if (data)
-               dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len,
+               dma_unmap_sg(host->dma.chan->device->dev,
+                            data->sg, data->sg_len,
                             ((data->flags & MMC_DATA_WRITE)
                              ? DMA_TO_DEVICE : DMA_FROM_DEVICE));
 }
@@ -678,7 +685,8 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)
        else
                direction = DMA_TO_DEVICE;
 
-       sglen = dma_map_sg(&host->pdev->dev, data->sg, data->sg_len, direction);
+       sglen = dma_map_sg(chan->device->dev, data->sg,
+                          data->sg_len, direction);
        if (sglen != data->sg_len)
                goto unmap_exit;
        desc = chan->device->device_prep_slave_sg(chan,
@@ -693,7 +701,7 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)
 
        return 0;
 unmap_exit:
-       dma_unmap_sg(&host->pdev->dev, data->sg, sglen, direction);
+       dma_unmap_sg(chan->device->dev, data->sg, sglen, direction);
        return -ENOMEM;
 }