diff mbox

[U-Boot,v4] mmc: add host_caps checking avoid switch card improperly

Message ID 1322533869-2953-1-git-send-email-macpaul@andestech.com
State Accepted, archived
Commit 2c3fbf4cbe621680105c5116b37e863a32ce410d
Delegated to: Andy Fleming
Headers show

Commit Message

Macpaul Lin Nov. 29, 2011, 2:31 a.m. UTC
Add a host capability checking to avoid the mmc stack
switch the card to HIGHSPEED mode when the card supports
HIGHSPEED while the host doesn't.

This patch avoid furthur transaction problem when the
mmc/sd card runs different mode to the host.

Signed-off-by: Macpaul Lin <macpaul@andestech.com>
---
Changes for v2:
  - Replace OR logic by AND logic; switch to high speed if controller
    support one of the high speed mode.
Changes for v3:
  - Correct the incorrect patch format.
Changes for v4:
  - Update patch version number due to inappropiate message flooding by
    Andes's SMTP server.

 drivers/mmc/mmc.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

Comments

Andy Fleming Dec. 30, 2011, 6:13 a.m. UTC | #1
On Mon, Nov 28, 2011 at 8:31 PM, Macpaul Lin <macpaul@andestech.com> wrote:
> Add a host capability checking to avoid the mmc stack
> switch the card to HIGHSPEED mode when the card supports
> HIGHSPEED while the host doesn't.
>
> This patch avoid furthur transaction problem when the
> mmc/sd card runs different mode to the host.
>
> Signed-off-by: Macpaul Lin <macpaul@andestech.com>

Applied, thanks!

Andy
diff mbox

Patch

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 21665ec..98abf1c 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -785,6 +785,16 @@  retry_scr:
 	if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
 		return 0;
 
+	/*
+	 * If the host doesn't support SD_HIGHSPEED, do not switch card to
+	 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
+	 * This can avoid furthur problem when the card runs in different
+	 * mode between the host.
+	 */
+	if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
+		(mmc->host_caps & MMC_MODE_HS)))
+		return 0;
+
 	err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
 
 	if (err)