diff options
-rw-r--r-- | zephyr/dts/bindings/gpio/named-gpios.yaml | 5 | ||||
-rw-r--r-- | zephyr/dts/bindings/gpio_led/cros-ec,gpio-led-pins.yaml | 33 | ||||
-rw-r--r-- | zephyr/projects/trogdor/lazor/gpio.dts | 2 | ||||
-rw-r--r-- | zephyr/projects/trogdor/lazor/led.dts | 22 | ||||
-rw-r--r-- | zephyr/projects/trogdor/lazor/src/led.c | 95 |
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; } } |