mmc: use the generic timeout for cmd6 (SWITCH) provided in the ext_csd
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>
This commit is contained in:
parent
cd0b80ec9c
commit
39320c537d
@ -21,6 +21,8 @@
|
|||||||
#include <div64.h>
|
#include <div64.h>
|
||||||
#include "mmc_private.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_set_signal_voltage(struct mmc *mmc, uint signal_voltage);
|
||||||
static int mmc_power_cycle(struct mmc *mmc);
|
static int mmc_power_cycle(struct mmc *mmc);
|
||||||
#if !CONFIG_IS_ENABLED(MMC_TINY)
|
#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)
|
bool send_status)
|
||||||
{
|
{
|
||||||
struct mmc_cmd cmd;
|
struct mmc_cmd cmd;
|
||||||
int timeout = 1000;
|
int timeout = DEFAULT_CMD6_TIMEOUT_MS;
|
||||||
int retries = 3;
|
int retries = 3;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (mmc->gen_cmd6_time)
|
||||||
|
timeout = mmc->gen_cmd6_time * 10;
|
||||||
|
|
||||||
cmd.cmdidx = MMC_CMD_SWITCH;
|
cmd.cmdidx = MMC_CMD_SWITCH;
|
||||||
cmd.resp_type = MMC_RSP_R1b;
|
cmd.resp_type = MMC_RSP_R1b;
|
||||||
cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
|
cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
|
||||||
@ -2135,6 +2140,9 @@ static int mmc_startup_v4(struct mmc *mmc)
|
|||||||
mmc->capacity_user = capacity;
|
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
|
/* The partition data may be non-zero but it is only
|
||||||
* effective if PARTITION_SETTING_COMPLETED is set in
|
* effective if PARTITION_SETTING_COMPLETED is set in
|
||||||
* EXT_CSD, so ignore any data if this bit is not set,
|
* EXT_CSD, so ignore any data if this bit is not set,
|
||||||
|
@ -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_WP_GRP_SIZE 221 /* RO */
|
||||||
#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
|
#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
|
||||||
#define EXT_CSD_BOOT_MULT 226 /* RO */
|
#define EXT_CSD_BOOT_MULT 226 /* RO */
|
||||||
|
#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
|
||||||
#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
|
#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -585,6 +586,7 @@ struct mmc {
|
|||||||
u8 part_attr;
|
u8 part_attr;
|
||||||
u8 wr_rel_set;
|
u8 wr_rel_set;
|
||||||
u8 part_config;
|
u8 part_config;
|
||||||
|
u8 gen_cmd6_time;
|
||||||
uint tran_speed;
|
uint tran_speed;
|
||||||
uint legacy_speed; /* speed for the legacy mode provided by the card */
|
uint legacy_speed; /* speed for the legacy mode provided by the card */
|
||||||
uint read_bl_len;
|
uint read_bl_len;
|
||||||
|
Loading…
Reference in New Issue
Block a user