1
2
3
4
5
6
7
8
9
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#include <linux/timer.h>
19
20struct device;
21
22
23
24
25enum led_brightness {
26 LED_OFF = 0,
27 LED_HALF = 127,
28 LED_FULL = 255,
29};
30
31struct led_classdev {
32 const char *name;
33 int brightness;
34 int max_brightness;
35 int flags;
36
37
38#define LED_SUSPENDED (1 << 0)
39
40#define LED_CORE_SUSPENDRESUME (1 << 16)
41#define LED_BLINK_ONESHOT (1 << 17)
42#define LED_BLINK_ONESHOT_STOP (1 << 18)
43#define LED_BLINK_INVERT (1 << 19)
44
45
46
47 void (*brightness_set)(struct led_classdev *led_cdev,
48 enum led_brightness brightness);
49
50 enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
51
52
53
54
55
56
57
58
59
60 int (*blink_set)(struct led_classdev *led_cdev,
61 unsigned long *delay_on,
62 unsigned long *delay_off);
63
64 struct device *dev;
65 struct list_head node;
66 const char *default_trigger;
67
68 unsigned long blink_delay_on, blink_delay_off;
69 struct timer_list blink_timer;
70 int blink_brightness;
71
72#ifdef CONFIG_LEDS_TRIGGERS
73
74 struct rw_semaphore trigger_lock;
75
76 struct led_trigger *trigger;
77 struct list_head trig_list;
78 void *trigger_data;
79
80 bool activated;
81#endif
82};
83
84extern int led_classdev_register(struct device *parent,
85 struct led_classdev *led_cdev);
86extern void led_classdev_unregister(struct led_classdev *led_cdev);
87extern void led_classdev_suspend(struct led_classdev *led_cdev);
88extern void led_classdev_resume(struct led_classdev *led_cdev);
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105extern void led_blink_set(struct led_classdev *led_cdev,
106 unsigned long *delay_on,
107 unsigned long *delay_off);
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122extern void led_blink_set_oneshot(struct led_classdev *led_cdev,
123 unsigned long *delay_on,
124 unsigned long *delay_off,
125 int invert);
126
127
128
129
130
131
132
133
134
135extern void led_set_brightness(struct led_classdev *led_cdev,
136 enum led_brightness brightness);
137
138
139
140
141#ifdef CONFIG_LEDS_TRIGGERS
142
143#define TRIG_NAME_MAX 50
144
145struct led_trigger {
146
147 const char *name;
148 void (*activate)(struct led_classdev *led_cdev);
149 void (*deactivate)(struct led_classdev *led_cdev);
150
151
152 rwlock_t leddev_list_lock;
153 struct list_head led_cdevs;
154
155
156 struct list_head next_trig;
157};
158
159
160extern int led_trigger_register(struct led_trigger *trigger);
161extern void led_trigger_unregister(struct led_trigger *trigger);
162
163
164#define DEFINE_LED_TRIGGER(x) static struct led_trigger *x;
165#define DEFINE_LED_TRIGGER_GLOBAL(x) struct led_trigger *x;
166extern void led_trigger_register_simple(const char *name,
167 struct led_trigger **trigger);
168extern void led_trigger_unregister_simple(struct led_trigger *trigger);
169extern void led_trigger_event(struct led_trigger *trigger,
170 enum led_brightness event);
171extern void led_trigger_blink(struct led_trigger *trigger,
172 unsigned long *delay_on,
173 unsigned long *delay_off);
174extern void led_trigger_blink_oneshot(struct led_trigger *trigger,
175 unsigned long *delay_on,
176 unsigned long *delay_off,
177 int invert);
178
179#else
180
181
182#define DEFINE_LED_TRIGGER(x)
183#define DEFINE_LED_TRIGGER_GLOBAL(x)
184#define led_trigger_register_simple(x, y) do {} while(0)
185#define led_trigger_unregister_simple(x) do {} while(0)
186#define led_trigger_event(x, y) do {} while(0)
187
188#endif
189
190
191#ifdef CONFIG_LEDS_TRIGGER_IDE_DISK
192extern void ledtrig_ide_activity(void);
193#else
194#define ledtrig_ide_activity() do {} while(0)
195#endif
196
197
198
199
200struct led_info {
201 const char *name;
202 const char *default_trigger;
203 int flags;
204};
205
206struct led_platform_data {
207 int num_leds;
208 struct led_info *leds;
209};
210
211
212struct gpio_led {
213 const char *name;
214 const char *default_trigger;
215 unsigned gpio;
216 unsigned active_low : 1;
217 unsigned retain_state_suspended : 1;
218 unsigned default_state : 2;
219
220};
221#define LEDS_GPIO_DEFSTATE_OFF 0
222#define LEDS_GPIO_DEFSTATE_ON 1
223#define LEDS_GPIO_DEFSTATE_KEEP 2
224
225struct gpio_led_platform_data {
226 int num_leds;
227 const struct gpio_led *leds;
228
229#define GPIO_LED_NO_BLINK_LOW 0
230#define GPIO_LED_NO_BLINK_HIGH 1
231#define GPIO_LED_BLINK 2
232 int (*gpio_blink_set)(unsigned gpio, int state,
233 unsigned long *delay_on,
234 unsigned long *delay_off);
235};
236
237struct platform_device *gpio_led_register_device(
238 int id, const struct gpio_led_platform_data *pdata);
239
240#endif
241