diff options
author | Viswanath Puttagunta <vishp@ti.com> | 2011-10-19 15:33:54 -0500 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-09-07 13:06:12 +0800 |
commit | 5fa0fe4e45d30fe16de77062396655967f4c0a94 (patch) | |
tree | 957d438fba199307c3d5729d9b18d294eece19fc /drivers | |
parent | a8fecc1ba4f482e27ce182ebf71bd4011e626b08 (diff) |
omap-hsmmc: Fix issue during SD card disconnect
Turning off IO & PBIAS cells and then SD card VMMC
as soon as we get disconnect interrupt. Failure to do
so is causing current spikes (latch-up issue)which
can potentially burn the I/O cells.
Enabled Debounce logic in TWL6030 so that erroneous
disconnect/connect interrupts will be suppressed.
This will also fix issue where SD card disconnect
event was not getting detected when SD card is very
slowly plugged out.
Signed-off-by: Viswanath Puttagunta <vishp@ti.com>
Conflicts:
drivers/mfd/twl6030-irq.c
drivers/mmc/host/omap_hsmmc.c
Signed-off-by: Sebastien Jan <s-jan@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mfd/twl6030-irq.c | 8 | ||||
-rw-r--r-- | drivers/mmc/host/omap_hsmmc.c | 13 |
2 files changed, 18 insertions, 3 deletions
diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c index b76902f1e44a..dfb64431e3b3 100644 --- a/drivers/mfd/twl6030-irq.c +++ b/drivers/mfd/twl6030-irq.c @@ -318,6 +318,14 @@ int twl6030_mmc_card_detect_config(void) return ret; } + ret = twl_i2c_write_u8(TWL6030_MODULE_ID0, MMC_MEXT_DEB_MASK, + TWL6030_MMCDEBOUNCING); + if (ret < 0){ + pr_err("twl6030: Failed to write MMC_MEXT_DEB_MASK %d\n", + ret); + return ret; + } + return twl6030_irq_base + MMCDETECT_INTR_OFFSET; } EXPORT_SYMBOL(twl6030_mmc_card_detect_config); diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 6fe3caa62496..79fa155cef9e 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -1309,10 +1309,17 @@ static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id) carddetect = -ENOSYS; } - if (carddetect) + if (carddetect) { mmc_detect_change(host->mmc, (HZ * 200) / 1000); - else - mmc_detect_change(host->mmc, (HZ * 50) / 1000); + } else { + if ((MMC_POWER_OFF != host->power_mode) && + (mmc_slot(host).set_power != NULL)) { + mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0); + host->power_mode = MMC_POWER_OFF; + } + mmc_detect_change(host->mmc, 0); + } + return IRQ_HANDLED; } |