Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: triggers: add device attribute support

As many triggers use device attributes, add support for these in
led_trigger_set which allows simplifying the drivers accordingly.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>

authored by

Uwe Kleine-König and committed by
Jacek Anaszewski
a7e7a315 2282e125

+23
+12
drivers/leds/led-triggers.c
··· 127 127 led_stop_software_blink(led_cdev); 128 128 if (led_cdev->trigger->deactivate) 129 129 led_cdev->trigger->deactivate(led_cdev); 130 + device_remove_groups(led_cdev->dev, led_cdev->trigger->groups); 130 131 led_cdev->trigger = NULL; 131 132 led_set_brightness(led_cdev, LED_OFF); 132 133 } ··· 144 143 145 144 if (ret) 146 145 goto err_activate; 146 + 147 + ret = device_add_groups(led_cdev->dev, trig->groups); 148 + if (ret) { 149 + dev_err(led_cdev->dev, "Failed to add trigger attributes\n"); 150 + goto err_add_groups; 151 + } 147 152 } 148 153 149 154 if (event) { ··· 163 156 164 157 return 0; 165 158 159 + err_add_groups: 160 + 161 + if (trig->deactivate) 162 + trig->deactivate(led_cdev); 166 163 err_activate: 164 + 167 165 led_cdev->trigger = NULL; 168 166 write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags); 169 167 list_del(&led_cdev->trig_list);
+11
include/linux/leds.h
··· 262 262 263 263 /* Link to next registered trigger */ 264 264 struct list_head next_trig; 265 + 266 + const struct attribute_group **groups; 265 267 }; 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))) 266 277 267 278 ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr, 268 279 const char *buf, size_t count);