diff options
author | Andy Green <andy@openmoko.com> | 2008-11-19 17:09:47 +0000 |
---|---|---|
committer | Andy Green <agreen@pads.home.warmcat.com> | 2008-11-19 17:09:47 +0000 |
commit | 11c78492dc87877aaf1220b6b855e4a9363ca932 (patch) | |
tree | 5ea1eae6f5e568ac339a712a55b29b743b837ab7 /arch/arm/mach-s3c2440 | |
parent | f8d84454949a5669abccf0b9c524f46380050c7f (diff) |
fix-glamo-mci-relationship-with-pcf50633-suspend-resume.patch
After protecting pcf50633 read and write primitives against
operation after suspend or before resume (by blowing a
stack_trace()) I saw glamo-mci was trying to use pcf50633
at these bad times on its own suspend and resume. Since that
part was already done via platform callback, I added an
export in pcf50633 that tells you if it is ready or busy,
and used it to defer (resume power on case) or ignore
(suspend power off case, since pcf50633 already did it)
the mci power call.
Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'arch/arm/mach-s3c2440')
-rw-r--r-- | arch/arm/mach-s3c2440/mach-gta02.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 22de1819475..5980ea9110e 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -1277,13 +1277,12 @@ gta02_glamo_mmc_set_power(unsigned char power_mode, unsigned short vdd) case GTA02v4_SYSTEM_REV: case GTA02v5_SYSTEM_REV: case GTA02v6_SYSTEM_REV: - /* depend on pcf50633 driver init */ - if (!pcf50633_global) - while (!pcf50633_global) - msleep(10); switch (power_mode) { case MMC_POWER_ON: case MMC_POWER_UP: + /* depend on pcf50633 driver init + not suspended */ + while (pcf50633_ready(pcf50633_global)) + msleep(1); /* select and set the voltage */ if (vdd > 7) { mv += 300 + 100 * (vdd - 8); @@ -1292,15 +1291,19 @@ gta02_glamo_mmc_set_power(unsigned char power_mode, unsigned short vdd) } pcf50633_voltage_set(pcf50633_global, PCF50633_REGULATOR_HCLDO, mv); - msleep(10); pcf50633_onoff_set(pcf50633_global, PCF50633_REGULATOR_HCLDO, 1); - msleep(1); break; case MMC_POWER_OFF: + /* power off happens during suspend, when pcf50633 can + * be already gone and not coming back... just forget + * the action then because pcf50633 suspend already + * dealt with it, otherwise we spin forever + */ + if (pcf50633_ready(pcf50633_global)) + return; pcf50633_onoff_set(pcf50633_global, PCF50633_REGULATOR_HCLDO, 0); - msleep(1); break; } break; |