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/device.h> 14 #include <linux/leds.h> 15 16 #include <asm/hardware.h> 17 #include <asm/hardware/locomo.h> 18 19 static void locomoled_brightness_set(struct led_classdev *led_cdev, 20 enum led_brightness value, int offset) 21 { 22 struct locomo_dev *locomo_dev = LOCOMO_DEV(led_cdev->dev->parent); 23 unsigned long flags; 24 25 local_irq_save(flags); 26 if (value) 27 locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase + offset); 28 else 29 locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase + offset); 30 local_irq_restore(flags); 31 } 32 33 static void locomoled_brightness_set0(struct led_classdev *led_cdev, 34 enum led_brightness value) 35 { 36 locomoled_brightness_set(led_cdev, value, LOCOMO_LPT0); 37 } 38 39 static void locomoled_brightness_set1(struct led_classdev *led_cdev, 40 enum led_brightness value) 41 { 42 locomoled_brightness_set(led_cdev, value, LOCOMO_LPT1); 43 } 44 45 static struct led_classdev locomo_led0 = { 46 .name = "locomo:amber:charge", 47 .default_trigger = "sharpsl-charge", 48 .brightness_set = locomoled_brightness_set0, 49 }; 50 51 static struct led_classdev locomo_led1 = { 52 .name = "locomo:green:mail", 53 .default_trigger = "nand-disk", 54 .brightness_set = locomoled_brightness_set1, 55 }; 56 57 static int locomoled_probe(struct locomo_dev *ldev) 58 { 59 int ret; 60 61 ret = led_classdev_register(&ldev->dev, &locomo_led0); 62 if (ret < 0) 63 return ret; 64 65 ret = led_classdev_register(&ldev->dev, &locomo_led1); 66 if (ret < 0) 67 led_classdev_unregister(&locomo_led0); 68 69 return ret; 70 } 71 72 static int locomoled_remove(struct locomo_dev *dev) 73 { 74 led_classdev_unregister(&locomo_led0); 75 led_classdev_unregister(&locomo_led1); 76 return 0; 77 } 78 79 static struct locomo_driver locomoled_driver = { 80 .drv = { 81 .name = "locomoled" 82 }, 83 .devid = LOCOMO_DEVID_LED, 84 .probe = locomoled_probe, 85 .remove = locomoled_remove, 86 }; 87 88 static int __init locomoled_init(void) 89 { 90 return locomo_driver_register(&locomoled_driver); 91 } 92 module_init(locomoled_init); 93 94 MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>"); 95 MODULE_DESCRIPTION("Locomo LED driver"); 96 MODULE_LICENSE("GPL"); 97