summaryrefslogtreecommitdiff
path: root/common/rgb_keyboard.c
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2022-05-18 11:27:16 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-05-20 00:09:45 +0000
commitf4a64c7feb5e97396c3de25ee3eb47493975a02b (patch)
tree972c1d952cc25fa208b6993166daabdb0a732f88 /common/rgb_keyboard.c
parentd621541e408b0f0e7425812976545c375f00f498 (diff)
downloadchrome-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.c33
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);