mmc: matsushita-common: Handle DMA completion flag differences
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Tue, 2 Jan 2018 18:40:49 +0000 (19:40 +0100)
committerMarek Vasut <marek.vasut+renesas@gmail.com>
Wed, 11 Apr 2018 21:11:58 +0000 (23:11 +0200)
The DMA READ completion flag position differs on Socionext and Renesas
SoCs. It is bit 20 on Socionext SoCs and using bit 17 is a hardware bug
and forbidden. It is bit 17 on Renesas SoCs and bit 20 does not work on
them.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Jaehoon Chung <jh80.chung@samsung.com>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
drivers/mmc/matsushita-common.c
drivers/mmc/matsushita-common.h

index 7e05b1f..11e4553 100644 (file)
@@ -339,7 +339,15 @@ static int matsu_sd_dma_xfer(struct udevice *dev, struct mmc_data *data)
        if (data->flags & MMC_DATA_READ) {
                buf = data->dest;
                dir = DMA_FROM_DEVICE;
-               poll_flag = MATSU_SD_DMA_INFO1_END_RD2;
+               /*
+                * The DMA READ completion flag position differs on Socionext
+                * and Renesas SoCs. It is bit 20 on Socionext SoCs and using
+                * bit 17 is a hardware bug and forbidden. It is bit 17 on
+                * Renesas SoCs and bit 20 does not work on them.
+                */
+               poll_flag = (priv->caps & MATSU_SD_CAP_RCAR) ?
+                           MATSU_SD_DMA_INFO1_END_RD :
+                           MATSU_SD_DMA_INFO1_END_RD2;
                tmp |= MATSU_SD_DMA_MODE_DIR_RD;
        } else {
                buf = (void *)data->src;
index a10ad20..8c81bbc 100644 (file)
@@ -96,8 +96,8 @@
 #define   MATSU_SD_DMA_RST_RD          BIT(9)
 #define   MATSU_SD_DMA_RST_WR          BIT(8)
 #define MATSU_SD_DMA_INFO1             0x420
-#define   MATSU_SD_DMA_INFO1_END_RD2   BIT(20) /* DMA from device is complete*/
-#define   MATSU_SD_DMA_INFO1_END_RD    BIT(17) /* Don't use!  Hardware bug */
+#define   MATSU_SD_DMA_INFO1_END_RD2   BIT(20) /* DMA from device is complete (uniphier) */
+#define   MATSU_SD_DMA_INFO1_END_RD    BIT(17) /* DMA from device is complete (renesas) */
 #define   MATSU_SD_DMA_INFO1_END_WR    BIT(16) /* DMA to device is complete */
 #define MATSU_SD_DMA_INFO1_MASK                0x424
 #define MATSU_SD_DMA_INFO2             0x428