1 /* 2 * linux/drivers/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/config.h> 12 #include <linux/kernel.h> 13 #include <linux/init.h> 14 #include <linux/device.h> 15 #include <linux/leds.h> 16 17 #include <asm/hardware.h> 18 #include <asm/hardware/locomo.h> 19 20 static 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->class_dev->dev); 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 34 static 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 40 static 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 46 static struct led_classdev locomo_led0 = { 47 .name = "locomo:amber", 48 .brightness_set = locomoled_brightness_set0, 49 }; 50 51 static struct led_classdev locomo_led1 = { 52 .name = "locomo:green", 53 .brightness_set = locomoled_brightness_set1, 54 }; 55 56 static int locomoled_probe(struct locomo_dev *ldev) 57 { 58 int ret; 59 60 ret = led_classdev_register(&ldev->dev, &locomo_led0); 61 if (ret < 0) 62 return ret; 63 64 ret = led_classdev_register(&ldev->dev, &locomo_led1); 65 if (ret < 0) 66 led_classdev_unregister(&locomo_led0); 67 68 return ret; 69 } 70 71 static int locomoled_remove(struct locomo_dev *dev) 72 { 73 led_classdev_unregister(&locomo_led0); 74 led_classdev_unregister(&locomo_led1); 75 return 0; 76 } 77 78 static struct locomo_driver locomoled_driver = { 79 .drv = { 80 .name = "locomoled" 81 }, 82 .devid = LOCOMO_DEVID_LED, 83 .probe = locomoled_probe, 84 .remove = locomoled_remove, 85 }; 86 87 static int __init locomoled_init(void) 88 { 89 return locomo_driver_register(&locomoled_driver); 90 } 91 module_init(locomoled_init); 92 93 MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>"); 94 MODULE_DESCRIPTION("Locomo LED driver"); 95 MODULE_LICENSE("GPL"); 96