From a80d7891472335ec297082daecc6fbf90042c38c Mon Sep 17 00:00:00 2001
From: Drashna Jaelre <drashna@live.com>
Date: Fri, 20 Aug 2021 21:02:53 -0700
Subject: [PATCH] Fix issues with VIA EEPROM init and bring in line with
 eeconfig functionality (#13243)

Co-authored-by: Ryan <fauxpark@gmail.com>
---
 quantum/bootmagic/bootmagic_lite.c |  8 +-----
 quantum/eeconfig.c                 | 33 +++++++++++++++++++++--
 quantum/keyboard.c                 |  6 ++---
 quantum/via.c                      | 42 ++++++++++++++++--------------
 quantum/via.h                      |  6 +----
 5 files changed, 58 insertions(+), 37 deletions(-)

diff --git a/quantum/bootmagic/bootmagic_lite.c b/quantum/bootmagic/bootmagic_lite.c
index 9cbdcb0bbd..54bbf5a2ee 100644
--- a/quantum/bootmagic/bootmagic_lite.c
+++ b/quantum/bootmagic/bootmagic_lite.c
@@ -19,13 +19,7 @@
  *
  * ...just incase someone wants to only change the eeprom behaviour
  */
-__attribute__((weak)) void bootmagic_lite_reset_eeprom(void) {
-#if defined(VIA_ENABLE)
-    via_eeprom_reset();
-#else
-    eeconfig_disable();
-#endif
-}
+__attribute__((weak)) void bootmagic_lite_reset_eeprom(void) { eeconfig_disable(); }
 
 /** \brief The lite version of TMK's bootmagic based on Wilba.
  *
diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c
index ffa56ab56d..92f0ac4439 100644
--- a/quantum/eeconfig.c
+++ b/quantum/eeconfig.c
@@ -17,6 +17,12 @@
 #    include "haptic.h"
 #endif
 
+#if defined(VIA_ENABLE)
+bool via_eeprom_is_valid(void);
+void via_eeprom_set_valid(bool valid);
+void eeconfig_init_via(void);
+#endif
+
 /** \brief eeconfig enable
  *
  * FIXME: needs doc
@@ -77,6 +83,13 @@ void eeconfig_init_quantum(void) {
     // when a haptic-enabled firmware is loaded onto the keyboard.
     eeprom_update_dword(EECONFIG_HAPTIC, 0);
 #endif
+#if defined(VIA_ENABLE)
+    // Invalidate VIA eeprom config, and then reset.
+    // Just in case if power is lost mid init, this makes sure that it pets
+    // properly re-initialized.
+    via_eeprom_set_valid(false);
+    eeconfig_init_via();
+#endif
 
     eeconfig_init_kb();
 }
@@ -111,13 +124,29 @@ void eeconfig_disable(void) {
  *
  * FIXME: needs doc
  */
-bool eeconfig_is_enabled(void) { return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER); }
+bool eeconfig_is_enabled(void) {
+    bool is_eeprom_enabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER);
+#ifdef VIA_ENABLE
+    if (is_eeprom_enabled) {
+        is_eeprom_enabled = via_eeprom_is_valid();
+    }
+#endif
+    return is_eeprom_enabled;
+}
 
 /** \brief eeconfig is disabled
  *
  * FIXME: needs doc
  */
-bool eeconfig_is_disabled(void) { return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF); }
+bool eeconfig_is_disabled(void) {
+    bool is_eeprom_disabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF);
+#ifdef VIA_ENABLE
+    if (!is_eeprom_disabled) {
+        is_eeprom_disabled = !via_eeprom_is_valid();
+    }
+#endif
+    return is_eeprom_disabled;
+}
 
 /** \brief eeconfig read debug
  *
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index 0eb41e7d30..644d8650dd 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -309,13 +309,13 @@ void housekeeping_task(void) {
 void keyboard_init(void) {
     timer_init();
     sync_timer_init();
+#ifdef VIA_ENABLE
+    via_init();
+#endif
     matrix_init();
 #if defined(CRC_ENABLE)
     crc_init();
 #endif
-#ifdef VIA_ENABLE
-    via_init();
-#endif
 #ifdef QWIIC_ENABLE
     qwiic_init();
 #endif
diff --git a/quantum/via.c b/quantum/via.c
index c89b663b9b..1b2dbcf08d 100644
--- a/quantum/via.c
+++ b/quantum/via.c
@@ -83,16 +83,6 @@ void via_eeprom_set_valid(bool valid) {
     eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2, valid ? magic2 : 0xFF);
 }
 
-// Flag QMK and VIA/keyboard level EEPROM as invalid.
-// Used in bootmagic_lite() and VIA command handler.
-// Keyboard level code should not need to call this.
-void via_eeprom_reset(void) {
-    // Set the VIA specific EEPROM state as invalid.
-    via_eeprom_set_valid(false);
-    // Set the TMK/QMK EEPROM state as invalid.
-    eeconfig_disable();
-}
-
 // Override this at the keyboard code level to check
 // VIA's EEPROM valid state and reset to defaults as needed.
 // Used by keyboards that store their own state in EEPROM,
@@ -109,19 +99,24 @@ void via_init(void) {
 
     // If the EEPROM has the magic, the data is good.
     // OK to load from EEPROM.
-    if (via_eeprom_is_valid()) {
-    } else {
-        // This resets the layout options
-        via_set_layout_options(VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT);
-        // This resets the keymaps in EEPROM to what is in flash.
-        dynamic_keymap_reset();
-        // This resets the macros in EEPROM to nothing.
-        dynamic_keymap_macro_reset();
-        // Save the magic number last, in case saving was interrupted
-        via_eeprom_set_valid(true);
+    if (!via_eeprom_is_valid()) {
+        eeconfig_init_via();
     }
 }
 
+void eeconfig_init_via(void) {
+    // set the magic number to false, in case this gets interrupted
+    via_eeprom_set_valid(false);
+    // This resets the layout options
+    via_set_layout_options(VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT);
+    // This resets the keymaps in EEPROM to what is in flash.
+    dynamic_keymap_reset();
+    // This resets the macros in EEPROM to nothing.
+    dynamic_keymap_macro_reset();
+    // Save the magic number last, in case saving was interrupted
+    via_eeprom_set_valid(true);
+}
+
 // This is generalized so the layout options EEPROM usage can be
 // variable, between 1 and 4 bytes.
 uint32_t via_get_layout_options(void) {
@@ -329,6 +324,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
 #endif
             break;
         }
+#ifdef VIA_EEPROM_ALLOW_RESET
+        case id_eeprom_reset: {
+            via_eeprom_set_valid(false);
+            eeconfig_init_via();
+            break;
+        }
+#endif
         case id_dynamic_keymap_macro_get_count: {
             command_data[0] = dynamic_keymap_macro_get_count();
             break;
diff --git a/quantum/via.h b/quantum/via.h
index de0a21da20..3db318a454 100644
--- a/quantum/via.h
+++ b/quantum/via.h
@@ -152,12 +152,8 @@ bool via_eeprom_is_valid(void);
 // Keyboard level code (eg. via_init_kb()) should not call this
 void via_eeprom_set_valid(bool valid);
 
-// Flag QMK and VIA/keyboard level EEPROM as invalid.
-// Used in bootmagic_lite() and VIA command handler.
-// Keyboard level code should not need to call this.
-void via_eeprom_reset(void);
-
 // Called by QMK core to initialize dynamic keymaps etc.
+void eeconfig_init_via(void);
 void via_init(void);
 
 // Used by VIA to store and retrieve the layout options.