diff options
-rw-r--r-- | arch/arm/mach-s3c2440/mach-gta02.c | 8 | ||||
-rw-r--r-- | defconfig-2.6.24 | 4 | ||||
-rw-r--r-- | drivers/i2c/chips/pcf50633.c | 50 | ||||
-rw-r--r-- | drivers/video/display/jbt6k74.c | 12 | ||||
-rw-r--r-- | include/linux/jbt6k74.h | 3 | ||||
-rw-r--r-- | include/linux/pcf50633.h | 6 |
6 files changed, 66 insertions, 17 deletions
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 1954121e67c..e1984a9bc5a 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -532,6 +532,7 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { }, }, }, + .defer_resume_backlight = 1, }; #if 0 /* currently unused */ @@ -828,9 +829,16 @@ void gta02_jbt6k74_reset(int devidx, int level) glamo_lcm_reset(level); } +/* finally bring up deferred backlight resume now LCM is resumed itself */ + +void gta02_jbt6k74_resuming(int devidx) +{ + pcf50633_backlight_resume(pcf50633_global); +} const struct jbt6k74_platform_data jbt6k74_pdata = { .reset = gta02_jbt6k74_reset, + .resuming = gta02_jbt6k74_resuming, }; static struct spi_board_info gta02_spi_board_info[] = { diff --git a/defconfig-2.6.24 b/defconfig-2.6.24 index 4df10bf963a..34fa961f5da 100644 --- a/defconfig-2.6.24 +++ b/defconfig-2.6.24 @@ -161,7 +161,7 @@ CONFIG_CPU_LLSERIAL_S3C2440=y # # Power management # -CONFIG_S3C2410_PM_DEBUG=y +# CONFIG_S3C2410_PM_DEBUG is not set # CONFIG_S3C2410_PM_CHECK is not set CONFIG_S3C_LOWLEVEL_UART_PORT=2 @@ -1754,7 +1754,7 @@ CONFIG_FORCED_INLINING=y # CONFIG_SAMPLES is not set # CONFIG_DEBUG_USER is not set CONFIG_DEBUG_ERRORS=y -CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_LL is not set # CONFIG_DEBUG_ICEDCC is not set # CONFIG_DEBUG_S3C_PORT is not set CONFIG_DEBUG_S3C_UART=2 diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c index cb4cad8e66f..da58aa326ad 100644 --- a/drivers/i2c/chips/pcf50633.c +++ b/drivers/i2c/chips/pcf50633.c @@ -1466,7 +1466,7 @@ static int pcf50633bl_set_intensity(struct backlight_device *bd) struct pcf50633_data *pcf = bl_get_data(bd); int intensity = bd->props.brightness; int old_intensity = reg_read(pcf, PCF50633_REG_LEDOUT); - u_int8_t ledena; + u_int8_t ledena = 2; int ret; if (bd->props.power != FB_BLANK_UNBLANK) @@ -1474,16 +1474,19 @@ static int pcf50633bl_set_intensity(struct backlight_device *bd) if (bd->props.fb_blank != FB_BLANK_UNBLANK) intensity = 0; - /* The PCF50633 seems to have some kind of oddity (bug?) when - * the intensity was 0, you need to completely switch it off - * and re-enable it, before it produces any output voltage again */ + /* The PCF50633 cannot handle LEDOUT = 0 (datasheet p60) + * if seen, you have to re-enable the LED unit + */ if (intensity != 0 && old_intensity == 0) { ledena = reg_read(pcf, PCF50633_REG_LEDENA); reg_write(pcf, PCF50633_REG_LEDENA, 0x00); } - ret = reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f, + if (!intensity) /* illegal to set LEDOUT to 0 */ + ret = reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f, 2); + else + ret = reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f, intensity); if (intensity != 0 && old_intensity == 0) @@ -1920,6 +1923,8 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state) } /* turn off the backlight */ + __reg_write(pcf, PCF50633_REG_LEDDIM, 0); + __reg_write(pcf, PCF50633_REG_LEDOUT, 2); __reg_write(pcf, PCF50633_REG_LEDENA, 0x00); pcf->standby_regs.int1m = __reg_read(pcf, PCF50633_REG_INT1M); @@ -1938,17 +1943,30 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state) return 0; } +/* + * if backlight resume is selected to be deferred by platform, then it + * can call this to finally reset backlight status (after LCM is resumed + * for example + */ + +void pcf50633_backlight_resume(struct pcf50633_data *pcf) +{ + __reg_write(pcf, PCF50633_REG_LEDOUT, pcf->standby_regs.ledout); + __reg_write(pcf, PCF50633_REG_LEDENA, pcf->standby_regs.ledena); + __reg_write(pcf, PCF50633_REG_LEDDIM, pcf->standby_regs.leddim); +} +EXPORT_SYMBOL_GPL(pcf50633_backlight_resume); + + static int pcf50633_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct pcf50633_data *pcf = i2c_get_clientdata(client); int i; - printk(KERN_INFO"a\n"); /* mutex_lock(&pcf->lock); */ /* resume in atomic context */ __reg_write(pcf, PCF50633_REG_LEDENA, 0x01); - printk(KERN_INFO"b\n"); /* Resume all saved registers that don't "survive" standby state */ __reg_write(pcf, PCF50633_REG_INT1M, pcf->standby_regs.int1m); @@ -1956,7 +1974,6 @@ static int pcf50633_resume(struct device *dev) __reg_write(pcf, PCF50633_REG_INT3M, pcf->standby_regs.int3m); __reg_write(pcf, PCF50633_REG_INT4M, pcf->standby_regs.int4m); __reg_write(pcf, PCF50633_REG_INT5M, pcf->standby_regs.int5m); - printk(KERN_INFO"c\n"); __reg_write(pcf, PCF50633_REG_OOCTIM2, pcf->standby_regs.ooctim2); __reg_write(pcf, PCF50633_REG_AUTOOUT, pcf->standby_regs.autoout); @@ -1967,17 +1984,24 @@ static int pcf50633_resume(struct device *dev) __reg_write(pcf, PCF50633_REG_DOWN2ENA, pcf->standby_regs.down2ena); __reg_write(pcf, PCF50633_REG_MEMLDOOUT, pcf->standby_regs.memldoout); __reg_write(pcf, PCF50633_REG_MEMLDOENA, pcf->standby_regs.memldoena); - __reg_write(pcf, PCF50633_REG_LEDOUT, pcf->standby_regs.ledout); - __reg_write(pcf, PCF50633_REG_LEDENA, pcf->standby_regs.ledena); - __reg_write(pcf, PCF50633_REG_LEDDIM, pcf->standby_regs.leddim); - printk(KERN_INFO"d\n"); + + /* platform can choose to defer backlight bringup */ + if (!pcf->pdata->defer_resume_backlight) { + __reg_write(pcf, PCF50633_REG_LEDOUT, pcf->standby_regs.ledout); + __reg_write(pcf, PCF50633_REG_LEDENA, pcf->standby_regs.ledena); + __reg_write(pcf, PCF50633_REG_LEDDIM, pcf->standby_regs.leddim); + } else { /* force backlight down, platform will restore later */ + __reg_write(pcf, PCF50633_REG_LEDOUT, 2); + __reg_write(pcf, PCF50633_REG_LEDENA, 0x20); + __reg_write(pcf, PCF50633_REG_LEDDIM, 1); + } + /* FIXME: one big read? */ for (i = 0; i < 7; i++) { u_int8_t reg_out = PCF50633_REG_LDO1OUT + 2*i; __reg_write(pcf, reg_out, pcf->standby_regs.ldo[i].out); __reg_write(pcf, reg_out+1, pcf->standby_regs.ldo[i].ena); } - printk(KERN_INFO"e\n"); /* mutex_unlock(&pcf->lock); */ /* resume in atomic context */ diff --git a/drivers/video/display/jbt6k74.c b/drivers/video/display/jbt6k74.c index 7e11da7b47d..178e2daba63 100644 --- a/drivers/video/display/jbt6k74.c +++ b/drivers/video/display/jbt6k74.c @@ -647,9 +647,14 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state) static void jbt_resume_work(struct work_struct *work) { struct jbt_info *jbt = container_of(work, struct jbt_info, work); + struct jbt6k74_platform_data *jbt6k74_pdata = + jbt->spi_dev->dev.platform_data; printk(KERN_INFO"jbt_resume_work waiting...\n"); - msleep(2000); + /* 100ms is not enough here 2008-05-08 andy@openmoko.com + * if CONFIG_PM_DEBUG is enabled 2000ms is required + */ + msleep(400); printk(KERN_INFO"jbt_resume_work GO...\n"); jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY); @@ -665,6 +670,11 @@ static void jbt_resume_work(struct work_struct *work) } jbt6k74_display_onoff(jbt, 1); + /* this gives the platform a chance to bring up backlight now */ + + if (jbt6k74_pdata->resuming) + (jbt6k74_pdata->resuming)(0); + printk(KERN_INFO"jbt_resume_work done...\n"); } diff --git a/include/linux/jbt6k74.h b/include/linux/jbt6k74.h index 3fbe1783460..0ac91241f08 100644 --- a/include/linux/jbt6k74.h +++ b/include/linux/jbt6k74.h @@ -2,7 +2,8 @@ #define __JBT6K74_H__ struct jbt6k74_platform_data { - void (* reset)(int devindex, int level); + void (*reset)(int devindex, int level); + void (*resuming)(int devindex); /* called when LCM is resumed */ }; #endif diff --git a/include/linux/pcf50633.h b/include/linux/pcf50633.h index b6a67ee5e4f..f42798545b9 100644 --- a/include/linux/pcf50633.h +++ b/include/linux/pcf50633.h @@ -61,6 +61,9 @@ pcf50633_usb_curlim_set(struct pcf50633_data *pcf, int ma); extern void pcf50633_charge_enable(struct pcf50633_data *pcf, int on); +extern void +pcf50633_backlight_resume(struct pcf50633_data *pcf); + #define PCF50633_FEAT_EXTON 0x00000001 /* not yet supported */ #define PCF50633_FEAT_MBC 0x00000002 #define PCF50633_FEAT_BBC 0x00000004 /* not yet supported */ @@ -89,6 +92,9 @@ struct pcf50633_platform_data { u_int8_t mbcc3; /* charger voltage / current */ } charger; pmu_cb *cb; + + /* post-resume backlight bringup */ + int defer_resume_backlight; }; #endif /* _PCF50633_H */ |