mmc: add a function to read and test the ext csd (mmc >= 4)
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Thu, 21 Sep 2017 14:29:52 +0000 (16:29 +0200)
committerJaehoon Chung <jh80.chung@samsung.com>
Fri, 12 Jan 2018 09:11:03 +0000 (18:11 +0900)
This will be reused later in the selection of high speed and ddr modes.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/mmc/mmc.c

index 694091d0855a2d7caeba1c8fa2aa58dbf4c93981..c4067e210b7e2651cc0ecc14cad6a7834cac9076 100644 (file)
@@ -1146,10 +1146,39 @@ static int sd_select_bus_freq_width(struct mmc *mmc)
        return 0;
 }
 
-static int mmc_select_bus_freq_width(struct mmc *mmc)
+/*
+ * read the compare the part of ext csd that is constant.
+ * This can be used to check that the transfer is working
+ * as expected.
+ */
+static int mmc_read_and_compare_ext_csd(struct mmc *mmc)
 {
-       ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
+       int err;
        const u8 *ext_csd = mmc->ext_csd;
+       ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
+
+       err = mmc_send_ext_csd(mmc, test_csd);
+       if (err)
+               return err;
+
+       /* Only compare read only fields */
+       if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
+               == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
+           ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
+               == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
+           ext_csd[EXT_CSD_REV]
+               == test_csd[EXT_CSD_REV] &&
+           ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
+               == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
+           memcmp(&ext_csd[EXT_CSD_SEC_CNT],
+                  &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
+               return 0;
+
+       return -EBADMSG;
+}
+
+static int mmc_select_bus_freq_width(struct mmc *mmc)
+{
        /* An array of possible bus widths in order of preference */
        static const unsigned int ext_csd_bits[] = {
                EXT_CSD_DDR_BUS_WIDTH_8,
@@ -1221,25 +1250,9 @@ static int mmc_select_bus_freq_width(struct mmc *mmc)
                mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
                mmc_set_bus_width(mmc, widths[idx]);
 
-               err = mmc_send_ext_csd(mmc, test_csd);
-
-               if (err)
-                       continue;
-
-               /* Only compare read only fields */
-               if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
-                       == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
-                   ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
-                       == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
-                   ext_csd[EXT_CSD_REV]
-                       == test_csd[EXT_CSD_REV] &&
-                   ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
-                       == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
-                   memcmp(&ext_csd[EXT_CSD_SEC_CNT],
-                          &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
+               err = mmc_read_and_compare_ext_csd(mmc);
+               if (!err)
                        break;
-
-               err = -EBADMSG;
        }
 
        if (err)