aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-core.c
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:11:16 +0000
committerAndy Green <andy@openmoko.com>2008-11-19 17:11:16 +0000
commit870784bf1f7a8e2269f2384867a651fce101757f (patch)
treed1bd5ff577cc697c3d7fa0cae511ab14dc829967 /drivers/mfd/glamo/glamo-core.c
parent27460b673fa446babd4d35ca8eb5f66c42cb99a3 (diff)
tracking-glamo-suspend-even-more-meddling.patch
Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'drivers/mfd/glamo/glamo-core.c')
-rw-r--r--drivers/mfd/glamo/glamo-core.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c
index d605e2d7cb8..9d44717c406 100644
--- a/drivers/mfd/glamo/glamo-core.c
+++ b/drivers/mfd/glamo/glamo-core.c
@@ -932,7 +932,7 @@ static void glamo_power(struct glamo_core *glamo,
spin_lock_irqsave(&glamo->lock, flags);
- dev_dbg(&glamo->pdev->dev, "***** glamo_power -> %d\n", new_state);
+ dev_info(&glamo->pdev->dev, "***** glamo_power -> %d\n", new_state);
/*
Power management
@@ -965,12 +965,23 @@ static const REG_VALUE_MASK_TYPE reg_powerSuspend[] =
switch (new_state) {
case GLAMO_POWER_ON:
- mdelay(100);
+ /*
+ * glamo state on resume is nondeterministic in some
+ * fundamental way, it has also been observed that the
+ * Glamo reset pin can get asserted by, eg, touching it with
+ * a scope probe. So the only answer is to roll with it and
+ * force an external reset on the Glamo during resume.
+ */
- glamo_run_script(glamo, glamo_resume_script,
- ARRAY_SIZE(glamo_resume_script), 0);
+ (glamo->pdata->glamo_external_reset)(0);
+ udelay(10);
+ (glamo->pdata->glamo_external_reset)(1);
+ mdelay(10);
- for (n = 0; n < 3 /*ARRAY_SIZE(reg_range)*/; n++)
+ glamo_run_script(glamo, glamo_init_script,
+ ARRAY_SIZE(glamo_init_script), 0);
+
+ for (n = 0; n < ARRAY_SIZE(reg_range); n++)
for (ads = reg_range[n].start; ads <
(reg_range[n].start + reg_range[n].count); ads += 2)
__reg_write(glamo, ads, suspend_regs[ads >> 1]);
@@ -978,13 +989,13 @@ static const REG_VALUE_MASK_TYPE reg_powerSuspend[] =
spin_unlock_irqrestore(&glamo->lock, flags);
/* dump down printk */
- regs_read(&glamo->pdev->dev, NULL, debug_buffer);
+// regs_read(&glamo->pdev->dev, NULL, debug_buffer);
return;
case GLAMO_POWER_SUSPEND:
- for (n = 0; n < 3 /*ARRAY_SIZE(reg_range) */; n++)
+ for (n = 0; n < ARRAY_SIZE(reg_range); n++)
for (ads = reg_range[n].start; ads <
(reg_range[n].start + reg_range[n].count); ads += 2)
suspend_regs[ads >> 1] = __reg_read(glamo, ads);
@@ -1198,7 +1209,12 @@ static int __init glamo_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, glamo);
-/*
+ (glamo->pdata->glamo_external_reset)(0);
+ udelay(10);
+ (glamo->pdata->glamo_external_reset)(1);
+ mdelay(10);
+
+ /*
* finally set the mfd interrupts up
* can't do them earlier or sibling probes blow up
*/