summaryrefslogtreecommitdiff
path: root/common/pwm_kblight.c
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2018-05-08 14:45:55 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-05-11 12:10:44 -0700
commit94b4c511a6a5f185bce14d30731f165c4c48d752 (patch)
tree1b26f85d80991d24cf22eb5e123796dd3d48c3cf /common/pwm_kblight.c
parentf21a0681c78e67ccc11f350dc3a455360fc765fb (diff)
downloadchrome-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.c121
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,
+};