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

leds: Introduce devres helper for led_classdev_register

(cooloney@gmail.com: add _unregister function into the document)

Suggested-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>

authored by

Bjorn Andersson and committed by
Bryan Wu
ca1bb4ee eb2294c3

+65
+4
Documentation/driver-model/devres.txt
··· 289 289 devm_request_irq() 290 290 devm_request_threaded_irq() 291 291 292 + LED 293 + devm_led_classdev_register() 294 + devm_led_classdev_unregister() 295 + 292 296 MDIO 293 297 devm_mdiobus_alloc() 294 298 devm_mdiobus_alloc_size()
+57
drivers/leds/led-class.c
··· 288 288 } 289 289 EXPORT_SYMBOL_GPL(led_classdev_unregister); 290 290 291 + static void devm_led_classdev_release(struct device *dev, void *res) 292 + { 293 + led_classdev_unregister(*(struct led_classdev **)res); 294 + } 295 + 296 + /** 297 + * devm_led_classdev_register - resource managed led_classdev_register() 298 + * @parent: The device to register. 299 + * @led_cdev: the led_classdev structure for this device. 300 + */ 301 + int devm_led_classdev_register(struct device *parent, 302 + struct led_classdev *led_cdev) 303 + { 304 + struct led_classdev **dr; 305 + int rc; 306 + 307 + dr = devres_alloc(devm_led_classdev_release, sizeof(*dr), GFP_KERNEL); 308 + if (!dr) 309 + return -ENOMEM; 310 + 311 + rc = led_classdev_register(parent, led_cdev); 312 + if (rc) { 313 + devres_free(dr); 314 + return rc; 315 + } 316 + 317 + *dr = led_cdev; 318 + devres_add(parent, dr); 319 + 320 + return 0; 321 + } 322 + EXPORT_SYMBOL_GPL(devm_led_classdev_register); 323 + 324 + static int devm_led_classdev_match(struct device *dev, void *res, void *data) 325 + { 326 + struct led_cdev **p = res; 327 + 328 + if (WARN_ON(!p || !*p)) 329 + return 0; 330 + 331 + return *p == data; 332 + } 333 + 334 + /** 335 + * devm_led_classdev_unregister() - resource managed led_classdev_unregister() 336 + * @parent: The device to unregister. 337 + * @led_cdev: the led_classdev structure for this device. 338 + */ 339 + void devm_led_classdev_unregister(struct device *dev, 340 + struct led_classdev *led_cdev) 341 + { 342 + WARN_ON(devres_release(dev, 343 + devm_led_classdev_release, 344 + devm_led_classdev_match, led_cdev)); 345 + } 346 + EXPORT_SYMBOL_GPL(devm_led_classdev_unregister); 347 + 291 348 static int __init leds_init(void) 292 349 { 293 350 leds_class = class_create(THIS_MODULE, "leds");
+4
include/linux/leds.h
··· 105 105 106 106 extern int led_classdev_register(struct device *parent, 107 107 struct led_classdev *led_cdev); 108 + extern int devm_led_classdev_register(struct device *parent, 109 + struct led_classdev *led_cdev); 108 110 extern void led_classdev_unregister(struct led_classdev *led_cdev); 111 + extern void devm_led_classdev_unregister(struct device *parent, 112 + struct led_classdev *led_cdev); 109 113 extern void led_classdev_suspend(struct led_classdev *led_cdev); 110 114 extern void led_classdev_resume(struct led_classdev *led_cdev); 111 115