diff options
author | Chris Manton <cmanton@google.com> | 2013-08-02 12:28:36 -0700 |
---|---|---|
committer | Chris Manton <cmanton@google.com> | 2013-08-14 15:08:57 -0700 |
commit | d7a12980520f766168c116a2224a4bff9b3fd412 (patch) | |
tree | 4f199cef252e0b1d468e526d47e4b83eddb2481c | |
parent | ecd02e180ac4c31da7098afed730e49e6a900b8a (diff) | |
download | omap-omapzoom-d7a12980520f766168c116a2224a4bff9b3fd412.tar.gz |
Restore ALS off during suspend
This will reduce deep suspend current while maintaining
availability for both the camera and the display.
It also forces a value through when zero is presented
on the ALS sensor to ensure traversal through input layer.
Change-Id: I06d2ee9865a9585b93252c1db2a6ef7d2ee660ac
-rw-r--r-- | arch/arm/mach-omap2/board-notle.c | 2 | ||||
-rw-r--r-- | drivers/input/misc/ltr506als.c | 31 |
2 files changed, 30 insertions, 3 deletions
diff --git a/arch/arm/mach-omap2/board-notle.c b/arch/arm/mach-omap2/board-notle.c index 4bad3a0b1067..dcb5ce70584c 100644 --- a/arch/arm/mach-omap2/board-notle.c +++ b/arch/arm/mach-omap2/board-notle.c @@ -1537,7 +1537,7 @@ static struct ltr506_platform_data notle_ltr506als_data = { .pfd_gpio_int_wake_dev = 0, /* Disable als on suspend flag */ - .pfd_disable_als_on_suspend = 0, + .pfd_disable_als_on_suspend = 1, /* ALS enable filtering interrupts * by suppressing interrupts when measured value diff --git a/drivers/input/misc/ltr506als.c b/drivers/input/misc/ltr506als.c index 072aaceff520..f9b1763f3e30 100644 --- a/drivers/input/misc/ltr506als.c +++ b/drivers/input/misc/ltr506als.c @@ -114,6 +114,9 @@ struct ltr506_data { struct ltr506_data *sensor_info; +static int als_enable(struct ltr506_data *ltr506); +static int als_disable(struct ltr506_data *ltr506); + /* I2C Read */ static int I2C_Read(char *rxData, int length) @@ -826,8 +829,14 @@ static int als_enable(struct ltr506_data *ltr506) int rc = 0; if (ltr506->als_enable_flag != 0) { - dev_err(<r506->i2c_client->dev, "%s: ALS already enabled...\n", __func__); - return rc; + dev_err(<r506->i2c_client->dev, "%s: ALS already enabled...disabling first\n", __func__); + rc = als_disable(ltr506); + if (rc) { + dev_err(<r506->i2c_client->dev, "%s: Unable to disable ALS\n", __func__); + return rc; + } + /* Wait some amount of time for the ALS to disable. */ + msleep(30); } /* NOTE(CMM) This part requires a workaround to enable the PS in order for the @@ -1858,6 +1867,24 @@ static void ltr506_late_resume(struct early_suspend *h) ltr506->ps_suspend_enable_flag = 0; } + /* Work around to force new values upon resume through the input + subsystem when there is literally no entropy left in our bits. */ + { + uint16_t adc_value; + adc_value = read_adc_value(ltr506); + if (adc_value == LTR506_ALS_MIN_MEASURE_VAL) { + /* Special case to force new value through input + subsystem upon resume. */ + adc_value = LTR506_ALS_MIN_MEASURE_VAL+1; + dev_info(<r506->i2c_client->dev, + "%s Detected darkness synthesizing value %d\n", + __func__, adc_value); + input_report_abs(ltr506->als_input_dev, ABS_MISC, + adc_value); + input_sync(ltr506->als_input_dev); + } + } + if (ret) { dev_err(<r506->i2c_client->dev, "%s Unable to complete resume\n", __func__); } else { |