diff options
| author | Bjorn Andersson <bjorn.andersson@sonymobile.com> | 2015-02-23 19:11:41 -0500 |
|---|---|---|
| committer | Bryan Wu <cooloney@gmail.com> | 2015-03-09 16:43:41 -0400 |
| commit | ca1bb4ee4c3a017bb66840d11d5efdf4e8f3f66d (patch) | |
| tree | eb9a3f0c441f5b1559b24eaf3ac9a296b03e7184 | |
| parent | eb2294c3432fb6366ec12b56a3b2a12cf4242b69 (diff) | |
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>
| -rw-r--r-- | Documentation/driver-model/devres.txt | 4 | ||||
| -rw-r--r-- | drivers/leds/led-class.c | 57 | ||||
| -rw-r--r-- | include/linux/leds.h | 4 |
3 files changed, 65 insertions, 0 deletions
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index 6d1e8eeb5990..e1e2bbd7a404 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt | |||
| @@ -289,6 +289,10 @@ IRQ | |||
| 289 | devm_request_irq() | 289 | devm_request_irq() |
| 290 | devm_request_threaded_irq() | 290 | devm_request_threaded_irq() |
| 291 | 291 | ||
| 292 | LED | ||
| 293 | devm_led_classdev_register() | ||
| 294 | devm_led_classdev_unregister() | ||
| 295 | |||
| 292 | MDIO | 296 | MDIO |
| 293 | devm_mdiobus_alloc() | 297 | devm_mdiobus_alloc() |
| 294 | devm_mdiobus_alloc_size() | 298 | devm_mdiobus_alloc_size() |
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c index 795ec994c663..768d33a79881 100644 --- a/drivers/leds/led-class.c +++ b/drivers/leds/led-class.c | |||
| @@ -288,6 +288,63 @@ void led_classdev_unregister(struct led_classdev *led_cdev) | |||
| 288 | } | 288 | } |
| 289 | EXPORT_SYMBOL_GPL(led_classdev_unregister); | 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 | static int __init leds_init(void) | 348 | static int __init leds_init(void) |
| 292 | { | 349 | { |
| 293 | leds_class = class_create(THIS_MODULE, "leds"); | 350 | leds_class = class_create(THIS_MODULE, "leds"); |
diff --git a/include/linux/leds.h b/include/linux/leds.h index f70f84f35674..ed634279062e 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h | |||
| @@ -105,7 +105,11 @@ struct led_classdev { | |||
| 105 | 105 | ||
| 106 | extern int led_classdev_register(struct device *parent, | 106 | extern int led_classdev_register(struct device *parent, |
| 107 | struct led_classdev *led_cdev); | 107 | struct led_classdev *led_cdev); |
| 108 | extern int devm_led_classdev_register(struct device *parent, | ||
| 109 | struct led_classdev *led_cdev); | ||
| 108 | extern void led_classdev_unregister(struct led_classdev *led_cdev); | 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 | extern void led_classdev_suspend(struct led_classdev *led_cdev); | 113 | extern void led_classdev_suspend(struct led_classdev *led_cdev); |
| 110 | extern void led_classdev_resume(struct led_classdev *led_cdev); | 114 | extern void led_classdev_resume(struct led_classdev *led_cdev); |
| 111 | 115 | ||
