@@ -1523,11 +1523,23 @@ static int mmc_select_timing(struct mmc_card *card)
if (!mmc_can_ext_csd(card))
goto bus_speed;
- if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES)
+ if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES) {
err = mmc_select_hs400es(card);
- else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
+ if (!err)
+ goto bus_speed;
+ if (err != -EBADMSG)
+ return err;
+ }
+
+ if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200) {
err = mmc_select_hs200(card);
- else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
+ if (!err)
+ goto bus_speed;
+ if (err != -EBADMSG)
+ return err;
+ }
+
+ if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
err = mmc_select_hs(card);
if (err && err != -EBADMSG)
I have a system (cheap Amlogic S905W based TV box) where the eMMC chip refuses to switch to HS200 timing. That's not nice, but my bigger problem is that the system then falls back to the very slow default mode, even though DDR52 is supported and works well. Therefore, if setting a mode fails with EBADMSG (switch error), try the next (in descending performance order) mode instead of immediately falling back to the slowest mode. With the patch it looks like this on my system: mmc1: mmc_select_hs200 failed, error -74 mmc1: new DDR MMC card at address 0001 mmcblk1: mmc1:0001 DG4008 7.28 GiB Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> --- drivers/mmc/core/mmc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)