1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Driver model for leds and led triggers
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu>
6*4882a593Smuzhiyun * Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun #ifndef __LINUX_LEDS_H_INCLUDED
9*4882a593Smuzhiyun #define __LINUX_LEDS_H_INCLUDED
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <dt-bindings/leds/common.h>
12*4882a593Smuzhiyun #include <linux/device.h>
13*4882a593Smuzhiyun #include <linux/kernfs.h>
14*4882a593Smuzhiyun #include <linux/list.h>
15*4882a593Smuzhiyun #include <linux/mutex.h>
16*4882a593Smuzhiyun #include <linux/rwsem.h>
17*4882a593Smuzhiyun #include <linux/spinlock.h>
18*4882a593Smuzhiyun #include <linux/timer.h>
19*4882a593Smuzhiyun #include <linux/workqueue.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun struct device;
22*4882a593Smuzhiyun struct led_pattern;
23*4882a593Smuzhiyun struct device_node;
24*4882a593Smuzhiyun /*
25*4882a593Smuzhiyun * LED Core
26*4882a593Smuzhiyun */
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /* This is obsolete/useless. We now support variable maximum brightness. */
29*4882a593Smuzhiyun enum led_brightness {
30*4882a593Smuzhiyun LED_OFF = 0,
31*4882a593Smuzhiyun LED_ON = 1,
32*4882a593Smuzhiyun LED_HALF = 127,
33*4882a593Smuzhiyun LED_FULL = 255,
34*4882a593Smuzhiyun };
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun struct led_init_data {
37*4882a593Smuzhiyun /* device fwnode handle */
38*4882a593Smuzhiyun struct fwnode_handle *fwnode;
39*4882a593Smuzhiyun /*
40*4882a593Smuzhiyun * default <color:function> tuple, for backward compatibility
41*4882a593Smuzhiyun * with in-driver hard-coded LED names used as a fallback when
42*4882a593Smuzhiyun * DT "label" property is absent; it should be set to NULL
43*4882a593Smuzhiyun * in new LED class drivers.
44*4882a593Smuzhiyun */
45*4882a593Smuzhiyun const char *default_label;
46*4882a593Smuzhiyun /*
47*4882a593Smuzhiyun * string to be used for devicename section of LED class device
48*4882a593Smuzhiyun * either for label based LED name composition path or for fwnode
49*4882a593Smuzhiyun * based when devname_mandatory is true
50*4882a593Smuzhiyun */
51*4882a593Smuzhiyun const char *devicename;
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun * indicates if LED name should always comprise devicename section;
54*4882a593Smuzhiyun * only LEDs exposed by drivers of hot-pluggable devices should
55*4882a593Smuzhiyun * set it to true
56*4882a593Smuzhiyun */
57*4882a593Smuzhiyun bool devname_mandatory;
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun struct led_hw_trigger_type {
61*4882a593Smuzhiyun int dummy;
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun struct led_classdev {
65*4882a593Smuzhiyun const char *name;
66*4882a593Smuzhiyun enum led_brightness brightness;
67*4882a593Smuzhiyun enum led_brightness max_brightness;
68*4882a593Smuzhiyun int flags;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /* Lower 16 bits reflect status */
71*4882a593Smuzhiyun #define LED_SUSPENDED BIT(0)
72*4882a593Smuzhiyun #define LED_UNREGISTERING BIT(1)
73*4882a593Smuzhiyun /* Upper 16 bits reflect control information */
74*4882a593Smuzhiyun #define LED_CORE_SUSPENDRESUME BIT(16)
75*4882a593Smuzhiyun #define LED_SYSFS_DISABLE BIT(17)
76*4882a593Smuzhiyun #define LED_DEV_CAP_FLASH BIT(18)
77*4882a593Smuzhiyun #define LED_HW_PLUGGABLE BIT(19)
78*4882a593Smuzhiyun #define LED_PANIC_INDICATOR BIT(20)
79*4882a593Smuzhiyun #define LED_BRIGHT_HW_CHANGED BIT(21)
80*4882a593Smuzhiyun #define LED_RETAIN_AT_SHUTDOWN BIT(22)
81*4882a593Smuzhiyun #define LED_INIT_DEFAULT_TRIGGER BIT(23)
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun /* set_brightness_work / blink_timer flags, atomic, private. */
84*4882a593Smuzhiyun unsigned long work_flags;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun #define LED_BLINK_SW 0
87*4882a593Smuzhiyun #define LED_BLINK_ONESHOT 1
88*4882a593Smuzhiyun #define LED_BLINK_ONESHOT_STOP 2
89*4882a593Smuzhiyun #define LED_BLINK_INVERT 3
90*4882a593Smuzhiyun #define LED_BLINK_BRIGHTNESS_CHANGE 4
91*4882a593Smuzhiyun #define LED_BLINK_DISABLE 5
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun /* Set LED brightness level
94*4882a593Smuzhiyun * Must not sleep. Use brightness_set_blocking for drivers
95*4882a593Smuzhiyun * that can sleep while setting brightness.
96*4882a593Smuzhiyun */
97*4882a593Smuzhiyun void (*brightness_set)(struct led_classdev *led_cdev,
98*4882a593Smuzhiyun enum led_brightness brightness);
99*4882a593Smuzhiyun /*
100*4882a593Smuzhiyun * Set LED brightness level immediately - it can block the caller for
101*4882a593Smuzhiyun * the time required for accessing a LED device register.
102*4882a593Smuzhiyun */
103*4882a593Smuzhiyun int (*brightness_set_blocking)(struct led_classdev *led_cdev,
104*4882a593Smuzhiyun enum led_brightness brightness);
105*4882a593Smuzhiyun /* Get LED brightness level */
106*4882a593Smuzhiyun enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun /*
109*4882a593Smuzhiyun * Activate hardware accelerated blink, delays are in milliseconds
110*4882a593Smuzhiyun * and if both are zero then a sensible default should be chosen.
111*4882a593Smuzhiyun * The call should adjust the timings in that case and if it can't
112*4882a593Smuzhiyun * match the values specified exactly.
113*4882a593Smuzhiyun * Deactivate blinking again when the brightness is set to LED_OFF
114*4882a593Smuzhiyun * via the brightness_set() callback.
115*4882a593Smuzhiyun */
116*4882a593Smuzhiyun int (*blink_set)(struct led_classdev *led_cdev,
117*4882a593Smuzhiyun unsigned long *delay_on,
118*4882a593Smuzhiyun unsigned long *delay_off);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun int (*pattern_set)(struct led_classdev *led_cdev,
121*4882a593Smuzhiyun struct led_pattern *pattern, u32 len, int repeat);
122*4882a593Smuzhiyun int (*pattern_clear)(struct led_classdev *led_cdev);
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun struct device *dev;
125*4882a593Smuzhiyun const struct attribute_group **groups;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun struct list_head node; /* LED Device list */
128*4882a593Smuzhiyun const char *default_trigger; /* Trigger to use */
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun unsigned long blink_delay_on, blink_delay_off;
131*4882a593Smuzhiyun struct timer_list blink_timer;
132*4882a593Smuzhiyun int blink_brightness;
133*4882a593Smuzhiyun int new_blink_brightness;
134*4882a593Smuzhiyun void (*flash_resume)(struct led_classdev *led_cdev);
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun struct work_struct set_brightness_work;
137*4882a593Smuzhiyun int delayed_set_value;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun #ifdef CONFIG_LEDS_TRIGGERS
140*4882a593Smuzhiyun /* Protects the trigger data below */
141*4882a593Smuzhiyun struct rw_semaphore trigger_lock;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun struct led_trigger *trigger;
144*4882a593Smuzhiyun struct list_head trig_list;
145*4882a593Smuzhiyun void *trigger_data;
146*4882a593Smuzhiyun /* true if activated - deactivate routine uses it to do cleanup */
147*4882a593Smuzhiyun bool activated;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /* LEDs that have private triggers have this set */
150*4882a593Smuzhiyun struct led_hw_trigger_type *trigger_type;
151*4882a593Smuzhiyun #endif
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
154*4882a593Smuzhiyun int brightness_hw_changed;
155*4882a593Smuzhiyun struct kernfs_node *brightness_hw_changed_kn;
156*4882a593Smuzhiyun #endif
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun /* Ensures consistent access to the LED Flash Class device */
159*4882a593Smuzhiyun struct mutex led_access;
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /**
163*4882a593Smuzhiyun * led_classdev_register_ext - register a new object of LED class with
164*4882a593Smuzhiyun * init data
165*4882a593Smuzhiyun * @parent: LED controller device this LED is driven by
166*4882a593Smuzhiyun * @led_cdev: the led_classdev structure for this device
167*4882a593Smuzhiyun * @init_data: the LED class device initialization data
168*4882a593Smuzhiyun *
169*4882a593Smuzhiyun * Register a new object of LED class, with name derived from init_data.
170*4882a593Smuzhiyun *
171*4882a593Smuzhiyun * Returns: 0 on success or negative error value on failure
172*4882a593Smuzhiyun */
173*4882a593Smuzhiyun int led_classdev_register_ext(struct device *parent,
174*4882a593Smuzhiyun struct led_classdev *led_cdev,
175*4882a593Smuzhiyun struct led_init_data *init_data);
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /**
178*4882a593Smuzhiyun * led_classdev_register - register a new object of LED class
179*4882a593Smuzhiyun * @parent: LED controller device this LED is driven by
180*4882a593Smuzhiyun * @led_cdev: the led_classdev structure for this device
181*4882a593Smuzhiyun *
182*4882a593Smuzhiyun * Register a new object of LED class, with name derived from the name property
183*4882a593Smuzhiyun * of passed led_cdev argument.
184*4882a593Smuzhiyun *
185*4882a593Smuzhiyun * Returns: 0 on success or negative error value on failure
186*4882a593Smuzhiyun */
led_classdev_register(struct device * parent,struct led_classdev * led_cdev)187*4882a593Smuzhiyun static inline int led_classdev_register(struct device *parent,
188*4882a593Smuzhiyun struct led_classdev *led_cdev)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun return led_classdev_register_ext(parent, led_cdev, NULL);
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun int devm_led_classdev_register_ext(struct device *parent,
194*4882a593Smuzhiyun struct led_classdev *led_cdev,
195*4882a593Smuzhiyun struct led_init_data *init_data);
196*4882a593Smuzhiyun
devm_led_classdev_register(struct device * parent,struct led_classdev * led_cdev)197*4882a593Smuzhiyun static inline int devm_led_classdev_register(struct device *parent,
198*4882a593Smuzhiyun struct led_classdev *led_cdev)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun return devm_led_classdev_register_ext(parent, led_cdev, NULL);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun void led_classdev_unregister(struct led_classdev *led_cdev);
203*4882a593Smuzhiyun void devm_led_classdev_unregister(struct device *parent,
204*4882a593Smuzhiyun struct led_classdev *led_cdev);
205*4882a593Smuzhiyun void led_classdev_suspend(struct led_classdev *led_cdev);
206*4882a593Smuzhiyun void led_classdev_resume(struct led_classdev *led_cdev);
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun extern struct led_classdev *of_led_get(struct device_node *np, int index);
209*4882a593Smuzhiyun extern void led_put(struct led_classdev *led_cdev);
210*4882a593Smuzhiyun struct led_classdev *__must_check devm_of_led_get(struct device *dev,
211*4882a593Smuzhiyun int index);
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun /**
214*4882a593Smuzhiyun * led_blink_set - set blinking with software fallback
215*4882a593Smuzhiyun * @led_cdev: the LED to start blinking
216*4882a593Smuzhiyun * @delay_on: the time it should be on (in ms)
217*4882a593Smuzhiyun * @delay_off: the time it should ble off (in ms)
218*4882a593Smuzhiyun *
219*4882a593Smuzhiyun * This function makes the LED blink, attempting to use the
220*4882a593Smuzhiyun * hardware acceleration if possible, but falling back to
221*4882a593Smuzhiyun * software blinking if there is no hardware blinking or if
222*4882a593Smuzhiyun * the LED refuses the passed values.
223*4882a593Smuzhiyun *
224*4882a593Smuzhiyun * Note that if software blinking is active, simply calling
225*4882a593Smuzhiyun * led_cdev->brightness_set() will not stop the blinking,
226*4882a593Smuzhiyun * use led_classdev_brightness_set() instead.
227*4882a593Smuzhiyun */
228*4882a593Smuzhiyun void led_blink_set(struct led_classdev *led_cdev, unsigned long *delay_on,
229*4882a593Smuzhiyun unsigned long *delay_off);
230*4882a593Smuzhiyun /**
231*4882a593Smuzhiyun * led_blink_set_oneshot - do a oneshot software blink
232*4882a593Smuzhiyun * @led_cdev: the LED to start blinking
233*4882a593Smuzhiyun * @delay_on: the time it should be on (in ms)
234*4882a593Smuzhiyun * @delay_off: the time it should ble off (in ms)
235*4882a593Smuzhiyun * @invert: blink off, then on, leaving the led on
236*4882a593Smuzhiyun *
237*4882a593Smuzhiyun * This function makes the LED blink one time for delay_on +
238*4882a593Smuzhiyun * delay_off time, ignoring the request if another one-shot
239*4882a593Smuzhiyun * blink is already in progress.
240*4882a593Smuzhiyun *
241*4882a593Smuzhiyun * If invert is set, led blinks for delay_off first, then for
242*4882a593Smuzhiyun * delay_on and leave the led on after the on-off cycle.
243*4882a593Smuzhiyun */
244*4882a593Smuzhiyun void led_blink_set_oneshot(struct led_classdev *led_cdev,
245*4882a593Smuzhiyun unsigned long *delay_on, unsigned long *delay_off,
246*4882a593Smuzhiyun int invert);
247*4882a593Smuzhiyun /**
248*4882a593Smuzhiyun * led_set_brightness - set LED brightness
249*4882a593Smuzhiyun * @led_cdev: the LED to set
250*4882a593Smuzhiyun * @brightness: the brightness to set it to
251*4882a593Smuzhiyun *
252*4882a593Smuzhiyun * Set an LED's brightness, and, if necessary, cancel the
253*4882a593Smuzhiyun * software blink timer that implements blinking when the
254*4882a593Smuzhiyun * hardware doesn't. This function is guaranteed not to sleep.
255*4882a593Smuzhiyun */
256*4882a593Smuzhiyun void led_set_brightness(struct led_classdev *led_cdev,
257*4882a593Smuzhiyun enum led_brightness brightness);
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun /**
260*4882a593Smuzhiyun * led_set_brightness_sync - set LED brightness synchronously
261*4882a593Smuzhiyun * @led_cdev: the LED to set
262*4882a593Smuzhiyun * @value: the brightness to set it to
263*4882a593Smuzhiyun *
264*4882a593Smuzhiyun * Set an LED's brightness immediately. This function will block
265*4882a593Smuzhiyun * the caller for the time required for accessing device registers,
266*4882a593Smuzhiyun * and it can sleep.
267*4882a593Smuzhiyun *
268*4882a593Smuzhiyun * Returns: 0 on success or negative error value on failure
269*4882a593Smuzhiyun */
270*4882a593Smuzhiyun int led_set_brightness_sync(struct led_classdev *led_cdev,
271*4882a593Smuzhiyun enum led_brightness value);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun /**
274*4882a593Smuzhiyun * led_update_brightness - update LED brightness
275*4882a593Smuzhiyun * @led_cdev: the LED to query
276*4882a593Smuzhiyun *
277*4882a593Smuzhiyun * Get an LED's current brightness and update led_cdev->brightness
278*4882a593Smuzhiyun * member with the obtained value.
279*4882a593Smuzhiyun *
280*4882a593Smuzhiyun * Returns: 0 on success or negative error value on failure
281*4882a593Smuzhiyun */
282*4882a593Smuzhiyun int led_update_brightness(struct led_classdev *led_cdev);
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun /**
285*4882a593Smuzhiyun * led_get_default_pattern - return default pattern
286*4882a593Smuzhiyun *
287*4882a593Smuzhiyun * @led_cdev: the LED to get default pattern for
288*4882a593Smuzhiyun * @size: pointer for storing the number of elements in returned array,
289*4882a593Smuzhiyun * modified only if return != NULL
290*4882a593Smuzhiyun *
291*4882a593Smuzhiyun * Return: Allocated array of integers with default pattern from device tree
292*4882a593Smuzhiyun * or NULL. Caller is responsible for kfree().
293*4882a593Smuzhiyun */
294*4882a593Smuzhiyun u32 *led_get_default_pattern(struct led_classdev *led_cdev, unsigned int *size);
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /**
297*4882a593Smuzhiyun * led_sysfs_disable - disable LED sysfs interface
298*4882a593Smuzhiyun * @led_cdev: the LED to set
299*4882a593Smuzhiyun *
300*4882a593Smuzhiyun * Disable the led_cdev's sysfs interface.
301*4882a593Smuzhiyun */
302*4882a593Smuzhiyun void led_sysfs_disable(struct led_classdev *led_cdev);
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun /**
305*4882a593Smuzhiyun * led_sysfs_enable - enable LED sysfs interface
306*4882a593Smuzhiyun * @led_cdev: the LED to set
307*4882a593Smuzhiyun *
308*4882a593Smuzhiyun * Enable the led_cdev's sysfs interface.
309*4882a593Smuzhiyun */
310*4882a593Smuzhiyun void led_sysfs_enable(struct led_classdev *led_cdev);
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun /**
313*4882a593Smuzhiyun * led_compose_name - compose LED class device name
314*4882a593Smuzhiyun * @dev: LED controller device object
315*4882a593Smuzhiyun * @init_data: the LED class device initialization data
316*4882a593Smuzhiyun * @led_classdev_name: composed LED class device name
317*4882a593Smuzhiyun *
318*4882a593Smuzhiyun * Create LED class device name basing on the provided init_data argument.
319*4882a593Smuzhiyun * The name can have <devicename:color:function> or <color:function>.
320*4882a593Smuzhiyun * form, depending on the init_data configuration.
321*4882a593Smuzhiyun *
322*4882a593Smuzhiyun * Returns: 0 on success or negative error value on failure
323*4882a593Smuzhiyun */
324*4882a593Smuzhiyun int led_compose_name(struct device *dev, struct led_init_data *init_data,
325*4882a593Smuzhiyun char *led_classdev_name);
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun /**
328*4882a593Smuzhiyun * led_sysfs_is_disabled - check if LED sysfs interface is disabled
329*4882a593Smuzhiyun * @led_cdev: the LED to query
330*4882a593Smuzhiyun *
331*4882a593Smuzhiyun * Returns: true if the led_cdev's sysfs interface is disabled.
332*4882a593Smuzhiyun */
led_sysfs_is_disabled(struct led_classdev * led_cdev)333*4882a593Smuzhiyun static inline bool led_sysfs_is_disabled(struct led_classdev *led_cdev)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun return led_cdev->flags & LED_SYSFS_DISABLE;
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun /*
339*4882a593Smuzhiyun * LED Triggers
340*4882a593Smuzhiyun */
341*4882a593Smuzhiyun /* Registration functions for simple triggers */
342*4882a593Smuzhiyun #define DEFINE_LED_TRIGGER(x) static struct led_trigger *x;
343*4882a593Smuzhiyun #define DEFINE_LED_TRIGGER_GLOBAL(x) struct led_trigger *x;
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun #ifdef CONFIG_LEDS_TRIGGERS
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun #define TRIG_NAME_MAX 50
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun struct led_trigger {
350*4882a593Smuzhiyun /* Trigger Properties */
351*4882a593Smuzhiyun const char *name;
352*4882a593Smuzhiyun int (*activate)(struct led_classdev *led_cdev);
353*4882a593Smuzhiyun void (*deactivate)(struct led_classdev *led_cdev);
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun /* LED-private triggers have this set */
356*4882a593Smuzhiyun struct led_hw_trigger_type *trigger_type;
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun /* LEDs under control by this trigger (for simple triggers) */
359*4882a593Smuzhiyun rwlock_t leddev_list_lock;
360*4882a593Smuzhiyun struct list_head led_cdevs;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun /* Link to next registered trigger */
363*4882a593Smuzhiyun struct list_head next_trig;
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun const struct attribute_group **groups;
366*4882a593Smuzhiyun };
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun /*
369*4882a593Smuzhiyun * Currently the attributes in struct led_trigger::groups are added directly to
370*4882a593Smuzhiyun * the LED device. As this might change in the future, the following
371*4882a593Smuzhiyun * macros abstract getting the LED device and its trigger_data from the dev
372*4882a593Smuzhiyun * parameter passed to the attribute accessor functions.
373*4882a593Smuzhiyun */
374*4882a593Smuzhiyun #define led_trigger_get_led(dev) ((struct led_classdev *)dev_get_drvdata((dev)))
375*4882a593Smuzhiyun #define led_trigger_get_drvdata(dev) (led_get_trigger_data(led_trigger_get_led(dev)))
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun /* Registration functions for complex triggers */
378*4882a593Smuzhiyun int led_trigger_register(struct led_trigger *trigger);
379*4882a593Smuzhiyun void led_trigger_unregister(struct led_trigger *trigger);
380*4882a593Smuzhiyun int devm_led_trigger_register(struct device *dev,
381*4882a593Smuzhiyun struct led_trigger *trigger);
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun void led_trigger_register_simple(const char *name,
384*4882a593Smuzhiyun struct led_trigger **trigger);
385*4882a593Smuzhiyun void led_trigger_unregister_simple(struct led_trigger *trigger);
386*4882a593Smuzhiyun void led_trigger_event(struct led_trigger *trigger, enum led_brightness event);
387*4882a593Smuzhiyun void led_trigger_blink(struct led_trigger *trigger, unsigned long *delay_on,
388*4882a593Smuzhiyun unsigned long *delay_off);
389*4882a593Smuzhiyun void led_trigger_blink_oneshot(struct led_trigger *trigger,
390*4882a593Smuzhiyun unsigned long *delay_on,
391*4882a593Smuzhiyun unsigned long *delay_off,
392*4882a593Smuzhiyun int invert);
393*4882a593Smuzhiyun void led_trigger_set_default(struct led_classdev *led_cdev);
394*4882a593Smuzhiyun int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger);
395*4882a593Smuzhiyun void led_trigger_remove(struct led_classdev *led_cdev);
396*4882a593Smuzhiyun
led_set_trigger_data(struct led_classdev * led_cdev,void * trigger_data)397*4882a593Smuzhiyun static inline void led_set_trigger_data(struct led_classdev *led_cdev,
398*4882a593Smuzhiyun void *trigger_data)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun led_cdev->trigger_data = trigger_data;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun
led_get_trigger_data(struct led_classdev * led_cdev)403*4882a593Smuzhiyun static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun return led_cdev->trigger_data;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun /**
409*4882a593Smuzhiyun * led_trigger_rename_static - rename a trigger
410*4882a593Smuzhiyun * @name: the new trigger name
411*4882a593Smuzhiyun * @trig: the LED trigger to rename
412*4882a593Smuzhiyun *
413*4882a593Smuzhiyun * Change a LED trigger name by copying the string passed in
414*4882a593Smuzhiyun * name into current trigger name, which MUST be large
415*4882a593Smuzhiyun * enough for the new string.
416*4882a593Smuzhiyun *
417*4882a593Smuzhiyun * Note that name must NOT point to the same string used
418*4882a593Smuzhiyun * during LED registration, as that could lead to races.
419*4882a593Smuzhiyun *
420*4882a593Smuzhiyun * This is meant to be used on triggers with statically
421*4882a593Smuzhiyun * allocated name.
422*4882a593Smuzhiyun */
423*4882a593Smuzhiyun void led_trigger_rename_static(const char *name, struct led_trigger *trig);
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun #define module_led_trigger(__led_trigger) \
426*4882a593Smuzhiyun module_driver(__led_trigger, led_trigger_register, \
427*4882a593Smuzhiyun led_trigger_unregister)
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun #else
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun /* Trigger has no members */
432*4882a593Smuzhiyun struct led_trigger {};
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun /* Trigger inline empty functions */
led_trigger_register_simple(const char * name,struct led_trigger ** trigger)435*4882a593Smuzhiyun static inline void led_trigger_register_simple(const char *name,
436*4882a593Smuzhiyun struct led_trigger **trigger) {}
led_trigger_unregister_simple(struct led_trigger * trigger)437*4882a593Smuzhiyun static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {}
led_trigger_event(struct led_trigger * trigger,enum led_brightness event)438*4882a593Smuzhiyun static inline void led_trigger_event(struct led_trigger *trigger,
439*4882a593Smuzhiyun enum led_brightness event) {}
led_trigger_blink(struct led_trigger * trigger,unsigned long * delay_on,unsigned long * delay_off)440*4882a593Smuzhiyun static inline void led_trigger_blink(struct led_trigger *trigger,
441*4882a593Smuzhiyun unsigned long *delay_on,
442*4882a593Smuzhiyun unsigned long *delay_off) {}
led_trigger_blink_oneshot(struct led_trigger * trigger,unsigned long * delay_on,unsigned long * delay_off,int invert)443*4882a593Smuzhiyun static inline void led_trigger_blink_oneshot(struct led_trigger *trigger,
444*4882a593Smuzhiyun unsigned long *delay_on,
445*4882a593Smuzhiyun unsigned long *delay_off,
446*4882a593Smuzhiyun int invert) {}
led_trigger_set_default(struct led_classdev * led_cdev)447*4882a593Smuzhiyun static inline void led_trigger_set_default(struct led_classdev *led_cdev) {}
led_trigger_set(struct led_classdev * led_cdev,struct led_trigger * trigger)448*4882a593Smuzhiyun static inline int led_trigger_set(struct led_classdev *led_cdev,
449*4882a593Smuzhiyun struct led_trigger *trigger)
450*4882a593Smuzhiyun {
451*4882a593Smuzhiyun return 0;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
led_trigger_remove(struct led_classdev * led_cdev)454*4882a593Smuzhiyun static inline void led_trigger_remove(struct led_classdev *led_cdev) {}
led_set_trigger_data(struct led_classdev * led_cdev)455*4882a593Smuzhiyun static inline void led_set_trigger_data(struct led_classdev *led_cdev) {}
led_get_trigger_data(struct led_classdev * led_cdev)456*4882a593Smuzhiyun static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun return NULL;
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun #endif /* CONFIG_LEDS_TRIGGERS */
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun /* Trigger specific functions */
464*4882a593Smuzhiyun #ifdef CONFIG_LEDS_TRIGGER_DISK
465*4882a593Smuzhiyun void ledtrig_disk_activity(bool write);
466*4882a593Smuzhiyun #else
ledtrig_disk_activity(bool write)467*4882a593Smuzhiyun static inline void ledtrig_disk_activity(bool write) {}
468*4882a593Smuzhiyun #endif
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun #ifdef CONFIG_LEDS_TRIGGER_MTD
471*4882a593Smuzhiyun void ledtrig_mtd_activity(void);
472*4882a593Smuzhiyun #else
ledtrig_mtd_activity(void)473*4882a593Smuzhiyun static inline void ledtrig_mtd_activity(void) {}
474*4882a593Smuzhiyun #endif
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun #if defined(CONFIG_LEDS_TRIGGER_CAMERA) || defined(CONFIG_LEDS_TRIGGER_CAMERA_MODULE)
477*4882a593Smuzhiyun void ledtrig_flash_ctrl(bool on);
478*4882a593Smuzhiyun void ledtrig_torch_ctrl(bool on);
479*4882a593Smuzhiyun #else
ledtrig_flash_ctrl(bool on)480*4882a593Smuzhiyun static inline void ledtrig_flash_ctrl(bool on) {}
ledtrig_torch_ctrl(bool on)481*4882a593Smuzhiyun static inline void ledtrig_torch_ctrl(bool on) {}
482*4882a593Smuzhiyun #endif
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun /*
485*4882a593Smuzhiyun * Generic LED platform data for describing LED names and default triggers.
486*4882a593Smuzhiyun */
487*4882a593Smuzhiyun struct led_info {
488*4882a593Smuzhiyun const char *name;
489*4882a593Smuzhiyun const char *default_trigger;
490*4882a593Smuzhiyun int flags;
491*4882a593Smuzhiyun };
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun struct led_platform_data {
494*4882a593Smuzhiyun int num_leds;
495*4882a593Smuzhiyun struct led_info *leds;
496*4882a593Smuzhiyun };
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun struct led_properties {
499*4882a593Smuzhiyun u32 color;
500*4882a593Smuzhiyun bool color_present;
501*4882a593Smuzhiyun const char *function;
502*4882a593Smuzhiyun u32 func_enum;
503*4882a593Smuzhiyun bool func_enum_present;
504*4882a593Smuzhiyun const char *label;
505*4882a593Smuzhiyun };
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun struct gpio_desc;
508*4882a593Smuzhiyun typedef int (*gpio_blink_set_t)(struct gpio_desc *desc, int state,
509*4882a593Smuzhiyun unsigned long *delay_on,
510*4882a593Smuzhiyun unsigned long *delay_off);
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun /* For the leds-gpio driver */
513*4882a593Smuzhiyun struct gpio_led {
514*4882a593Smuzhiyun const char *name;
515*4882a593Smuzhiyun const char *default_trigger;
516*4882a593Smuzhiyun unsigned gpio;
517*4882a593Smuzhiyun unsigned active_low : 1;
518*4882a593Smuzhiyun unsigned retain_state_suspended : 1;
519*4882a593Smuzhiyun unsigned panic_indicator : 1;
520*4882a593Smuzhiyun unsigned default_state : 2;
521*4882a593Smuzhiyun unsigned retain_state_shutdown : 1;
522*4882a593Smuzhiyun /* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
523*4882a593Smuzhiyun struct gpio_desc *gpiod;
524*4882a593Smuzhiyun };
525*4882a593Smuzhiyun #define LEDS_GPIO_DEFSTATE_OFF 0
526*4882a593Smuzhiyun #define LEDS_GPIO_DEFSTATE_ON 1
527*4882a593Smuzhiyun #define LEDS_GPIO_DEFSTATE_KEEP 2
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun struct gpio_led_platform_data {
530*4882a593Smuzhiyun int num_leds;
531*4882a593Smuzhiyun const struct gpio_led *leds;
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun #define GPIO_LED_NO_BLINK_LOW 0 /* No blink GPIO state low */
534*4882a593Smuzhiyun #define GPIO_LED_NO_BLINK_HIGH 1 /* No blink GPIO state high */
535*4882a593Smuzhiyun #define GPIO_LED_BLINK 2 /* Please, blink */
536*4882a593Smuzhiyun gpio_blink_set_t gpio_blink_set;
537*4882a593Smuzhiyun };
538*4882a593Smuzhiyun
539*4882a593Smuzhiyun #ifdef CONFIG_NEW_LEDS
540*4882a593Smuzhiyun struct platform_device *gpio_led_register_device(
541*4882a593Smuzhiyun int id, const struct gpio_led_platform_data *pdata);
542*4882a593Smuzhiyun #else
gpio_led_register_device(int id,const struct gpio_led_platform_data * pdata)543*4882a593Smuzhiyun static inline struct platform_device *gpio_led_register_device(
544*4882a593Smuzhiyun int id, const struct gpio_led_platform_data *pdata)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun return 0;
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun #endif
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun enum cpu_led_event {
551*4882a593Smuzhiyun CPU_LED_IDLE_START, /* CPU enters idle */
552*4882a593Smuzhiyun CPU_LED_IDLE_END, /* CPU idle ends */
553*4882a593Smuzhiyun CPU_LED_START, /* Machine starts, especially resume */
554*4882a593Smuzhiyun CPU_LED_STOP, /* Machine stops, especially suspend */
555*4882a593Smuzhiyun CPU_LED_HALTED, /* Machine shutdown */
556*4882a593Smuzhiyun };
557*4882a593Smuzhiyun #ifdef CONFIG_LEDS_TRIGGER_CPU
558*4882a593Smuzhiyun void ledtrig_cpu(enum cpu_led_event evt);
559*4882a593Smuzhiyun #else
ledtrig_cpu(enum cpu_led_event evt)560*4882a593Smuzhiyun static inline void ledtrig_cpu(enum cpu_led_event evt)
561*4882a593Smuzhiyun {
562*4882a593Smuzhiyun return;
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun #endif
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
567*4882a593Smuzhiyun void led_classdev_notify_brightness_hw_changed(
568*4882a593Smuzhiyun struct led_classdev *led_cdev, enum led_brightness brightness);
569*4882a593Smuzhiyun #else
led_classdev_notify_brightness_hw_changed(struct led_classdev * led_cdev,enum led_brightness brightness)570*4882a593Smuzhiyun static inline void led_classdev_notify_brightness_hw_changed(
571*4882a593Smuzhiyun struct led_classdev *led_cdev, enum led_brightness brightness) { }
572*4882a593Smuzhiyun #endif
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun /**
575*4882a593Smuzhiyun * struct led_pattern - pattern interval settings
576*4882a593Smuzhiyun * @delta_t: pattern interval delay, in milliseconds
577*4882a593Smuzhiyun * @brightness: pattern interval brightness
578*4882a593Smuzhiyun */
579*4882a593Smuzhiyun struct led_pattern {
580*4882a593Smuzhiyun u32 delta_t;
581*4882a593Smuzhiyun int brightness;
582*4882a593Smuzhiyun };
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun enum led_audio {
585*4882a593Smuzhiyun LED_AUDIO_MUTE, /* master mute LED */
586*4882a593Smuzhiyun LED_AUDIO_MICMUTE, /* mic mute LED */
587*4882a593Smuzhiyun NUM_AUDIO_LEDS
588*4882a593Smuzhiyun };
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_LEDS_TRIGGER_AUDIO)
591*4882a593Smuzhiyun enum led_brightness ledtrig_audio_get(enum led_audio type);
592*4882a593Smuzhiyun void ledtrig_audio_set(enum led_audio type, enum led_brightness state);
593*4882a593Smuzhiyun #else
ledtrig_audio_get(enum led_audio type)594*4882a593Smuzhiyun static inline enum led_brightness ledtrig_audio_get(enum led_audio type)
595*4882a593Smuzhiyun {
596*4882a593Smuzhiyun return LED_OFF;
597*4882a593Smuzhiyun }
ledtrig_audio_set(enum led_audio type,enum led_brightness state)598*4882a593Smuzhiyun static inline void ledtrig_audio_set(enum led_audio type,
599*4882a593Smuzhiyun enum led_brightness state)
600*4882a593Smuzhiyun {
601*4882a593Smuzhiyun }
602*4882a593Smuzhiyun #endif
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun #endif /* __LINUX_LEDS_H_INCLUDED */
605