diff options
Diffstat (limited to 'target/linux/generic-2.6')
-rw-r--r-- | target/linux/generic-2.6/files/drivers/leds/leds-alix.c | 172 | ||||
-rw-r--r-- | target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch | 27 |
2 files changed, 199 insertions, 0 deletions
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 |