UPSTREAM: 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>
(cherry picked from commit 6d30d50d03)
Change-Id: I09cd4050f5df72c1502a99dd2d2e3b652e3d7a4e
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
745f0d21bb
commit
8a1d1451d8
@@ -4478,6 +4478,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.
|
||||||
|
|||||||
Reference in New Issue
Block a user