The problem is a little more complicated then this. During out testing of multiple sd/mmc cards we found some cards that gave incorrect timeout values. The solution was to define the existing quirk to force the timeout to 0xe. The timeout problems had nothing to do with the controller being broken nor with suspend/resume. ________________________________________ From: linux-mmc-owner@xxxxxxxxxxxxxxx [linux-mmc-owner@xxxxxxxxxxxxxxx] On Behalf Of Jaehoon Chung [jh80.chung@xxxxxxxxxxx] Sent: Monday, November 29, 2010 10:13 PM To: linux-mmc@xxxxxxxxxxxxxxx Cc: Chris Ball; kyungmin Park; Andrew Morton; matt@xxxxxxxxxxxxxxxxx Subject: [RFC Patch] SDHCI: add quirk for data timeout value when card busy. This patch is added quirks for data timeout value. Some card have problem when suspend/resume. CMD6(switch command) to switch the bus to high speed mode and to set the bus width. After resuming, the card was initialized...in that time, some card need set a correct timeout value. so we add SDHCI_QUIRK_SET_DATA_TIMEOUT_VAL. Let me know any comment, plz. Signed-off-by: Jaehoon Chung <jh80.chung@xxxxxxxxxxx> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> --- drivers/mmc/host/sdhci.c | 6 +++++- include/linux/mmc/sdhci.h | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 782c0ee..3b93d97 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -655,8 +655,12 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data) WARN_ON(host->data); - if (data == NULL) + if (data == NULL) { + if ((host->quirks & SDHCI_QUIRK_SET_DATA_TIMEOUT_VAL) && + (host->cmd->flags & MMC_RSP_BUSY)) + sdhci_writel(host, 0xE, SDHCI_TIMEOUT_CONTROL); return; + } /* Sanity checks */ BUG_ON(data->blksz * data->blocks > 524288); diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 1fdc673..315ff49 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -83,7 +83,8 @@ struct sdhci_host { #define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28) /* Controller doesn't have HISPD bit field in HI-SPEED SD card */ #define SDHCI_QUIRK_NO_HISPD_BIT (1<<29) - +/* Controller need set data timeout value when card is busy */ +#define SDHCI_QUIRK_SET_DATA_TIMEOUT_VAL (1<<30) int irq; /* Device IRQ */ void __iomem *ioaddr; /* Mapped address */ -- 1.6.0.4 Thanks Jaehoon Chung -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html