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/device.h>
16#include <linux/list.h>
17#include <linux/mutex.h>
18#include <linux/rwsem.h>
19#include <linux/spinlock.h>
20#include <linux/timer.h>
21#include <linux/workqueue.h>
22
23struct device;
24
25
26
27
28enum led_brightness {
29 LED_OFF = 0,
30 LED_HALF = 127,
31 LED_FULL = 255,
32};
33
34struct led_classdev {
35 const char *name;
36 enum led_brightness brightness;
37 enum led_brightness max_brightness;
38 int flags;
39
40
41#define LED_SUSPENDED (1 << 0)
42#define LED_UNREGISTERING (1 << 1)
43
44#define LED_CORE_SUSPENDRESUME (1 << 16)
45#define LED_SYSFS_DISABLE (1 << 17)
46#define LED_DEV_CAP_FLASH (1 << 18)
47#define LED_HW_PLUGGABLE (1 << 19)
48#define LED_PANIC_INDICATOR (1 << 20)
49
50
51 unsigned long work_flags;
52
53#define LED_BLINK_SW 0
54#define LED_BLINK_ONESHOT 1
55#define LED_BLINK_ONESHOT_STOP 2
56#define LED_BLINK_INVERT 3
57#define LED_BLINK_BRIGHTNESS_CHANGE 4
58#define LED_BLINK_DISABLE 5
59
60
61
62
63
64 void (*brightness_set)(struct led_classdev *led_cdev,
65 enum led_brightness brightness);
66
67
68
69
70 int (*brightness_set_blocking)(struct led_classdev *led_cdev,
71 enum led_brightness brightness);
72
73 enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
74
75
76
77
78
79
80
81
82
83 int (*blink_set)(struct led_classdev *led_cdev,
84 unsigned long *delay_on,
85 unsigned long *delay_off);
86
87 struct device *dev;
88 const struct attribute_group **groups;
89
90 struct list_head node;
91 const char *default_trigger;
92
93 unsigned long blink_delay_on, blink_delay_off;
94 struct timer_list blink_timer;
95 int blink_brightness;
96 int new_blink_brightness;
97 void (*flash_resume)(struct led_classdev *led_cdev);
98
99 struct work_struct set_brightness_work;
100 int delayed_set_value;
101
102#ifdef CONFIG_LEDS_TRIGGERS
103
104 struct rw_semaphore trigger_lock;
105
106 struct led_trigger *trigger;
107 struct list_head trig_list;
108 void *trigger_data;
109
110 bool activated;
111#endif
112
113
114 struct mutex led_access;
115};
116
117extern int led_classdev_register(struct device *parent,
118 struct led_classdev *led_cdev);
119extern int devm_led_classdev_register(struct device *parent,
120 struct led_classdev *led_cdev);
121extern void led_classdev_unregister(struct led_classdev *led_cdev);
122extern void devm_led_classdev_unregister(struct device *parent,
123 struct led_classdev *led_cdev);
124extern void led_classdev_suspend(struct led_classdev *led_cdev);
125extern void led_classdev_resume(struct led_classdev *led_cdev);
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142extern void led_blink_set(struct led_classdev *led_cdev,
143 unsigned long *delay_on,
144 unsigned long *delay_off);
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159extern void led_blink_set_oneshot(struct led_classdev *led_cdev,
160 unsigned long *delay_on,
161 unsigned long *delay_off,
162 int invert);
163
164
165
166
167
168
169
170
171
172extern void led_set_brightness(struct led_classdev *led_cdev,
173 enum led_brightness brightness);
174
175
176
177
178
179
180
181
182
183
184
185
186extern int led_set_brightness_sync(struct led_classdev *led_cdev,
187 enum led_brightness value);
188
189
190
191
192
193
194
195
196
197
198extern int led_update_brightness(struct led_classdev *led_cdev);
199
200
201
202
203
204
205
206extern void led_sysfs_disable(struct led_classdev *led_cdev);
207
208
209
210
211
212
213
214extern void led_sysfs_enable(struct led_classdev *led_cdev);
215
216
217
218
219
220
221
222static inline bool led_sysfs_is_disabled(struct led_classdev *led_cdev)
223{
224 return led_cdev->flags & LED_SYSFS_DISABLE;
225}
226
227
228
229
230
231#define DEFINE_LED_TRIGGER(x) static struct led_trigger *x;
232#define DEFINE_LED_TRIGGER_GLOBAL(x) struct led_trigger *x;
233
234#ifdef CONFIG_LEDS_TRIGGERS
235
236#define TRIG_NAME_MAX 50
237
238struct led_trigger {
239
240 const char *name;
241 void (*activate)(struct led_classdev *led_cdev);
242 void (*deactivate)(struct led_classdev *led_cdev);
243
244
245 rwlock_t leddev_list_lock;
246 struct list_head led_cdevs;
247
248
249 struct list_head next_trig;
250};
251
252ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
253 const char *buf, size_t count);
254ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr,
255 char *buf);
256
257
258extern int led_trigger_register(struct led_trigger *trigger);
259extern void led_trigger_unregister(struct led_trigger *trigger);
260extern int devm_led_trigger_register(struct device *dev,
261 struct led_trigger *trigger);
262
263extern void led_trigger_register_simple(const char *name,
264 struct led_trigger **trigger);
265extern void led_trigger_unregister_simple(struct led_trigger *trigger);
266extern void led_trigger_event(struct led_trigger *trigger,
267 enum led_brightness event);
268extern void led_trigger_blink(struct led_trigger *trigger,
269 unsigned long *delay_on,
270 unsigned long *delay_off);
271extern void led_trigger_blink_oneshot(struct led_trigger *trigger,
272 unsigned long *delay_on,
273 unsigned long *delay_off,
274 int invert);
275extern void led_trigger_set_default(struct led_classdev *led_cdev);
276extern void led_trigger_set(struct led_classdev *led_cdev,
277 struct led_trigger *trigger);
278extern void led_trigger_remove(struct led_classdev *led_cdev);
279
280static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
281{
282 return led_cdev->trigger_data;
283}
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300extern void led_trigger_rename_static(const char *name,
301 struct led_trigger *trig);
302
303#else
304
305
306struct led_trigger {};
307
308
309static inline void led_trigger_register_simple(const char *name,
310 struct led_trigger **trigger) {}
311static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {}
312static inline void led_trigger_event(struct led_trigger *trigger,
313 enum led_brightness event) {}
314static inline void led_trigger_blink(struct led_trigger *trigger,
315 unsigned long *delay_on,
316 unsigned long *delay_off) {}
317static inline void led_trigger_blink_oneshot(struct led_trigger *trigger,
318 unsigned long *delay_on,
319 unsigned long *delay_off,
320 int invert) {}
321static inline void led_trigger_set_default(struct led_classdev *led_cdev) {}
322static inline void led_trigger_set(struct led_classdev *led_cdev,
323 struct led_trigger *trigger) {}
324static inline void led_trigger_remove(struct led_classdev *led_cdev) {}
325static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
326{
327 return NULL;
328}
329
330#endif
331
332
333#ifdef CONFIG_LEDS_TRIGGER_DISK
334extern void ledtrig_disk_activity(void);
335#else
336static inline void ledtrig_disk_activity(void) {}
337#endif
338
339#ifdef CONFIG_LEDS_TRIGGER_MTD
340extern void ledtrig_mtd_activity(void);
341#else
342static inline void ledtrig_mtd_activity(void) {}
343#endif
344
345#if defined(CONFIG_LEDS_TRIGGER_CAMERA) || defined(CONFIG_LEDS_TRIGGER_CAMERA_MODULE)
346extern void ledtrig_flash_ctrl(bool on);
347extern void ledtrig_torch_ctrl(bool on);
348#else
349static inline void ledtrig_flash_ctrl(bool on) {}
350static inline void ledtrig_torch_ctrl(bool on) {}
351#endif
352
353
354
355
356struct led_info {
357 const char *name;
358 const char *default_trigger;
359 int flags;
360};
361
362struct led_platform_data {
363 int num_leds;
364 struct led_info *leds;
365};
366
367struct gpio_desc;
368typedef int (*gpio_blink_set_t)(struct gpio_desc *desc, int state,
369 unsigned long *delay_on,
370 unsigned long *delay_off);
371
372
373struct gpio_led {
374 const char *name;
375 const char *default_trigger;
376 unsigned gpio;
377 unsigned active_low : 1;
378 unsigned retain_state_suspended : 1;
379 unsigned panic_indicator : 1;
380 unsigned default_state : 2;
381
382 struct gpio_desc *gpiod;
383};
384#define LEDS_GPIO_DEFSTATE_OFF 0
385#define LEDS_GPIO_DEFSTATE_ON 1
386#define LEDS_GPIO_DEFSTATE_KEEP 2
387
388struct gpio_led_platform_data {
389 int num_leds;
390 const struct gpio_led *leds;
391
392#define GPIO_LED_NO_BLINK_LOW 0
393#define GPIO_LED_NO_BLINK_HIGH 1
394#define GPIO_LED_BLINK 2
395 gpio_blink_set_t gpio_blink_set;
396};
397
398#ifdef CONFIG_NEW_LEDS
399struct platform_device *gpio_led_register_device(
400 int id, const struct gpio_led_platform_data *pdata);
401#else
402static inline struct platform_device *gpio_led_register_device(
403 int id, const struct gpio_led_platform_data *pdata)
404{
405 return 0;
406}
407#endif
408
409enum cpu_led_event {
410 CPU_LED_IDLE_START,
411 CPU_LED_IDLE_END,
412 CPU_LED_START,
413 CPU_LED_STOP,
414 CPU_LED_HALTED,
415};
416#ifdef CONFIG_LEDS_TRIGGER_CPU
417extern void ledtrig_cpu(enum cpu_led_event evt);
418#else
419static inline void ledtrig_cpu(enum cpu_led_event evt)
420{
421 return;
422}
423#endif
424
425#endif
426