diff options
-rw-r--r-- | common/keyboard_backlight.c | 22 | ||||
-rw-r--r-- | common/pwm.c | 35 | ||||
-rw-r--r-- | common/rgb_keyboard.c | 42 | ||||
-rw-r--r-- | include/rgb_keyboard.h | 16 | ||||
-rw-r--r-- | test/rgb_keyboard.c | 11 |
5 files changed, 35 insertions, 91 deletions
diff --git a/common/keyboard_backlight.c b/common/keyboard_backlight.c index 4940d9a97e..b1b3671d3d 100644 --- a/common/keyboard_backlight.c +++ b/common/keyboard_backlight.c @@ -19,6 +19,7 @@ static struct kblight_conf kblight; static int current_percent; +static uint8_t current_enable; void __attribute__((weak)) board_kblight_init(void) { } @@ -56,14 +57,23 @@ int kblight_get(void) return current_percent; } -int kblight_enable(int enable) +static void kblight_enable_deferred(void) { #ifdef CONFIG_KBLIGHT_ENABLE_PIN - gpio_set_level(GPIO_EN_KEYBOARD_BACKLIGHT, enable); + gpio_set_level(GPIO_EN_KEYBOARD_BACKLIGHT, current_enable); #endif if (!kblight.drv || !kblight.drv->enable) - return -1; - return kblight.drv->enable(enable); + return; + kblight.drv->enable(current_enable); +} +DECLARE_DEFERRED(kblight_enable_deferred); + +int kblight_enable(int enable) +{ + current_enable = enable; + /* Need to defer i2c in case it's called from an interrupt handler. */ + hook_call_deferred(&kblight_enable_deferred_data, 0); + return EC_SUCCESS; } int kblight_get_enabled(void) @@ -104,6 +114,7 @@ static void keyboard_backlight_init(void) } DECLARE_HOOK(HOOK_INIT, keyboard_backlight_init, HOOK_PRIO_DEFAULT); +#ifdef HAS_TASK_CHIPSET static void kblight_suspend(void) { kblight_enable(0); @@ -118,12 +129,15 @@ static void kblight_resume(void) } } DECLARE_HOOK(HOOK_CHIPSET_RESUME, kblight_resume, HOOK_PRIO_DEFAULT); +#endif // HAS_TASK_CHIPSET +#ifdef CONFIG_LID_SWITCH static void kblight_lid_change(void) { kblight_enable(lid_is_open() && current_percent); } DECLARE_HOOK(HOOK_LID_CHANGE, kblight_lid_change, HOOK_PRIO_DEFAULT); +#endif /* * Console and host commands diff --git a/common/pwm.c b/common/pwm.c index 7699405f3d..a4edfdd5a5 100644 --- a/common/pwm.c +++ b/common/pwm.c @@ -9,7 +9,6 @@ #include "hooks.h" #include "host_command.h" #include "pwm.h" -#include "rgb_keyboard.h" #include "util.h" #ifdef CONFIG_PWM @@ -65,18 +64,10 @@ host_command_pwm_set_duty(struct host_cmd_handler_args *args) const struct ec_params_pwm_set_duty *p = args->params; enum pwm_channel channel; - if (IS_ENABLED(CONFIG_RGB_KEYBOARD) && - (p->pwm_type == EC_PWM_TYPE_KB_LIGHT)) { - uint8_t gcc = DIV_ROUND_NEAREST(p->duty * RGBKBD_MAX_GCC_LEVEL, - EC_PWM_MAX_DUTY); - if (rgbkbd_set_global_brightness(gcc)) - return EC_RES_ERROR; - } else { - if (get_target_channel(&channel, p->pwm_type, p->index)) - return EC_RES_INVALID_PARAM; - pwm_set_raw_duty(channel, p->duty); - pwm_enable(channel, p->duty > 0); - } + if (get_target_channel(&channel, p->pwm_type, p->index)) + return EC_RES_INVALID_PARAM; + pwm_set_raw_duty(channel, p->duty); + pwm_enable(channel, p->duty > 0); return EC_RES_SUCCESS; } @@ -90,22 +81,12 @@ host_command_pwm_get_duty(struct host_cmd_handler_args *args) const struct ec_params_pwm_get_duty *p = args->params; struct ec_response_pwm_get_duty *r = args->response; - if (IS_ENABLED(CONFIG_RGB_KEYBOARD) && - (p->pwm_type == EC_PWM_TYPE_KB_LIGHT)) { - uint8_t gcc; - - if (rgbkbd_get_global_brightness(&gcc)) - return EC_RES_ERROR; - r->duty = DIV_ROUND_NEAREST(gcc * EC_PWM_MAX_DUTY, - RGBKBD_MAX_GCC_LEVEL); - } else { - enum pwm_channel channel; + enum pwm_channel channel; - if (get_target_channel(&channel, p->pwm_type, p->index)) - return EC_RES_INVALID_PARAM; + if (get_target_channel(&channel, p->pwm_type, p->index)) + return EC_RES_INVALID_PARAM; - r->duty = pwm_get_raw_duty(channel); - } + r->duty = pwm_get_raw_duty(channel); args->response_size = sizeof(*r); diff --git a/common/rgb_keyboard.c b/common/rgb_keyboard.c index b5a8bfae40..d909d3ad09 100644 --- a/common/rgb_keyboard.c +++ b/common/rgb_keyboard.c @@ -234,7 +234,7 @@ void rgbkbd_init_lookup_table(void) */ } -int rgbkbd_set_global_brightness(uint8_t gcc) +static int rgbkbd_set_global_brightness(uint8_t gcc) { int e, grid; int rv = EC_SUCCESS; @@ -249,8 +249,6 @@ int rgbkbd_set_global_brightness(uint8_t gcc) rv = e; continue; } - - ctx->gcc = gcc; } CPRINTS("Set GCC to %u", gcc); @@ -259,21 +257,14 @@ int rgbkbd_set_global_brightness(uint8_t gcc) return rv; } -int rgbkbd_get_global_brightness(uint8_t *gcc) -{ - *gcc = rgbkbds[0].gcc; - - return EC_SUCCESS; -} - -__overridable void board_enable_rgb_keyboard(bool enable) {} - static int rgbkbd_init(void) { int rv = EC_SUCCESS; int e, i; bool updated = false; + rgbkbd_init_lookup_table(); + for (i = 0; i < rgbkbd_count; i++) { struct rgbkbd *ctx = &rgbkbds[i]; @@ -342,16 +333,6 @@ static int rgbkbd_kblight_set(int percent) return rgbkbd_set_global_brightness(gcc); } -static int rgbkbd_kblight_get(void) -{ - uint8_t gcc; - - if (rgbkbd_get_global_brightness(&gcc)) - return 0; - - return DIV_ROUND_NEAREST(gcc * 100, RGBKBD_MAX_GCC_LEVEL); -} - static int rgbkbd_get_enabled(void) { return rgbkbds[0].state >= RGBKBD_STATE_ENABLED; @@ -360,14 +341,8 @@ static int rgbkbd_get_enabled(void) const struct kblight_drv kblight_rgbkbd = { .init = rgbkbd_init, .set = rgbkbd_kblight_set, - .get = rgbkbd_kblight_get, - /* - * We need to let RGBKBD manage enable/disable the backlight to keep - * the LEDs under the control of RGBKBD. Registering NULL also avoids - * ASSERT(!in_interrupt_context()) failure in task.c called from - * rgbkbd_enable API. - */ - .enable = NULL, + .get = NULL, + .enable = rgbkbd_enable, .get_enabled = rgbkbd_get_enabled, }; @@ -375,13 +350,6 @@ void rgbkbd_task(void *u) { uint32_t event; - board_enable_rgb_keyboard(true); - - rgbkbd_init_lookup_table(); - rgbkbd_init(); - rgbkbd_enable(1); - rgbkbd_set_global_brightness(0x80); - while (1) { event = task_wait_event(100 * MSEC); if (IS_ENABLED(CONFIG_RGB_KEYBOARD_DEBUG)) diff --git a/include/rgb_keyboard.h b/include/rgb_keyboard.h index 2c6a550e7b..3593ab6f0e 100644 --- a/include/rgb_keyboard.h +++ b/include/rgb_keyboard.h @@ -39,8 +39,6 @@ struct rgbkbd { const struct rgbkbd_cfg * const cfg; /* Current state of the port */ enum rgbkbd_state state; - /* Global current control (a.k.a. backlight brightness) */ - uint8_t gcc; /* Buffer containing color info for each dot. */ struct rgb_s *buf; }; @@ -142,11 +140,6 @@ extern const uint8_t rgbkbd_hsize; extern const uint8_t rgbkbd_vsize; /* - * Called to power on or off the RGB keyboard module. - */ -__override_proto void board_enable_rgb_keyboard(bool enable); - -/* * rgbkbd_map describes a mapping from key IDs to LED IDs. * * Multiple keys can be mapped to one LED and one key can be mapped to multiple @@ -178,15 +171,6 @@ __override_proto void board_enable_rgb_keyboard(bool enable); extern const uint8_t rgbkbd_map[]; extern const size_t rgbkbd_map_size; -/** - * Set/get global brightness of the RGB keyboard. - * - * @param gcc Brightness level 0 ~ RGBKBD_MAX_GCC_LEVEL. - * @return enum ec_error_list; - */ -int rgbkbd_set_global_brightness(uint8_t gcc); -int rgbkbd_get_global_brightness(uint8_t *gcc); - /* * Driver for keyboard_backlight. */ diff --git a/test/rgb_keyboard.c b/test/rgb_keyboard.c index 014f32b014..935c60165b 100644 --- a/test/rgb_keyboard.c +++ b/test/rgb_keyboard.c @@ -116,10 +116,14 @@ static int test_drv_set_gcc(struct rgbkbd *ctx, uint8_t level) return EC_SUCCESS; } +void rgbkbd_init_lookup_table(void); + static int test_rgbkbd_map(void) { union rgbkbd_coord_u8 led; + rgbkbd_init_lookup_table(); + led.u8 = rgbkbd_map[rgbkbd_table[0]]; zassert_equal(RGBKBD_COORD(led.coord.x, led.coord.y), RGBKBD_DELM, "key[0] -> None"); @@ -164,13 +168,6 @@ static int test_rgbkbd_startup(void) /* Let RGBKBD task run. */ task_wait_event(-1); - zassert_equal(mock_state.count_drv_init, rgbkbd_count, - "init() called"); - zassert_equal(mock_state.count_drv_set_gcc, rgbkbd_count, - "set_gcc() called"); - zassert_equal(mock_state.count_drv_set_scale, rgbkbd_count, - "set_scale() called"); - /* Check 'DOT' demo. */ for (x = 0; x < rgbkbd_hsize; x++) { g = x / rgbkbds[0].cfg->col_len; |