Skip to content
Snippets Groups Projects
Commit 9dfdcdfe authored by Igor Grinberg's avatar Igor Grinberg Committed by Tom Rini
Browse files

gpio_led: add support for inverted polarity


Some GPIO connected LEDs have inverted polarity.
Introduce new config option: CONFIG_GPIO_LED_INVERTED_TABLE for the
specifying the inverted GPIO LEDs list and add support for this in the
gpio_led driver.

Signed-off-by: default avatarIgor Grinberg <grinberg@compulab.co.il>
Tested-by: default avatarIlya Ledvich <ilya@compulab.co.il>
parent 6516f81b
No related branches found
No related tags found
No related merge requests found
......@@ -1971,6 +1971,13 @@ CBFS (Coreboot Filesystem) support
status LED backend implementation. Define CONFIG_GPIO_LED
to include the gpio_led driver in the U-Boot binary.
CONFIG_GPIO_LED_INVERTED_TABLE
Some GPIO connected LEDs may have inverted polarity in which
case the GPIO high value corresponds to LED off state and
GPIO low value corresponds to LED on state.
In such cases CONFIG_GPIO_LED_INVERTED_TABLE may be defined
with a list of GPIO LEDs that have inverted polarity.
- CAN Support: CONFIG_CAN_DRIVER
Defining CONFIG_CAN_DRIVER enables CAN driver support
......
......@@ -9,19 +9,42 @@
#include <status_led.h>
#include <asm/gpio.h>
#ifndef CONFIG_GPIO_LED_INVERTED_TABLE
#define CONFIG_GPIO_LED_INVERTED_TABLE {}
#endif
static led_id_t gpio_led_inv[] = CONFIG_GPIO_LED_INVERTED_TABLE;
static int gpio_led_gpio_value(led_id_t mask, int state)
{
int i, gpio_value = (state == STATUS_LED_ON);
for (i = 0; i < ARRAY_SIZE(gpio_led_inv); i++) {
if (gpio_led_inv[i] == mask)
gpio_value = !gpio_value;
}
return gpio_value;
}
void __led_init(led_id_t mask, int state)
{
int gpio_value;
if (gpio_request(mask, "gpio_led") != 0) {
printf("%s: failed requesting GPIO%lu!\n", __func__, mask);
return;
}
gpio_direction_output(mask, state == STATUS_LED_ON);
gpio_value = gpio_led_gpio_value(mask, state);
gpio_direction_output(mask, gpio_value);
}
void __led_set(led_id_t mask, int state)
{
gpio_set_value(mask, state == STATUS_LED_ON);
int gpio_value = gpio_led_gpio_value(mask, state);
gpio_set_value(mask, gpio_value);
}
void __led_toggle(led_id_t mask)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment