From 613ab757a371f7585dab04fffd602b10cb87cd01 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 14 Dec 2007 00:52:15 +0000 Subject: LED driver for PCEngines ALIX boards This patch adds a driver for the three LEDs that exists on the PCEngines ALIX 2 and 3 series boards. The driver is also added to the Alix profile. Signed-off-by: Petr Liebman -- git-svn-id: svn://svn.openwrt.org/openwrt/trunk@9748 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/kernel/modules/other.mk | 16 ++ .../generic-2.6/files/drivers/leds/leds-alix.c | 172 +++++++++++++++++++++ .../generic-2.6/patches-2.6.23/401-led_alix.patch | 27 ++++ target/linux/x86/generic/profiles/Alix.mk | 4 +- 4 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 target/linux/generic-2.6/files/drivers/leds/leds-alix.c create mode 100644 target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch diff --git a/package/kernel/modules/other.mk b/package/kernel/modules/other.mk index ba6f6f89bd..ebf4d066cb 100644 --- a/package/kernel/modules/other.mk +++ b/package/kernel/modules/other.mk @@ -334,6 +334,22 @@ endef $(eval $(call KernelPackage,leds-wrap)) +define KernelPackage/leds-alix + SUBMENU:=$(OTHER_MENU) + TITLE:=PCengines ALIX LED support + DEPENDS:=@TARGET_x86 + KCONFIG:=CONFIG_LEDS_ALIX + FILES:=$(LINUX_DIR)/drivers/leds/leds-alix.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoLoad,50,leds-alix) +endef + +define KernelPackage/leds-alix/description + Kernel module for PCengines ALIX LEDs +endef + +$(eval $(call KernelPackage,leds-alix)) + + define KernelPackage/ledtrig-morse SUBMENU:=$(OTHER_MENU) TITLE:=LED Morse Trigger diff --git a/target/linux/generic-2.6/files/drivers/leds/leds-alix.c b/target/linux/generic-2.6/files/drivers/leds/leds-alix.c new file mode 100644 index 0000000000..103ca7dfa4 --- /dev/null +++ b/target/linux/generic-2.6/files/drivers/leds/leds-alix.c @@ -0,0 +1,172 @@ +/* + * LEDs driver for PCEngines ALIX 2/3 series + * + * Copyright (C) 2007 Petr Liebman + * + * Based on leds-wrap.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include + +#define DRVNAME "alix-led" + +#define ALIX_LED1_PORT (0x6100) +#define ALIX_LED1_ON (1<<22) +#define ALIX_LED1_OFF (1<<6) + +#define ALIX_LED2_PORT (0x6180) +#define ALIX_LED2_ON (1<<25) +#define ALIX_LED2_OFF (1<<9) + +#define ALIX_LED3_PORT (0x6180) +#define ALIX_LED3_ON (1<<27) +#define ALIX_LED3_OFF (1<<11) + + +static struct platform_device *pdev; + +static void alix_led_set_1(struct led_classdev *led_cdev, + enum led_brightness value) +{ + if (value) + outl(ALIX_LED1_ON, ALIX_LED1_PORT); + else + outl(ALIX_LED1_OFF, ALIX_LED1_PORT); +} + +static void alix_led_set_2(struct led_classdev *led_cdev, + enum led_brightness value) +{ + if (value) + outl(ALIX_LED2_ON, ALIX_LED2_PORT); + else + outl(ALIX_LED2_OFF, ALIX_LED2_PORT); +} + +static void alix_led_set_3(struct led_classdev *led_cdev, + enum led_brightness value) +{ + if (value) + outl(ALIX_LED3_ON, ALIX_LED3_PORT); + else + outl(ALIX_LED3_OFF, ALIX_LED3_PORT); +} + +static struct led_classdev alix_led_1 = { + .name = "alix:1", + .brightness_set = alix_led_set_1, +}; + +static struct led_classdev alix_led_2 = { + .name = "alix:2", + .brightness_set = alix_led_set_2, +}; + +static struct led_classdev alix_led_3 = { + .name = "alix:3", + .brightness_set = alix_led_set_3, +}; + + +#ifdef CONFIG_PM +static int alix_led_suspend(struct platform_device *dev, + pm_message_t state) +{ + led_classdev_suspend(&alix_led_1); + led_classdev_suspend(&alix_led_2); + led_classdev_suspend(&alix_led_3); + return 0; +} + +static int alix_led_resume(struct platform_device *dev) +{ + led_classdev_resume(&alix_led_1); + led_classdev_resume(&alix_led_2); + led_classdev_resume(&alix_led_3); + return 0; +} +#else +#define alix_led_suspend NULL +#define alix_led_resume NULL +#endif + +static int alix_led_probe(struct platform_device *pdev) +{ + int ret; + + ret = led_classdev_register(&pdev->dev, &alix_led_1); + if (ret >= 0) + { + ret = led_classdev_register(&pdev->dev, &alix_led_2); + if (ret >= 0) + { + ret = led_classdev_register(&pdev->dev, &alix_led_3); + if (ret < 0) + led_classdev_unregister(&alix_led_2); + } + if (ret < 0) + led_classdev_unregister(&alix_led_1); + } + return ret; +} + +static int alix_led_remove(struct platform_device *pdev) +{ + led_classdev_unregister(&alix_led_1); + led_classdev_unregister(&alix_led_2); + led_classdev_unregister(&alix_led_3); + return 0; +} + +static struct platform_driver alix_led_driver = { + .probe = alix_led_probe, + .remove = alix_led_remove, + .suspend = alix_led_suspend, + .resume = alix_led_resume, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, + }, +}; + +static int __init alix_led_init(void) +{ + int ret; + + ret = platform_driver_register(&alix_led_driver); + if (ret < 0) + goto out; + + pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + if (IS_ERR(pdev)) { + ret = PTR_ERR(pdev); + platform_driver_unregister(&alix_led_driver); + goto out; + } + +out: + return ret; +} + +static void __exit alix_led_exit(void) +{ + platform_device_unregister(pdev); + platform_driver_unregister(&alix_led_driver); +} + +module_init(alix_led_init); +module_exit(alix_led_exit); + +MODULE_AUTHOR("Petr Liebman"); +MODULE_DESCRIPTION("PCEngines ALIX LED driver"); +MODULE_LICENSE("GPL"); + diff --git a/target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch b/target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch new file mode 100644 index 0000000000..cb00274b92 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch @@ -0,0 +1,27 @@ +diff -Nur linux-2.6.23.1.orig/drivers/leds/Kconfig linux-2.6.23.1/drivers/leds/Kconfig +--- linux-2.6.23.1.orig/drivers/leds/Kconfig 2007-10-12 12:43:44.000000000 -0400 ++++ linux-2.6.23.1/drivers/leds/Kconfig 2007-10-31 02:36:22.000000000 -0400 +@@ -81,6 +81,12 @@ + help + This option enables support for the PCEngines WRAP programmable LEDs. + ++config LEDS_ALIX ++ tristate "LED Support for the ALIX 2/3 boards" ++ depends on LEDS_CLASS ++ help ++ This option enables support for the three LEDs on the PCEngines ALIX 2/3 boards. ++ + config LEDS_H1940 + tristate "LED Support for iPAQ H1940 device" + depends LEDS_CLASS && ARCH_H1940 +diff -Nur linux-2.6.23.1.orig/drivers/leds/Makefile linux-2.6.23.1/drivers/leds/Makefile +--- linux-2.6.23.1.orig/drivers/leds/Makefile 2007-10-12 12:43:44.000000000 -0400 ++++ linux-2.6.23.1/drivers/leds/Makefile 2007-10-31 02:36:17.000000000 -0400 +@@ -14,6 +14,7 @@ + obj-$(CONFIG_LEDS_AMS_DELTA) += leds-ams-delta.o + obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o + obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o ++obj-$(CONFIG_LEDS_ALIX) += leds-alix.o + obj-$(CONFIG_LEDS_H1940) += leds-h1940.o + obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o + obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o diff --git a/target/linux/x86/generic/profiles/Alix.mk b/target/linux/x86/generic/profiles/Alix.mk index 24f5bf1306..c7d9f3253d 100644 --- a/target/linux/x86/generic/profiles/Alix.mk +++ b/target/linux/x86/generic/profiles/Alix.mk @@ -7,10 +7,10 @@ define Profile/Alix NAME:=PCEngines Alix - PACKAGES:=kmod-via-rhine + PACKAGES:=kmod-via-rhine kmod-leds-alix endef define Profile/Alix/Description - Package set compatible with the PCEngines Alix. Contains VIA Rhine III VT6105M support + Package set compatible with the PCEngines Alix. Contains VIA Rhine III VT6105M and LED support endef $(eval $(call Profile,Alix)) -- cgit v1.2.3