summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorViswanath Puttagunta <vishp@ti.com>2011-10-19 15:33:54 -0500
committerAndy Green <andy.green@linaro.org>2012-09-07 13:06:12 +0800
commit5fa0fe4e45d30fe16de77062396655967f4c0a94 (patch)
tree957d438fba199307c3d5729d9b18d294eece19fc /drivers
parenta8fecc1ba4f482e27ce182ebf71bd4011e626b08 (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.c8
-rw-r--r--drivers/mmc/host/omap_hsmmc.c13
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;
}