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: Igor Grinberg <grinberg@compulab.co.il>
Tested-by: Ilya Ledvich <ilya@compulab.co.il>
This commit is contained in:
Igor Grinberg 2013-11-08 01:03:52 +02:00 committed by Tom Rini
parent 6516f81b64
commit 9dfdcdfed4
2 changed files with 32 additions and 2 deletions

7
README
View file

@ -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

View file

@ -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)