diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2018-05-08 14:45:55 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-05-11 12:10:44 -0700 |
commit | 94b4c511a6a5f185bce14d30731f165c4c48d752 (patch) | |
tree | 1b26f85d80991d24cf22eb5e123796dd3d48c3cf /common/pwm_kblight.c | |
parent | f21a0681c78e67ccc11f350dc3a455360fc765fb (diff) | |
download | chrome-ec-94b4c511a6a5f185bce14d30731f165c4c48d752.tar.gz |
kblight: Add keyboard backlight control module
This patch promotes board/nami/keyboard_backlight.c to common
directory.
Board customization is done via board_kblight_init callback.
It currently supports two drivers: direct PWM control and lm3509.
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
BUG=b:78360907,b:78141647
BRANCH=none
TEST=On Nami (for lm3509) and Sona (pwm), verify the followings:
1. Alt + brightness up/down works
2. After suspend-resume, brightness is restored
3. Lid close/open
4. After screen is off, keyboard backlight is turned off
Change-Id: I584c06e8702fe7b289999698f277311cfd3400bd
Reviewed-on: https://chromium-review.googlesource.com/1051027
Commit-Ready: Daisuke Nojiri <dnojiri@chromium.org>
Tested-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
Diffstat (limited to 'common/pwm_kblight.c')
-rw-r--r-- | common/pwm_kblight.c | 121 |
1 files changed, 21 insertions, 100 deletions
diff --git a/common/pwm_kblight.c b/common/pwm_kblight.c index 13415b5c51..1db5b9e5bd 100644 --- a/common/pwm_kblight.c +++ b/common/pwm_kblight.c @@ -3,123 +3,44 @@ * found in the LICENSE file. */ -/* PWM control module for Chromebook keyboard backlight. */ +/* PWM control module for keyboard backlight. */ #include "common.h" -#include "console.h" -#include "gpio.h" -#include "hooks.h" -#include "host_command.h" -#include "lid_switch.h" +#include "keyboard_backlight.h" #include "pwm.h" #include "system.h" #include "util.h" -#define PWMKBD_SYSJUMP_TAG 0x504b /* "PK" */ -#define PWM_HOOK_VERSION 1 -/* Saved PWM state across sysjumps */ -struct pwm_kbd_state { - uint8_t kblight_en; - uint8_t kblight_percent; -}; - -/*****************************************************************************/ -/* Console commands */ +const enum pwm_channel kblight_pwm_ch = PWM_CH_KBLIGHT; -static int command_kblight(int argc, char **argv) +static int kblight_pwm_set(int percent) { - if (argc >= 2) { - char *e; - int i = strtoi(argv[1], &e, 0); - if (*e) - return EC_ERROR_PARAM1; - pwm_set_duty(PWM_CH_KBLIGHT, i); - } - - ccprintf("Keyboard backlight: %d%%\n", pwm_get_duty(PWM_CH_KBLIGHT)); + pwm_set_duty(kblight_pwm_ch, percent); return EC_SUCCESS; } -DECLARE_CONSOLE_COMMAND(kblight, command_kblight, - "percent", - "Set keyboard backlight"); - -/*****************************************************************************/ -/* Host commands */ - -int pwm_command_get_keyboard_backlight(struct host_cmd_handler_args *args) -{ - struct ec_response_pwm_get_keyboard_backlight *r = args->response; - - r->percent = pwm_get_duty(PWM_CH_KBLIGHT); - r->enabled = pwm_get_enabled(PWM_CH_KBLIGHT); - args->response_size = sizeof(*r); - - return EC_RES_SUCCESS; -} -DECLARE_HOST_COMMAND(EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT, - pwm_command_get_keyboard_backlight, - EC_VER_MASK(0)); - -int pwm_command_set_keyboard_backlight(struct host_cmd_handler_args *args) -{ - const struct ec_params_pwm_set_keyboard_backlight *p = args->params; - - pwm_set_duty(PWM_CH_KBLIGHT, p->percent); - - return EC_RES_SUCCESS; -} -DECLARE_HOST_COMMAND(EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT, - pwm_command_set_keyboard_backlight, - EC_VER_MASK(0)); - -/*****************************************************************************/ -/* Hooks */ -static void pwm_kblight_init(void) +static int kblight_pwm_get(void) { - const struct pwm_kbd_state *prev; - int version, size; - - prev = (const struct pwm_kbd_state *) - system_get_jump_tag(PWMKBD_SYSJUMP_TAG, &version, &size); - if (prev && version == PWM_HOOK_VERSION && size == sizeof(*prev)) { - /* Restore previous state. */ - pwm_enable(PWM_CH_KBLIGHT, prev->kblight_en); - pwm_set_duty(PWM_CH_KBLIGHT, prev->kblight_percent); - } else { - /* Enable keyboard backlight control, turned down */ - pwm_set_duty(PWM_CH_KBLIGHT, 0); - pwm_enable(PWM_CH_KBLIGHT, 1); - } + return pwm_get_duty(kblight_pwm_ch); } -DECLARE_HOOK(HOOK_INIT, pwm_kblight_init, HOOK_PRIO_DEFAULT); -static void pwm_kblight_preserve_state(void) +static int kblight_pwm_init(void) { - struct pwm_kbd_state state; - - state.kblight_en = pwm_get_enabled(PWM_CH_KBLIGHT); - state.kblight_percent = pwm_get_duty(PWM_CH_KBLIGHT); - - system_add_jump_tag(PWMKBD_SYSJUMP_TAG, PWM_HOOK_VERSION, - sizeof(state), &state); -} -DECLARE_HOOK(HOOK_SYSJUMP, pwm_kblight_preserve_state, HOOK_PRIO_DEFAULT); - -static void pwm_kblight_suspend(void) -{ - pwm_set_duty(PWM_CH_KBLIGHT, 0); + /* dnojiri: Why do we need save/restore setting over sysjump? */ + kblight_pwm_set(0); + pwm_enable(kblight_pwm_ch, 1); + return EC_SUCCESS; } -DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, pwm_kblight_suspend, HOOK_PRIO_DEFAULT); -static void pwm_kblight_shutdown(void) +static int kblight_pwm_enable(int enable) { - pwm_set_duty(PWM_CH_KBLIGHT, 0); + pwm_enable(kblight_pwm_ch, enable); + return EC_SUCCESS; } -DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, pwm_kblight_shutdown, HOOK_PRIO_DEFAULT); -static void pwm_kblight_lid_change(void) -{ - pwm_enable(PWM_CH_KBLIGHT, lid_is_open()); -} -DECLARE_HOOK(HOOK_LID_CHANGE, pwm_kblight_lid_change, HOOK_PRIO_DEFAULT); +const struct kblight_drv kblight_pwm = { + .init = kblight_pwm_init, + .set = kblight_pwm_set, + .get = kblight_pwm_get, + .enable = kblight_pwm_enable, +}; |