mirror of https://gitee.com/openkylin/linux.git
clk: add devm variant of clk_notifier_register
Add a memory managed variant of clk_notifier_register() to make life easier on clock consumers using notifiers Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Link: https://lore.kernel.org/r/20201021163847.595189-2-jbrunet@baylibre.com Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
parent
8e677e7f0a
commit
6d30d50d03
|
@ -4395,6 +4395,42 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(clk_notifier_unregister);
|
||||
|
||||
struct clk_notifier_devres {
|
||||
struct clk *clk;
|
||||
struct notifier_block *nb;
|
||||
};
|
||||
|
||||
static void devm_clk_notifier_release(struct device *dev, void *res)
|
||||
{
|
||||
struct clk_notifier_devres *devres = res;
|
||||
|
||||
clk_notifier_unregister(devres->clk, devres->nb);
|
||||
}
|
||||
|
||||
int devm_clk_notifier_register(struct device *dev, struct clk *clk,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
struct clk_notifier_devres *devres;
|
||||
int ret;
|
||||
|
||||
devres = devres_alloc(devm_clk_notifier_release,
|
||||
sizeof(*devres), GFP_KERNEL);
|
||||
|
||||
if (!devres)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = clk_notifier_register(clk, nb);
|
||||
if (!ret) {
|
||||
devres->clk = clk;
|
||||
devres->nb = nb;
|
||||
} else {
|
||||
devres_free(devres);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_notifier_register);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static void clk_core_reparent_orphans(void)
|
||||
{
|
||||
|
|
|
@ -109,6 +109,16 @@ int clk_notifier_register(struct clk *clk, struct notifier_block *nb);
|
|||
*/
|
||||
int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);
|
||||
|
||||
/**
|
||||
* devm_clk_notifier_register - register a managed rate-change notifier callback
|
||||
* @dev: device for clock "consumer"
|
||||
* @clk: clock whose rate we are interested in
|
||||
* @nb: notifier block with callback function pointer
|
||||
*
|
||||
* Returns 0 on success, -EERROR otherwise
|
||||
*/
|
||||
int devm_clk_notifier_register(struct device *dev, struct clk *clk, struct notifier_block *nb);
|
||||
|
||||
/**
|
||||
* clk_get_accuracy - obtain the clock accuracy in ppb (parts per billion)
|
||||
* for a clock source.
|
||||
|
|
Loading…
Reference in New Issue