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