From fce1c38e628eff0b5a749f78cb59a4169cc9d7e2 Mon Sep 17 00:00:00 2001
From: Peter Johanson <peter@peterjohanson.com>
Date: Mon, 5 Aug 2024 12:12:17 -0600
Subject: [PATCH] fix: Defer auto enabling of kscan sideband.

* Now that device init of kscan sideband is in POST_KERNEL stage,
  use a separate SYS_INIT for auto enabling the device so processing
  of early/initial presses from referenced toggle mode kscan devices
  occurs at the proper time during init.
---
 app/src/kscan_sideband_behaviors.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/app/src/kscan_sideband_behaviors.c b/app/src/kscan_sideband_behaviors.c
index 602cae12..0107d8e2 100644
--- a/app/src/kscan_sideband_behaviors.c
+++ b/app/src/kscan_sideband_behaviors.c
@@ -161,16 +161,11 @@ static int ksbb_init(const struct device *dev) {
         return -ENODEV;
     }
 
-    if (config->auto_enable) {
-#if !IS_ENABLED(CONFIG_PM_DEVICE)
-        kscan_config(config->kscan, &ksbb_inner_kscan_callback);
-        kscan_enable_callback(config->kscan);
-#else
-        ksbb_pm_action(dev, PM_DEVICE_ACTION_RESUME);
-    } else {
+#if IS_ENABLED(CONFIG_PM_DEVICE)
+    if (!config->auto_enable) {
         pm_device_init_suspended(dev);
-#endif
     }
+#endif
 
     return 0;
 }
@@ -188,6 +183,16 @@ static const struct kscan_driver_api ksbb_api = {
     }
 
 #define KSBB_INST(n)                                                                               \
+    COND_CODE_1(DT_INST_PROP_OR(n, auto_enable, false), (static int ksbb_auto_enable_##n(void) {   \
+                    const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(n));                      \
+                    COND_CODE_1(IS_ENABLED(CONFIG_PM_DEVICE),                                      \
+                                (ksbb_pm_action(dev, PM_DEVICE_ACTION_RESUME);),                   \
+                                (const struct ksbb_config *config = dev->config;                   \
+                                 kscan_config(config->kscan, &ksbb_inner_kscan_callback);          \
+                                 kscan_enable_callback(config->kscan);))                           \
+                    return 0;                                                                      \
+                } SYS_INIT(ksbb_auto_enable_##n, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);), \
+                ())                                                                                \
     static struct ksbb_entry entries_##n[] = {                                                     \
         DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(n, ENTRY, (, ))};                                    \
     const struct ksbb_config ksbb_config_##n = {                                                   \