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>
This commit is contained in:
parent
eb2294c343
commit
ca1bb4ee4c
|
@ -289,6 +289,10 @@ IRQ
|
|||
devm_request_irq()
|
||||
devm_request_threaded_irq()
|
||||
|
||||
LED
|
||||
devm_led_classdev_register()
|
||||
devm_led_classdev_unregister()
|
||||
|
||||
MDIO
|
||||
devm_mdiobus_alloc()
|
||||
devm_mdiobus_alloc_size()
|
||||
|
|
|
@ -288,6 +288,63 @@ void led_classdev_unregister(struct led_classdev *led_cdev)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(led_classdev_unregister);
|
||||
|
||||
static void devm_led_classdev_release(struct device *dev, void *res)
|
||||
{
|
||||
led_classdev_unregister(*(struct led_classdev **)res);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_led_classdev_register - resource managed led_classdev_register()
|
||||
* @parent: The device to register.
|
||||
* @led_cdev: the led_classdev structure for this device.
|
||||
*/
|
||||
int devm_led_classdev_register(struct device *parent,
|
||||
struct led_classdev *led_cdev)
|
||||
{
|
||||
struct led_classdev **dr;
|
||||
int rc;
|
||||
|
||||
dr = devres_alloc(devm_led_classdev_release, sizeof(*dr), GFP_KERNEL);
|
||||
if (!dr)
|
||||
return -ENOMEM;
|
||||
|
||||
rc = led_classdev_register(parent, led_cdev);
|
||||
if (rc) {
|
||||
devres_free(dr);
|
||||
return rc;
|
||||
}
|
||||
|
||||
*dr = led_cdev;
|
||||
devres_add(parent, dr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_led_classdev_register);
|
||||
|
||||
static int devm_led_classdev_match(struct device *dev, void *res, void *data)
|
||||
{
|
||||
struct led_cdev **p = res;
|
||||
|
||||
if (WARN_ON(!p || !*p))
|
||||
return 0;
|
||||
|
||||
return *p == data;
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_led_classdev_unregister() - resource managed led_classdev_unregister()
|
||||
* @parent: The device to unregister.
|
||||
* @led_cdev: the led_classdev structure for this device.
|
||||
*/
|
||||
void devm_led_classdev_unregister(struct device *dev,
|
||||
struct led_classdev *led_cdev)
|
||||
{
|
||||
WARN_ON(devres_release(dev,
|
||||
devm_led_classdev_release,
|
||||
devm_led_classdev_match, led_cdev));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_led_classdev_unregister);
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
leds_class = class_create(THIS_MODULE, "leds");
|
||||
|
|
|
@ -105,7 +105,11 @@ struct led_classdev {
|
|||
|
||||
extern int led_classdev_register(struct device *parent,
|
||||
struct led_classdev *led_cdev);
|
||||
extern int devm_led_classdev_register(struct device *parent,
|
||||
struct led_classdev *led_cdev);
|
||||
extern void led_classdev_unregister(struct led_classdev *led_cdev);
|
||||
extern void devm_led_classdev_unregister(struct device *parent,
|
||||
struct led_classdev *led_cdev);
|
||||
extern void led_classdev_suspend(struct led_classdev *led_cdev);
|
||||
extern void led_classdev_resume(struct led_classdev *led_cdev);
|
||||
|
||||
|
|
Loading…
Reference in New Issue