|
1 /* |
|
2 * Driver model for leds and led triggers |
|
3 * |
|
4 * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> |
|
5 * Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com> |
|
6 * |
|
7 * This program is free software; you can redistribute it and/or modify |
|
8 * it under the terms of the GNU General Public License version 2 as |
|
9 * published by the Free Software Foundation. |
|
10 * |
|
11 */ |
|
12 #ifndef __LINUX_LEDS_H_INCLUDED |
|
13 #define __LINUX_LEDS_H_INCLUDED |
|
14 |
|
15 #include <linux/list.h> |
|
16 #include <linux/spinlock.h> |
|
17 #include <linux/rwsem.h> |
|
18 |
|
19 struct device; |
|
20 /* |
|
21 * LED Core |
|
22 */ |
|
23 |
|
24 enum led_brightness { |
|
25 LED_OFF = 0, |
|
26 LED_HALF = 127, |
|
27 LED_FULL = 255, |
|
28 }; |
|
29 |
|
30 struct led_classdev { |
|
31 const char *name; |
|
32 int brightness; |
|
33 int flags; |
|
34 |
|
35 #define LED_SUSPENDED (1 << 0) |
|
36 |
|
37 /* Set LED brightness level */ |
|
38 /* Must not sleep, use a workqueue if needed */ |
|
39 void (*brightness_set)(struct led_classdev *led_cdev, |
|
40 enum led_brightness brightness); |
|
41 /* Get LED brightness level */ |
|
42 enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); |
|
43 |
|
44 /* Activate hardware accelerated blink */ |
|
45 int (*blink_set)(struct led_classdev *led_cdev, |
|
46 unsigned long *delay_on, |
|
47 unsigned long *delay_off); |
|
48 |
|
49 struct device *dev; |
|
50 struct list_head node; /* LED Device list */ |
|
51 const char *default_trigger; /* Trigger to use */ |
|
52 |
|
53 #ifdef CONFIG_LEDS_TRIGGERS |
|
54 /* Protects the trigger data below */ |
|
55 struct rw_semaphore trigger_lock; |
|
56 |
|
57 struct led_trigger *trigger; |
|
58 struct list_head trig_list; |
|
59 void *trigger_data; |
|
60 #endif |
|
61 }; |
|
62 |
|
63 extern int led_classdev_register(struct device *parent, |
|
64 struct led_classdev *led_cdev); |
|
65 extern void led_classdev_unregister(struct led_classdev *lcd); |
|
66 extern void led_classdev_suspend(struct led_classdev *led_cdev); |
|
67 extern void led_classdev_resume(struct led_classdev *led_cdev); |
|
68 |
|
69 /* |
|
70 * LED Triggers |
|
71 */ |
|
72 #ifdef CONFIG_LEDS_TRIGGERS |
|
73 |
|
74 #define TRIG_NAME_MAX 50 |
|
75 |
|
76 struct led_trigger { |
|
77 /* Trigger Properties */ |
|
78 const char *name; |
|
79 void (*activate)(struct led_classdev *led_cdev); |
|
80 void (*deactivate)(struct led_classdev *led_cdev); |
|
81 |
|
82 /* LEDs under control by this trigger (for simple triggers) */ |
|
83 rwlock_t leddev_list_lock; |
|
84 struct list_head led_cdevs; |
|
85 |
|
86 /* Link to next registered trigger */ |
|
87 struct list_head next_trig; |
|
88 }; |
|
89 |
|
90 /* Registration functions for complex triggers */ |
|
91 extern int led_trigger_register(struct led_trigger *trigger); |
|
92 extern void led_trigger_unregister(struct led_trigger *trigger); |
|
93 |
|
94 /* Registration functions for simple triggers */ |
|
95 #define DEFINE_LED_TRIGGER(x) static struct led_trigger *x; |
|
96 #define DEFINE_LED_TRIGGER_GLOBAL(x) struct led_trigger *x; |
|
97 extern void led_trigger_register_simple(const char *name, |
|
98 struct led_trigger **trigger); |
|
99 extern void led_trigger_unregister_simple(struct led_trigger *trigger); |
|
100 extern void led_trigger_event(struct led_trigger *trigger, |
|
101 enum led_brightness event); |
|
102 |
|
103 #else |
|
104 |
|
105 /* Triggers aren't active - null macros */ |
|
106 #define DEFINE_LED_TRIGGER(x) |
|
107 #define DEFINE_LED_TRIGGER_GLOBAL(x) |
|
108 #define led_trigger_register_simple(x, y) do {} while(0) |
|
109 #define led_trigger_unregister_simple(x) do {} while(0) |
|
110 #define led_trigger_event(x, y) do {} while(0) |
|
111 |
|
112 #endif |
|
113 |
|
114 /* Trigger specific functions */ |
|
115 #ifdef CONFIG_LEDS_TRIGGER_IDE_DISK |
|
116 extern void ledtrig_ide_activity(void); |
|
117 #else |
|
118 #define ledtrig_ide_activity() do {} while(0) |
|
119 #endif |
|
120 |
|
121 /* |
|
122 * Generic LED platform data for describing LED names and default triggers. |
|
123 */ |
|
124 struct led_info { |
|
125 const char *name; |
|
126 const char *default_trigger; |
|
127 int flags; |
|
128 }; |
|
129 |
|
130 struct led_platform_data { |
|
131 int num_leds; |
|
132 struct led_info *leds; |
|
133 }; |
|
134 |
|
135 /* For the leds-gpio driver */ |
|
136 struct gpio_led { |
|
137 const char *name; |
|
138 const char *default_trigger; |
|
139 unsigned gpio; |
|
140 u8 active_low; |
|
141 }; |
|
142 |
|
143 struct gpio_led_platform_data { |
|
144 int num_leds; |
|
145 struct gpio_led *leds; |
|
146 int (*gpio_blink_set)(unsigned gpio, |
|
147 unsigned long *delay_on, |
|
148 unsigned long *delay_off); |
|
149 }; |
|
150 |
|
151 |
|
152 #endif /* __LINUX_LEDS_H_INCLUDED */ |