| /* |
| * Driver for the LED found on the EBSA110 machine |
| * Based on Versatile and RealView machine LED code |
| * |
| * License terms: GNU General Public License (GPL) version 2 |
| * Author: Bryan Wu <bryan.wu@canonical.com> |
| */ |
| #include <linux/kernel.h> |
| #include <linux/init.h> |
| #include <linux/io.h> |
| #include <linux/slab.h> |
| #include <linux/leds.h> |
| |
| #include <asm/mach-types.h> |
| |
| #include "core.h" |
| |
| #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) |
| static void ebsa110_led_set(struct led_classdev *cdev, |
| enum led_brightness b) |
| { |
| u8 reg = __raw_readb(SOFT_BASE); |
| |
| if (b != LED_OFF) |
| reg |= 0x80; |
| else |
| reg &= ~0x80; |
| |
| __raw_writeb(reg, SOFT_BASE); |
| } |
| |
| static enum led_brightness ebsa110_led_get(struct led_classdev *cdev) |
| { |
| u8 reg = __raw_readb(SOFT_BASE); |
| |
| return (reg & 0x80) ? LED_FULL : LED_OFF; |
| } |
| |
| static int __init ebsa110_leds_init(void) |
| { |
| |
| 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; |
| } |
| |
| return 0; |
| } |
| |
| /* |
| * Since we may have triggers on any subsystem, defer registration |
| * until after subsystem_init. |
| */ |
| fs_initcall(ebsa110_leds_init); |
| #endif |