xref: /linux-6.15/include/linux/leds.h (revision e73173db)
1 /*
2  * Driver model for leds and led triggers
3  *
4  * Copyright (C) 2005 John Lenz <[email protected]>
5  * Copyright (C) 2005 Richard Purdie <[email protected]>
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  *
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 
19 struct device;
20 /*
21  * LED Core
22  */
23 
24 enum led_brightness {
25 	LED_OFF		= 0,
26 	LED_HALF	= 127,
27 	LED_FULL	= 255,
28 };
29 
30 struct led_classdev {
31 	const char		*name;
32 	int			 brightness;
33 	int			 max_brightness;
34 	int			 flags;
35 
36 	/* Lower 16 bits reflect status */
37 #define LED_SUSPENDED		(1 << 0)
38 	/* Upper 16 bits reflect control information */
39 #define LED_CORE_SUSPENDRESUME	(1 << 16)
40 
41 	/* Set LED brightness level */
42 	/* Must not sleep, use a workqueue if needed */
43 	void		(*brightness_set)(struct led_classdev *led_cdev,
44 					  enum led_brightness brightness);
45 	/* Get LED brightness level */
46 	enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
47 
48 	/* Activate hardware accelerated blink */
49 	int		(*blink_set)(struct led_classdev *led_cdev,
50 				     unsigned long *delay_on,
51 				     unsigned long *delay_off);
52 
53 	struct device		*dev;
54 	struct list_head	 node;			/* LED Device list */
55 	const char		*default_trigger;	/* Trigger to use */
56 
57 #ifdef CONFIG_LEDS_TRIGGERS
58 	/* Protects the trigger data below */
59 	struct rw_semaphore	 trigger_lock;
60 
61 	struct led_trigger	*trigger;
62 	struct list_head	 trig_list;
63 	void			*trigger_data;
64 #endif
65 };
66 
67 extern int led_classdev_register(struct device *parent,
68 				 struct led_classdev *led_cdev);
69 extern void led_classdev_unregister(struct led_classdev *led_cdev);
70 extern void led_classdev_suspend(struct led_classdev *led_cdev);
71 extern void led_classdev_resume(struct led_classdev *led_cdev);
72 
73 /*
74  * LED Triggers
75  */
76 #ifdef CONFIG_LEDS_TRIGGERS
77 
78 #define TRIG_NAME_MAX 50
79 
80 struct led_trigger {
81 	/* Trigger Properties */
82 	const char	 *name;
83 	void		(*activate)(struct led_classdev *led_cdev);
84 	void		(*deactivate)(struct led_classdev *led_cdev);
85 
86 	/* LEDs under control by this trigger (for simple triggers) */
87 	rwlock_t	  leddev_list_lock;
88 	struct list_head  led_cdevs;
89 
90 	/* Link to next registered trigger */
91 	struct list_head  next_trig;
92 };
93 
94 /* Registration functions for complex triggers */
95 extern int led_trigger_register(struct led_trigger *trigger);
96 extern void led_trigger_unregister(struct led_trigger *trigger);
97 
98 /* Registration functions for simple triggers */
99 #define DEFINE_LED_TRIGGER(x)		static struct led_trigger *x;
100 #define DEFINE_LED_TRIGGER_GLOBAL(x)	struct led_trigger *x;
101 extern void led_trigger_register_simple(const char *name,
102 				struct led_trigger **trigger);
103 extern void led_trigger_unregister_simple(struct led_trigger *trigger);
104 extern void led_trigger_event(struct led_trigger *trigger,
105 				enum led_brightness event);
106 
107 #else
108 
109 /* Triggers aren't active - null macros */
110 #define DEFINE_LED_TRIGGER(x)
111 #define DEFINE_LED_TRIGGER_GLOBAL(x)
112 #define led_trigger_register_simple(x, y) do {} while(0)
113 #define led_trigger_unregister_simple(x) do {} while(0)
114 #define led_trigger_event(x, y) do {} while(0)
115 
116 #endif
117 
118 /* Trigger specific functions */
119 #ifdef CONFIG_LEDS_TRIGGER_IDE_DISK
120 extern void ledtrig_ide_activity(void);
121 #else
122 #define ledtrig_ide_activity() do {} while(0)
123 #endif
124 
125 /*
126  * Generic LED platform data for describing LED names and default triggers.
127  */
128 struct led_info {
129 	const char	*name;
130 	const char	*default_trigger;
131 	int		flags;
132 };
133 
134 struct led_platform_data {
135 	int		num_leds;
136 	struct led_info	*leds;
137 };
138 
139 /* For the leds-gpio driver */
140 struct gpio_led {
141 	const char *name;
142 	const char *default_trigger;
143 	unsigned 	gpio;
144 	u8 		active_low : 1;
145 	u8		retain_state_suspended : 1;
146 };
147 
148 struct gpio_led_platform_data {
149 	int 		num_leds;
150 	struct gpio_led *leds;
151 	int		(*gpio_blink_set)(unsigned gpio,
152 					unsigned long *delay_on,
153 					unsigned long *delay_off);
154 };
155 
156 
157 #endif		/* __LINUX_LEDS_H_INCLUDED */
158