linux/arch/arm/mach-ebsa110/leds.c
<<
>>
Prefs
   1/*
   2 * Driver for the LED found on the EBSA110 machine
   3 * Based on Versatile and RealView machine LED code
   4 *
   5 * License terms: GNU General Public License (GPL) version 2
   6 * Author: Bryan Wu <bryan.wu@canonical.com>
   7 */
   8#include <linux/kernel.h>
   9#include <linux/init.h>
  10#include <linux/io.h>
  11#include <linux/slab.h>
  12#include <linux/leds.h>
  13
  14#include <asm/mach-types.h>
  15
  16#include "core.h"
  17
  18#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
  19static void ebsa110_led_set(struct led_classdev *cdev,
  20                              enum led_brightness b)
  21{
  22        u8 reg = __raw_readb(SOFT_BASE);
  23
  24        if (b != LED_OFF)
  25                reg |= 0x80;
  26        else
  27                reg &= ~0x80;
  28
  29        __raw_writeb(reg, SOFT_BASE);
  30}
  31
  32static enum led_brightness ebsa110_led_get(struct led_classdev *cdev)
  33{
  34        u8 reg = __raw_readb(SOFT_BASE);
  35
  36        return (reg & 0x80) ? LED_FULL : LED_OFF;
  37}
  38
  39static int __init ebsa110_leds_init(void)
  40{
  41
  42        struct led_classdev *cdev;
  43        int ret;
  44
  45        if (!machine_is_ebsa110())
  46                return -ENODEV;
  47
  48        cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
  49        if (!cdev)
  50                return -ENOMEM;
  51
  52        cdev->name = "ebsa110:0";
  53        cdev->brightness_set = ebsa110_led_set;
  54        cdev->brightness_get = ebsa110_led_get;
  55        cdev->default_trigger = "heartbeat";
  56
  57        ret = led_classdev_register(NULL, cdev);
  58        if (ret < 0) {
  59                kfree(cdev);
  60                return ret;
  61        }
  62
  63        return 0;
  64}
  65
  66/*
  67 * Since we may have triggers on any subsystem, defer registration
  68 * until after subsystem_init.
  69 */
  70fs_initcall(ebsa110_leds_init);
  71#endif
  72