Skip to content

Commit dd63771

Browse files
committed
speed up boot time
1 parent 77c7a53 commit dd63771

3 files changed

Lines changed: 69 additions & 20 deletions

File tree

arch/riscv/dts/k230_canmv_01studio_emmc.dts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@
3939

4040
&mmc0 {
4141
1-8-v;
42+
//non-removable;
4243
status = "okay";
4344
};

drivers/mmc/mmc.c

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,32 @@
3030

3131
static int mmc_set_signal_voltage(struct mmc *mmc, uint signal_voltage);
3232

33+
static bool mmc_is_nonremovable_emmc(struct mmc *mmc)
34+
{
35+
return !mmc_host_is_spi(mmc) &&
36+
(mmc->cfg->host_caps & MMC_CAP_NONREMOVABLE) &&
37+
(mmc->cfg->host_caps & MMC_MODE_8BIT);
38+
}
39+
40+
static unsigned int mmc_go_idle_pre_delay_us(struct mmc *mmc)
41+
{
42+
#if defined(CONFIG_MMC_SDHCI_SNPS)
43+
return mmc_is_nonremovable_emmc(mmc) ? 1000 : 4000;
44+
#else
45+
return 1000;
46+
#endif
47+
}
48+
49+
static unsigned int mmc_go_idle_post_delay_us(struct mmc *mmc)
50+
{
51+
return mmc_is_nonremovable_emmc(mmc) ? 0 : 2000;
52+
}
53+
54+
static unsigned int mmc_power_cycle_delay_us(struct mmc *mmc)
55+
{
56+
return mmc_is_nonremovable_emmc(mmc) ? 1000 : 2000;
57+
}
58+
3359
#if !CONFIG_IS_ENABLED(DM_MMC)
3460

3561
static int mmc_wait_dat0(struct mmc *mmc, int state, int timeout_us)
@@ -512,12 +538,10 @@ static int mmc_go_idle(struct mmc *mmc)
512538
{
513539
struct mmc_cmd cmd;
514540
int err;
541+
unsigned int delay_us;
515542

516-
#if defined (CONFIG_MMC_SDHCI_SNPS)
517-
udelay(4000);
518-
#else
519-
udelay(1000);
520-
#endif
543+
delay_us = mmc_go_idle_pre_delay_us(mmc);
544+
udelay(delay_us);
521545

522546
cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
523547
cmd.cmdarg = 0;
@@ -528,7 +552,9 @@ static int mmc_go_idle(struct mmc *mmc)
528552
if (err)
529553
return err;
530554

531-
udelay(2000);
555+
delay_us = mmc_go_idle_post_delay_us(mmc);
556+
if (delay_us)
557+
udelay(delay_us);
532558

533559
return 0;
534560
}
@@ -696,14 +722,15 @@ static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
696722
return 0;
697723
}
698724

699-
static int mmc_send_op_cond(struct mmc *mmc)
725+
static int mmc_send_op_cond(struct mmc *mmc, bool send_idle)
700726
{
701727
int err, i;
702728
int timeout = 1000;
703729
uint start;
704730

705731
/* Some cards seem to need this */
706-
mmc_go_idle(mmc);
732+
if (send_idle)
733+
mmc_go_idle(mmc);
707734

708735
start = get_timer(0);
709736
/* Asking to the card its capabilities */
@@ -2598,6 +2625,17 @@ static int mmc_startup(struct mmc *mmc)
25982625
return err;
25992626
}
26002627

2628+
/*
2629+
* Reading EXT_CSD at the initial clock is slow on K230 eMMC. Once the
2630+
* card reaches transfer state, use the CSD legacy rate before CMD8.
2631+
*/
2632+
if (!IS_SD(mmc) && !mmc_host_is_spi(mmc) &&
2633+
mmc->legacy_speed > mmc->clock) {
2634+
err = mmc_set_clock(mmc, mmc->legacy_speed, false);
2635+
if (err)
2636+
return err;
2637+
}
2638+
26012639
/*
26022640
* For SD, its erase group is always one sector
26032641
*/
@@ -2788,6 +2826,7 @@ static int mmc_power_off(struct mmc *mmc)
27882826
static int mmc_power_cycle(struct mmc *mmc)
27892827
{
27902828
int ret;
2829+
unsigned int delay_us;
27912830

27922831
ret = mmc_power_off(mmc);
27932832
if (ret)
@@ -2801,13 +2840,15 @@ static int mmc_power_cycle(struct mmc *mmc)
28012840
* SD spec recommends at least 1ms of delay. Let's wait for 2ms
28022841
* to be on the safer side.
28032842
*/
2804-
udelay(2000);
2843+
delay_us = mmc_power_cycle_delay_us(mmc);
2844+
udelay(delay_us);
28052845
return mmc_power_on(mmc);
28062846
}
28072847

28082848
int mmc_get_op_cond(struct mmc *mmc, bool quiet)
28092849
{
28102850
bool uhs_en = supports_uhs(mmc->cfg->host_caps);
2851+
bool skip_sd_probe = false;
28112852
int err;
28122853

28132854
if (mmc->has_init)
@@ -2864,20 +2905,25 @@ int mmc_get_op_cond(struct mmc *mmc, bool quiet)
28642905
/* The internal partition reset to user partition(0) at every CMD0 */
28652906
mmc_get_blk_desc(mmc)->hwpart = 0;
28662907

2867-
/* Test for SD version 2 */
2868-
err = mmc_send_if_cond(mmc);
2869-
2870-
/* Now try to get the SD card's operating condition */
2871-
err = sd_send_op_cond(mmc, uhs_en);
2872-
if (err && uhs_en) {
2873-
uhs_en = false;
2874-
mmc_power_cycle(mmc);
2875-
goto retry;
2908+
skip_sd_probe = mmc_is_nonremovable_emmc(mmc);
2909+
if (!skip_sd_probe) {
2910+
/* Test for SD version 2 */
2911+
err = mmc_send_if_cond(mmc);
2912+
2913+
/* Now try to get the SD card's operating condition */
2914+
err = sd_send_op_cond(mmc, uhs_en);
2915+
if (err && uhs_en) {
2916+
uhs_en = false;
2917+
mmc_power_cycle(mmc);
2918+
goto retry;
2919+
}
2920+
} else {
2921+
err = -ETIMEDOUT;
28762922
}
28772923

28782924
/* If the command timed out, we check for an MMC card */
28792925
if (err == -ETIMEDOUT) {
2880-
err = mmc_send_op_cond(mmc);
2926+
err = mmc_send_op_cond(mmc, !skip_sd_probe);
28812927

28822928
if (err) {
28832929
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)

drivers/mmc/snps_sdhci.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include <sdhci.h>
1212
#include <linux/delay.h>
1313

14+
#define SNPS_SDHCI_MIN_FREQ 400000
15+
1416
struct snps_sdhci_plat {
1517
struct mmc_config cfg;
1618
struct mmc mmc;
@@ -269,7 +271,7 @@ static int snps_sdhci_probe(struct udevice *dev)
269271
host->mmc->priv = host;
270272
upriv->mmc = host->mmc;
271273

272-
ret = sdhci_setup_cfg(cfg, host, cfg->f_max, 0);
274+
ret = sdhci_setup_cfg(cfg, host, cfg->f_max, SNPS_SDHCI_MIN_FREQ);
273275
if (ret)
274276
goto err;
275277

0 commit comments

Comments
 (0)