1/* 2 * linux/drivers/leds/leds-locomo.c 3 * 4 * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11#include <linux/kernel.h> 12#include <linux/init.h> 13#include <linux/module.h> 14#include <linux/device.h> 15#include <linux/leds.h> 16 17#include <mach/hardware.h> 18#include <asm/hardware/locomo.h> 19 20static void locomoled_brightness_set(struct led_classdev *led_cdev, 21 enum led_brightness value, int offset) 22{ 23 struct locomo_dev *locomo_dev = LOCOMO_DEV(led_cdev->dev->parent); 24 unsigned long flags; 25 26 local_irq_save(flags); 27 if (value) 28 locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase + offset); 29 else 30 locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase + offset); 31 local_irq_restore(flags); 32} 33 34static void locomoled_brightness_set0(struct led_classdev *led_cdev, 35 enum led_brightness value) 36{ 37 locomoled_brightness_set(led_cdev, value, LOCOMO_LPT0); 38} 39 40static void locomoled_brightness_set1(struct led_classdev *led_cdev, 41 enum led_brightness value) 42{ 43 locomoled_brightness_set(led_cdev, value, LOCOMO_LPT1); 44} 45 46static struct led_classdev locomo_led0 = { 47 .name = "locomo:amber:charge", 48 .default_trigger = "main-battery-charging", 49 .brightness_set = locomoled_brightness_set0, 50}; 51 52static struct led_classdev locomo_led1 = { 53 .name = "locomo:green:mail", 54 .default_trigger = "nand-disk", 55 .brightness_set = locomoled_brightness_set1, 56}; 57 58static int locomoled_probe(struct locomo_dev *ldev) 59{ 60 int ret; 61 62 ret = led_classdev_register(&ldev->dev, &locomo_led0); 63 if (ret < 0) 64 return ret; 65 66 ret = led_classdev_register(&ldev->dev, &locomo_led1); 67 if (ret < 0) 68 led_classdev_unregister(&locomo_led0); 69 70 return ret; 71} 72 73static int locomoled_remove(struct locomo_dev *dev) 74{ 75 led_classdev_unregister(&locomo_led0); 76 led_classdev_unregister(&locomo_led1); 77 return 0; 78} 79 80static struct locomo_driver locomoled_driver = { 81 .drv = { 82 .name = "locomoled" 83 }, 84 .devid = LOCOMO_DEVID_LED, 85 .probe = locomoled_probe, 86 .remove = locomoled_remove, 87}; 88 89static int __init locomoled_init(void) 90{ 91 return locomo_driver_register(&locomoled_driver); 92} 93module_init(locomoled_init); 94 95MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>"); 96MODULE_DESCRIPTION("Locomo LED driver"); 97MODULE_LICENSE("GPL"); 98