Convert the driver to use the new common SDHCI DMA helpers.

Signed-off-by: Sascha Hauer <[email protected]>
---
 drivers/mci/imx-esdhc-common.c | 88 ++++++++++------------------------
 1 file changed, 24 insertions(+), 64 deletions(-)

diff --git a/drivers/mci/imx-esdhc-common.c b/drivers/mci/imx-esdhc-common.c
index a85459d29c..a0290275be 100644
--- a/drivers/mci/imx-esdhc-common.c
+++ b/drivers/mci/imx-esdhc-common.c
@@ -10,12 +10,6 @@
 
 #define PRSSTAT_DAT0  0x01000000
 
-struct fsl_esdhc_dma_transfer {
-       dma_addr_t dma;
-       unsigned int size;
-       enum dma_data_direction dir;
-};
-
 static u32 esdhc_op_read32_be(struct sdhci *sdhci, int reg)
 {
        struct fsl_esdhc_host *host = sdhci_to_esdhc(sdhci);
@@ -58,71 +52,33 @@ static bool esdhc_use_pio_mode(void)
 {
        return IN_PBL || IS_ENABLED(CONFIG_MCI_IMX_ESDHC_PIO);
 }
+
 static int esdhc_setup_data(struct fsl_esdhc_host *host, struct mci_data *data,
-                           struct fsl_esdhc_dma_transfer *tr)
+                           dma_addr_t *dma)
 {
        u32 wml_value;
-       void *ptr;
-
-       if (!esdhc_use_pio_mode()) {
-               wml_value = data->blocksize/4;
-
-               if (data->flags & MMC_DATA_READ) {
-                       if (wml_value > 0x10)
-                               wml_value = 0x10;
-
-                       esdhc_clrsetbits32(host, IMX_SDHCI_WML, 
WML_RD_WML_MASK, wml_value);
-               } else {
-                       if (wml_value > 0x80)
-                               wml_value = 0x80;
 
-                       esdhc_clrsetbits32(host, IMX_SDHCI_WML, WML_WR_WML_MASK,
-                                               wml_value << 16);
-               }
-
-               tr->size = data->blocks * data->blocksize;
+       wml_value = data->blocksize / 4;
 
-               if (data->flags & MMC_DATA_WRITE) {
-                       ptr = (void *)data->src;
-                       tr->dir = DMA_TO_DEVICE;
-               } else {
-                       ptr = data->dest;
-                       tr->dir = DMA_FROM_DEVICE;
-               }
+       if (data->flags & MMC_DATA_READ) {
+               if (wml_value > 0x10)
+                       wml_value = 0x10;
 
-               tr->dma = dma_map_single(host->dev, ptr, tr->size, tr->dir);
-               if (dma_mapping_error(host->dev, tr->dma))
-                       return -EFAULT;
+               esdhc_clrsetbits32(host, IMX_SDHCI_WML, WML_RD_WML_MASK, 
wml_value);
+       } else {
+               if (wml_value > 0x80)
+                       wml_value = 0x80;
 
-
-               sdhci_write32(&host->sdhci, SDHCI_DMA_ADDRESS, tr->dma);
+               esdhc_clrsetbits32(host, IMX_SDHCI_WML, WML_WR_WML_MASK,
+                                       wml_value << 16);
        }
 
-       sdhci_write32(&host->sdhci, SDHCI_BLOCK_SIZE__BLOCK_COUNT, data->blocks 
<< 16 | data->blocksize);
-
-       return 0;
-}
-
-static int esdhc_do_data(struct fsl_esdhc_host *host, struct mci_data *data,
-                 struct fsl_esdhc_dma_transfer *tr)
-{
-       u32 irqstat;
+       host->sdhci.sdma_boundary = 0;
 
        if (esdhc_use_pio_mode())
-               return sdhci_transfer_data_pio(&host->sdhci, data);
-
-       do {
-               irqstat = sdhci_read32(&host->sdhci, SDHCI_INT_STATUS);
-
-               if (irqstat & DATA_ERR)
-                       return -EIO;
-
-               if (irqstat & SDHCI_INT_DATA_TIMEOUT)
-                       return -ETIMEDOUT;
-       } while (!(irqstat & SDHCI_INT_XFER_COMPLETE) &&
-               (sdhci_read32(&host->sdhci, SDHCI_PRESENT_STATE) & 
SDHCI_DATA_LINE_ACTIVE));
-
-       dma_unmap_single(host->dev, tr->dma, tr->size, tr->dir);
+               sdhci_setup_data_pio(&host->sdhci, data);
+       else
+               sdhci_setup_data_dma(&host->sdhci, data, dma);
 
        return 0;
 }
@@ -172,7 +128,7 @@ int __esdhc_send_cmd(struct fsl_esdhc_host *host, struct 
mci_cmd *cmd,
 {
        u32     xfertyp, mixctrl, command;
        u32     irqstat;
-       struct fsl_esdhc_dma_transfer tr = { 0 };
+       dma_addr_t dma = SDHCI_NO_DMA;
        int ret;
 
        sdhci_write32(&host->sdhci, SDHCI_INT_STATUS, -1);
@@ -182,13 +138,13 @@ int __esdhc_send_cmd(struct fsl_esdhc_host *host, struct 
mci_cmd *cmd,
 
        /* Set up for a data transfer if we have one */
        if (data) {
-               ret = esdhc_setup_data(host, data, &tr);
+               ret = esdhc_setup_data(host, data, &dma);
                if (ret)
                        return ret;
        }
 
        sdhci_set_cmd_xfer_mode(&host->sdhci, cmd, data,
-                               !esdhc_use_pio_mode(), &command, &xfertyp);
+                               dma != SDHCI_NO_DMA, &command, &xfertyp);
 
        if ((host->socdata->flags & ESDHC_FLAG_MULTIBLK_NO_INT) &&
            (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION))
@@ -245,7 +201,11 @@ int __esdhc_send_cmd(struct fsl_esdhc_host *host, struct 
mci_cmd *cmd,
 
        /* Wait until all of the blocks are transferred */
        if (data) {
-               ret = esdhc_do_data(host, data, &tr);
+               if (esdhc_use_pio_mode())
+                       ret = sdhci_transfer_data_pio(&host->sdhci, data);
+               else
+                       ret = sdhci_transfer_data_dma(&host->sdhci, data, dma);
+
                if (ret)
                        return ret;
        }
-- 
2.29.2


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to