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:
parent
cc37eb4a4d
commit
06e641353e
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue