aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2007-12-14 00:52:15 +0000
committerFelix Fietkau <nbd@openwrt.org>2007-12-14 00:52:15 +0000
commit985ee9fc8fd1aa23e5a19f65f10873fd7f4e9c91 (patch)
tree37dd758fe9d6ad4cdfe468d2076850f516c54fbc
parent2da3f6a25641ed7442141ce07943afaaad3b8c31 (diff)
downloadupstream-985ee9fc8fd1aa23e5a19f65f10873fd7f4e9c91.tar.gz
upstream-985ee9fc8fd1aa23e5a19f65f10873fd7f4e9c91.tar.bz2
upstream-985ee9fc8fd1aa23e5a19f65f10873fd7f4e9c91.zip
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 <petrliebman@gmail.com> -- SVN-Revision: 9748
-rw-r--r--package/kernel/modules/other.mk16
-rw-r--r--target/linux/generic-2.6/files/drivers/leds/leds-alix.c172
-rw-r--r--target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch27
-rw-r--r--target/linux/x86/generic/profiles/Alix.mk4
4 files changed, 217 insertions, 2 deletions
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 <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+#include <linux/err.h>
+#include <asm/io.h>
+
+#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))