[PATCH 1/3] mmc: fix mmc mode selection for HS-DDR and higher
From: Marcel Ziswiler <hidden>
Date: 2016-06-01 09:19:54
Also in:
linux-mmc, linux-tegra, lkml
On Sun, 2016-05-29 at 15:04 +0800, Chen-Yu Tsai wrote:
When IS_ERR_VALUE was removed from the mmc core code, it was replaced
with a simple not-zero check. This does not work, as the value
checked
is the return value for mmc_select_bus_width, which returns the set
bit width on success. This made eMMC modes higher than HS-DDR
unusable.
Fix this by checking for a positive return value instead.
Fixes: 287980e49ffc ("remove lots of IS_ERR_VALUE abuses")
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Chen-Yu Tsai <redacted>This fixes the following eMMC issue as experienced on Apalis T30 as well: [????7.194625] mmc1: mmc_select_hs200 failed, error 3 [????7.201549] mmc1: error 3 whilst initialising MMC card Tested-by: Marcel Ziswiler <redacted>
quoted hunk ↗ jump to hunk
--- ?drivers/mmc/core/mmc.c | 4 ++-- ?1 file changed, 2 insertions(+), 2 deletions(-)diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index c984321d1881..aafb73d080ca 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card*card) ? ?* switch to HS200 mode if bus width is set successfully. ? ?*/ ? err = mmc_select_bus_width(card); - if (!err) { + if (err > 0) { ? val = EXT_CSD_TIMING_HS200 | ? ??????card->drive_strength << EXT_CSD_DRV_STR_SHIFT; ? err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,@@ -1583,7 +1583,7 @@ static int mmc_init_card(struct mmc_host *host,u32 ocr, ? } else if (mmc_card_hs(card)) { ? /* Select the desired bus width optionally */ ? err = mmc_select_bus_width(card); - if (!err) { + if (err > 0) { ? err = mmc_select_hs_ddr(card); ? if (err) ? goto free_card;