From c7ab8715dee2ceae41a38042c234be859ba9276c Mon Sep 17 00:00:00 2001 From: Jaap Versteegh Date: Mon, 15 Dec 2025 14:47:08 +0100 Subject: [PATCH 1/3] Don't store ext power settings when ext power is controlled by rgb --- app/src/ext_power_generic.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 3975e038a..8617f5c3c 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -29,12 +29,12 @@ struct ext_power_generic_config { struct ext_power_generic_data { bool status; -#if IS_ENABLED(CONFIG_SETTINGS) +#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) bool settings_init; #endif }; -#if IS_ENABLED(CONFIG_SETTINGS) +#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) static void ext_power_save_state_work(struct k_work *work) { char setting_path[40]; const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); @@ -48,7 +48,7 @@ static struct k_work_delayable ext_power_save_work; #endif int ext_power_save_state(void) { -#if IS_ENABLED(CONFIG_SETTINGS) +#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) int ret = k_work_reschedule(&ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); return MIN(ret, 0); #else @@ -91,7 +91,7 @@ static int ext_power_generic_get(const struct device *dev) { return data->status; } -#if IS_ENABLED(CONFIG_SETTINGS) +#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) static int ext_power_settings_set_status(const struct device *dev, size_t len, settings_read_cb read_cb, void *cb_arg) { struct ext_power_generic_data *data = dev->data; @@ -158,7 +158,7 @@ static int ext_power_generic_init(const struct device *dev) { } } -#if IS_ENABLED(CONFIG_SETTINGS) +#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) k_work_init_delayable(&ext_power_save_work, ext_power_save_state_work); #endif @@ -197,7 +197,7 @@ static const struct ext_power_generic_config config = { static struct ext_power_generic_data data = { .status = false, -#if IS_ENABLED(CONFIG_SETTINGS) +#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) .settings_init = false, #endif }; From c28536ee292dcd996dff137a38b9ae817eeb5967 Mon Sep 17 00:00:00 2001 From: Jaap Versteegh Date: Sat, 20 Dec 2025 12:30:01 +0100 Subject: [PATCH 2/3] Improve readability with additional macro --- app/src/ext_power_generic.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 8617f5c3c..02a5e1098 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -21,6 +21,9 @@ #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); +#define PERSIST_EXT_POWER_STATE \ + IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) + struct ext_power_generic_config { const struct gpio_dt_spec *control; const size_t control_gpios_count; @@ -29,12 +32,12 @@ struct ext_power_generic_config { struct ext_power_generic_data { bool status; -#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) +#if PERSIST_EXT_POWER_STATE bool settings_init; #endif }; -#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) +#if PERSIST_EXT_POWER_STATE static void ext_power_save_state_work(struct k_work *work) { char setting_path[40]; const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); @@ -48,7 +51,7 @@ static struct k_work_delayable ext_power_save_work; #endif int ext_power_save_state(void) { -#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) +#if PERSIST_EXT_POWER_STATE int ret = k_work_reschedule(&ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); return MIN(ret, 0); #else @@ -91,7 +94,7 @@ static int ext_power_generic_get(const struct device *dev) { return data->status; } -#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) +#if PERSIST_EXT_POWER_STATE static int ext_power_settings_set_status(const struct device *dev, size_t len, settings_read_cb read_cb, void *cb_arg) { struct ext_power_generic_data *data = dev->data; @@ -158,7 +161,7 @@ static int ext_power_generic_init(const struct device *dev) { } } -#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) +#if PERSIST_EXT_POWER_STATE k_work_init_delayable(&ext_power_save_work, ext_power_save_state_work); #endif @@ -197,7 +200,7 @@ static const struct ext_power_generic_config config = { static struct ext_power_generic_data data = { .status = false, -#if IS_ENABLED(CONFIG_SETTINGS) && !IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) +#if PERSIST_EXT_POWER_STATE .settings_init = false, #endif }; From 3989d73875b618ecedcdd51c51b89e18c823a5e5 Mon Sep 17 00:00:00 2001 From: Jaap Versteegh Date: Sat, 20 Dec 2025 14:36:43 +0100 Subject: [PATCH 3/3] Make pm controlled ext power changes not affect state --- app/src/ext_power_generic.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 02a5e1098..a83309b1b 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -59,7 +59,7 @@ int ext_power_save_state(void) { #endif } -static int ext_power_generic_enable(const struct device *dev) { +static int ext_power_generic_enable(const struct device *dev, bool save_state) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; @@ -71,10 +71,14 @@ static int ext_power_generic_enable(const struct device *dev) { } } data->status = true; - return ext_power_save_state(); + return save_state ? ext_power_save_state() : 0; } -static int ext_power_generic_disable(const struct device *dev) { +static int ext_power_stateful_enable(const struct device *dev) { + return ext_power_generic_enable(dev, true); +} + +static int ext_power_generic_disable(const struct device *dev, bool save_state) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; @@ -86,7 +90,11 @@ static int ext_power_generic_disable(const struct device *dev) { } } data->status = false; - return ext_power_save_state(); + return save_state ? ext_power_save_state() : 0; +} + +static int ext_power_stateful_disable(const struct device *dev) { + return ext_power_generic_disable(dev, true); } static int ext_power_generic_get(const struct device *dev) { @@ -108,9 +116,9 @@ static int ext_power_settings_set_status(const struct device *dev, size_t len, data->settings_init = true; if (data->status) { - ext_power_generic_enable(dev); + ext_power_stateful_enable(dev); } else { - ext_power_generic_disable(dev); + ext_power_stateful_disable(dev); } return 0; @@ -179,10 +187,10 @@ static int ext_power_generic_init(const struct device *dev) { static int ext_power_generic_pm_action(const struct device *dev, enum pm_device_action action) { switch (action) { case PM_DEVICE_ACTION_RESUME: - ext_power_generic_enable(dev); + ext_power_generic_enable(dev, false); return 0; case PM_DEVICE_ACTION_SUSPEND: - ext_power_generic_disable(dev); + ext_power_generic_disable(dev, false); return 0; default: return -ENOTSUP; @@ -205,8 +213,8 @@ static struct ext_power_generic_data data = { #endif }; -static const struct ext_power_api api = {.enable = ext_power_generic_enable, - .disable = ext_power_generic_disable, +static const struct ext_power_api api = {.enable = ext_power_stateful_enable, + .disable = ext_power_stateful_disable, .get = ext_power_generic_get}; #define ZMK_EXT_POWER_INIT_PRIORITY 81