summaryrefslogtreecommitdiff
path: root/msm8909/liblight/lights.c
diff options
context:
space:
mode:
Diffstat (limited to 'msm8909/liblight/lights.c')
-rw-r--r--msm8909/liblight/lights.c122
1 files changed, 90 insertions, 32 deletions
diff --git a/msm8909/liblight/lights.c b/msm8909/liblight/lights.c
index cf24d501..eed6a250 100644
--- a/msm8909/liblight/lights.c
+++ b/msm8909/liblight/lights.c
@@ -1,6 +1,7 @@
/*
+ * Copyright (C) 2014, 2017 The Linux Foundation. All rights reserved.
+ * Not a contribution
* Copyright (C) 2008 The Android Open Source Project
- * Copyright (C) 2014 The Linux Foundation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,8 +19,8 @@
// #define LOG_NDEBUG 0
-#include <cutils/log.h>
-
+#include <log/log.h>
+#include <cutils/properties.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -32,6 +33,11 @@
#include <sys/types.h>
#include <hardware/lights.h>
+#include "lights_prv.h"
+
+#ifndef DEFAULT_LOW_PERSISTENCE_MODE_BRIGHTNESS
+#define DEFAULT_LOW_PERSISTENCE_MODE_BRIGHTNESS 0x80
+#endif
/******************************************************************************/
@@ -39,7 +45,9 @@ static pthread_once_t g_init = PTHREAD_ONCE_INIT;
static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;
static struct light_state_t g_notification;
static struct light_state_t g_battery;
+static int g_last_backlight_mode = BRIGHTNESS_MODE_USER;
static int g_attention = 0;
+static int g_brightness_max = 0;
char const*const RED_LED_FILE
= "/sys/class/leds/red/brightness";
@@ -50,12 +58,12 @@ char const*const GREEN_LED_FILE
char const*const BLUE_LED_FILE
= "/sys/class/leds/blue/brightness";
-char const*const BLUETOOTH_LED_FILE
- = "/sys/class/leds/bt/brightness";
-
char const*const LCD_FILE
= "/sys/class/leds/lcd-backlight/brightness";
+char const*const LCD_FILE2
+ = "/sys/class/backlight/panel0-backlight/brightness";
+
char const*const BUTTON_FILE
= "/sys/class/leds/button-backlight/brightness";
@@ -68,6 +76,9 @@ char const*const GREEN_BLINK_FILE
char const*const BLUE_BLINK_FILE
= "/sys/class/leds/blue/blink";
+char const*const PERSISTENCE_FILE
+ = "/sys/class/graphics/fb0/msm_fb_persist_mode";
+
/**
* device methods
*/
@@ -120,12 +131,59 @@ set_light_backlight(struct light_device_t* dev,
{
int err = 0;
int brightness = rgb_to_brightness(state);
+ unsigned int lpEnabled =
+ state->brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE;
+ if(!dev) {
+ return -1;
+ }
+
+ pthread_mutex_lock(&g_lock);
+ // Toggle low persistence mode state
+ if ((g_last_backlight_mode != state->brightnessMode && lpEnabled) ||
+ (!lpEnabled &&
+ g_last_backlight_mode == BRIGHTNESS_MODE_LOW_PERSISTENCE)) {
+ if ((err = write_int(PERSISTENCE_FILE, lpEnabled)) != 0) {
+ ALOGE("%s: Failed to write to %s: %s\n", __FUNCTION__,
+ PERSISTENCE_FILE, strerror(errno));
+ }
+ if (lpEnabled != 0) {
+ brightness = DEFAULT_LOW_PERSISTENCE_MODE_BRIGHTNESS;
+ }
+ }
+
+ g_last_backlight_mode = state->brightnessMode;
+
+ if (!err) {
+ if (!access(LCD_FILE, F_OK)) {
+ err = write_int(LCD_FILE, brightness);
+ } else {
+ err = write_int(LCD_FILE2, brightness);
+ }
+ }
+
+ pthread_mutex_unlock(&g_lock);
+ return err;
+}
+
+static int
+set_light_backlight_ext(struct light_device_t* dev,
+ struct light_state_t const* state)
+{
+ int err = 0;
+
if(!dev) {
return -1;
}
+
+ int brightness = state->color & 0x00ffffff;
pthread_mutex_lock(&g_lock);
- err = write_int(LCD_FILE, brightness);
+
+ if (brightness >= 0 && brightness <= g_brightness_max) {
+ set_brightness_ext_level(brightness);
+ }
+
pthread_mutex_unlock(&g_lock);
+
return err;
}
@@ -184,15 +242,15 @@ set_speaker_light_locked(struct light_device_t* dev,
if (red) {
if (write_int(RED_BLINK_FILE, blink))
write_int(RED_LED_FILE, 0);
- }
+ }
if (green) {
if (write_int(GREEN_BLINK_FILE, blink))
write_int(GREEN_LED_FILE, 0);
- }
+ }
if (blue) {
if (write_int(BLUE_BLINK_FILE, blink))
write_int(BLUE_LED_FILE, 0);
- }
+ }
} else {
write_int(RED_LED_FILE, red);
write_int(GREEN_LED_FILE, green);
@@ -263,20 +321,6 @@ set_light_buttons(struct light_device_t* dev,
return err;
}
-static int
-set_light_bluetooth(struct light_device_t* dev,
- struct light_state_t const* state)
-{
- int err = 0;
- if(!dev) {
- return -1;
- }
- pthread_mutex_lock(&g_lock);
- err = write_int(BLUETOOTH_LED_FILE, state->color & 0xFF);
- pthread_mutex_unlock(&g_lock);
- return err;
-}
-
/** Close the lights device */
static int
close_lights(struct light_device_t *dev)
@@ -301,18 +345,32 @@ static int open_lights(const struct hw_module_t* module, char const* name,
int (*set_light)(struct light_device_t* dev,
struct light_state_t const* state);
- if (0 == strcmp(LIGHT_ID_BACKLIGHT, name))
- set_light = set_light_backlight;
- else if (0 == strcmp(LIGHT_ID_BATTERY, name))
+ if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
+ char property[PROPERTY_VALUE_MAX];
+ property_get("persist.extend.brightness", property, "0");
+
+ if(!(strncmp(property, "1", PROPERTY_VALUE_MAX)) ||
+ !(strncmp(property, "true", PROPERTY_VALUE_MAX))) {
+ property_get("persist.display.max_brightness", property, "255");
+ g_brightness_max = atoi(property);
+ set_brightness_ext_init();
+ set_light = set_light_backlight_ext;
+ } else
+ set_light = set_light_backlight;
+ } else if (0 == strcmp(LIGHT_ID_BATTERY, name))
set_light = set_light_battery;
else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name))
set_light = set_light_notifications;
- else if (0 == strcmp(LIGHT_ID_BUTTONS, name))
- set_light = set_light_buttons;
+ else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
+ if (!access(BUTTON_FILE, F_OK)) {
+ // enable light button when the file is present
+ set_light = set_light_buttons;
+ } else {
+ return -EINVAL;
+ }
+ }
else if (0 == strcmp(LIGHT_ID_ATTENTION, name))
set_light = set_light_attention;
- else if (0 == strcmp(LIGHT_ID_BLUETOOTH, name))
- set_light = set_light_bluetooth;
else
return -EINVAL;
@@ -326,7 +384,7 @@ static int open_lights(const struct hw_module_t* module, char const* name,
memset(dev, 0, sizeof(*dev));
dev->common.tag = HARDWARE_DEVICE_TAG;
- dev->common.version = 0;
+ dev->common.version = LIGHTS_DEVICE_API_VERSION_2_0;
dev->common.module = (struct hw_module_t*)module;
dev->common.close = (int (*)(struct hw_device_t*))close_lights;
dev->set_light = set_light;