Commit 6d30d50d authored by Jerome Brunet's avatar Jerome Brunet Committed by Stephen Boyd
Browse files

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: default avatarJerome Brunet <jbrunet@baylibre.com>
Link: https://lore.kernel.org/r/20201021163847.595189-2-jbrunet@baylibre.com


Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 8e677e7f
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -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)
{
+10 −0
Original line number Diff line number Diff line
@@ -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.