From 3156cf6da0b36403875b99b0417cb22e2a4f0963 Mon Sep 17 00:00:00 2001
From: Joel Challis <git@zvecr.com>
Date: Fri, 23 Jun 2023 22:50:31 +0100
Subject: [PATCH] Remove use of __flash within LED drivers (#21343)

---
 docs/feature_led_matrix.md           |  4 ++--
 docs/feature_rgb_matrix.md           |  4 ++--
 drivers/led/issi/is31fl3733-simple.c |  6 ++++--
 drivers/led/issi/is31fl3733-simple.h |  2 +-
 drivers/led/issi/is31flcommon.c      | 22 +++++++++++++++-------
 drivers/led/issi/is31flcommon.h      |  6 +++---
 6 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/docs/feature_led_matrix.md b/docs/feature_led_matrix.md
index bc86099f1f..b967f943d3 100644
--- a/docs/feature_led_matrix.md
+++ b/docs/feature_led_matrix.md
@@ -139,7 +139,7 @@ Currently only 4 drivers are supported, but it would be trivial to support for m
 Define these arrays listing all the LEDs in your `<keyboard>.c`:
 
 ```c
-const is31_led __flash g_is31_leds[LED_MATRIX_LED_COUNT] = {
+const is31_led PROGMEM g_is31_leds[LED_MATRIX_LED_COUNT] = {
 /* Refer to IS31 manual for these locations
  *    driver
  *    |  LED address
@@ -158,7 +158,7 @@ Eg `#define ISSI_MANUAL_SCALING 3`
 Then Define the array listing all the LEDs you want to override in your `<keyboard>.c`:
 
 ```c
-const is31_led __flash g_is31_scaling[ISSI_MANUAL_SCALING] = {
+const is31_led PROGMEM g_is31_scaling[ISSI_MANUAL_SCALING] = {
  *   LED Index
  *   |  Scaling
  *   |  | */
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 75f07b5e64..89c9268ca4 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -386,7 +386,7 @@ Currently only 4 drivers are supported, but it would be trivial to support for m
 Define these arrays listing all the LEDs in your `<keyboard>.c`:
 
 ```c
-const is31_led __flash g_is31_leds[RGB_MATRIX_LED_COUNT] = {
+const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
 /* Refer to IS31 manual for these locations
  *   driver
  *   |  R location
@@ -406,7 +406,7 @@ Eg `#define ISSI_MANUAL_SCALING 3`
 Then Define the array listing all the LEDs you want to override in your `<keyboard>.c`:
 
 ```c
-const is31_led __flash g_is31_scaling[ISSI_MANUAL_SCALING] = {
+const is31_led PROGMEM g_is31_scaling[ISSI_MANUAL_SCALING] = {
  *   LED Index
  *   |  R scaling
  *   |  |    G scaling
diff --git a/drivers/led/issi/is31fl3733-simple.c b/drivers/led/issi/is31fl3733-simple.c
index 782d1c6f78..d90fd8587f 100644
--- a/drivers/led/issi/is31fl3733-simple.c
+++ b/drivers/led/issi/is31fl3733-simple.c
@@ -193,8 +193,9 @@ void IS31FL3733_init(uint8_t addr, uint8_t sync) {
 }
 
 void IS31FL3733_set_value(int index, uint8_t value) {
+    is31_led led;
     if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
-        is31_led led = g_is31_leds[index];
+        memcpy_P(&led, (&g_is31_leds[index]), sizeof(led));
 
         if (g_pwm_buffer[led.driver][led.v] == value) {
             return;
@@ -211,7 +212,8 @@ void IS31FL3733_set_value_all(uint8_t value) {
 }
 
 void IS31FL3733_set_led_control_register(uint8_t index, bool value) {
-    is31_led led = g_is31_leds[index];
+    is31_led led;
+    memcpy_P(&led, (&g_is31_leds[index]), sizeof(led));
 
     uint8_t control_register = led.v / 8;
     uint8_t bit_value        = led.v % 8;
diff --git a/drivers/led/issi/is31fl3733-simple.h b/drivers/led/issi/is31fl3733-simple.h
index 1571fdd3d5..bd61082f42 100644
--- a/drivers/led/issi/is31fl3733-simple.h
+++ b/drivers/led/issi/is31fl3733-simple.h
@@ -30,7 +30,7 @@ typedef struct is31_led {
     uint8_t v;
 } __attribute__((packed)) is31_led;
 
-extern const is31_led __flash g_is31_leds[LED_MATRIX_LED_COUNT];
+extern const is31_led PROGMEM g_is31_leds[LED_MATRIX_LED_COUNT];
 
 void IS31FL3733_init(uint8_t addr, uint8_t sync);
 bool IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
diff --git a/drivers/led/issi/is31flcommon.c b/drivers/led/issi/is31flcommon.c
index 40b162beb3..4b78947ada 100644
--- a/drivers/led/issi/is31flcommon.c
+++ b/drivers/led/issi/is31flcommon.c
@@ -133,11 +133,14 @@ void IS31FL_common_update_pwm_register(uint8_t addr, uint8_t index) {
 
 #ifdef ISSI_MANUAL_SCALING
 void IS31FL_set_manual_scaling_buffer(void) {
+    is31_led led;
+    is31_led scale;
     for (int i = 0; i < ISSI_MANUAL_SCALING; i++) {
-        is31_led scale = g_is31_scaling[i];
+        memcpy_P(&scale, (&g_is31_scaling[i]), sizeof(scale));
+
 #    ifdef RGB_MATRIX_ENABLE
         if (scale.driver >= 0 && scale.driver < RGB_MATRIX_LED_COUNT) {
-            is31_led led = g_is31_leds[scale.driver];
+            memcpy_P(&led, (&g_is31_leds[scale.driver]), sizeof(led));
 
             if (g_scaling_buffer[led.driver][led.r] = scale.r && g_scaling_buffer[led.driver][led.g] = scale.g && g_scaling_buffer[led.driver][led.b] = scale.b) {
                 return;
@@ -147,7 +150,7 @@ void IS31FL_set_manual_scaling_buffer(void) {
             g_scaling_buffer[led.driver][led.b] = scale.b;
 #    elif defined(LED_MATRIX_ENABLE)
         if (scale.driver >= 0 && scale.driver < LED_MATRIX_LED_COUNT) {
-            is31_led led = g_is31_leds[scale.driver];
+            memcpy_P(&led, (&g_is31_leds[scale.driver]), sizeof(led));
 
             if (g_scaling_buffer[led.driver][led.v] == scale.v) {
                 return;
@@ -175,7 +178,8 @@ void IS31FL_common_update_scaling_register(uint8_t addr, uint8_t index) {
 // Colour is set by adjusting PWM register
 void IS31FL_RGB_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
     if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
-        is31_led led = g_is31_leds[index];
+        is31_led led;
+        memcpy_P(&led, (&g_is31_leds[index]), sizeof(led));
 
         g_pwm_buffer[led.driver][led.r]          = red;
         g_pwm_buffer[led.driver][led.g]          = green;
@@ -192,7 +196,8 @@ void IS31FL_RGB_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 
 // Setup Scaling register that decides the peak current of each LED
 void IS31FL_RGB_set_scaling_buffer(uint8_t index, bool red, bool green, bool blue) {
-    is31_led led = g_is31_leds[index];
+    is31_led led;
+    memcpy_P(&led, (&g_is31_leds[index]), sizeof(led));
     if (red) {
         g_scaling_buffer[led.driver][led.r] = ISSI_SCAL_RED;
     } else {
@@ -214,7 +219,8 @@ void IS31FL_RGB_set_scaling_buffer(uint8_t index, bool red, bool green, bool blu
 #elif defined(LED_MATRIX_ENABLE)
 // LED Matrix Specific scripts
 void IS31FL_simple_set_scaling_buffer(uint8_t index, bool value) {
-    is31_led led = g_is31_leds[index];
+    is31_led led;
+    memcpy_P(&led, (&g_is31_leds[index]), sizeof(led));
     if (value) {
         g_scaling_buffer[led.driver][led.v] = ISSI_SCAL_LED;
     } else {
@@ -225,7 +231,9 @@ void IS31FL_simple_set_scaling_buffer(uint8_t index, bool value) {
 
 void IS31FL_simple_set_brightness(int index, uint8_t value) {
     if (index >= 0 && index < LED_MATRIX_LED_COUNT) {
-        is31_led led = g_is31_leds[index];
+        is31_led led;
+        memcpy_P(&led, (&g_is31_leds[index]), sizeof(led));
+
         g_pwm_buffer[led.driver][led.v] = value;
         g_pwm_buffer_update_required[led.driver] = true;
     }
diff --git a/drivers/led/issi/is31flcommon.h b/drivers/led/issi/is31flcommon.h
index 18432ffc31..4b3add558b 100644
--- a/drivers/led/issi/is31flcommon.h
+++ b/drivers/led/issi/is31flcommon.h
@@ -43,7 +43,7 @@ typedef struct is31_led {
     uint8_t b;
 } __attribute__((packed)) is31_led;
 
-extern const is31_led __flash g_is31_leds[RGB_MATRIX_LED_COUNT];
+extern const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT];
 
 #elif defined(LED_MATRIX_ENABLE)
 typedef struct is31_led {
@@ -51,11 +51,11 @@ typedef struct is31_led {
     uint8_t v;
 } __attribute__((packed)) is31_led;
 
-extern const is31_led __flash g_is31_leds[LED_MATRIX_LED_COUNT];
+extern const is31_led PROGMEM g_is31_leds[LED_MATRIX_LED_COUNT];
 #endif
 
 #ifdef ISSI_MANUAL_SCALING
-extern const is31_led __flash g_is31_scaling[];
+extern const is31_led PROGMEM g_is31_scaling[];
 void                          IS31FL_set_manual_scaling_buffer(void);
 #endif