aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilippe Langlais <philippe.langlais@linaro.org>2011-03-22 11:53:06 +0100
committerRobert Marklund <robert.marklund@stericsson.com>2011-05-04 18:04:59 +0200
commit32030d8dd85c0de40aac5d108bc8f82283013e91 (patch)
tree17d2d467f7573588c08c841ca9ac095cf366a821
parent178133e8dcd2f718c832932dda166261d1ee0d53 (diff)
SDIO: Add workaround for client with broken CMD53
Adds a workaround which can be turned on for SDIO devices that do not support 512 byte requests in byte mode during CMD53. These requests will always be sent in block mode instead. ST-Ericsson ID: AP272999 Change-Id: I9923e87d2be43e0139af6648f3add522d65ab5ad Signed-off-by: Stefan Nilsson XK <stefan.xk.nilsson@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/15092 Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
-rw-r--r--drivers/mmc/core/sdio_ops.c9
-rw-r--r--include/linux/mmc/host.h1
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/mmc/core/sdio_ops.c b/drivers/mmc/core/sdio_ops.c
index dea36d9c22e..4e3b3004013 100644
--- a/drivers/mmc/core/sdio_ops.c
+++ b/drivers/mmc/core/sdio_ops.c
@@ -152,10 +152,15 @@ int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn,
cmd.arg |= fn << 28;
cmd.arg |= incr_addr ? 0x04000000 : 0x00000000;
cmd.arg |= addr << 9;
- if (blocks == 1 && blksz <= 512)
- cmd.arg |= (blksz == 512) ? 0 : blksz; /* byte mode */
+
+ if (blocks == 1 && blksz < 512)
+ cmd.arg |= blksz; /* byte mode */
+ else if (blocks == 1 && blksz == 512 &&
+ !(card->host->caps & MMC_CAP_BROKEN_SDIO_CMD53))
+ cmd.arg |= 0; /* byte mode, 0=512 */
else
cmd.arg |= 0x08000000 | blocks; /* block mode */
+
cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC;
data.blksz = blksz;
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index bcb793ec737..a2d2e35647b 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -173,6 +173,7 @@ struct mmc_host {
/* DDR mode at 1.2V */
#define MMC_CAP_POWER_OFF_CARD (1 << 13) /* Can power off after boot */
#define MMC_CAP_BUS_WIDTH_TEST (1 << 14) /* CMD14/CMD19 bus width ok */
+#define MMC_CAP_BROKEN_SDIO_CMD53 (1 << 15) /* Broken CMD53 byte mode */
mmc_pm_flag_t pm_caps; /* supported pm features */