hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/include/linux/leds.h
....@@ -1,17 +1,14 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * Driver model for leds and led triggers
34 *
45 * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu>
56 * 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
- *
117 */
128 #ifndef __LINUX_LEDS_H_INCLUDED
139 #define __LINUX_LEDS_H_INCLUDED
1410
11
+#include <dt-bindings/leds/common.h>
1512 #include <linux/device.h>
1613 #include <linux/kernfs.h>
1714 #include <linux/list.h>
....@@ -22,15 +19,46 @@
2219 #include <linux/workqueue.h>
2320
2421 struct device;
22
+struct led_pattern;
23
+struct device_node;
2524 /*
2625 * LED Core
2726 */
2827
28
+/* This is obsolete/useless. We now support variable maximum brightness. */
2929 enum led_brightness {
3030 LED_OFF = 0,
3131 LED_ON = 1,
3232 LED_HALF = 127,
3333 LED_FULL = 255,
34
+};
35
+
36
+struct led_init_data {
37
+ /* device fwnode handle */
38
+ struct fwnode_handle *fwnode;
39
+ /*
40
+ * default <color:function> tuple, for backward compatibility
41
+ * with in-driver hard-coded LED names used as a fallback when
42
+ * DT "label" property is absent; it should be set to NULL
43
+ * in new LED class drivers.
44
+ */
45
+ const char *default_label;
46
+ /*
47
+ * string to be used for devicename section of LED class device
48
+ * either for label based LED name composition path or for fwnode
49
+ * based when devname_mandatory is true
50
+ */
51
+ const char *devicename;
52
+ /*
53
+ * indicates if LED name should always comprise devicename section;
54
+ * only LEDs exposed by drivers of hot-pluggable devices should
55
+ * set it to true
56
+ */
57
+ bool devname_mandatory;
58
+};
59
+
60
+struct led_hw_trigger_type {
61
+ int dummy;
3462 };
3563
3664 struct led_classdev {
....@@ -50,6 +78,7 @@
5078 #define LED_PANIC_INDICATOR BIT(20)
5179 #define LED_BRIGHT_HW_CHANGED BIT(21)
5280 #define LED_RETAIN_AT_SHUTDOWN BIT(22)
81
+#define LED_INIT_DEFAULT_TRIGGER BIT(23)
5382
5483 /* set_brightness_work / blink_timer flags, atomic, private. */
5584 unsigned long work_flags;
....@@ -88,6 +117,10 @@
88117 unsigned long *delay_on,
89118 unsigned long *delay_off);
90119
120
+ int (*pattern_set)(struct led_classdev *led_cdev,
121
+ struct led_pattern *pattern, u32 len, int repeat);
122
+ int (*pattern_clear)(struct led_classdev *led_cdev);
123
+
91124 struct device *dev;
92125 const struct attribute_group **groups;
93126
....@@ -112,6 +145,9 @@
112145 void *trigger_data;
113146 /* true if activated - deactivate routine uses it to do cleanup */
114147 bool activated;
148
+
149
+ /* LEDs that have private triggers have this set */
150
+ struct led_hw_trigger_type *trigger_type;
115151 #endif
116152
117153 #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
....@@ -123,21 +159,56 @@
123159 struct mutex led_access;
124160 };
125161
126
-extern int of_led_classdev_register(struct device *parent,
127
- struct device_node *np,
128
- struct led_classdev *led_cdev);
129
-#define led_classdev_register(parent, led_cdev) \
130
- of_led_classdev_register(parent, NULL, led_cdev)
131
-extern int devm_of_led_classdev_register(struct device *parent,
132
- struct device_node *np,
133
- struct led_classdev *led_cdev);
134
-#define devm_led_classdev_register(parent, led_cdev) \
135
- devm_of_led_classdev_register(parent, NULL, led_cdev)
136
-extern void led_classdev_unregister(struct led_classdev *led_cdev);
137
-extern void devm_led_classdev_unregister(struct device *parent,
138
- struct led_classdev *led_cdev);
139
-extern void led_classdev_suspend(struct led_classdev *led_cdev);
140
-extern void led_classdev_resume(struct led_classdev *led_cdev);
162
+/**
163
+ * led_classdev_register_ext - register a new object of LED class with
164
+ * init data
165
+ * @parent: LED controller device this LED is driven by
166
+ * @led_cdev: the led_classdev structure for this device
167
+ * @init_data: the LED class device initialization data
168
+ *
169
+ * Register a new object of LED class, with name derived from init_data.
170
+ *
171
+ * Returns: 0 on success or negative error value on failure
172
+ */
173
+int led_classdev_register_ext(struct device *parent,
174
+ struct led_classdev *led_cdev,
175
+ struct led_init_data *init_data);
176
+
177
+/**
178
+ * led_classdev_register - register a new object of LED class
179
+ * @parent: LED controller device this LED is driven by
180
+ * @led_cdev: the led_classdev structure for this device
181
+ *
182
+ * Register a new object of LED class, with name derived from the name property
183
+ * of passed led_cdev argument.
184
+ *
185
+ * Returns: 0 on success or negative error value on failure
186
+ */
187
+static inline int led_classdev_register(struct device *parent,
188
+ struct led_classdev *led_cdev)
189
+{
190
+ return led_classdev_register_ext(parent, led_cdev, NULL);
191
+}
192
+
193
+int devm_led_classdev_register_ext(struct device *parent,
194
+ struct led_classdev *led_cdev,
195
+ struct led_init_data *init_data);
196
+
197
+static inline int devm_led_classdev_register(struct device *parent,
198
+ struct led_classdev *led_cdev)
199
+{
200
+ return devm_led_classdev_register_ext(parent, led_cdev, NULL);
201
+}
202
+void led_classdev_unregister(struct led_classdev *led_cdev);
203
+void devm_led_classdev_unregister(struct device *parent,
204
+ struct led_classdev *led_cdev);
205
+void led_classdev_suspend(struct led_classdev *led_cdev);
206
+void led_classdev_resume(struct led_classdev *led_cdev);
207
+
208
+extern struct led_classdev *of_led_get(struct device_node *np, int index);
209
+extern void led_put(struct led_classdev *led_cdev);
210
+struct led_classdev *__must_check devm_of_led_get(struct device *dev,
211
+ int index);
141212
142213 /**
143214 * led_blink_set - set blinking with software fallback
....@@ -154,9 +225,8 @@
154225 * led_cdev->brightness_set() will not stop the blinking,
155226 * use led_classdev_brightness_set() instead.
156227 */
157
-extern void led_blink_set(struct led_classdev *led_cdev,
158
- unsigned long *delay_on,
159
- unsigned long *delay_off);
228
+void led_blink_set(struct led_classdev *led_cdev, unsigned long *delay_on,
229
+ unsigned long *delay_off);
160230 /**
161231 * led_blink_set_oneshot - do a oneshot software blink
162232 * @led_cdev: the LED to start blinking
....@@ -171,10 +241,9 @@
171241 * If invert is set, led blinks for delay_off first, then for
172242 * delay_on and leave the led on after the on-off cycle.
173243 */
174
-extern void led_blink_set_oneshot(struct led_classdev *led_cdev,
175
- unsigned long *delay_on,
176
- unsigned long *delay_off,
177
- int invert);
244
+void led_blink_set_oneshot(struct led_classdev *led_cdev,
245
+ unsigned long *delay_on, unsigned long *delay_off,
246
+ int invert);
178247 /**
179248 * led_set_brightness - set LED brightness
180249 * @led_cdev: the LED to set
....@@ -184,13 +253,13 @@
184253 * software blink timer that implements blinking when the
185254 * hardware doesn't. This function is guaranteed not to sleep.
186255 */
187
-extern void led_set_brightness(struct led_classdev *led_cdev,
188
- enum led_brightness brightness);
256
+void led_set_brightness(struct led_classdev *led_cdev,
257
+ enum led_brightness brightness);
189258
190259 /**
191260 * led_set_brightness_sync - set LED brightness synchronously
192261 * @led_cdev: the LED to set
193
- * @brightness: the brightness to set it to
262
+ * @value: the brightness to set it to
194263 *
195264 * Set an LED's brightness immediately. This function will block
196265 * the caller for the time required for accessing device registers,
....@@ -198,8 +267,8 @@
198267 *
199268 * Returns: 0 on success or negative error value on failure
200269 */
201
-extern int led_set_brightness_sync(struct led_classdev *led_cdev,
202
- enum led_brightness value);
270
+int led_set_brightness_sync(struct led_classdev *led_cdev,
271
+ enum led_brightness value);
203272
204273 /**
205274 * led_update_brightness - update LED brightness
....@@ -210,7 +279,19 @@
210279 *
211280 * Returns: 0 on success or negative error value on failure
212281 */
213
-extern int led_update_brightness(struct led_classdev *led_cdev);
282
+int led_update_brightness(struct led_classdev *led_cdev);
283
+
284
+/**
285
+ * led_get_default_pattern - return default pattern
286
+ *
287
+ * @led_cdev: the LED to get default pattern for
288
+ * @size: pointer for storing the number of elements in returned array,
289
+ * modified only if return != NULL
290
+ *
291
+ * Return: Allocated array of integers with default pattern from device tree
292
+ * or NULL. Caller is responsible for kfree().
293
+ */
294
+u32 *led_get_default_pattern(struct led_classdev *led_cdev, unsigned int *size);
214295
215296 /**
216297 * led_sysfs_disable - disable LED sysfs interface
....@@ -218,7 +299,7 @@
218299 *
219300 * Disable the led_cdev's sysfs interface.
220301 */
221
-extern void led_sysfs_disable(struct led_classdev *led_cdev);
302
+void led_sysfs_disable(struct led_classdev *led_cdev);
222303
223304 /**
224305 * led_sysfs_enable - enable LED sysfs interface
....@@ -226,7 +307,22 @@
226307 *
227308 * Enable the led_cdev's sysfs interface.
228309 */
229
-extern void led_sysfs_enable(struct led_classdev *led_cdev);
310
+void led_sysfs_enable(struct led_classdev *led_cdev);
311
+
312
+/**
313
+ * led_compose_name - compose LED class device name
314
+ * @dev: LED controller device object
315
+ * @init_data: the LED class device initialization data
316
+ * @led_classdev_name: composed LED class device name
317
+ *
318
+ * Create LED class device name basing on the provided init_data argument.
319
+ * The name can have <devicename:color:function> or <color:function>.
320
+ * form, depending on the init_data configuration.
321
+ *
322
+ * Returns: 0 on success or negative error value on failure
323
+ */
324
+int led_compose_name(struct device *dev, struct led_init_data *init_data,
325
+ char *led_classdev_name);
230326
231327 /**
232328 * led_sysfs_is_disabled - check if LED sysfs interface is disabled
....@@ -256,6 +352,9 @@
256352 int (*activate)(struct led_classdev *led_cdev);
257353 void (*deactivate)(struct led_classdev *led_cdev);
258354
355
+ /* LED-private triggers have this set */
356
+ struct led_hw_trigger_type *trigger_type;
357
+
259358 /* LEDs under control by this trigger (for simple triggers) */
260359 rwlock_t leddev_list_lock;
261360 struct list_head led_cdevs;
....@@ -275,33 +374,25 @@
275374 #define led_trigger_get_led(dev) ((struct led_classdev *)dev_get_drvdata((dev)))
276375 #define led_trigger_get_drvdata(dev) (led_get_trigger_data(led_trigger_get_led(dev)))
277376
278
-ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
279
- const char *buf, size_t count);
280
-ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr,
281
- char *buf);
282
-
283377 /* Registration functions for complex triggers */
284
-extern int led_trigger_register(struct led_trigger *trigger);
285
-extern void led_trigger_unregister(struct led_trigger *trigger);
286
-extern int devm_led_trigger_register(struct device *dev,
378
+int led_trigger_register(struct led_trigger *trigger);
379
+void led_trigger_unregister(struct led_trigger *trigger);
380
+int devm_led_trigger_register(struct device *dev,
287381 struct led_trigger *trigger);
288382
289
-extern void led_trigger_register_simple(const char *name,
383
+void led_trigger_register_simple(const char *name,
290384 struct led_trigger **trigger);
291
-extern void led_trigger_unregister_simple(struct led_trigger *trigger);
292
-extern void led_trigger_event(struct led_trigger *trigger,
293
- enum led_brightness event);
294
-extern void led_trigger_blink(struct led_trigger *trigger,
295
- unsigned long *delay_on,
296
- unsigned long *delay_off);
297
-extern void led_trigger_blink_oneshot(struct led_trigger *trigger,
298
- unsigned long *delay_on,
299
- unsigned long *delay_off,
300
- int invert);
301
-extern void led_trigger_set_default(struct led_classdev *led_cdev);
302
-extern int led_trigger_set(struct led_classdev *led_cdev,
303
- struct led_trigger *trigger);
304
-extern void led_trigger_remove(struct led_classdev *led_cdev);
385
+void led_trigger_unregister_simple(struct led_trigger *trigger);
386
+void led_trigger_event(struct led_trigger *trigger, enum led_brightness event);
387
+void led_trigger_blink(struct led_trigger *trigger, unsigned long *delay_on,
388
+ unsigned long *delay_off);
389
+void led_trigger_blink_oneshot(struct led_trigger *trigger,
390
+ unsigned long *delay_on,
391
+ unsigned long *delay_off,
392
+ int invert);
393
+void led_trigger_set_default(struct led_classdev *led_cdev);
394
+int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger);
395
+void led_trigger_remove(struct led_classdev *led_cdev);
305396
306397 static inline void led_set_trigger_data(struct led_classdev *led_cdev,
307398 void *trigger_data)
....@@ -329,8 +420,7 @@
329420 * This is meant to be used on triggers with statically
330421 * allocated name.
331422 */
332
-extern void led_trigger_rename_static(const char *name,
333
- struct led_trigger *trig);
423
+void led_trigger_rename_static(const char *name, struct led_trigger *trig);
334424
335425 #define module_led_trigger(__led_trigger) \
336426 module_driver(__led_trigger, led_trigger_register, \
....@@ -372,20 +462,20 @@
372462
373463 /* Trigger specific functions */
374464 #ifdef CONFIG_LEDS_TRIGGER_DISK
375
-extern void ledtrig_disk_activity(bool write);
465
+void ledtrig_disk_activity(bool write);
376466 #else
377467 static inline void ledtrig_disk_activity(bool write) {}
378468 #endif
379469
380470 #ifdef CONFIG_LEDS_TRIGGER_MTD
381
-extern void ledtrig_mtd_activity(void);
471
+void ledtrig_mtd_activity(void);
382472 #else
383473 static inline void ledtrig_mtd_activity(void) {}
384474 #endif
385475
386476 #if defined(CONFIG_LEDS_TRIGGER_CAMERA) || defined(CONFIG_LEDS_TRIGGER_CAMERA_MODULE)
387
-extern void ledtrig_flash_ctrl(bool on);
388
-extern void ledtrig_torch_ctrl(bool on);
477
+void ledtrig_flash_ctrl(bool on);
478
+void ledtrig_torch_ctrl(bool on);
389479 #else
390480 static inline void ledtrig_flash_ctrl(bool on) {}
391481 static inline void ledtrig_torch_ctrl(bool on) {}
....@@ -403,6 +493,15 @@
403493 struct led_platform_data {
404494 int num_leds;
405495 struct led_info *leds;
496
+};
497
+
498
+struct led_properties {
499
+ u32 color;
500
+ bool color_present;
501
+ const char *function;
502
+ u32 func_enum;
503
+ bool func_enum_present;
504
+ const char *label;
406505 };
407506
408507 struct gpio_desc;
....@@ -456,7 +555,7 @@
456555 CPU_LED_HALTED, /* Machine shutdown */
457556 };
458557 #ifdef CONFIG_LEDS_TRIGGER_CPU
459
-extern void ledtrig_cpu(enum cpu_led_event evt);
558
+void ledtrig_cpu(enum cpu_led_event evt);
460559 #else
461560 static inline void ledtrig_cpu(enum cpu_led_event evt)
462561 {
....@@ -465,11 +564,41 @@
465564 #endif
466565
467566 #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
468
-extern void led_classdev_notify_brightness_hw_changed(
567
+void led_classdev_notify_brightness_hw_changed(
469568 struct led_classdev *led_cdev, enum led_brightness brightness);
470569 #else
471570 static inline void led_classdev_notify_brightness_hw_changed(
472571 struct led_classdev *led_cdev, enum led_brightness brightness) { }
473572 #endif
474573
574
+/**
575
+ * struct led_pattern - pattern interval settings
576
+ * @delta_t: pattern interval delay, in milliseconds
577
+ * @brightness: pattern interval brightness
578
+ */
579
+struct led_pattern {
580
+ u32 delta_t;
581
+ int brightness;
582
+};
583
+
584
+enum led_audio {
585
+ LED_AUDIO_MUTE, /* master mute LED */
586
+ LED_AUDIO_MICMUTE, /* mic mute LED */
587
+ NUM_AUDIO_LEDS
588
+};
589
+
590
+#if IS_ENABLED(CONFIG_LEDS_TRIGGER_AUDIO)
591
+enum led_brightness ledtrig_audio_get(enum led_audio type);
592
+void ledtrig_audio_set(enum led_audio type, enum led_brightness state);
593
+#else
594
+static inline enum led_brightness ledtrig_audio_get(enum led_audio type)
595
+{
596
+ return LED_OFF;
597
+}
598
+static inline void ledtrig_audio_set(enum led_audio type,
599
+ enum led_brightness state)
600
+{
601
+}
602
+#endif
603
+
475604 #endif /* __LINUX_LEDS_H_INCLUDED */