mmc: sdio: Enable SDIO 4-bit bus if not support SD_SCR_BUS_WIDTH_4 for SD combo card
authorYue Hu <huyue2@yulong.com>
Mon, 8 Jun 2020 10:30:09 +0000 (18:30 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 13 Jul 2020 10:18:23 +0000 (12:18 +0200)
If the card type is SD combo(MMC_TYPE_SD_COMBO) and the memory part does
not support wider bus(SD_SCR_BUS_WIDTH_4), nothing will be done except
return 0. However, we should check whether IO part support wider bus or
not. We should use available IO ability if supported.

In addition, there's a duplicated check to MMC_CAP_4_BIT_DATA since
sdio_enable_wide() will include that check. And we can also save one
call site to sdio_enable_wide() after this change.

Signed-off-by: Yue Hu <huyue2@yulong.com>
Link: https://lore.kernel.org/r/20200608103009.5000-1-zbestahu@gmail.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/sdio.c

index b65b26f76d719e9f31134f2d5802ed9917f80044..d9ba7dd7cf1bfc578c2a86a9fe0d5aed77430738 100644 (file)
@@ -308,25 +308,23 @@ static int sdio_enable_4bit_bus(struct mmc_card *card)
 {
        int err;
 
+       err = sdio_enable_wide(card);
+       if (err <= 0)
+               return err;
        if (card->type == MMC_TYPE_SDIO)
-               err = sdio_enable_wide(card);
-       else if ((card->host->caps & MMC_CAP_4_BIT_DATA) &&
-                (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {
+               goto out;
+
+       if (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4) {
                err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4);
-               if (err)
+               if (err) {
+                       sdio_disable_wide(card);
                        return err;
-               err = sdio_enable_wide(card);
-               if (err <= 0)
-                       mmc_app_set_bus_width(card, MMC_BUS_WIDTH_1);
-       } else
-               return 0;
-
-       if (err > 0) {
-               mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);
-               err = 0;
+               }
        }
+out:
+       mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);
 
-       return err;
+       return 0;
 }