diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2022-05-18 11:27:16 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-05-20 00:09:45 +0000 |
commit | f4a64c7feb5e97396c3de25ee3eb47493975a02b (patch) | |
tree | 972c1d952cc25fa208b6993166daabdb0a732f88 /common/rgb_keyboard.c | |
parent | d621541e408b0f0e7425812976545c375f00f498 (diff) | |
download | chrome-ec-f4a64c7feb5e97396c3de25ee3eb47493975a02b.tar.gz |
RGBKBD: Add late initialization
is31fl3743b does not successfully change the GCC or scale registers
during power-on after a cold reset.
This patch adds a delayed initialization to rgbkbd_enable so that the
chip will be re-initialized on the first operation (e.g. enable, set
brightness, set color).
BUG=b:232443638
BRANCH=None
TEST=Vell
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Change-Id: Ie78983dab73c608aa9d14b3e1f9d1edd2def2e54
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3654489
Reviewed-by: Parth Malkan <parthmalkan@google.com>
Diffstat (limited to 'common/rgb_keyboard.c')
-rw-r--r-- | common/rgb_keyboard.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/common/rgb_keyboard.c b/common/rgb_keyboard.c index fe0c44ce07..2bce0066a9 100644 --- a/common/rgb_keyboard.c +++ b/common/rgb_keyboard.c @@ -329,6 +329,24 @@ static int rgbkbd_init(void) return rv; } +/* This is used to re-init on the first enable. */ +static bool reinitialized; +static int rgbkbd_late_init(void) +{ + if (IS_ENABLED(CONFIG_IS31FL3743B_LATE_INIT)) { + if (!reinitialized) { + int rv; + + CPRINTS("Re-initializing"); + rv = rgbkbd_init(); + if (rv) + return rv; + reinitialized = true; + } + } + return EC_SUCCESS; +} + static int rgbkbd_enable(int enable) { int rv = EC_SUCCESS; @@ -337,6 +355,9 @@ static int rgbkbd_enable(int enable) if (enable) { if (rgbkbd_state == RGBKBD_STATE_ENABLED) return EC_SUCCESS; + rv = rgbkbd_late_init(); + if (rv) + return rv; } else { if (rgbkbd_state == RGBKBD_STATE_DISABLED) return EC_SUCCESS; @@ -368,6 +389,11 @@ static int rgbkbd_enable(int enable) static int rgbkbd_kblight_set(int percent) { uint8_t gcc = DIV_ROUND_NEAREST(percent * RGBKBD_MAX_GCC_LEVEL, 100); + int rv = rgbkbd_late_init(); + + if (rv) + return rv; + return rgbkbd_set_global_brightness(gcc); } @@ -381,6 +407,7 @@ static void rgbkbd_reset(void) board_kblight_shutdown(); board_kblight_init(); rgbkbd_state = RGBKBD_STATE_RESET; + reinitialized = false; } const struct kblight_drv kblight_rgbkbd = { @@ -412,6 +439,9 @@ static enum ec_status hc_rgbkbd_set_color(struct host_cmd_handler_args *args) if (p->start_key + p->length > EC_RGBKBD_MAX_KEY_COUNT) return EC_RES_INVALID_PARAM; + if (rgbkbd_late_init()) + return EC_RES_ERROR; + for (i = 0; i < p->length; i++) { uint8_t j = rgbkbd_table[p->start_key + i]; union rgbkbd_coord_u8 led; @@ -441,6 +471,9 @@ static enum ec_status hc_rgbkbd(struct host_cmd_handler_args *args) const struct ec_params_rgbkbd *p = args->params; enum ec_status rv = EC_RES_ERROR; + if (rgbkbd_late_init()) + return EC_RES_ERROR; + switch (p->subcmd) { case EC_RGBKBD_SUBCMD_CLEAR: rgbkbd_reset_color(p->color); |