Blame view

include/linux/leds.h 18.2 KB
d2912cb15   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-only */
c72a1d608   Richard Purdie   [PATCH] LED: add ...
2
3
4
5
6
  /*
   * Driver model for leds and led triggers
   *
   * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu>
   * Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com>
c72a1d608   Richard Purdie   [PATCH] LED: add ...
7
8
9
   */
  #ifndef __LINUX_LEDS_H_INCLUDED
  #define __LINUX_LEDS_H_INCLUDED
bb4e9af03   Jacek Anaszewski   leds: core: Add s...
10
  #include <dt-bindings/leds/common.h>
20f56758b   Jacek Anaszewski   leds: unify the l...
11
  #include <linux/device.h>
0cb8eb30d   Hans de Goede   leds: class: Add ...
12
  #include <linux/kernfs.h>
af410fc13   Johannes Berg   [PATCH] make leds...
13
  #include <linux/list.h>
acd899e4f   Jacek Anaszewski   leds: implement s...
14
  #include <linux/mutex.h>
dc47206e5   Richard Purdie   leds: Fix led tri...
15
  #include <linux/rwsem.h>
047133066   Jacek Anaszewski   leds: Reorder inc...
16
  #include <linux/spinlock.h>
9067359fa   Jiri Kosina   Revert "leds: con...
17
  #include <linux/timer.h>
d23a22a74   Fabio Baltieri   leds: delay led_s...
18
  #include <linux/workqueue.h>
af410fc13   Johannes Berg   [PATCH] make leds...
19

c72a1d608   Richard Purdie   [PATCH] LED: add ...
20
  struct device;
5fd752b6b   Baolin Wang   leds: core: Intro...
21
  struct led_pattern;
699a8c7c4   Tomi Valkeinen   leds: Add of_led_...
22
  struct device_node;
c72a1d608   Richard Purdie   [PATCH] LED: add ...
23
24
25
  /*
   * LED Core
   */
c7e4ea68c   Pavel Machek   leds: old enums a...
26
  /* This is obsolete/useless. We now support variable maximum brightness. */
c72a1d608   Richard Purdie   [PATCH] LED: add ...
27
  enum led_brightness {
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
28
  	LED_OFF		= 0,
4e552c8cb   Andi Shyti   leds: add LED_ON ...
29
  	LED_ON		= 1,
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
30
31
  	LED_HALF	= 127,
  	LED_FULL	= 255,
c72a1d608   Richard Purdie   [PATCH] LED: add ...
32
  };
b2b998c0f   Jacek Anaszewski   leds: class: Impr...
33
34
35
  struct led_init_data {
  	/* device fwnode handle */
  	struct fwnode_handle *fwnode;
bb4e9af03   Jacek Anaszewski   leds: core: Add s...
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  	/*
  	 * default <color:function> tuple, for backward compatibility
  	 * with in-driver hard-coded LED names used as a fallback when
  	 * DT "label" property is absent; it should be set to NULL
  	 * in new LED class drivers.
  	 */
  	const char *default_label;
  	/*
  	 * string to be used for devicename section of LED class device
  	 * either for label based LED name composition path or for fwnode
  	 * based when devname_mandatory is true
  	 */
  	const char *devicename;
  	/*
  	 * indicates if LED name should always comprise devicename section;
  	 * only LEDs exposed by drivers of hot-pluggable devices should
  	 * set it to true
  	 */
  	bool devname_mandatory;
b2b998c0f   Jacek Anaszewski   leds: class: Impr...
55
  };
93690cdf3   Marek Behún   leds: trigger: ad...
56
57
58
  struct led_hw_trigger_type {
  	int dummy;
  };
c72a1d608   Richard Purdie   [PATCH] LED: add ...
59
  struct led_classdev {
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
60
  	const char		*name;
d8082827d   Jacek Anaszewski   leds: make bright...
61
62
  	enum led_brightness	 brightness;
  	enum led_brightness	 max_brightness;
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
63
  	int			 flags;
c72a1d608   Richard Purdie   [PATCH] LED: add ...
64

859cb7f2a   Richard Purdie   leds: Add suspend...
65
  	/* Lower 16 bits reflect status */
55edd1dad   David Lin   leds: Replace fla...
66
67
  #define LED_SUSPENDED		BIT(0)
  #define LED_UNREGISTERING	BIT(1)
859cb7f2a   Richard Purdie   leds: Add suspend...
68
  	/* Upper 16 bits reflect control information */
55edd1dad   David Lin   leds: Replace fla...
69
70
71
72
73
74
75
  #define LED_CORE_SUSPENDRESUME	BIT(16)
  #define LED_SYSFS_DISABLE	BIT(17)
  #define LED_DEV_CAP_FLASH	BIT(18)
  #define LED_HW_PLUGGABLE	BIT(19)
  #define LED_PANIC_INDICATOR	BIT(20)
  #define LED_BRIGHT_HW_CHANGED	BIT(21)
  #define LED_RETAIN_AT_SHUTDOWN	BIT(22)
02d31765b   Jacek Anaszewski   led: triggers: Ad...
76
  #define LED_INIT_DEFAULT_TRIGGER BIT(23)
a9c6ce57e   Hans de Goede   led: core: Use at...
77
78
79
80
81
82
83
84
85
86
  
  	/* set_brightness_work / blink_timer flags, atomic, private. */
  	unsigned long		work_flags;
  
  #define LED_BLINK_SW			0
  #define LED_BLINK_ONESHOT		1
  #define LED_BLINK_ONESHOT_STOP		2
  #define LED_BLINK_INVERT		3
  #define LED_BLINK_BRIGHTNESS_CHANGE 	4
  #define LED_BLINK_DISABLE		5
c72a1d608   Richard Purdie   [PATCH] LED: add ...
87

70b2563b3   Heiner Kallweit   leds: core: fix m...
88
89
90
91
  	/* Set LED brightness level
  	 * Must not sleep. Use brightness_set_blocking for drivers
  	 * that can sleep while setting brightness.
  	 */
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
92
93
  	void		(*brightness_set)(struct led_classdev *led_cdev,
  					  enum led_brightness brightness);
4d71a4a12   Jacek Anaszewski   leds: Add support...
94
95
96
97
  	/*
  	 * Set LED brightness level immediately - it can block the caller for
  	 * the time required for accessing a LED device register.
  	 */
437a4240f   Jacek Anaszewski   leds: Rename brig...
98
99
  	int (*brightness_set_blocking)(struct led_classdev *led_cdev,
  				       enum led_brightness brightness);
29d76dfa2   Henrique de Moraes Holschuh   leds: Add support...
100
101
  	/* Get LED brightness level */
  	enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
102

5ada28bf7   Johannes Berg   led-class: always...
103
104
105
106
107
  	/*
  	 * Activate hardware accelerated blink, delays are in milliseconds
  	 * and if both are zero then a sensible default should be chosen.
  	 * The call should adjust the timings in that case and if it can't
  	 * match the values specified exactly.
7cfe749fa   Tony Makkiel   leds: core: Fix b...
108
109
  	 * Deactivate blinking again when the brightness is set to LED_OFF
  	 * via the brightness_set() callback.
5ada28bf7   Johannes Berg   led-class: always...
110
  	 */
4c79141d2   Márton Németh   leds: Add support...
111
112
113
  	int		(*blink_set)(struct led_classdev *led_cdev,
  				     unsigned long *delay_on,
  				     unsigned long *delay_off);
5fd752b6b   Baolin Wang   leds: core: Intro...
114
115
116
  	int (*pattern_set)(struct led_classdev *led_cdev,
  			   struct led_pattern *pattern, u32 len, int repeat);
  	int (*pattern_clear)(struct led_classdev *led_cdev);
f8a7c6fe1   Richard Purdie   leds: Convert fro...
117
  	struct device		*dev;
d0d480cce   Johan Hovold   leds: add led-cla...
118
  	const struct attribute_group	**groups;
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
119
  	struct list_head	 node;			/* LED Device list */
781a54e76   Anton Vorontsov   leds: mark led_cl...
120
  	const char		*default_trigger;	/* Trigger to use */
c72a1d608   Richard Purdie   [PATCH] LED: add ...
121

5ada28bf7   Johannes Berg   led-class: always...
122
  	unsigned long		 blink_delay_on, blink_delay_off;
9067359fa   Jiri Kosina   Revert "leds: con...
123
  	struct timer_list	 blink_timer;
5ada28bf7   Johannes Berg   led-class: always...
124
  	int			 blink_brightness;
eb1610b4c   Hans de Goede   led: core: Fix bl...
125
  	int			 new_blink_brightness;
7aea8389a   Jacek Anaszewski   leds: Add LED Fla...
126
  	void			(*flash_resume)(struct led_classdev *led_cdev);
5ada28bf7   Johannes Berg   led-class: always...
127

d23a22a74   Fabio Baltieri   leds: delay led_s...
128
129
  	struct work_struct	set_brightness_work;
  	int			delayed_set_value;
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
130
  #ifdef CONFIG_LEDS_TRIGGERS
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
131
  	/* Protects the trigger data below */
dc47206e5   Richard Purdie   leds: Fix led tri...
132
  	struct rw_semaphore	 trigger_lock;
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
133

fb5035dbb   Ben Dooks   [PATCH] leds: re-...
134
135
136
  	struct led_trigger	*trigger;
  	struct list_head	 trig_list;
  	void			*trigger_data;
b00961824   Shuah Khan   leds: add new fie...
137
138
  	/* true if activated - deactivate routine uses it to do cleanup */
  	bool			activated;
93690cdf3   Marek Behún   leds: trigger: ad...
139
140
141
  
  	/* LEDs that have private triggers have this set */
  	struct led_hw_trigger_type	*trigger_type;
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
142
  #endif
acd899e4f   Jacek Anaszewski   leds: implement s...
143

0cb8eb30d   Hans de Goede   leds: class: Add ...
144
145
146
147
  #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
  	int			 brightness_hw_changed;
  	struct kernfs_node	*brightness_hw_changed_kn;
  #endif
acd899e4f   Jacek Anaszewski   leds: implement s...
148
149
  	/* Ensures consistent access to the LED Flash Class device */
  	struct mutex		led_access;
c72a1d608   Richard Purdie   [PATCH] LED: add ...
150
  };
b2b998c0f   Jacek Anaszewski   leds: class: Impr...
151
152
153
154
155
156
157
  /**
   * led_classdev_register_ext - register a new object of LED class with
   *			       init data
   * @parent: LED controller device this LED is driven by
   * @led_cdev: the led_classdev structure for this device
   * @init_data: the LED class device initialization data
   *
7c322056e   Jacek Anaszewski   leds: Replace {de...
158
159
   * Register a new object of LED class, with name derived from init_data.
   *
b2b998c0f   Jacek Anaszewski   leds: class: Impr...
160
161
   * Returns: 0 on success or negative error value on failure
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
162
  int led_classdev_register_ext(struct device *parent,
b2b998c0f   Jacek Anaszewski   leds: class: Impr...
163
164
  				     struct led_classdev *led_cdev,
  				     struct led_init_data *init_data);
7c322056e   Jacek Anaszewski   leds: Replace {de...
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
  
  /**
   * led_classdev_register - register a new object of LED class
   * @parent: LED controller device this LED is driven by
   * @led_cdev: the led_classdev structure for this device
   *
   * Register a new object of LED class, with name derived from the name property
   * of passed led_cdev argument.
   *
   * Returns: 0 on success or negative error value on failure
   */
  static inline int led_classdev_register(struct device *parent,
  					struct led_classdev *led_cdev)
  {
  	return led_classdev_register_ext(parent, led_cdev, NULL);
  }
ec28a8cfd   Dan Murphy   leds: core: Remov...
181
  int devm_led_classdev_register_ext(struct device *parent,
b2b998c0f   Jacek Anaszewski   leds: class: Impr...
182
183
  					  struct led_classdev *led_cdev,
  					  struct led_init_data *init_data);
7c322056e   Jacek Anaszewski   leds: Replace {de...
184
185
186
187
188
189
  
  static inline int devm_led_classdev_register(struct device *parent,
  					     struct led_classdev *led_cdev)
  {
  	return devm_led_classdev_register_ext(parent, led_cdev, NULL);
  }
ec28a8cfd   Dan Murphy   leds: core: Remov...
190
191
192
193
194
  void led_classdev_unregister(struct led_classdev *led_cdev);
  void devm_led_classdev_unregister(struct device *parent,
  				  struct led_classdev *led_cdev);
  void led_classdev_suspend(struct led_classdev *led_cdev);
  void led_classdev_resume(struct led_classdev *led_cdev);
c72a1d608   Richard Purdie   [PATCH] LED: add ...
195

699a8c7c4   Tomi Valkeinen   leds: Add of_led_...
196
197
  extern struct led_classdev *of_led_get(struct device_node *np, int index);
  extern void led_put(struct led_classdev *led_cdev);
e389240ad   Jean-Jacques Hiblot   leds: Add managed...
198
199
  struct led_classdev *__must_check devm_of_led_get(struct device *dev,
  						  int index);
699a8c7c4   Tomi Valkeinen   leds: Add of_led_...
200

5ada28bf7   Johannes Berg   led-class: always...
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  /**
   * led_blink_set - set blinking with software fallback
   * @led_cdev: the LED to start blinking
   * @delay_on: the time it should be on (in ms)
   * @delay_off: the time it should ble off (in ms)
   *
   * This function makes the LED blink, attempting to use the
   * hardware acceleration if possible, but falling back to
   * software blinking if there is no hardware blinking or if
   * the LED refuses the passed values.
   *
   * Note that if software blinking is active, simply calling
   * led_cdev->brightness_set() will not stop the blinking,
   * use led_classdev_brightness_set() instead.
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
216
217
  void led_blink_set(struct led_classdev *led_cdev, unsigned long *delay_on,
  		   unsigned long *delay_off);
5ada28bf7   Johannes Berg   led-class: always...
218
  /**
5bb629c50   Fabio Baltieri   leds: add oneshot...
219
220
221
222
223
224
225
226
227
228
229
230
231
   * led_blink_set_oneshot - do a oneshot software blink
   * @led_cdev: the LED to start blinking
   * @delay_on: the time it should be on (in ms)
   * @delay_off: the time it should ble off (in ms)
   * @invert: blink off, then on, leaving the led on
   *
   * This function makes the LED blink one time for delay_on +
   * delay_off time, ignoring the request if another one-shot
   * blink is already in progress.
   *
   * If invert is set, led blinks for delay_off first, then for
   * delay_on and leave the led on after the on-off cycle.
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
232
233
234
  void led_blink_set_oneshot(struct led_classdev *led_cdev,
  			   unsigned long *delay_on, unsigned long *delay_off,
  			   int invert);
5bb629c50   Fabio Baltieri   leds: add oneshot...
235
  /**
19cd67e2d   Shuah Khan   leds: Rename led_...
236
   * led_set_brightness - set LED brightness
5ada28bf7   Johannes Berg   led-class: always...
237
238
239
240
241
   * @led_cdev: the LED to set
   * @brightness: the brightness to set it to
   *
   * Set an LED's brightness, and, if necessary, cancel the
   * software blink timer that implements blinking when the
1afcadfcd   Jacek Anaszewski   leds: core: Use s...
242
   * hardware doesn't. This function is guaranteed not to sleep.
5ada28bf7   Johannes Berg   led-class: always...
243
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
244
245
  void led_set_brightness(struct led_classdev *led_cdev,
  			enum led_brightness brightness);
13ae79bbe   Jacek Anaszewski   leds: core: Drive...
246
247
248
249
  
  /**
   * led_set_brightness_sync - set LED brightness synchronously
   * @led_cdev: the LED to set
9cc93be7b   Dan Murphy   leds: core: Fix l...
250
   * @value: the brightness to set it to
13ae79bbe   Jacek Anaszewski   leds: core: Drive...
251
252
253
254
255
256
257
   *
   * Set an LED's brightness immediately. This function will block
   * the caller for the time required for accessing device registers,
   * and it can sleep.
   *
   * Returns: 0 on success or negative error value on failure
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
258
259
  int led_set_brightness_sync(struct led_classdev *led_cdev,
  			    enum led_brightness value);
13ae79bbe   Jacek Anaszewski   leds: core: Drive...
260

3ef7de530   Jacek Anaszewski   leds: Improve and...
261
262
263
264
265
266
267
268
269
  /**
   * led_update_brightness - update LED brightness
   * @led_cdev: the LED to query
   *
   * Get an LED's current brightness and update led_cdev->brightness
   * member with the obtained value.
   *
   * Returns: 0 on success or negative error value on failure
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
270
  int led_update_brightness(struct led_classdev *led_cdev);
5ada28bf7   Johannes Berg   led-class: always...
271

acd899e4f   Jacek Anaszewski   leds: implement s...
272
  /**
8e1f45612   Krzysztof Kozlowski   leds: Add helper ...
273
274
275
276
277
278
279
280
281
   * led_get_default_pattern - return default pattern
   *
   * @led_cdev: the LED to get default pattern for
   * @size:     pointer for storing the number of elements in returned array,
   *            modified only if return != NULL
   *
   * Return:    Allocated array of integers with default pattern from device tree
   *            or NULL.  Caller is responsible for kfree().
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
282
  u32 *led_get_default_pattern(struct led_classdev *led_cdev, unsigned int *size);
8e1f45612   Krzysztof Kozlowski   leds: Add helper ...
283
284
  
  /**
acd899e4f   Jacek Anaszewski   leds: implement s...
285
286
287
288
289
   * led_sysfs_disable - disable LED sysfs interface
   * @led_cdev: the LED to set
   *
   * Disable the led_cdev's sysfs interface.
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
290
  void led_sysfs_disable(struct led_classdev *led_cdev);
acd899e4f   Jacek Anaszewski   leds: implement s...
291
292
293
294
295
296
297
  
  /**
   * led_sysfs_enable - enable LED sysfs interface
   * @led_cdev: the LED to set
   *
   * Enable the led_cdev's sysfs interface.
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
298
  void led_sysfs_enable(struct led_classdev *led_cdev);
acd899e4f   Jacek Anaszewski   leds: implement s...
299
300
  
  /**
bb4e9af03   Jacek Anaszewski   leds: core: Add s...
301
302
   * led_compose_name - compose LED class device name
   * @dev: LED controller device object
9cc93be7b   Dan Murphy   leds: core: Fix l...
303
   * @init_data: the LED class device initialization data
bb4e9af03   Jacek Anaszewski   leds: core: Add s...
304
305
306
307
308
309
310
311
   * @led_classdev_name: composed LED class device name
   *
   * Create LED class device name basing on the provided init_data argument.
   * The name can have <devicename:color:function> or <color:function>.
   * form, depending on the init_data configuration.
   *
   * Returns: 0 on success or negative error value on failure
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
312
313
  int led_compose_name(struct device *dev, struct led_init_data *init_data,
  		     char *led_classdev_name);
bb4e9af03   Jacek Anaszewski   leds: core: Add s...
314
315
  
  /**
acd899e4f   Jacek Anaszewski   leds: implement s...
316
317
318
319
320
321
322
323
324
   * led_sysfs_is_disabled - check if LED sysfs interface is disabled
   * @led_cdev: the LED to query
   *
   * Returns: true if the led_cdev's sysfs interface is disabled.
   */
  static inline bool led_sysfs_is_disabled(struct led_classdev *led_cdev)
  {
  	return led_cdev->flags & LED_SYSFS_DISABLE;
  }
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
325
326
327
  /*
   * LED Triggers
   */
39f7e08af   Kim, Milo   leds: trigger: us...
328
329
330
  /* Registration functions for simple triggers */
  #define DEFINE_LED_TRIGGER(x)		static struct led_trigger *x;
  #define DEFINE_LED_TRIGGER_GLOBAL(x)	struct led_trigger *x;
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
331
332
333
334
335
336
  #ifdef CONFIG_LEDS_TRIGGERS
  
  #define TRIG_NAME_MAX 50
  
  struct led_trigger {
  	/* Trigger Properties */
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
337
  	const char	 *name;
2282e125a   Uwe Kleine-König   leds: triggers: l...
338
  	int		(*activate)(struct led_classdev *led_cdev);
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
339
  	void		(*deactivate)(struct led_classdev *led_cdev);
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
340

93690cdf3   Marek Behún   leds: trigger: ad...
341
342
  	/* LED-private triggers have this set */
  	struct led_hw_trigger_type *trigger_type;
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
343
  	/* LEDs under control by this trigger (for simple triggers) */
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
344
345
  	rwlock_t	  leddev_list_lock;
  	struct list_head  led_cdevs;
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
346
347
  
  	/* Link to next registered trigger */
fb5035dbb   Ben Dooks   [PATCH] leds: re-...
348
  	struct list_head  next_trig;
a7e7a3156   Uwe Kleine-König   leds: triggers: a...
349
350
  
  	const struct attribute_group **groups;
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
351
  };
a7e7a3156   Uwe Kleine-König   leds: triggers: a...
352
353
354
355
356
357
358
359
  /*
   * Currently the attributes in struct led_trigger::groups are added directly to
   * the LED device. As this might change in the future, the following
   * macros abstract getting the LED device and its trigger_data from the dev
   * parameter passed to the attribute accessor functions.
   */
  #define led_trigger_get_led(dev)	((struct led_classdev *)dev_get_drvdata((dev)))
  #define led_trigger_get_drvdata(dev)	(led_get_trigger_data(led_trigger_get_led(dev)))
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
360
  /* Registration functions for complex triggers */
ec28a8cfd   Dan Murphy   leds: core: Remov...
361
362
363
  int led_trigger_register(struct led_trigger *trigger);
  void led_trigger_unregister(struct led_trigger *trigger);
  int devm_led_trigger_register(struct device *dev,
9534cc31d   Heiner Kallweit   leds: core: add m...
364
  				     struct led_trigger *trigger);
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
365

ec28a8cfd   Dan Murphy   leds: core: Remov...
366
  void led_trigger_register_simple(const char *name,
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
367
  				struct led_trigger **trigger);
ec28a8cfd   Dan Murphy   leds: core: Remov...
368
369
370
371
372
373
374
375
376
377
378
  void led_trigger_unregister_simple(struct led_trigger *trigger);
  void led_trigger_event(struct led_trigger *trigger,  enum led_brightness event);
  void led_trigger_blink(struct led_trigger *trigger, unsigned long *delay_on,
  		       unsigned long *delay_off);
  void led_trigger_blink_oneshot(struct led_trigger *trigger,
  			       unsigned long *delay_on,
  			       unsigned long *delay_off,
  			       int invert);
  void led_trigger_set_default(struct led_classdev *led_cdev);
  int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger);
  void led_trigger_remove(struct led_classdev *led_cdev);
20f56758b   Jacek Anaszewski   leds: unify the l...
379

9acc560de   Uwe Kleine-König   leds: triggers: n...
380
381
382
383
384
  static inline void led_set_trigger_data(struct led_classdev *led_cdev,
  					void *trigger_data)
  {
  	led_cdev->trigger_data = trigger_data;
  }
20f56758b   Jacek Anaszewski   leds: unify the l...
385
386
387
388
  static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
  {
  	return led_cdev->trigger_data;
  }
057407c73   Jingoo Han   led: Add dependen...
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
  /**
   * led_trigger_rename_static - rename a trigger
   * @name: the new trigger name
   * @trig: the LED trigger to rename
   *
   * Change a LED trigger name by copying the string passed in
   * name into current trigger name, which MUST be large
   * enough for the new string.
   *
   * Note that name must NOT point to the same string used
   * during LED registration, as that could lead to races.
   *
   * This is meant to be used on triggers with statically
   * allocated name.
   */
ec28a8cfd   Dan Murphy   leds: core: Remov...
404
  void led_trigger_rename_static(const char *name, struct led_trigger *trig);
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
405

a0b750768   Uwe Kleine-König   leds: triggers: d...
406
407
408
  #define module_led_trigger(__led_trigger) \
  	module_driver(__led_trigger, led_trigger_register, \
  		      led_trigger_unregister)
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
409
  #else
39f7e08af   Kim, Milo   leds: trigger: us...
410
411
  /* Trigger has no members */
  struct led_trigger {};
c3bc9956e   Richard Purdie   [PATCH] LED: add ...
412

39f7e08af   Kim, Milo   leds: trigger: us...
413
414
415
416
417
418
  /* Trigger inline empty functions */
  static inline void led_trigger_register_simple(const char *name,
  					struct led_trigger **trigger) {}
  static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {}
  static inline void led_trigger_event(struct led_trigger *trigger,
  				enum led_brightness event) {}
8890624a4   Michael Grzeschik   arcnet: com20020-...
419
420
421
422
423
424
425
  static inline void led_trigger_blink(struct led_trigger *trigger,
  				      unsigned long *delay_on,
  				      unsigned long *delay_off) {}
  static inline void led_trigger_blink_oneshot(struct led_trigger *trigger,
  				      unsigned long *delay_on,
  				      unsigned long *delay_off,
  				      int invert) {}
20f56758b   Jacek Anaszewski   leds: unify the l...
426
  static inline void led_trigger_set_default(struct led_classdev *led_cdev) {}
2282e125a   Uwe Kleine-König   leds: triggers: l...
427
428
429
430
431
  static inline int led_trigger_set(struct led_classdev *led_cdev,
  				  struct led_trigger *trigger)
  {
  	return 0;
  }
20f56758b   Jacek Anaszewski   leds: unify the l...
432
  static inline void led_trigger_remove(struct led_classdev *led_cdev) {}
9acc560de   Uwe Kleine-König   leds: triggers: n...
433
  static inline void led_set_trigger_data(struct led_classdev *led_cdev) {}
20f56758b   Jacek Anaszewski   leds: unify the l...
434
435
436
437
  static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
  {
  	return NULL;
  }
39f7e08af   Kim, Milo   leds: trigger: us...
438
  #endif /* CONFIG_LEDS_TRIGGERS */
2bfb646cd   Richard Purdie   [PATCH] LED: Add ...
439
440
  
  /* Trigger specific functions */
eb25cb995   Stephan Linz   leds: convert IDE...
441
  #ifdef CONFIG_LEDS_TRIGGER_DISK
ec28a8cfd   Dan Murphy   leds: core: Remov...
442
  void ledtrig_disk_activity(bool write);
2bfb646cd   Richard Purdie   [PATCH] LED: Add ...
443
  #else
d1ed7c558   Linus Walleij   leds: Extends dis...
444
  static inline void ledtrig_disk_activity(bool write) {}
2bfb646cd   Richard Purdie   [PATCH] LED: Add ...
445
  #endif
4b721174c   Ezequiel Garcia   leds: trigger: In...
446
  #ifdef CONFIG_LEDS_TRIGGER_MTD
ec28a8cfd   Dan Murphy   leds: core: Remov...
447
  void ledtrig_mtd_activity(void);
4b721174c   Ezequiel Garcia   leds: trigger: In...
448
449
450
  #else
  static inline void ledtrig_mtd_activity(void) {}
  #endif
48a1d032c   Kim, Milo   leds: add camera ...
451
  #if defined(CONFIG_LEDS_TRIGGER_CAMERA) || defined(CONFIG_LEDS_TRIGGER_CAMERA_MODULE)
ec28a8cfd   Dan Murphy   leds: core: Remov...
452
453
  void ledtrig_flash_ctrl(bool on);
  void ledtrig_torch_ctrl(bool on);
48a1d032c   Kim, Milo   leds: add camera ...
454
455
456
457
  #else
  static inline void ledtrig_flash_ctrl(bool on) {}
  static inline void ledtrig_torch_ctrl(bool on) {}
  #endif
f46e9203d   Nate Case   leds: Add support...
458
459
460
461
462
  /*
   * Generic LED platform data for describing LED names and default triggers.
   */
  struct led_info {
  	const char	*name;
326bb8a5a   Trent Piepho   leds: Make defaul...
463
  	const char	*default_trigger;
f46e9203d   Nate Case   leds: Add support...
464
465
466
467
468
469
470
  	int		flags;
  };
  
  struct led_platform_data {
  	int		num_leds;
  	struct led_info	*leds;
  };
bb4e9af03   Jacek Anaszewski   leds: core: Add s...
471
472
473
474
475
476
477
478
  struct led_properties {
  	u32		color;
  	bool		color_present;
  	const char	*function;
  	u32		func_enum;
  	bool		func_enum_present;
  	const char	*label;
  };
68620e594   Heiner Kallweit   leds: gpio: intro...
479
480
481
482
  struct gpio_desc;
  typedef int (*gpio_blink_set_t)(struct gpio_desc *desc, int state,
  				unsigned long *delay_on,
  				unsigned long *delay_off);
22e03f3b5   Raphael Assenat   leds: Add generic...
483
484
485
  /* For the leds-gpio driver */
  struct gpio_led {
  	const char *name;
326bb8a5a   Trent Piepho   leds: Make defaul...
486
  	const char *default_trigger;
22e03f3b5   Raphael Assenat   leds: Add generic...
487
  	unsigned 	gpio;
ed88bae69   Trent Piepho   leds: Add options...
488
489
  	unsigned	active_low : 1;
  	unsigned	retain_state_suspended : 1;
80d6737b2   Ezequiel Garcia   leds: gpio: Suppo...
490
  	unsigned	panic_indicator : 1;
ed88bae69   Trent Piepho   leds: Add options...
491
  	unsigned	default_state : 2;
f5808ac15   Andrew Jeffery   leds: gpio: Allow...
492
  	unsigned	retain_state_shutdown : 1;
ed88bae69   Trent Piepho   leds: Add options...
493
  	/* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
5c51277a9   Mika Westerberg   leds: leds-gpio: ...
494
  	struct gpio_desc *gpiod;
22e03f3b5   Raphael Assenat   leds: Add generic...
495
  };
2146325df   Benjamin Herrenschmidt   leds: leds-gpio: ...
496
497
498
  #define LEDS_GPIO_DEFSTATE_OFF		0
  #define LEDS_GPIO_DEFSTATE_ON		1
  #define LEDS_GPIO_DEFSTATE_KEEP		2
22e03f3b5   Raphael Assenat   leds: Add generic...
499
500
501
  
  struct gpio_led_platform_data {
  	int 		num_leds;
9517f925f   Uwe Kleine-König   leds: make *struc...
502
  	const struct gpio_led *leds;
2146325df   Benjamin Herrenschmidt   leds: leds-gpio: ...
503
504
505
  
  #define GPIO_LED_NO_BLINK_LOW	0	/* No blink GPIO state low */
  #define GPIO_LED_NO_BLINK_HIGH	1	/* No blink GPIO state high */
9517f925f   Uwe Kleine-König   leds: make *struc...
506
  #define GPIO_LED_BLINK		2	/* Please, blink */
68620e594   Heiner Kallweit   leds: gpio: intro...
507
  	gpio_blink_set_t	gpio_blink_set;
22e03f3b5   Raphael Assenat   leds: Add generic...
508
  };
fca23e47d   Andrew F. Davis   leds: Add no-op g...
509
  #ifdef CONFIG_NEW_LEDS
4440673a9   Uwe Kleine-König   leds: provide hel...
510
511
  struct platform_device *gpio_led_register_device(
  		int id, const struct gpio_led_platform_data *pdata);
fca23e47d   Andrew F. Davis   leds: Add no-op g...
512
513
514
515
516
517
518
  #else
  static inline struct platform_device *gpio_led_register_device(
  		int id, const struct gpio_led_platform_data *pdata)
  {
  	return 0;
  }
  #endif
22e03f3b5   Raphael Assenat   leds: Add generic...
519

8f88731d0   Bryan Wu   led-triggers: cre...
520
521
522
523
524
525
526
527
  enum cpu_led_event {
  	CPU_LED_IDLE_START,	/* CPU enters idle */
  	CPU_LED_IDLE_END,	/* CPU idle ends */
  	CPU_LED_START,		/* Machine starts, especially resume */
  	CPU_LED_STOP,		/* Machine stops, especially suspend */
  	CPU_LED_HALTED,		/* Machine shutdown */
  };
  #ifdef CONFIG_LEDS_TRIGGER_CPU
ec28a8cfd   Dan Murphy   leds: core: Remov...
528
  void ledtrig_cpu(enum cpu_led_event evt);
8f88731d0   Bryan Wu   led-triggers: cre...
529
530
531
532
533
534
  #else
  static inline void ledtrig_cpu(enum cpu_led_event evt)
  {
  	return;
  }
  #endif
0cb8eb30d   Hans de Goede   leds: class: Add ...
535
  #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
ec28a8cfd   Dan Murphy   leds: core: Remov...
536
  void led_classdev_notify_brightness_hw_changed(
0cb8eb30d   Hans de Goede   leds: class: Add ...
537
538
539
540
541
  	struct led_classdev *led_cdev, enum led_brightness brightness);
  #else
  static inline void led_classdev_notify_brightness_hw_changed(
  	struct led_classdev *led_cdev, enum led_brightness brightness) { }
  #endif
5fd752b6b   Baolin Wang   leds: core: Intro...
542
543
544
545
546
547
548
549
550
  /**
   * struct led_pattern - pattern interval settings
   * @delta_t: pattern interval delay, in milliseconds
   * @brightness: pattern interval brightness
   */
  struct led_pattern {
  	u32 delta_t;
  	int brightness;
  };
faa2541f5   Takashi Iwai   leds: trigger: In...
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
  enum led_audio {
  	LED_AUDIO_MUTE,		/* master mute LED */
  	LED_AUDIO_MICMUTE,	/* mic mute LED */
  	NUM_AUDIO_LEDS
  };
  
  #if IS_ENABLED(CONFIG_LEDS_TRIGGER_AUDIO)
  enum led_brightness ledtrig_audio_get(enum led_audio type);
  void ledtrig_audio_set(enum led_audio type, enum led_brightness state);
  #else
  static inline enum led_brightness ledtrig_audio_get(enum led_audio type)
  {
  	return LED_OFF;
  }
  static inline void ledtrig_audio_set(enum led_audio type,
  				     enum led_brightness state)
  {
  }
  #endif
c72a1d608   Richard Purdie   [PATCH] LED: add ...
570
  #endif		/* __LINUX_LEDS_H_INCLUDED */