| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  |  * Driver for the LED found on the EBSA110 machine | 
					
						
							|  |  |  |  * Based on Versatile and RealView machine LED code | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  |  * License terms: GNU General Public License (GPL) version 2 | 
					
						
							|  |  |  |  * Author: Bryan Wu <bryan.wu@canonical.com> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | #include <linux/kernel.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <linux/init.h>
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | #include <linux/io.h>
 | 
					
						
							|  |  |  | #include <linux/slab.h>
 | 
					
						
							|  |  |  | #include <linux/leds.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <asm/mach-types.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-10 11:13:05 +01:00
										 |  |  | #include "core.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
 | 
					
						
							|  |  |  | static void ebsa110_led_set(struct led_classdev *cdev, | 
					
						
							|  |  |  | 			      enum led_brightness b) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | 	u8 reg = __raw_readb(SOFT_BASE); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | 	if (b != LED_OFF) | 
					
						
							|  |  |  | 		reg |= 0x80; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		reg &= ~0x80; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | 	__raw_writeb(reg, SOFT_BASE); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | static enum led_brightness ebsa110_led_get(struct led_classdev *cdev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	u8 reg = __raw_readb(SOFT_BASE); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | 	return (reg & 0x80) ? LED_FULL : LED_OFF; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | static int __init ebsa110_leds_init(void) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct led_classdev *cdev; | 
					
						
							|  |  |  | 	int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!machine_is_ebsa110()) | 
					
						
							|  |  |  | 		return -ENODEV; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); | 
					
						
							|  |  |  | 	if (!cdev) | 
					
						
							|  |  |  | 		return -ENOMEM; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cdev->name = "ebsa110:0"; | 
					
						
							|  |  |  | 	cdev->brightness_set = ebsa110_led_set; | 
					
						
							|  |  |  | 	cdev->brightness_get = ebsa110_led_get; | 
					
						
							|  |  |  | 	cdev->default_trigger = "heartbeat"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ret = led_classdev_register(NULL, cdev); | 
					
						
							|  |  |  | 	if (ret	< 0) { | 
					
						
							|  |  |  | 		kfree(cdev); | 
					
						
							|  |  |  | 		return ret; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-30 22:56:17 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Since we may have triggers on any subsystem, defer registration | 
					
						
							|  |  |  |  * until after subsystem_init. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | fs_initcall(ebsa110_leds_init); | 
					
						
							|  |  |  | #endif
 |