linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] mmc: core: fix using wrong io voltage if mmc_select_hs200 fails
@ 2016-04-20 16:51 Dong Aisheng
  2016-04-20 16:51 ` [PATCH 2/3] mmc: core: remove the invalid message in mmc_select_timing Dong Aisheng
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Dong Aisheng @ 2016-04-20 16:51 UTC (permalink / raw)
  To: linux-arm-kernel

Currently MMC core will keep going if HS200/HS timing switch failed
with -EBADMSG error by the assumption that the old timing is still valid.

However, for mmc_select_hs200 case, the signal voltage may have already
been switched. If the timing switch failed, we should fall back to
the old voltage in case the card is continue run with legacy timing.

If fall back signal voltage failed, we explicitly report an EIO error
to force retry during the next power cycle.

Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
 drivers/mmc/core/mmc.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index b8aa12c..f6683a9 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1245,9 +1245,11 @@ static int mmc_select_hs200(struct mmc_card *card)
 	struct mmc_host *host = card->host;
 	bool send_status = true;
 	unsigned int old_timing;
+	unsigned int old_signal_voltage;
 	int err = -EINVAL;
 	u8 val;
 
+	old_signal_voltage = host->ios.signal_voltage;
 	if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
 		err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
 
@@ -1256,7 +1258,7 @@ static int mmc_select_hs200(struct mmc_card *card)
 
 	/* If fails try again during next card power cycle */
 	if (err)
-		goto err;
+		return err;
 
 	mmc_select_driver_type(card);
 
@@ -1290,9 +1292,14 @@ static int mmc_select_hs200(struct mmc_card *card)
 		}
 	}
 err:
-	if (err)
+	if (err) {
+		/* fall back to the old signal voltage, if fails report error */
+		if (__mmc_set_signal_voltage(host, old_signal_voltage))
+			err = -EIO;
+
 		pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host),
 		       __func__, err);
+	}
 	return err;
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2016-05-26 11:27 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-20 16:51 [PATCH 1/3] mmc: core: fix using wrong io voltage if mmc_select_hs200 fails Dong Aisheng
2016-04-20 16:51 ` [PATCH 2/3] mmc: core: remove the invalid message in mmc_select_timing Dong Aisheng
2016-04-28  9:24   ` Ulf Hansson
2016-04-28 14:58     ` Dong Aisheng
2016-05-10  9:46       ` Ulf Hansson
2016-04-20 16:51 ` [PATCH 3/3] mmc: core: support hs speed mode if hs200 mode fails Dong Aisheng
2016-05-10  9:46   ` Ulf Hansson
2016-05-13  9:06   ` Marcel Ziswiler
2016-05-16  9:32     ` Ulf Hansson
2016-05-26 11:27     ` Dong Aisheng
2016-04-28  9:26 ` [PATCH 1/3] mmc: core: fix using wrong io voltage if mmc_select_hs200 fails Ulf Hansson
2016-05-10  9:46   ` Ulf Hansson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).