Hi Marek, > When using CMD6 to switch eMMC card timing from HS200/HS400 to > HS/legacy, do not poll for the completion status using CMD13, but > rather wait 50mS.
Nit: mS -> ms > > Once the card receives the CMD6 and starts executing it, the bus is in > undefined state until both the card finishes executing the command and > until the controller switches the bus to matching timing > configuration. During this time, it is not possible to transport any > commands or data across the bus, which includes the CMD13. Just out of curiosity - is this 50ms time written in some spec? Or is it only specific to Renesas HS200/HS400 ? > > Signed-off-by: Marek Vasut <marek.vasut+rene...@gmail.com> > Cc: Jaehoon Chung <jh80.ch...@samsung.com> > --- > NOTE: Linux does the same thing. > --- > drivers/mmc/mmc.c | 28 ++++++++++++++++++++-------- > 1 file changed, 20 insertions(+), 8 deletions(-) > > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index c7730c9233..ababacf65a 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -720,7 +720,8 @@ static int mmc_send_ext_csd(struct mmc *mmc, u8 > *ext_csd) return err; > } > > -int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value) > +static int __mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value, > + bool send_status) > { > struct mmc_cmd cmd; > int timeout = 1000; > @@ -736,19 +737,29 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 > index, u8 value) while (retries > 0) { > ret = mmc_send_cmd(mmc, &cmd, NULL); > > - /* Waiting for the ready status */ > - if (!ret) { > - ret = mmc_send_status(mmc, timeout); > - return ret; > + if (ret) { > + retries--; > + continue; > + } > + > + if (!send_status) { > + mdelay(50); > + return 0; > } > > - retries--; > + /* Waiting for the ready status */ > + return mmc_send_status(mmc, timeout); > } > > return ret; > > } > > +int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value) > +{ > + return __mmc_switch(mmc, set, index, value, true); > +} > + > #if !CONFIG_IS_ENABLED(MMC_TINY) > static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode, > bool hsdowngrade) > @@ -780,8 +791,9 @@ static int mmc_set_card_speed(struct mmc *mmc, > enum bus_mode mode, default: > return -EINVAL; > } > - err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, > EXT_CSD_HS_TIMING, > - speed_bits); > + > + err = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, > EXT_CSD_HS_TIMING, > + speed_bits, !hsdowngrade); > if (err) > return err; > Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lu...@denx.de
pgptls88_75xP.pgp
Description: OpenPGP digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot