Skip to content

Commit

Permalink
power: reset: reboot-mode: Add managed resource API
Browse files Browse the repository at this point in the history
Provide managed resource version of reboot_mode_register() and
reboot_mode_unregister() to simplify implementations.

Signed-off-by: Bjorn Andersson <[email protected]>
Tested-by: John Stultz <[email protected]>
Signed-off-by: Sebastian Reichel <[email protected]>
  • Loading branch information
andersson authored and sre committed Aug 15, 2016
1 parent 957cb72 commit c1a9634
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Documentation/driver-model/devres.txt
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,10 @@ PINCTRL
devm_pinctrl_register()
devm_pinctrl_unregister()

POWER
devm_reboot_mode_register()
devm_reboot_mode_unregister()

PWM
devm_pwm_get()
devm_pwm_put()
Expand Down
59 changes: 59 additions & 0 deletions drivers/power/reset/reboot-mode.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,65 @@ int reboot_mode_unregister(struct reboot_mode_driver *reboot)
}
EXPORT_SYMBOL_GPL(reboot_mode_unregister);

static void devm_reboot_mode_release(struct device *dev, void *res)
{
reboot_mode_unregister(*(struct reboot_mode_driver **)res);
}

/**
* devm_reboot_mode_register() - resource managed reboot_mode_register()
* @dev: device to associate this resource with
* @reboot: reboot mode driver
*
* Returns: 0 on success or a negative error code on failure.
*/
int devm_reboot_mode_register(struct device *dev,
struct reboot_mode_driver *reboot)
{
struct reboot_mode_driver **dr;
int rc;

dr = devres_alloc(devm_reboot_mode_release, sizeof(*dr), GFP_KERNEL);
if (!dr)
return -ENOMEM;

rc = reboot_mode_register(reboot);
if (rc) {
devres_free(dr);
return rc;
}

*dr = reboot;
devres_add(dev, dr);

return 0;
}
EXPORT_SYMBOL_GPL(devm_reboot_mode_register);

static int devm_reboot_mode_match(struct device *dev, void *res, void *data)
{
struct reboot_mode_driver **p = res;

if (WARN_ON(!p || !*p))
return 0;

return *p == data;
}

/**
* devm_reboot_mode_unregister() - resource managed reboot_mode_unregister()
* @dev: device to associate this resource with
* @reboot: reboot mode driver
*/
void devm_reboot_mode_unregister(struct device *dev,
struct reboot_mode_driver *reboot)
{
WARN_ON(devres_release(dev,
devm_reboot_mode_release,
devm_reboot_mode_match, reboot));
}
EXPORT_SYMBOL_GPL(devm_reboot_mode_unregister);

MODULE_AUTHOR("Andy Yan <[email protected]");
MODULE_DESCRIPTION("System reboot mode core library");
MODULE_LICENSE("GPL v2");
4 changes: 4 additions & 0 deletions drivers/power/reset/reboot-mode.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,9 @@ struct reboot_mode_driver {

int reboot_mode_register(struct reboot_mode_driver *reboot);
int reboot_mode_unregister(struct reboot_mode_driver *reboot);
int devm_reboot_mode_register(struct device *dev,
struct reboot_mode_driver *reboot);
void devm_reboot_mode_unregister(struct device *dev,
struct reboot_mode_driver *reboot);

#endif

0 comments on commit c1a9634

Please sign in to comment.