9
0
Fork 0

led-gpio: add bicolor led support

those led can have 2 colors but one at a time otherwise they are black

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2012-11-16 21:17:23 +01:00 committed by Sascha Hauer
parent cc37eb4a4d
commit 06e641353e
3 changed files with 71 additions and 0 deletions

View File

@ -11,6 +11,10 @@ config LED_GPIO_RGB
bool "gpio rgb LED support"
depends on LED_GPIO
config LED_GPIO_BICOLOR
bool "gpio bicolor LED support"
depends on LED_GPIO
config LED_TRIGGERS
select POLLER
bool "LED triggers support"

View File

@ -52,6 +52,53 @@ void led_gpio_unregister(struct gpio_led *led)
led_unregister(&led->led);
}
#ifdef CONFIG_LED_GPIO_BICOLOR
static void led_gpio_bicolor_set(struct led *led, unsigned int value)
{
struct gpio_bicolor_led *bi = container_of(led, struct gpio_bicolor_led, led);
int al = bi->active_low;
switch (value) {
case 0:
gpio_direction_output(bi->gpio_c0, al);
gpio_direction_output(bi->gpio_c1, al);
break;
case 1:
gpio_direction_output(bi->gpio_c0, !al);
gpio_direction_output(bi->gpio_c1, al);
break;
case 2:
gpio_direction_output(bi->gpio_c0, al);
gpio_direction_output(bi->gpio_c1, !al);
break;
}
}
/**
* led_gpio_bicolor_register - register three gpios as a bicolor LED
* @param led The gpio bicolor LED
*
* This function registers three gpios as a bicolor LED. led->gpio[rg]
* should be initialized to the gpios to control.
*/
int led_gpio_bicolor_register(struct gpio_bicolor_led *led)
{
led->led.set = led_gpio_bicolor_set;
led->led.max_value = 2;
return led_register(&led->led);
}
/**
* led_gpio_bicolor_unregister - remove a gpio controlled bicolor LED from the framework
* @param led The gpio LED
*/
void led_gpio_bicolor_unregister(struct gpio_bicolor_led *led)
{
led_unregister(&led->led);
}
#endif
#ifdef CONFIG_LED_GPIO_RGB
static void led_gpio_rgb_set(struct led *led, unsigned int value)

View File

@ -65,6 +65,12 @@ struct gpio_led {
struct led led;
};
struct gpio_bicolor_led {
int gpio_c0, gpio_c1;
bool active_low;
struct led led;
};
struct gpio_rgb_led {
int gpio_r, gpio_g, gpio_b;
bool active_low;
@ -85,6 +91,20 @@ static inline void led_gpio_unregister(struct gpio_led *led)
}
#endif
#ifdef CONFIG_LED_GPIO_BICOLOR
int led_gpio_bicolor_register(struct gpio_bicolor_led *led);
void led_gpio_bicolor_unregister(struct gpio_bicolor_led *led);
#else
static inline int led_gpio_bicolor_register(struct gpio_bicolor_led *led)
{
return -ENOSYS;
}
static inline void led_gpio_bicolor_unregister(struct gpio_bicolor_led *led)
{
}
#endif
#ifdef CONFIG_LED_GPIO_RGB
int led_gpio_rgb_register(struct gpio_rgb_led *led);
void led_gpio_rgb_unregister(struct gpio_led *led);