Skip to content

Commit

Permalink
leds: core: add OF variants of LED registering functions
Browse files Browse the repository at this point in the history
These new functions allow passing an additional device_node argument
that will be internally set for created LED device. Thanks to this LED
core code and triggers will be able to access DT node for reading extra
info.

The easiest solution for achieving this was reworking old functions to
more generic ones & adding simple defines for API compatibility.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
  • Loading branch information
Rafał Miłecki authored and Jacek Anaszewski committed Mar 8, 2017
1 parent ab76838 commit 442c609
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 14 deletions.
26 changes: 16 additions & 10 deletions drivers/leds/led-class.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,11 +244,14 @@ static int led_classdev_next_name(const char *init_name, char *name,
}

/**
* led_classdev_register - register a new object of led_classdev class.
* @parent: The device to register.
* of_led_classdev_register - register a new object of led_classdev class.
*
* @parent: parent of LED device
* @led_cdev: the led_classdev structure for this device.
* @np: DT node describing this LED
*/
int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
int of_led_classdev_register(struct device *parent, struct device_node *np,
struct led_classdev *led_cdev)
{
char name[LED_MAX_NAME_SIZE];
int ret;
Expand All @@ -261,6 +264,7 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
led_cdev, led_cdev->groups, "%s", name);
if (IS_ERR(led_cdev->dev))
return PTR_ERR(led_cdev->dev);
led_cdev->dev->of_node = np;

if (ret)
dev_warn(parent, "Led %s renamed to %s due to name collision",
Expand Down Expand Up @@ -303,7 +307,7 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)

return 0;
}
EXPORT_SYMBOL_GPL(led_classdev_register);
EXPORT_SYMBOL_GPL(of_led_classdev_register);

/**
* led_classdev_unregister - unregisters a object of led_properties class.
Expand Down Expand Up @@ -348,12 +352,14 @@ static void devm_led_classdev_release(struct device *dev, void *res)
}

/**
* devm_led_classdev_register - resource managed led_classdev_register()
* @parent: The device to register.
* devm_of_led_classdev_register - resource managed led_classdev_register()
*
* @parent: parent of LED device
* @led_cdev: the led_classdev structure for this device.
*/
int devm_led_classdev_register(struct device *parent,
struct led_classdev *led_cdev)
int devm_of_led_classdev_register(struct device *parent,
struct device_node *np,
struct led_classdev *led_cdev)
{
struct led_classdev **dr;
int rc;
Expand All @@ -362,7 +368,7 @@ int devm_led_classdev_register(struct device *parent,
if (!dr)
return -ENOMEM;

rc = led_classdev_register(parent, led_cdev);
rc = of_led_classdev_register(parent, np, led_cdev);
if (rc) {
devres_free(dr);
return rc;
Expand All @@ -373,7 +379,7 @@ int devm_led_classdev_register(struct device *parent,

return 0;
}
EXPORT_SYMBOL_GPL(devm_led_classdev_register);
EXPORT_SYMBOL_GPL(devm_of_led_classdev_register);

static int devm_led_classdev_match(struct device *dev, void *res, void *data)
{
Expand Down
14 changes: 10 additions & 4 deletions include/linux/leds.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,16 @@ struct led_classdev {
struct mutex led_access;
};

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 int of_led_classdev_register(struct device *parent,
struct device_node *np,
struct led_classdev *led_cdev);
#define led_classdev_register(parent, led_cdev) \
of_led_classdev_register(parent, NULL, led_cdev)
extern int devm_of_led_classdev_register(struct device *parent,
struct device_node *np,
struct led_classdev *led_cdev);
#define devm_led_classdev_register(parent, led_cdev) \
devm_of_led_classdev_register(parent, NULL, 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);
Expand Down

0 comments on commit 442c609

Please sign in to comment.