summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Manton <cmanton@google.com>2013-08-02 12:28:36 -0700
committerChris Manton <cmanton@google.com>2013-08-14 15:08:57 -0700
commitd7a12980520f766168c116a2224a4bff9b3fd412 (patch)
tree4f199cef252e0b1d468e526d47e4b83eddb2481c
parentecd02e180ac4c31da7098afed730e49e6a900b8a (diff)
downloadomap-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.c2
-rw-r--r--drivers/input/misc/ltr506als.c31
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(&ltr506->i2c_client->dev, "%s: ALS already enabled...\n", __func__);
- return rc;
+ dev_err(&ltr506->i2c_client->dev, "%s: ALS already enabled...disabling first\n", __func__);
+ rc = als_disable(ltr506);
+ if (rc) {
+ dev_err(&ltr506->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(&ltr506->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(&ltr506->i2c_client->dev, "%s Unable to complete resume\n", __func__);
} else {