Message ID | 20210101165507.19486-6-tiny.windzz@gmail.com |
---|---|
State | New |
Headers | show |
Series | Introduce devm_pm_opp_* API | expand |
On 01-01-21, 16:54, Yangtao Li wrote: > Add devres wrapper for dev_pm_opp_register_notifier() to simplify driver > code. > > Signed-off-by: Yangtao Li <tiny.windzz@gmail.com> > --- > drivers/opp/core.c | 38 ++++++++++++++++++++++++++++++++++++++ > include/linux/pm_opp.h | 6 ++++++ > 2 files changed, 44 insertions(+) > > diff --git a/drivers/opp/core.c b/drivers/opp/core.c > index 6b83e373f0d8..ef3544f8cecd 100644 > --- a/drivers/opp/core.c > +++ b/drivers/opp/core.c > @@ -2599,6 +2599,44 @@ int dev_pm_opp_unregister_notifier(struct device *dev, > } > EXPORT_SYMBOL(dev_pm_opp_unregister_notifier); > > +static void devm_pm_opp_notifier_release(struct device *dev, void *res) > +{ > + struct notifier_block *nb = *(struct notifier_block **)res; > + > + WARN_ON(dev_pm_opp_unregister_notifier(dev, nb)); > +} > + > +/** > + * devm_pm_opp_register_notifier() - Register OPP notifier for the device > + * @dev: Device for which notifier needs to be registered > + * @nb: Notifier block to be registered > + * > + * Return: 0 on success or a negative error value. > + * > + * The notifier will be unregistered after the device is destroyed. > + */ > +int devm_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb) > +{ > + struct notifier_block **ptr; > + int ret; > + > + ptr = devres_alloc(devm_pm_opp_notifier_release, sizeof(*ptr), GFP_KERNEL); > + if (!ptr) > + return -ENOMEM; > + > + ret = dev_pm_opp_register_notifier(dev, nb); > + if (ret) { > + devres_free(ptr); > + return ret; > + } > + > + *ptr = nb; > + devres_add(dev, ptr); > + > + return 0; > +} > +EXPORT_SYMBOL(devm_pm_opp_register_notifier); I am not in favor of this patch, and it only has one user, which makes it more unwanted.
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 6b83e373f0d8..ef3544f8cecd 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -2599,6 +2599,44 @@ int dev_pm_opp_unregister_notifier(struct device *dev, } EXPORT_SYMBOL(dev_pm_opp_unregister_notifier); +static void devm_pm_opp_notifier_release(struct device *dev, void *res) +{ + struct notifier_block *nb = *(struct notifier_block **)res; + + WARN_ON(dev_pm_opp_unregister_notifier(dev, nb)); +} + +/** + * devm_pm_opp_register_notifier() - Register OPP notifier for the device + * @dev: Device for which notifier needs to be registered + * @nb: Notifier block to be registered + * + * Return: 0 on success or a negative error value. + * + * The notifier will be unregistered after the device is destroyed. + */ +int devm_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb) +{ + struct notifier_block **ptr; + int ret; + + ptr = devres_alloc(devm_pm_opp_notifier_release, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return -ENOMEM; + + ret = dev_pm_opp_register_notifier(dev, nb); + if (ret) { + devres_free(ptr); + return ret; + } + + *ptr = nb; + devres_add(dev, ptr); + + return 0; +} +EXPORT_SYMBOL(devm_pm_opp_register_notifier); + /** * dev_pm_opp_remove_table() - Free all OPPs associated with the device * @dev: device pointer used to lookup OPP table. diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index e8bdac5f9555..c24bd34339d7 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -136,6 +136,7 @@ int dev_pm_opp_disable(struct device *dev, unsigned long freq); int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb); int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb); +int devm_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb); struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count); void dev_pm_opp_put_supported_hw(struct opp_table *opp_table); @@ -288,6 +289,11 @@ static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifi return -ENOTSUPP; } +static inline int devm_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb) +{ + return -ENOTSUPP; +} + static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb) { return -ENOTSUPP;
Add devres wrapper for dev_pm_opp_register_notifier() to simplify driver code. Signed-off-by: Yangtao Li <tiny.windzz@gmail.com> --- drivers/opp/core.c | 38 ++++++++++++++++++++++++++++++++++++++ include/linux/pm_opp.h | 6 ++++++ 2 files changed, 44 insertions(+)