diff options
author | Alexandre Courbot <acourbot@nvidia.com> | 2012-08-01 06:20:58 -0400 |
---|---|---|
committer | Thierry Reding <thierry.reding@avionic-design.de> | 2012-09-10 11:05:45 -0400 |
commit | 6354316dbe5a13b25bea15d7ffc891be025eb267 (patch) | |
tree | 8163ca9c16c872732d37b39ca26e5cf4a686b7ea /drivers/pwm | |
parent | 0aa0869c3c9b10338dd92a20fa4a9b6959f177b5 (diff) |
pwm: add devm_pwm_get() and devm_pwm_put()
Add resource managed variants of pwm_get() and pwm_put() for
convenience. Code is largely inspired by the equivalent devm functions
of the regulator framework.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Diffstat (limited to 'drivers/pwm')
-rw-r--r-- | drivers/pwm/core.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 85592e97ef2d..92b1782d0d8e 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c | |||
@@ -646,6 +646,64 @@ out: | |||
646 | } | 646 | } |
647 | EXPORT_SYMBOL_GPL(pwm_put); | 647 | EXPORT_SYMBOL_GPL(pwm_put); |
648 | 648 | ||
649 | static void devm_pwm_release(struct device *dev, void *res) | ||
650 | { | ||
651 | pwm_put(*(struct pwm_device **)res); | ||
652 | } | ||
653 | |||
654 | /** | ||
655 | * devm_pwm_get() - resource managed pwm_get() | ||
656 | * @dev: device for PWM consumer | ||
657 | * @con_id: consumer name | ||
658 | * | ||
659 | * This function performs like pwm_get() but the acquired PWM device will | ||
660 | * automatically be released on driver detach. | ||
661 | */ | ||
662 | struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id) | ||
663 | { | ||
664 | struct pwm_device **ptr, *pwm; | ||
665 | |||
666 | ptr = devres_alloc(devm_pwm_release, sizeof(**ptr), GFP_KERNEL); | ||
667 | if (!ptr) | ||
668 | return ERR_PTR(-ENOMEM); | ||
669 | |||
670 | pwm = pwm_get(dev, con_id); | ||
671 | if (!IS_ERR(pwm)) { | ||
672 | *ptr = pwm; | ||
673 | devres_add(dev, ptr); | ||
674 | } else { | ||
675 | devres_free(ptr); | ||
676 | } | ||
677 | |||
678 | return pwm; | ||
679 | } | ||
680 | EXPORT_SYMBOL_GPL(devm_pwm_get); | ||
681 | |||
682 | static int devm_pwm_match(struct device *dev, void *res, void *data) | ||
683 | { | ||
684 | struct pwm_device **p = res; | ||
685 | |||
686 | if (WARN_ON(!p || !*p)) | ||
687 | return 0; | ||
688 | |||
689 | return *p == data; | ||
690 | } | ||
691 | |||
692 | /** | ||
693 | * devm_pwm_put() - resource managed pwm_put() | ||
694 | * @dev: device for PWM consumer | ||
695 | * @pwm: PWM device | ||
696 | * | ||
697 | * Release a PWM previously allocated using devm_pwm_get(). Calling this | ||
698 | * function is usually not needed because devm-allocated resources are | ||
699 | * automatically released on driver detach. | ||
700 | */ | ||
701 | void devm_pwm_put(struct device *dev, struct pwm_device *pwm) | ||
702 | { | ||
703 | WARN_ON(devres_release(dev, devm_pwm_release, devm_pwm_match, pwm)); | ||
704 | } | ||
705 | EXPORT_SYMBOL_GPL(devm_pwm_put); | ||
706 | |||
649 | #ifdef CONFIG_DEBUG_FS | 707 | #ifdef CONFIG_DEBUG_FS |
650 | static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) | 708 | static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) |
651 | { | 709 | { |