From 51271530d2f824ee9e1ef01a2eb7f361622716aa Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Sat, 18 Dec 2010 14:34:14 +0100 Subject: [PATCH] basic LED support This patch adds core functionality for controlling LEDs. Signed-off-by: Sascha Hauer --- drivers/Kconfig | 1 + drivers/Makefile | 1 + drivers/led/Kconfig | 6 ++ drivers/led/Makefile | 1 + drivers/led/core.c | 157 +++++++++++++++++++++++++++++++++++++++++++ include/led.h | 27 ++++++++ 6 files changed, 193 insertions(+) create mode 100644 drivers/led/Kconfig create mode 100644 drivers/led/Makefile create mode 100644 drivers/led/core.c create mode 100644 include/led.h diff --git a/drivers/Kconfig b/drivers/Kconfig index d94017bfc..86d8fb54c 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -12,5 +12,6 @@ source "drivers/video/Kconfig" source "drivers/mci/Kconfig" source "drivers/clk/Kconfig" source "drivers/mfd/Kconfig" +source "drivers/led/Kconfig" endmenu diff --git a/drivers/Makefile b/drivers/Makefile index 242a564dd..b1b402fb4 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -10,3 +10,4 @@ obj-$(CONFIG_MCI) += mci/ obj-$(CONFIG_VIDEO) += video/ obj-y += clk/ obj-y += mfd/ +obj-$(CONFIG_LED) += led/ diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig new file mode 100644 index 000000000..964626cdc --- /dev/null +++ b/drivers/led/Kconfig @@ -0,0 +1,6 @@ +menuconfig LED + bool "LED support" + +if LED + +endif diff --git a/drivers/led/Makefile b/drivers/led/Makefile new file mode 100644 index 000000000..0c1a6b6b8 --- /dev/null +++ b/drivers/led/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_LED) += core.o diff --git a/drivers/led/core.c b/drivers/led/core.c new file mode 100644 index 000000000..748a978b9 --- /dev/null +++ b/drivers/led/core.c @@ -0,0 +1,157 @@ +/* + * core LED support for barebox + * + * (C) Copyright 2010 Sascha Hauer, Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * @file + * @brief LED framework + * + * This file contains the core LED framework for barebox. + * + * Each LED can be set to a value where 0 means disabled and values + * > 0 mean enabled. LEDs can have different enable values where the + * exact meaning depends on the LED, for example a gpio controlled rgb + * LED can have enable values from 1 to 7 which correspond to different + * colors. value could also mean a brightness. + * Each LED is assigned a number. numbers start with 0 and are increased + * with each registered LED. The number stays the same during lifecycle, + * gaps because of unregistered LEDs are not filled up. + */ + +static LIST_HEAD(leds); +static int num_leds; + +/** + * led_by_number - get the number of a LED + * @param num number of the LED to return + */ +struct led *led_by_number(int num) +{ + struct led *led; + + list_for_each_entry(led, &leds, list) { + if (led->num == num) + return led; + } + + return NULL; +} + +/** + * led_by_name - get a LED with its name + * @param name name of the LED + */ +struct led *led_by_name(const char *name) +{ + struct led *led; + + list_for_each_entry(led, &leds, list) { + if (led->name && !strcmp(led->name, name)) + return led; + } + + return NULL; +} + +/** + * led_by_name_or_number - get a LED with its name or number + * @param str if first character of str is a digit led_by_number + * is returned, led_by_name otherwise. + */ +struct led *led_by_name_or_number(const char *str) +{ + if (isdigit(*str)) { + int l; + + l = simple_strtoul(str, NULL, 0); + + return led_by_number(l); + } else { + return led_by_name(str); + } +} + +/** + * led_set - set the value of a LED + * @param led the led + * @param value the value of the LED (0 is disabled) + */ +int led_set(struct led *led, unsigned int value) +{ + if (value > led->max_value) + value = led->max_value; + + led->set(led, value); + + return 0; +} + +/** + * led_set_num - set the value of a LED + * @param num the number of the LED + * @param value the value of the LED (0 is disabled) + */ +int led_set_num(int num, unsigned int value) +{ + struct led *led = led_by_number(num); + + if (!led) + return -ENODEV; + + return led_set(led, value); +} + +/** + * led_register - Register a LED + * @param led the led + */ +int led_register(struct led *led) +{ + if (led->name && led_by_name(led->name)) + return -EBUSY; + + led->num = num_leds++; + + list_add_tail(&led->list, &leds); + + return 0; +} + +/** + * led_unregister - Unegister a LED + * @param led the led + */ +void led_unregister(struct led *led) +{ + list_del(&led->list); +} diff --git a/include/led.h b/include/led.h new file mode 100644 index 000000000..3e7b1d98b --- /dev/null +++ b/include/led.h @@ -0,0 +1,27 @@ +#ifndef __LED_H +#define __LED_H + +struct led { + void (*set)(struct led *, unsigned int value); + int max_value; + char *name; + int num; + struct list_head list; +}; + +struct led *led_by_number(int no); +struct led *led_by_name(const char *name); +struct led *led_by_name_or_number(const char *str); + +static inline int led_get_number(struct led *led) +{ + return led->num; +} + +int led_set_num(int num, unsigned int value); +int led_set(struct led *led, unsigned int value); +int led_register(struct led *led); +void led_unregister(struct led *led); +void led_unregister(struct led *led); + +#endif /* __LED_H */