
On 11/08/13 01:03, Igor Grinberg wrote:
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
on cm-t335.
README | 7 +++++++ drivers/misc/gpio_led.c | 27 +++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/README b/README index 55c71fa..b8bad51 100644 --- a/README +++ b/README @@ -1959,6 +1959,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
diff --git a/drivers/misc/gpio_led.c b/drivers/misc/gpio_led.c index de20419..3e95727 100644 --- a/drivers/misc/gpio_led.c +++ b/drivers/misc/gpio_led.c @@ -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)