mmc: use the generic timeout for cmd6 (SWITCH) provided in the ext_csd
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Tue, 2 Jul 2019 08:53:54 +0000 (10:53 +0200)
committerPeng Fan <peng.fan@nxp.com>
Mon, 15 Jul 2019 02:16:49 +0000 (10:16 +0800)
Starting with rev 4.5, the eMMC can define a generic timeout for the
SWITCH command.

Following Linux Kernel code, the timeout also changed from 1000 -> 500

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
drivers/mmc/mmc.c
include/mmc.h

index a61e311ccaafe6231677cda5c24a0f9124505ae7..ff56c3dd67dd361a6a934364c2df13ac109c25f6 100644 (file)
@@ -21,6 +21,8 @@
 #include <div64.h>
 #include "mmc_private.h"
 
+#define DEFAULT_CMD6_TIMEOUT_MS  500
+
 static int mmc_set_signal_voltage(struct mmc *mmc, uint signal_voltage);
 static int mmc_power_cycle(struct mmc *mmc);
 #if !CONFIG_IS_ENABLED(MMC_TINY)
@@ -745,10 +747,13 @@ static int __mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value,
                        bool send_status)
 {
        struct mmc_cmd cmd;
-       int timeout = 1000;
+       int timeout = DEFAULT_CMD6_TIMEOUT_MS;
        int retries = 3;
        int ret;
 
+       if (mmc->gen_cmd6_time)
+               timeout = mmc->gen_cmd6_time * 10;
+
        cmd.cmdidx = MMC_CMD_SWITCH;
        cmd.resp_type = MMC_RSP_R1b;
        cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
@@ -2135,6 +2140,9 @@ static int mmc_startup_v4(struct mmc *mmc)
                        mmc->capacity_user = capacity;
        }
 
+       if (mmc->version >= MMC_VERSION_4_5)
+               mmc->gen_cmd6_time = ext_csd[EXT_CSD_GENERIC_CMD6_TIME];
+
        /* The partition data may be non-zero but it is only
         * effective if PARTITION_SETTING_COMPLETED is set in
         * EXT_CSD, so ignore any data if this bit is not set,
index cf83b74dcbcb313cfae9cae20e81a26930e072cf..711cb5d116d1199935bc26d753958bbaf70a4fe8 100644 (file)
@@ -230,6 +230,7 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
 #define EXT_CSD_HC_WP_GRP_SIZE         221     /* RO */
 #define EXT_CSD_HC_ERASE_GRP_SIZE      224     /* RO */
 #define EXT_CSD_BOOT_MULT              226     /* RO */
+#define EXT_CSD_GENERIC_CMD6_TIME       248     /* RO */
 #define EXT_CSD_BKOPS_SUPPORT          502     /* RO */
 
 /*
@@ -585,6 +586,7 @@ struct mmc {
        u8 part_attr;
        u8 wr_rel_set;
        u8 part_config;
+       u8 gen_cmd6_time;
        uint tran_speed;
        uint legacy_speed; /* speed for the legacy mode provided by the card */
        uint read_bl_len;