diff options
-rw-r--r-- | arch/arm/mach-s3c2440/mach-gta02.c | 43 | ||||
-rw-r--r-- | drivers/i2c/chips/pcf50633.c | 29 | ||||
-rw-r--r-- | drivers/mfd/glamo/glamo-core.c | 2 | ||||
-rw-r--r-- | drivers/video/display/jbt6k74.c | 1 |
4 files changed, 49 insertions, 26 deletions
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 654dc8fa092..0bacafafed2 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -485,6 +485,9 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { [1] = PCF50633_INT2_ONKEYF, [2] = PCF50633_INT3_ONKEY1S }, + /* warning: these get rewritten during machine init below + * depending on pcb variant + */ .rails = { [PCF50633_REGULATOR_AUTO] = { .name = "io_3v3", @@ -496,6 +499,12 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { }, [PCF50633_REGULATOR_DOWN1] = { .name = "core_1v3", + /* Wow, when we are going into suspend, after pcf50633 + * runs its suspend (which happens real early since it + * is an i2c device) we are running out of the 22uF cap + * on core_1v3 rail !!!! + */ + .flags = PMU_VRAIL_F_SUSPEND_ON, .voltage = { .init = 1300, .max = 1600, @@ -503,6 +512,7 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { }, [PCF50633_REGULATOR_DOWN2] = { .name = "core_1v8", + .flags = PMU_VRAIL_F_SUSPEND_ON, .voltage = { .init = 1800, .max = 1800, @@ -516,8 +526,7 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { }, }, [PCF50633_REGULATOR_LDO1] = { - .name = "stby_1v3", - .flags = PMU_VRAIL_F_SUSPEND_ON, + .name = "gsensor_3v3", .voltage = { .init = 1300, .max = 1330, @@ -531,7 +540,7 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { }, }, [PCF50633_REGULATOR_LDO3] = { - .name = "lcm_3v", + .name = "unused3", .voltage = { .init = 3000, .max = 3000, @@ -545,20 +554,28 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { }, }, [PCF50633_REGULATOR_LDO5] = { - .name = "gl_1v5", + .name = "rf3v", .voltage = { .init = 1500, .max = 1500, }, }, [PCF50633_REGULATOR_LDO6] = { - .name = "user1", + .name = "lcm_3v", .flags = PMU_VRAIL_F_SUSPEND_ON, .voltage = { .init = 0, .max = 3300, }, }, + [PCF50633_REGULATOR_MEMLDO] = { + .name = "memldo", + .flags = PMU_VRAIL_F_SUSPEND_ON, + .voltage = { + .init = 1800, + .max = 1800, + }, + }, }, .defer_resume_backlight = 1, }; @@ -611,13 +628,15 @@ static void mangle_pmu_pdata_by_system_rev(void) .max = 3000, } }); - gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO6] = ((struct pmu_voltage_rail) { - .name = "lcm_3v", - .voltage = { - .init = 3000, - .max = 3000, - } - }); + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO6] = + ((struct pmu_voltage_rail) { + .name = "lcm_3v", + .flags = PMU_VRAIL_F_SUSPEND_ON, + .voltage = { + .init = 3000, + .max = 3000, + } + }); break; default: break; diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c index 4002c03aca3..37dfca68797 100644 --- a/drivers/i2c/chips/pcf50633.c +++ b/drivers/i2c/chips/pcf50633.c @@ -750,9 +750,6 @@ static void pcf50633_work(struct work_struct *work) mutex_lock(&pcf->working_lock); pcf->working = 1; - dev_info(&pcf->client.dev, "pcf50633_work called with suspended = %d\n", - pcf->have_been_suspended); - /* * If we are inside suspend -> resume completion time we don't attempt * service until we have fully resumed. Although we could talk to the @@ -763,11 +760,8 @@ static void pcf50633_work(struct work_struct *work) * completed. */ - if (pcf->have_been_suspended && (pcf->have_been_suspended < 3)) { - dev_info(&pcf->client.dev, "rescheduling, suspended = %d\n", - pcf->have_been_suspended); + if (pcf->have_been_suspended && (pcf->have_been_suspended < 3)) goto reschedule; - } /* * datasheet says we have to read the five IRQ @@ -1157,9 +1151,13 @@ static void pcf50633_work(struct work_struct *work) reschedule: /* don't spew, delaying whatever else is happening */ - msleep(100); - - dev_info(&pcf->client.dev, "rescheduling interrupt service\n"); + /* EXCEPTION: if we are in the middle of suspending, we don't have + * time to hang around since we may be turned off core 1V3 already + */ + if (pcf->have_been_suspended != 1) { + msleep(50); + dev_info(&pcf->client.dev, "rescheduling interrupt service\n"); + } if (!schedule_work(&pcf->work)) dev_err(&pcf->client.dev, "int service reschedule failed\n"); @@ -2333,7 +2331,7 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state) PCF50633_REG_AUTOOUT, sizeof(pcf->standby_regs.misc), &pcf->standby_regs.misc[0]); - if (ret != 18) + if (ret != sizeof(pcf->standby_regs.misc)) dev_err(dev, "Failed to save misc levels and enables :-(\n"); /* regulator voltages and enable states */ @@ -2341,7 +2339,7 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state) PCF50633_REG_LDO1OUT, sizeof(pcf->standby_regs.ldo), &pcf->standby_regs.ldo[0]); - if (ret != 14) + if (ret != sizeof(pcf->standby_regs.ldo)) dev_err(dev, "Failed to save LDO levels and enables :-(\n"); /* switch off power supplies that are not needed during suspend */ @@ -2349,8 +2347,6 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state) if ((pcf->pdata->rails[i].flags & PMU_VRAIL_F_SUSPEND_ON)) continue; - dev_dbg(dev, "disabling regulator %u\n", i); - /* we can save ourselves the read part of a read-modify-write * here because we captured all these already */ @@ -2359,6 +2355,11 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state) else tmp = pcf->standby_regs.ldo[(i - 4) * 2 + 1]; + dev_info(dev, "disabling reg %s by setting ENA %d to 0x%02X\n", + pcf->pdata->rails[i].name, + regulator_registers[i] + 1, tmp & 0xfe); + + /* associated enable is always +1 from OUT reg */ __reg_write(pcf, regulator_registers[i] + 1, tmp & 0xfe); } diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c index 3edbfa820d2..d4b526d41fa 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -848,6 +848,7 @@ static void glamo_power(struct glamo_core *glamo, ARRAY_SIZE(glamo_resume_script), 0); break; + case GLAMO_POWER_STANDBY: /* enable memory self-refresh */ __reg_set_bit_mask(glamo, GLAMO_REG_MEM_DRAM1, @@ -859,6 +860,7 @@ static void glamo_power(struct glamo_core *glamo, __reg_set_bit_mask(glamo, GLAMO_REG_PLL_GEN3, 0x2000, 0xffff); __reg_set_bit_mask(glamo, GLAMO_REG_DFT_GEN5, 0x0001, 0xffff); break; + case GLAMO_POWER_SUSPEND: __reg_set_bit_mask(glamo, GLAMO_REG_MEM_DRAM2, GLAMO_MEM_DRAM2_DEEP_PWRDOWN, 0xffff); diff --git a/drivers/video/display/jbt6k74.c b/drivers/video/display/jbt6k74.c index 6fa1fe7ee51..b40629839fc 100644 --- a/drivers/video/display/jbt6k74.c +++ b/drivers/video/display/jbt6k74.c @@ -634,6 +634,7 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state) /* Save mode for resume */ jbt->last_state = jbt->state; + jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY); jbt->have_resumed = 0; |