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
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
							
								
								
									
										172
									
								
								target/linux/generic-2.6/files/drivers/leds/leds-alix.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								target/linux/generic-2.6/files/drivers/leds/leds-alix.c
									
									
									
									
									
										Normal file
									
								
							| @@ -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"); | ||||
|  | ||||
							
								
								
									
										27
									
								
								target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								target/linux/generic-2.6/patches-2.6.23/401-led_alix.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
| @@ -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)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau