diff options
Diffstat (limited to 'drivers/video/backlight/jbt6k74.c')
-rw-r--r-- | drivers/video/backlight/jbt6k74.c | 160 |
1 files changed, 36 insertions, 124 deletions
diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c index 95ca4cfae96..9554cb314b2 100644 --- a/drivers/video/backlight/jbt6k74.c +++ b/drivers/video/backlight/jbt6k74.c @@ -107,14 +107,12 @@ enum jbt_resolution { }; enum jbt_power_mode { - JBT_POWER_MODE_DEEP_STANDBY, - JBT_POWER_MODE_SLEEP, + JBT_POWER_MODE_OFF, JBT_POWER_MODE_NORMAL, }; static const char *jbt_power_mode_names[] = { - [JBT_POWER_MODE_DEEP_STANDBY] = "deep-standby", - [JBT_POWER_MODE_SLEEP] = "sleep", + [JBT_POWER_MODE_OFF] = "off", [JBT_POWER_MODE_NORMAL] = "normal", }; @@ -260,14 +258,18 @@ static int jbt_init_regs(struct jbt_info *jbt) return ret ? -EIO : 0; } -static int jbt_standby_to_sleep(struct jbt_info *jbt) + +static int jbt_off_to_normal(struct jbt_info *jbt) { int ret; + struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data; gpio_set_value_cansleep(pdata->gpio_reset, 1); ret = regulator_bulk_enable(ARRAY_SIZE(jbt->supplies), jbt->supplies); + mdelay(30); + /* three times command zero */ ret |= jbt_reg_write_nodata(jbt, 0x00); mdelay(1); @@ -279,18 +281,11 @@ static int jbt_standby_to_sleep(struct jbt_info *jbt) /* deep standby out */ ret |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x11); mdelay(1); - ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28); + ret |= jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28); /* (re)initialize register set */ ret |= jbt_init_regs(jbt); - return ret ? -EIO : 0; -} - -static int jbt_sleep_to_normal(struct jbt_info *jbt) -{ - int ret; - /* Make sure we are 120 ms after SLEEP_OUT */ if (time_before(jiffies, jbt->next_sleep)) mdelay(jiffies_to_msecs(jbt->next_sleep - jiffies)); @@ -320,53 +315,34 @@ static int jbt_sleep_to_normal(struct jbt_info *jbt) /* Sleep mode off */ ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT); - jbt->next_sleep = jiffies + msecs_to_jiffies(120); - /* Allow the booster and display controller to restart stably */ - mdelay(5); - - return ret ? -EIO : 0; -} - -static int jbt_normal_to_sleep(struct jbt_info *jbt) -{ - int ret; - - /* Make sure we are 120 ms after SLEEP_OUT */ - while (time_before(jiffies, jbt->next_sleep)) - cpu_relax(); - - ret = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF); - ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8000 | 1 << 3); - ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN); jbt->next_sleep = jiffies + msecs_to_jiffies(120); - /* Allow the internal circuits to stop automatically */ + /* Allow the booster and display controller to restart stably */ mdelay(5); return ret ? -EIO : 0; } -static int jbt_sleep_to_standby(struct jbt_info *jbt) +static int jbt_normal_to_off(struct jbt_info *jbt) { int ret; struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data; - ret = jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00); - - if (!ret) - ret = regulator_bulk_disable(ARRAY_SIZE(jbt->supplies), jbt->supplies); + /* Pull the plug! */ + ret = regulator_bulk_disable(ARRAY_SIZE(jbt->supplies), + jbt->supplies); if (!ret) gpio_set_value_cansleep(pdata->gpio_reset, 0); - return ret; + return ret ? -EIO : 0; } + static int jbt6k74_enter_power_mode(struct jbt_info *jbt, enum jbt_power_mode new_mode) { - struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data; int ret = -EINVAL; dev_dbg(&jbt->spi->dev, "entering (old_state=%s, new_state=%s)\n", @@ -375,49 +351,14 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt, mutex_lock(&jbt->lock); - if (jbt->suspended) { - switch (new_mode) { - case JBT_POWER_MODE_DEEP_STANDBY: - case JBT_POWER_MODE_SLEEP: - case JBT_POWER_MODE_NORMAL: - ret = 0; - jbt->suspend_mode = new_mode; - break; - default: - break; - } - } else if (new_mode == JBT_POWER_MODE_NORMAL && - pdata->enable_pixel_clock) { - pdata->enable_pixel_clock(&jbt->spi->dev, 1); - } - switch (jbt->power_mode) { - case JBT_POWER_MODE_DEEP_STANDBY: - switch (new_mode) { - case JBT_POWER_MODE_DEEP_STANDBY: - ret = 0; - break; - case JBT_POWER_MODE_SLEEP: - ret = jbt_standby_to_sleep(jbt); - break; - case JBT_POWER_MODE_NORMAL: - /* first transition into sleep */ - ret = jbt_standby_to_sleep(jbt); - /* then transition into normal */ - ret |= jbt_sleep_to_normal(jbt); - break; - } - break; - case JBT_POWER_MODE_SLEEP: + case JBT_POWER_MODE_OFF: switch (new_mode) { - case JBT_POWER_MODE_SLEEP: + case JBT_POWER_MODE_OFF: ret = 0; break; - case JBT_POWER_MODE_DEEP_STANDBY: - ret = jbt_sleep_to_standby(jbt); - break; case JBT_POWER_MODE_NORMAL: - ret = jbt_sleep_to_normal(jbt); + ret = jbt_off_to_normal(jbt); break; } break; @@ -426,25 +367,16 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt, case JBT_POWER_MODE_NORMAL: ret = 0; break; - case JBT_POWER_MODE_DEEP_STANDBY: - /* first transition into sleep */ - ret = jbt_normal_to_sleep(jbt); - /* then transition into deep standby */ - ret |= jbt_sleep_to_standby(jbt); - break; - case JBT_POWER_MODE_SLEEP: - ret = jbt_normal_to_sleep(jbt); + case JBT_POWER_MODE_OFF: + ret = jbt_normal_to_off(jbt); break; } } if (ret == 0) { jbt->power_mode = new_mode; - if (new_mode != JBT_POWER_MODE_NORMAL && - pdata->enable_pixel_clock) - pdata->enable_pixel_clock(&jbt->spi->dev, 0); } else { - dev_err(&jbt->spi->dev, "Failed enter state '%s': %d\n", + dev_err(&jbt->spi->dev, "Failed to enter state '%s': %d\n", jbt_power_mode_names[new_mode], ret); } @@ -470,8 +402,8 @@ static int jbt6k74_set_resolution(struct jbt_info *jbt, if (jbt->power_mode == JBT_POWER_MODE_NORMAL) { /* first transition into sleep */ - ret = jbt_normal_to_sleep(jbt); - ret |= jbt_sleep_to_normal(jbt); + ret = jbt_normal_to_off(jbt); + ret |= jbt_off_to_normal(jbt); if (ret) { jbt->resolution = old_resolution; @@ -589,7 +521,7 @@ static ssize_t reset_write(struct device *dev, struct device_attribute *attr, mutex_unlock(&jbt->lock); - jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY; + jbt->power_mode = JBT_POWER_MODE_OFF; jbt6k74_enter_power_mode(jbt, old_power_mode); return count; @@ -616,27 +548,6 @@ static struct attribute_group jbt_attr_group = { .attrs = jbt_sysfs_entries, }; -/* FIXME: This in an ugly hack to delay display blanking. - When the jbt is in sleep mode it displays an all white screen and thus one - will a see a short flash. - By delaying the blanking we will give the backlight a chance to turn off and - thus avoid getting the flash */ -static void jbt_blank_worker(struct work_struct *work) -{ - struct jbt_info *jbt = container_of(work, struct jbt_info, - blank_work.work); - - switch (jbt->blank_mode) { - case FB_BLANK_NORMAL: - jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP); - break; - case FB_BLANK_POWERDOWN: - jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY); - break; - default: - break; - } -} static int jbt6k74_set_mode(struct lcd_device *ld, struct fb_videomode *m) { @@ -649,7 +560,7 @@ static int jbt6k74_set_mode(struct lcd_device *ld, struct fb_videomode *m) ret = jbt6k74_set_resolution(jbt, JBT_RESOLUTION_VGA); } else { dev_err(&jbt->spi->dev, "Unknown resolution.\n"); - jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP); + jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF); } return ret; @@ -671,11 +582,11 @@ static int jbt6k74_set_power(struct lcd_device *ld, int power) break; case FB_BLANK_NORMAL: dev_dbg(&jbt->spi->dev, "blank\n"); - ret = schedule_delayed_work(&jbt->blank_work, HZ); + ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF); break; case FB_BLANK_POWERDOWN: dev_dbg(&jbt->spi->dev, "powerdown\n"); - ret = schedule_delayed_work(&jbt->blank_work, HZ); + ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF); break; default: break; @@ -691,10 +602,10 @@ static int jbt6k74_get_power(struct lcd_device *ld) switch (jbt->power_mode) { case JBT_POWER_MODE_NORMAL: return FB_BLANK_UNBLANK; - case JBT_POWER_MODE_SLEEP: + case JBT_POWER_MODE_OFF: return FB_BLANK_NORMAL; default: - return JBT_POWER_MODE_DEEP_STANDBY; + return JBT_POWER_MODE_OFF; } } @@ -707,7 +618,7 @@ void jbt6k74_action(int val) return; } if ( val == 0 ) { - jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_SLEEP); + jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_OFF); } else { jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_NORMAL); } @@ -756,11 +667,9 @@ static int __devinit jbt_probe(struct spi_device *spi) goto err_free_drvdata; } - INIT_DELAYED_WORK(&jbt->blank_work, jbt_blank_worker); - jbt->resolution = JBT_RESOLUTION_VGA; - jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY; jbt->next_sleep = jiffies + msecs_to_jiffies(120); + jbt->power_mode = JBT_POWER_MODE_OFF; mutex_init(&jbt->lock); dev_set_drvdata(&spi->dev, jbt); @@ -856,9 +765,10 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state) jbt->suspend_mode = jbt->power_mode; - jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY); - jbt->suspended = 1; + printk(KERN_CRIT "[jbt] powering off for suspend\n"); + jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF); + printk(KERN_CRIT "[jbt] done\n"); dev_info(&spi->dev, "suspended\n"); return 0; @@ -869,11 +779,13 @@ int jbt6k74_resume(struct spi_device *spi) struct jbt_info *jbt = dev_get_drvdata(&spi->dev); dev_info(&spi->dev, "starting resume: %d\n", jbt->suspend_mode); + printk(KERN_CRIT "[jbt] powering on for resume\n"); mdelay(20); jbt->suspended = 0; jbt6k74_enter_power_mode(jbt, jbt->suspend_mode); + printk(KERN_CRIT "[jbt] done\n"); dev_info(&spi->dev, "resumed: %d\n", jbt->suspend_mode); return 0; |