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);
|
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
|
#ifdef CONFIG_OF
|
||||||
static void clk_core_reparent_orphans(void)
|
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);
|
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)
|
* clk_get_accuracy - obtain the clock accuracy in ppb (parts per billion)
|
||||||
* for a clock source.
|
* for a clock source.
|
||||||
|
|
Loading…
Reference in New Issue