xref: /openbmc/linux/drivers/leds/leds-locomo.c (revision 4d3cb35476903768541f79e61f171e79e6065098)
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