diff options
author | Philippe Langlais <philippe.langlais@linaro.org> | 2011-03-22 11:53:06 +0100 |
---|---|---|
committer | Robert Marklund <robert.marklund@stericsson.com> | 2011-05-04 18:04:59 +0200 |
commit | 32030d8dd85c0de40aac5d108bc8f82283013e91 (patch) | |
tree | 17d2d467f7573588c08c841ca9ac095cf366a821 | |
parent | 178133e8dcd2f718c832932dda166261d1ee0d53 (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.c | 9 | ||||
-rw-r--r-- | include/linux/mmc/host.h | 1 |
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 */ |