fix(power): Fixes for dynamic PD in display/RGB.

This commit is contained in:
Peter Johanson 2024-01-28 16:55:06 -08:00
parent 742063629b
commit 2f37b08ee3
2 changed files with 21 additions and 17 deletions

View file

@ -111,6 +111,13 @@ static void initialize_theme() {
#endif // CONFIG_LV_USE_THEME_MONO #endif // CONFIG_LV_USE_THEME_MONO
} }
#define HAS_DISPLAY_PD \
(DT_HAS_CHOSEN(zmk_display_default_power_domain) || DT_HAS_CHOSEN(zmk_default_power_domain))
#define GET_DISPLAY_PD \
DEVICE_DT_GET(COND_CODE_1(DT_HAS_CHOSEN(zmk_display_default_power_domain), \
(DT_CHOSEN(zmk_display_default_power_domain)), \
(DT_CHOSEN(zmk_default_power_domain))))
void initialize_display(struct k_work *work) { void initialize_display(struct k_work *work) {
LOG_DBG(""); LOG_DBG("");
@ -119,17 +126,14 @@ void initialize_display(struct k_work *work) {
return; return;
} }
#if IS_ENABLED(CONFIG_ZMK_DISPLAY_DEFAULT_POWER_DOMAIN) && DT_HAS_CHOSEN(zmk_default_power_domain) #if IS_ENABLED(CONFIG_ZMK_DISPLAY_DEFAULT_POWER_DOMAIN) && HAS_DISPLAY_PD
pm_device_runtime_enable(display); pm_device_runtime_enable(display);
if (!pm_device_on_power_domain(display)) { if (!pm_device_on_power_domain(display)) {
int rc = int rc = pm_device_power_domain_add(display, GET_DISPLAY_PD);
pm_device_power_domain_add(display, DEVICE_DT_GET(DT_CHOSEN(zmk_default_power_domain)));
if (rc < 0) { if (rc < 0) {
LOG_ERR("Failed to add the display to the default power domain (0x%02x)", -rc); LOG_ERR("Failed to add the display to the default power domain (0x%02x)", -rc);
} }
} }
#endif #endif
initialized = true; initialized = true;

View file

@ -62,7 +62,7 @@ struct rgb_underglow_state {
bool on; bool on;
}; };
static const struct device *led_strip; static const struct device *led_strip = DEVICE_DT_GET(STRIP_CHOSEN);
static struct led_rgb pixels[STRIP_NUM_PIXELS]; static struct led_rgb pixels[STRIP_NUM_PIXELS];
@ -245,9 +245,15 @@ static void zmk_rgb_underglow_save_state_work(struct k_work *_work) {
static struct k_work_delayable underglow_save_work; static struct k_work_delayable underglow_save_work;
#endif #endif
static int zmk_rgb_underglow_init(void) { #define HAS_RGB_UG_PD \
led_strip = DEVICE_DT_GET(STRIP_CHOSEN); (DT_HAS_CHOSEN(zmk_rgb_underglow_default_power_domain) || \
DT_HAS_CHOSEN(zmk_default_power_domain))
#define GET_RGB_UG_PD \
DEVICE_DT_GET(COND_CODE_1(DT_HAS_CHOSEN(zmk_rgb_underglow_default_power_domain), \
(DT_CHOSEN(zmk_rgb_underglow_default_power_domain)), \
(DT_CHOSEN(zmk_default_power_domain))))
static int zmk_rgb_underglow_init(void) {
#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER)
if (!device_is_ready(ext_power)) { if (!device_is_ready(ext_power)) {
LOG_ERR("External power device \"%s\" is not ready", ext_power->name); LOG_ERR("External power device \"%s\" is not ready", ext_power->name);
@ -255,13 +261,11 @@ static int zmk_rgb_underglow_init(void) {
} }
#endif #endif
#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_DEFAULT_POWER_DOMAIN) && \ #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_DEFAULT_POWER_DOMAIN) && HAS_RGB_UG_PD
DT_HAS_CHOSEN(zmk_default_power_domain)
pm_device_runtime_enable(led_strip); pm_device_runtime_enable(led_strip);
if (!pm_device_on_power_domain(led_strip)) { if (!pm_device_on_power_domain(led_strip)) {
int rc = pm_device_power_domain_add(led_strip, int rc = pm_device_power_domain_add(led_strip, GET_RGB_UG_PD);
DEVICE_DT_GET(DT_CHOSEN(zmk_default_power_domain)));
if (rc < 0) { if (rc < 0) {
LOG_ERR("Failed to add the LED strip to the default power domain (0x%02x)", -rc); LOG_ERR("Failed to add the LED strip to the default power domain (0x%02x)", -rc);
} }
@ -315,12 +319,8 @@ int zmk_rgb_underglow_get_state(bool *on_off) {
} }
int zmk_rgb_underglow_on(void) { int zmk_rgb_underglow_on(void) {
if (!led_strip)
return -ENODEV;
}
// Newer PM device approach to ensuring powered on when used. // Newer PM device approach to ensuring powered on when used.
const int rc = pm_device_runtime_get(led_strip); int rc = pm_device_runtime_get(led_strip);
if (rc < 0) { if (rc < 0) {
LOG_ERR("Failed to enable/get the PM device (%d)", rc); LOG_ERR("Failed to enable/get the PM device (%d)", rc);
return rc; return rc;