aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-04-11 12:51:40 -0400
committerJeff Garzik <jeff@garzik.org>2006-04-11 12:51:40 -0400
commit10a5fd5e6b7e2d464c9f95f67cade4ddbd63f4e1 (patch)
treeeddf856286234f28cac747d20eb59d918e1bc8b5 /drivers/leds
parentc2a6585296009379e0f4eff39cdcb108b457ebf2 (diff)
parenta145410dccdb44f81d3b56763ef9b6f721f4e47c (diff)
Merge branch 'master'
Conflicts: drivers/scsi/libata-scsi.c include/linux/libata.h
Diffstat (limited to 'drivers/leds')
-rw-r--r--drivers/leds/Kconfig27
-rw-r--r--drivers/leds/Makefile1
-rw-r--r--drivers/leds/leds-s3c24xx.c163
3 files changed, 183 insertions, 8 deletions
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 2c4f20b7f021..3f5b64794542 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -14,13 +14,7 @@ config LEDS_CLASS
14 This option enables the led sysfs class in /sys/class/leds. You'll 14 This option enables the led sysfs class in /sys/class/leds. You'll
15 need this to do anything useful with LEDs. If unsure, say N. 15 need this to do anything useful with LEDs. If unsure, say N.
16 16
17config LEDS_TRIGGERS 17comment "LED drivers"
18 bool "LED Trigger support"
19 depends NEW_LEDS
20 help
21 This option enables trigger support for the leds class.
22 These triggers allow kernel events to drive the LEDs and can
23 be configured via sysfs. If unsure, say Y.
24 18
25config LEDS_CORGI 19config LEDS_CORGI
26 tristate "LED Support for the Sharp SL-C7x0 series" 20 tristate "LED Support for the Sharp SL-C7x0 series"
@@ -59,6 +53,23 @@ config LEDS_TOSA
59 This option enables support for the LEDs on Sharp Zaurus 53 This option enables support for the LEDs on Sharp Zaurus
60 SL-6000 series. 54 SL-6000 series.
61 55
56config LEDS_S3C24XX
57 tristate "LED Support for Samsung S3C24XX GPIO LEDs"
58 depends on LEDS_CLASS && ARCH_S3C2410
59 help
60 This option enables support for LEDs connected to GPIO lines
61 on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440.
62
63comment "LED Triggers"
64
65config LEDS_TRIGGERS
66 bool "LED Trigger support"
67 depends NEW_LEDS
68 help
69 This option enables trigger support for the leds class.
70 These triggers allow kernel events to drive the LEDs and can
71 be configured via sysfs. If unsure, say Y.
72
62config LEDS_TRIGGER_TIMER 73config LEDS_TRIGGER_TIMER
63 tristate "LED Timer Trigger" 74 tristate "LED Timer Trigger"
64 depends LEDS_TRIGGERS 75 depends LEDS_TRIGGERS
@@ -67,7 +78,7 @@ config LEDS_TRIGGER_TIMER
67 via sysfs. If unsure, say Y. 78 via sysfs. If unsure, say Y.
68 79
69config LEDS_TRIGGER_IDE_DISK 80config LEDS_TRIGGER_IDE_DISK
70 bool "LED Timer Trigger" 81 bool "LED IDE Disk Trigger"
71 depends LEDS_TRIGGERS && BLK_DEV_IDEDISK 82 depends LEDS_TRIGGERS && BLK_DEV_IDEDISK
72 help 83 help
73 This allows LEDs to be controlled by IDE disk activity. 84 This allows LEDs to be controlled by IDE disk activity.
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 40699d3cabbf..40f042633bf5 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
10obj-$(CONFIG_LEDS_SPITZ) += leds-spitz.o 10obj-$(CONFIG_LEDS_SPITZ) += leds-spitz.o
11obj-$(CONFIG_LEDS_IXP4XX) += leds-ixp4xx-gpio.o 11obj-$(CONFIG_LEDS_IXP4XX) += leds-ixp4xx-gpio.o
12obj-$(CONFIG_LEDS_TOSA) += leds-tosa.o 12obj-$(CONFIG_LEDS_TOSA) += leds-tosa.o
13obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
13 14
14# LED Triggers 15# LED Triggers
15obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o 16obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o
diff --git a/drivers/leds/leds-s3c24xx.c b/drivers/leds/leds-s3c24xx.c
new file mode 100644
index 000000000000..650cf72dc675
--- /dev/null
+++ b/drivers/leds/leds-s3c24xx.c
@@ -0,0 +1,163 @@
1/* drivers/leds/leds-s3c24xx.c
2 *
3 * (c) 2006 Simtec Electronics
4 * http://armlinux.simtec.co.uk/
5 * Ben Dooks <ben@simtec.co.uk>
6 *
7 * S3C24XX - LEDs GPIO driver
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12*/
13
14#include <linux/config.h>
15#include <linux/kernel.h>
16#include <linux/init.h>
17#include <linux/platform_device.h>
18#include <linux/leds.h>
19
20#include <asm/arch/hardware.h>
21#include <asm/arch/regs-gpio.h>
22#include <asm/arch/leds-gpio.h>
23
24/* our context */
25
26struct s3c24xx_gpio_led {
27 struct led_classdev cdev;
28 struct s3c24xx_led_platdata *pdata;
29};
30
31static inline struct s3c24xx_gpio_led *pdev_to_gpio(struct platform_device *dev)
32{
33 return platform_get_drvdata(dev);
34}
35
36static inline struct s3c24xx_gpio_led *to_gpio(struct led_classdev *led_cdev)
37{
38 return container_of(led_cdev, struct s3c24xx_gpio_led, cdev);
39}
40
41static void s3c24xx_led_set(struct led_classdev *led_cdev,
42 enum led_brightness value)
43{
44 struct s3c24xx_gpio_led *led = to_gpio(led_cdev);
45 struct s3c24xx_led_platdata *pd = led->pdata;
46
47 /* there will be a sort delay between setting the output and
48 * going from output to input when using tristate. */
49
50 s3c2410_gpio_setpin(pd->gpio, (value ? 1 : 0) ^
51 (pd->flags & S3C24XX_LEDF_ACTLOW));
52
53 if (pd->flags & S3C24XX_LEDF_TRISTATE)
54 s3c2410_gpio_cfgpin(pd->gpio,
55 value ? S3C2410_GPIO_OUTPUT : S3C2410_GPIO_INPUT);
56
57}
58
59static int s3c24xx_led_remove(struct platform_device *dev)
60{
61 struct s3c24xx_gpio_led *led = pdev_to_gpio(dev);
62
63 led_classdev_unregister(&led->cdev);
64 kfree(led);
65
66 return 0;
67}
68
69static int s3c24xx_led_probe(struct platform_device *dev)
70{
71 struct s3c24xx_led_platdata *pdata = dev->dev.platform_data;
72 struct s3c24xx_gpio_led *led;
73 int ret;
74
75 led = kzalloc(sizeof(struct s3c24xx_gpio_led), GFP_KERNEL);
76 if (led == NULL) {
77 dev_err(&dev->dev, "No memory for device\n");
78 return -ENOMEM;
79 }
80
81 platform_set_drvdata(dev, led);
82
83 led->cdev.brightness_set = s3c24xx_led_set;
84 led->cdev.default_trigger = pdata->def_trigger;
85 led->cdev.name = pdata->name;
86
87 led->pdata = pdata;
88
89 /* no point in having a pull-up if we are always driving */
90
91 if (pdata->flags & S3C24XX_LEDF_TRISTATE) {
92 s3c2410_gpio_setpin(pdata->gpio, 0);
93 s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_INPUT);
94 } else {
95 s3c2410_gpio_pullup(pdata->gpio, 0);
96 s3c2410_gpio_setpin(pdata->gpio, 0);
97 s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_OUTPUT);
98 }
99
100 /* register our new led device */
101
102 ret = led_classdev_register(&dev->dev, &led->cdev);
103 if (ret < 0) {
104 dev_err(&dev->dev, "led_classdev_register failed\n");
105 goto exit_err1;
106 }
107
108 return 0;
109
110 exit_err1:
111 kfree(led);
112 return ret;
113}
114
115
116#ifdef CONFIG_PM
117static int s3c24xx_led_suspend(struct platform_device *dev, pm_message_t state)
118{
119 struct s3c24xx_gpio_led *led = pdev_to_gpio(dev);
120
121 led_classdev_suspend(&led->cdev);
122 return 0;
123}
124
125static int s3c24xx_led_resume(struct platform_device *dev)
126{
127 struct s3c24xx_gpio_led *led = pdev_to_gpio(dev);
128
129 led_classdev_resume(&led->cdev);
130 return 0;
131}
132#else
133#define s3c24xx_led_suspend NULL
134#define s3c24xx_led_resume NULL
135#endif
136
137static struct platform_driver s3c24xx_led_driver = {
138 .probe = s3c24xx_led_probe,
139 .remove = s3c24xx_led_remove,
140 .suspend = s3c24xx_led_suspend,
141 .resume = s3c24xx_led_resume,
142 .driver = {
143 .name = "s3c24xx_led",
144 .owner = THIS_MODULE,
145 },
146};
147
148static int __init s3c24xx_led_init(void)
149{
150 return platform_driver_register(&s3c24xx_led_driver);
151}
152
153static void __exit s3c24xx_led_exit(void)
154{
155 platform_driver_unregister(&s3c24xx_led_driver);
156}
157
158module_init(s3c24xx_led_init);
159module_exit(s3c24xx_led_exit);
160
161MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
162MODULE_DESCRIPTION("S3C24XX LED driver");
163MODULE_LICENSE("GPL");