summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParth Malkan <parthmalkan@google.com>2021-12-16 14:42:07 -0800
committerCommit Bot <commit-bot@chromium.org>2022-03-21 19:55:33 +0000
commitede27d3aea422106a05cd686c83d5804c7388180 (patch)
treee07e6b152bc6310968059b7737f857008f6e8849
parent11597b9ba5c42a3f310b776431f967c8129c857d (diff)
downloadchrome-ec-ede27d3aea422106a05cd686c83d5804c7388180.tar.gz
zephyr: Set gpio pin nodes and update set color fn
Convert led_set_color fn to make use of devicetree to set gpio pins instead of using hard-coded GPIO pin enums BRANCH=None BUG=b:225917471, b:194430340 TEST=manual led test on lazor Signed-off-by: Parth Malkan <parthmalkan@google.com> Change-Id: I08f0b82d7db00370dc9ebe6e016d822645fea1cf Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3383912 Reviewed-by: Wai-Hong Tam <waihong@google.com>
-rw-r--r--zephyr/dts/bindings/gpio/named-gpios.yaml5
-rw-r--r--zephyr/dts/bindings/gpio_led/cros-ec,gpio-led-pins.yaml33
-rw-r--r--zephyr/projects/trogdor/lazor/gpio.dts2
-rw-r--r--zephyr/projects/trogdor/lazor/led.dts22
-rw-r--r--zephyr/projects/trogdor/lazor/src/led.c95
5 files changed, 129 insertions, 28 deletions
diff --git a/zephyr/dts/bindings/gpio/named-gpios.yaml b/zephyr/dts/bindings/gpio/named-gpios.yaml
index 02415ad69d..59ed404754 100644
--- a/zephyr/dts/bindings/gpio/named-gpios.yaml
+++ b/zephyr/dts/bindings/gpio/named-gpios.yaml
@@ -14,6 +14,9 @@ child-binding:
gpios:
type: phandle-array
required: true
+ "#led-pin-cells":
+ type: int
+ required: false
no-auto-init:
description:
When set, the GPIO is not initialised, and can be
@@ -24,3 +27,5 @@ child-binding:
according to the flags in the gpios node.
type: boolean
required: false
+ led-pin-cells:
+ - value
diff --git a/zephyr/dts/bindings/gpio_led/cros-ec,gpio-led-pins.yaml b/zephyr/dts/bindings/gpio_led/cros-ec,gpio-led-pins.yaml
new file mode 100644
index 0000000000..f0baa4bb4a
--- /dev/null
+++ b/zephyr/dts/bindings/gpio_led/cros-ec,gpio-led-pins.yaml
@@ -0,0 +1,33 @@
+# Copyright 2022 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+description: GPIO LED pins parent node
+
+compatible: "cros-ec,gpio-led-pins"
+
+child-binding:
+ description: Each child node describes all the GPIO pins that need to be
+ altered to set a specific color. Eg. for a board supporting
+ Blue and Amber LEDs - to set LED_AMBER color, amber LED will
+ need to be set to 1 and blue LED to 0 So a node looks like
+ color-amber {
+ led-color = "LED_AMBER";
+ led-pins = <&gpio_ec_chg_led_y_c1 1>,
+ <&gpio_ec_chg_led_b_c1 0>;
+ };
+ properties:
+ led-color:
+ type: string
+ required: true
+ enum:
+ - LED_OFF
+ - LED_RED
+ - LED_GREEN
+ - LED_BLUE
+ - LED_YELLOW
+ - LED_WHITE
+ - LED_AMBER
+ led-pins:
+ type: phandle-array
+ required: false
diff --git a/zephyr/projects/trogdor/lazor/gpio.dts b/zephyr/projects/trogdor/lazor/gpio.dts
index bb3cc1ee24..4758456c5f 100644
--- a/zephyr/projects/trogdor/lazor/gpio.dts
+++ b/zephyr/projects/trogdor/lazor/gpio.dts
@@ -188,9 +188,11 @@
gpios = <&gpio7 5 GPIO_OUTPUT_HIGH>;
};
gpio_ec_chg_led_y_c1: ec_chg_led_y_c1 {
+ #led-pin-cells = <1>;
gpios = <&gpioc 3 GPIO_OUTPUT_LOW>;
};
gpio_ec_chg_led_b_c1: ec_chg_led_b_c1 {
+ #led-pin-cells = <1>;
gpios = <&gpioc 4 GPIO_OUTPUT_LOW>;
};
gpio_brd_id0: brd_id0 {
diff --git a/zephyr/projects/trogdor/lazor/led.dts b/zephyr/projects/trogdor/lazor/led.dts
index 6d3fd69964..a1e8f0c87c 100644
--- a/zephyr/projects/trogdor/lazor/led.dts
+++ b/zephyr/projects/trogdor/lazor/led.dts
@@ -2,6 +2,28 @@
gpio-led {
compatible = "gpio-led-behavior";
+ gpio-led-pins {
+ compatible = "cros-ec,gpio-led-pins";
+
+ color-off {
+ led-color = "LED_OFF";
+ led-pins = <&gpio_ec_chg_led_y_c1 0>,
+ <&gpio_ec_chg_led_b_c1 0>;
+ };
+
+ color-amber {
+ led-color = "LED_AMBER";
+ led-pins = <&gpio_ec_chg_led_y_c1 1>,
+ <&gpio_ec_chg_led_b_c1 0>;
+ };
+
+ color-blue {
+ led-color = "LED_BLUE";
+ led-pins = <&gpio_ec_chg_led_y_c1 0>,
+ <&gpio_ec_chg_led_b_c1 1>;
+ };
+ };
+
gpio-led-colors {
compatible = "cros-ec,gpio-led-colors";
diff --git a/zephyr/projects/trogdor/lazor/src/led.c b/zephyr/projects/trogdor/lazor/src/led.c
index ccc369fb90..b1afa28c88 100644
--- a/zephyr/projects/trogdor/lazor/src/led.c
+++ b/zephyr/projects/trogdor/lazor/src/led.c
@@ -28,7 +28,8 @@ LOG_MODULE_REGISTER(gpio_led, LOG_LEVEL_ERR);
#define BAT_LED_ON 1
#define BAT_LED_OFF 0
-#define GPIO_LED_NODE DT_PATH(gpio_led, gpio_led_colors)
+#define GPIO_LED_COLOR_NODE DT_PATH(gpio_led, gpio_led_colors)
+#define GPIO_LED_PINS_NODE DT_PATH(gpio_led, gpio_led_pins)
const enum ec_led_id supported_led_ids[] = {
EC_LED_ID_BATTERY_LED,
@@ -43,31 +44,7 @@ enum led_color {
LED_COLOR_COUNT /* Number of colors, not a color itself */
};
-static void led_set_color(enum led_color color)
-{
- gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_ec_chg_led_y_c1),
- (color == LED_AMBER) ? BAT_LED_ON : BAT_LED_OFF);
- gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_ec_chg_led_b_c1),
- (color == LED_BLUE) ? BAT_LED_ON : BAT_LED_OFF);
-}
-
-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;
-}
+#define LED_PIN_COUNT (LED_COLOR_COUNT - 1)
struct led_color_node_t {
int led_color;
@@ -151,9 +128,71 @@ struct node_prop_t {
},
struct node_prop_t node_array[] = {
- DT_FOREACH_CHILD(GPIO_LED_NODE, SET_LED_VALUES)
+ DT_FOREACH_CHILD(GPIO_LED_COLOR_NODE, SET_LED_VALUES)
+};
+
+struct gpio_pins_t {
+ enum gpio_signal signal;
+ int val;
};
+struct led_pins_node_t {
+ int led_color;
+ struct gpio_pins_t gpio_pins[LED_PIN_COUNT];
+};
+
+#define SET_PIN(node_id, prop, i) \
+{ \
+ .signal = GPIO_SIGNAL(DT_PHANDLE_BY_IDX(node_id, prop, i)), \
+ .val = DT_PHA_BY_IDX(node_id, prop, i, value) \
+},
+
+#define SET_GPIO_PIN(node_id) \
+{ \
+ DT_FOREACH_PROP_ELEM(node_id, led_pins, SET_PIN) \
+}
+
+#define SET_PIN_NODE(node_id) \
+{ \
+ .led_color = GET_PROP(node_id, led_color), \
+ .gpio_pins = SET_GPIO_PIN(node_id) \
+},
+
+struct led_pins_node_t pins_node[LED_COLOR_COUNT] = {
+ DT_FOREACH_CHILD(GPIO_LED_PINS_NODE, SET_PIN_NODE)
+};
+
+static void led_set_color(enum led_color color)
+{
+ for (int i = 0; i < LED_COLOR_COUNT; i++) {
+ if (pins_node[i].led_color == color) {
+ for (int j = 0; j < LED_PIN_COUNT; j++) {
+ gpio_pin_set_dt(gpio_get_dt_spec(
+ pins_node[i].gpio_pins[j].signal),
+ pins_node[i].gpio_pins[j].val);
+ }
+ }
+ }
+}
+
+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;
@@ -265,7 +304,7 @@ static int find_color(int node_idx, int ticks)
ticks = ticks % GET_PERIOD(node_idx, MAX_COLOR - 1);
for (color_idx = 0; color_idx < MAX_COLOR; color_idx++) {
- if (GET_PERIOD(node_idx, color_idx) > ticks)
+ if (ticks < GET_PERIOD(node_idx, color_idx))
break;
}
}