aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-08-14 16:07:22 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-14 16:07:22 -0400
commitc07b3682cd12a017f976ec63bbd4758dc4c5100e (patch)
treed158994137113f31a30feadaae80d3c5d7109a26 /include
parent4d88e3d24905eafa98cef0fc29365649ad8977b5 (diff)
parent2224f2ff9670b899983ff1b42d85530e889cfea1 (diff)
Merge tag 'leds-for-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds
Pull LED updates from Jacek Anaszewski: "LED triggers improvements make the biggest part of this pull request. The most striking ones, that allowed for nice cleanups in the triggers are: - centralized handling of creation and removal of trigger sysfs attributes via attribute group - addition of module_led_trigger() helper The other things that need to be mentioned: New features and improvements to existing LED class drivers: - lt3593: add DT support, switch to gpiod interface - lm3692x: support LED sync configuration, change OF calls to fwnode calls - apu: modify PC Engines apu/apu2 driver to support apu3 Change in the drivers/net/can/led.c: - mark led trigger as broken since it's in the way for the further cleanups. It implements a subset of the netdev trigger and an Ack is needed from someone who can actually test and confirm that the netdev trigger works for can devices" * tag 'leds-for-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds: (32 commits) leds: ns2: Change unsigned to unsigned int usb: simplify usbport trigger leds: gpio trigger: simplifications from core changes leds: backlight trigger: simplifications from core changes leds: activity trigger: simplifications from core changes leds: default-on trigger: make use of module_led_trigger() leds: heartbeat trigger: simplifications from core changes leds: oneshot trigger: simplifications from core changes leds: transient trigger: simplifications from core changes leds: timer trigger: simplifications from core changes leds: netdev trigger: simplifications from core changes leds: triggers: new function led_set_trigger_data() leds: triggers: define module_led_trigger helper leds: triggers: handle .trigger_data and .activated() in the core leds: triggers: add device attribute support leds: triggers: let struct led_trigger::activate() return an error code leds: triggers: make the MODULE_LICENSE string match the actual license leds: lm3692x: Support LED sync configuration dt: bindings: lm3692x: Update binding for LED sync control leds: lm3692x: Change DT calls to fwnode calls ...
Diffstat (limited to 'include')
-rw-r--r--include/linux/leds.h36
1 files changed, 31 insertions, 5 deletions
diff --git a/include/linux/leds.h b/include/linux/leds.h
index b7e82550e655..834683d603f9 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -253,7 +253,7 @@ static inline bool led_sysfs_is_disabled(struct led_classdev *led_cdev)
253struct led_trigger { 253struct led_trigger {
254 /* Trigger Properties */ 254 /* Trigger Properties */
255 const char *name; 255 const char *name;
256 void (*activate)(struct led_classdev *led_cdev); 256 int (*activate)(struct led_classdev *led_cdev);
257 void (*deactivate)(struct led_classdev *led_cdev); 257 void (*deactivate)(struct led_classdev *led_cdev);
258 258
259 /* LEDs under control by this trigger (for simple triggers) */ 259 /* LEDs under control by this trigger (for simple triggers) */
@@ -262,8 +262,19 @@ struct led_trigger {
262 262
263 /* Link to next registered trigger */ 263 /* Link to next registered trigger */
264 struct list_head next_trig; 264 struct list_head next_trig;
265
266 const struct attribute_group **groups;
265}; 267};
266 268
269/*
270 * Currently the attributes in struct led_trigger::groups are added directly to
271 * the LED device. As this might change in the future, the following
272 * macros abstract getting the LED device and its trigger_data from the dev
273 * parameter passed to the attribute accessor functions.
274 */
275#define led_trigger_get_led(dev) ((struct led_classdev *)dev_get_drvdata((dev)))
276#define led_trigger_get_drvdata(dev) (led_get_trigger_data(led_trigger_get_led(dev)))
277
267ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr, 278ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr,
268 const char *buf, size_t count); 279 const char *buf, size_t count);
269ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr, 280ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr,
@@ -288,10 +299,16 @@ extern void led_trigger_blink_oneshot(struct led_trigger *trigger,
288 unsigned long *delay_off, 299 unsigned long *delay_off,
289 int invert); 300 int invert);
290extern void led_trigger_set_default(struct led_classdev *led_cdev); 301extern void led_trigger_set_default(struct led_classdev *led_cdev);
291extern void led_trigger_set(struct led_classdev *led_cdev, 302extern int led_trigger_set(struct led_classdev *led_cdev,
292 struct led_trigger *trigger); 303 struct led_trigger *trigger);
293extern void led_trigger_remove(struct led_classdev *led_cdev); 304extern void led_trigger_remove(struct led_classdev *led_cdev);
294 305
306static inline void led_set_trigger_data(struct led_classdev *led_cdev,
307 void *trigger_data)
308{
309 led_cdev->trigger_data = trigger_data;
310}
311
295static inline void *led_get_trigger_data(struct led_classdev *led_cdev) 312static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
296{ 313{
297 return led_cdev->trigger_data; 314 return led_cdev->trigger_data;
@@ -315,6 +332,10 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
315extern void led_trigger_rename_static(const char *name, 332extern void led_trigger_rename_static(const char *name,
316 struct led_trigger *trig); 333 struct led_trigger *trig);
317 334
335#define module_led_trigger(__led_trigger) \
336 module_driver(__led_trigger, led_trigger_register, \
337 led_trigger_unregister)
338
318#else 339#else
319 340
320/* Trigger has no members */ 341/* Trigger has no members */
@@ -334,9 +355,14 @@ static inline void led_trigger_blink_oneshot(struct led_trigger *trigger,
334 unsigned long *delay_off, 355 unsigned long *delay_off,
335 int invert) {} 356 int invert) {}
336static inline void led_trigger_set_default(struct led_classdev *led_cdev) {} 357static inline void led_trigger_set_default(struct led_classdev *led_cdev) {}
337static inline void led_trigger_set(struct led_classdev *led_cdev, 358static inline int led_trigger_set(struct led_classdev *led_cdev,
338 struct led_trigger *trigger) {} 359 struct led_trigger *trigger)
360{
361 return 0;
362}
363
339static inline void led_trigger_remove(struct led_classdev *led_cdev) {} 364static inline void led_trigger_remove(struct led_classdev *led_cdev) {}
365static inline void led_set_trigger_data(struct led_classdev *led_cdev) {}
340static inline void *led_get_trigger_data(struct led_classdev *led_cdev) 366static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
341{ 367{
342 return NULL; 368 return NULL;