summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParth Malkan <parthmalkan@google.com>2022-04-07 16:13:21 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-04-08 15:36:32 +0000
commit5b9b3ce49180b94a4535b56eb11022c994591427 (patch)
tree39179aaa2b50f141dfb3da0e2c33a1f810f74d14
parent0e90261640febc2e7f97f213846b56faf662a7ae (diff)
downloadchrome-ec-5b9b3ce49180b94a4535b56eb11022c994591427.tar.gz
zephyr: LED: Convert brightness range func to use DT
LED set/get brightness range funcs are used in ectool for LED testing. This patch converts the implementation to be generic and leverage dt. BUG=b:227755556, b:194430340 BRANCH=none TEST=On Lazor in both gpio and pwm LED configurations - ectool led battery query -> Amber and Blue are set - ectool led battery amber -> Sets Amber LED - ectool led battery blue -> Sets Blue LED - ectool led battery off -> Turns off LED - ectool led battery auto -> Sets Blue LED (w/o charger) Cq-Depend: chromium:3576900, chromium:3578053 Signed-off-by: Parth Malkan <parthmalkan@google.com> Change-Id: I4830837202f80db662b4341d41c82c9cc2e70d3b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3576899 Reviewed-by: Wai-Hong Tam <waihong@google.com>
-rw-r--r--zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml13
-rw-r--r--zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml13
-rw-r--r--zephyr/shim/src/led_driver/led.c18
-rw-r--r--zephyr/shim/src/led_driver/led.h5
-rw-r--r--zephyr/shim/src/led_driver/led_gpio.c40
-rw-r--r--zephyr/shim/src/led_driver/led_pwm.c40
6 files changed, 109 insertions, 20 deletions
diff --git a/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml b/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml
index 238be08782..7c625bf401 100644
--- a/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml
+++ b/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml
@@ -20,6 +20,7 @@ child-binding:
led-color:
type: string
required: true
+ description: Used to link the color nodes with the pin nodes
enum:
- LED_OFF
- LED_RED
@@ -28,6 +29,18 @@ child-binding:
- LED_YELLOW
- LED_WHITE
- LED_AMBER
+ br-color:
+ type: string
+ required: false
+ description: This is used in the ectool brightness range APIs.
+ It needs to match the enum names defined in ec_commands.h
+ enum:
+ - EC_LED_COLOR_RED
+ - EC_LED_COLOR_GREEN
+ - EC_LED_COLOR_BLUE
+ - EC_LED_COLOR_YELLOW
+ - EC_LED_COLOR_WHITE
+ - EC_LED_COLOR_AMBER
led-pins:
type: phandle-array
required: false
diff --git a/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml b/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml
index deabf0227f..3b083fb79d 100644
--- a/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml
+++ b/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml
@@ -26,6 +26,7 @@ child-binding:
led-color:
type: string
required: true
+ description: Used to link the color nodes with the pin nodes
enum:
- LED_OFF
- LED_RED
@@ -34,6 +35,18 @@ child-binding:
- LED_YELLOW
- LED_WHITE
- LED_AMBER
+ br-color:
+ type: string
+ required: false
+ description: This is used in the ectool brightness range APIs.
+ It needs to match the enum names defined in ec_commands.h
+ enum:
+ - EC_LED_COLOR_RED
+ - EC_LED_COLOR_GREEN
+ - EC_LED_COLOR_BLUE
+ - EC_LED_COLOR_YELLOW
+ - EC_LED_COLOR_WHITE
+ - EC_LED_COLOR_AMBER
led-pins:
type: phandle-array
required: false
diff --git a/zephyr/shim/src/led_driver/led.c b/zephyr/shim/src/led_driver/led.c
index 1e97c98a86..edc4f9ce58 100644
--- a/zephyr/shim/src/led_driver/led.c
+++ b/zephyr/shim/src/led_driver/led.c
@@ -119,24 +119,6 @@ struct node_prop_t node_array[] = {
DT_FOREACH_CHILD(LED_COLOR_NODE, SET_LED_VALUES)
};
-void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
-{
- brightness_range[EC_LED_COLOR_AMBER] = 1;
- brightness_range[EC_LED_COLOR_BLUE] = 1;
-}
-
-int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
-{
- if (brightness[EC_LED_COLOR_BLUE] != 0)
- led_set_color(LED_BLUE);
- else if (brightness[EC_LED_COLOR_AMBER] != 0)
- led_set_color(LED_AMBER);
- else
- led_set_color(LED_OFF);
-
- return EC_SUCCESS;
-}
-
static enum power_state get_chipset_state(void)
{
enum power_state chipset_state = 0;
diff --git a/zephyr/shim/src/led_driver/led.h b/zephyr/shim/src/led_driver/led.h
index 4354df5125..53728609ed 100644
--- a/zephyr/shim/src/led_driver/led.h
+++ b/zephyr/shim/src/led_driver/led.h
@@ -14,6 +14,11 @@
(DT_STRING_UPPER_TOKEN(id, prop)), \
(0))
+#define GET_BR_COLOR(id, prop) \
+ COND_CODE_1(DT_NODE_HAS_PROP(id, prop), \
+ (DT_STRING_UPPER_TOKEN(id, prop)), \
+ (-1))
+
/* TODO(b/227798487): Use DT to generate this enum instead of hardcoding */
enum led_color {
LED_OFF = 0,
diff --git a/zephyr/shim/src/led_driver/led_gpio.c b/zephyr/shim/src/led_driver/led_gpio.c
index 46d94db4dc..85bdc2dd71 100644
--- a/zephyr/shim/src/led_driver/led_gpio.c
+++ b/zephyr/shim/src/led_driver/led_gpio.c
@@ -5,6 +5,7 @@
* GPIO LED control.
*/
+#include "ec_commands.h"
#include "led.h"
#include "util.h"
@@ -32,7 +33,13 @@ struct gpio_pin_t {
* to alter in order to enable the given color.
*/
struct led_pins_node_t {
+ /* Link between color and pins node */
int led_color;
+
+ /* Brightness Range color, only used by ectool funcs for testing */
+ enum ec_led_colors br_color;
+
+ /* Array of GPIO pins to set to enable particular color */
struct gpio_pin_t gpio_pins[LED_PIN_COUNT];
};
@@ -50,10 +57,11 @@ struct led_pins_node_t {
#define SET_PIN_NODE(node_id) \
{ \
.led_color = GET_PROP(node_id, led_color), \
+ .br_color = GET_BR_COLOR(node_id, br_color), \
.gpio_pins = SET_GPIO_PIN(node_id) \
},
-struct led_pins_node_t pins_node[LED_COLOR_COUNT] = {
+struct led_pins_node_t pins_node[] = {
DT_FOREACH_CHILD(GPIO_LED_PINS_NODE, SET_PIN_NODE)
};
@@ -74,4 +82,34 @@ void led_set_color(enum led_color color)
}
}
}
+
+void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
+{
+ for (int i = 0; i < ARRAY_SIZE(pins_node); i++) {
+ int br_color = pins_node[i].br_color;
+
+ if (br_color != -1)
+ brightness_range[br_color] = 1;
+ }
+}
+
+int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
+{
+ bool color_set = false;
+
+ for (int i = 0; i < ARRAY_SIZE(pins_node); i++) {
+ int br_color = pins_node[i].br_color;
+
+ if ((br_color != -1) && (brightness[br_color] != 0)) {
+ color_set = true;
+ led_set_color(pins_node[i].led_color);
+ }
+ }
+
+ /* If no color was set, turn off the LED */
+ if (!color_set)
+ led_set_color(LED_OFF);
+
+ return EC_SUCCESS;
+}
#endif /* DT_HAS_COMPAT_STATUS_OKAY(COMPAT_GPIO_LED) */
diff --git a/zephyr/shim/src/led_driver/led_pwm.c b/zephyr/shim/src/led_driver/led_pwm.c
index 57cd6eb92f..d2605256a5 100644
--- a/zephyr/shim/src/led_driver/led_pwm.c
+++ b/zephyr/shim/src/led_driver/led_pwm.c
@@ -5,6 +5,7 @@
* PWM LED control.
*/
+#include "ec_commands.h"
#include "led.h"
#include "util.h"
@@ -34,7 +35,13 @@ struct pwm_pin_t {
* to alter in order to enable the given color.
*/
struct led_pins_node_t {
+ /* Link between color and pins node */
int led_color;
+
+ /* Brightness Range color, only used by ectool funcs for testing */
+ enum ec_led_colors br_color;
+
+ /* Array of PWM pins to set to enable particular color */
struct pwm_pin_t pwm_pins[LED_PIN_COUNT];
};
@@ -70,10 +77,11 @@ const uint32_t period_us =
#define SET_PIN_NODE(node_id) \
{ \
.led_color = GET_PROP(node_id, led_color), \
+ .br_color = GET_BR_COLOR(node_id, br_color), \
.pwm_pins = SET_PWM_PIN(node_id) \
},
-struct led_pins_node_t pins_node[LED_COLOR_COUNT] = {
+struct led_pins_node_t pins_node[] = {
DT_FOREACH_CHILD(PWM_LED_PINS_NODE, SET_PIN_NODE)
};
@@ -99,4 +107,34 @@ void led_set_color(enum led_color color)
}
}
}
+
+void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
+{
+ for (int i = 0; i < ARRAY_SIZE(pins_node); i++) {
+ int br_color = pins_node[i].br_color;
+
+ if (br_color != -1)
+ brightness_range[br_color] = 100;
+ }
+}
+
+int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
+{
+ bool color_set = false;
+
+ for (int i = 0; i < ARRAY_SIZE(pins_node); i++) {
+ int br_color = pins_node[i].br_color;
+
+ if ((br_color != -1) && (brightness[br_color] != 0)) {
+ color_set = true;
+ led_set_color(pins_node[i].led_color);
+ }
+ }
+
+ /* If no color was set, turn off the LED */
+ if (!color_set)
+ led_set_color(LED_OFF);
+
+ return EC_SUCCESS;
+}
#endif /* DT_HAS_COMPAT_STATUS_OKAY(COMPAT_PWM_LED) */