From 3404491eb5a3232dc33b131da470840f4cc76a32 Mon Sep 17 00:00:00 2001 From: David Brownell Date: Fri, 20 Mar 2009 22:33:24 +0000 Subject: [PATCH] Updates to the mmc-twl4030 code Updates to the mmc-twl4030 code: - Partial workaround for the bug fixed more comprehensively by f4223ec219313d631c3f620220ed23670c158a34 ... workaround applies only to MMC devs using this code. - Fix a cut'n'paste bug as noted by Adrian Hunter: the intent was to "disable" not (re)"enable". The reason to want this workaround is lack of faith that any sane fix for that regulator framework bug will ever merge, while still wanting to see things work in mainline. Signed-off-by: David Brownell Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/mmc-twl4030.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c index 77a12e5b446..2ff50f05f49 100644 --- a/arch/arm/mach-omap2/mmc-twl4030.c +++ b/arch/arm/mach-omap2/mmc-twl4030.c @@ -128,6 +128,27 @@ static int twl_mmc_late_init(struct device *dev) reg = regulator_get(dev, "vmmc_aux"); hsmmc[i].vcc_aux = IS_ERR(reg) ? NULL : reg; + /* UGLY HACK: workaround regulator framework bugs. + * When the bootloader leaves a supply active, it's + * initialized with zero usecount ... and we can't + * disable it without first disabling it. Until the + * framework is fixed, we need a workaround like this + * (which is safe for MMC, but not in general). + */ + if (regulator_is_enabled(hsmmc[i].vcc) > 0) { + dev_warn(dev, "APPLY REGULATOR HACK for vmmc\n"); + regulator_enable(hsmmc[i].vcc); + regulator_disable(hsmmc[i].vcc); + } + if (hsmmc[i].vcc_aux) { + if (regulator_is_enabled(reg) > 0) { + dev_warn(dev, "APPLY REGULATOR HACK " + "for vmmc_aux\n"); + regulator_enable(reg); + regulator_disable(reg); + } + } + break; } } @@ -285,7 +306,7 @@ static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int v } } else { if (c->vcc_aux) - ret = regulator_enable(c->vcc_aux); + ret = regulator_disable(c->vcc_aux); if (ret == 0) ret = mmc_regulator_set_ocr(c->vcc, 0); } -- 2.41.0