mmc: sdhci: clear auto cmd setting bits for no data cmds
authorDong Aisheng <b29396@freescale.com>
Wed, 30 Oct 2013 14:09:48 +0000 (22:09 +0800)
committerChris Ball <cjb@laptop.org>
Tue, 26 Nov 2013 21:33:47 +0000 (16:33 -0500)
The auto cmd settings bits should be cleared before sending new commands
or we may receive command timeout error for normal commands due to wrongly
pre-sent auto cmd.

e.g. we receive CMD13 timeout error due to ACMD23 is wrongly enabled
by former data commands.

mmc2: new high speed DDR MMC card at address 0001
mmcblk1: mmc2:0001 SEM08G 7.39 GiB
mmcblk1boot0: mmc2:0001 SEM08G partition 1 2.00 MiB
mmcblk1boot1: mmc2:0001 SEM08G partition 2 2.00 MiB
mmcblk1rpmb: mmc2:0001 SEM08G partition 3 128 KiB
 mmcblk1: p1 p2 p3 p4 < p5 p6 p7 >
mmc2: Timeout waiting for hardware interrupt.
 mmcblk1boot1: unknown partition table
mmc2: Timeout waiting for hardware interrupt.
 mmcblk1boot0: unknown partition table

Signed-off-by: Dong Aisheng <b29396@freescale.com>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sdhci.c

index bd8a0982aec33ec99b95b97fbcbdd65dee642770..6840322c12a0cbbd84edd7219f19dfb82800e7ca 100644 (file)
@@ -898,8 +898,13 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
        u16 mode;
        struct mmc_data *data = cmd->data;
 
-       if (data == NULL)
+       if (data == NULL) {
+               /* clear Auto CMD settings for no data CMDs */
+               mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+               sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
+                               SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
                return;
+       }
 
        WARN_ON(!host->data);