[PATCHv3 1/7] clkdev: add helper registration API
From: Tero Kristo <hidden>
Date: 2016-06-30 14:13:32
Also in:
linux-clk, linux-omap
Subsystem:
arm/clkdev support, the rest · Maintainers:
Russell King, Linus Torvalds
In certain cases, it is desirable to extend the implementation of the clkdev lookup, to avoid registering massive amounts of clkdev aliases. A simple helper implementation can instead be used to search and automatically create the clkdev entries. A sample of this is the TI clock implementation, which currently registers a large number of clkdev entries with a very simple mapping strategy. This patch adds an API to register a helper function that gets called during clk_get(), in case everything else fails to look up the clock. Individual clock drivers are then free to register the helper and implement it the way they want. Signed-off-by: Tero Kristo <redacted> Cc: Russell King <linux@armlinux.org.uk> --- drivers/clk/clkdev.c | 22 +++++++++++++++++++++- include/linux/clkdev.h | 1 + 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c
index 89cc700..788c0b2 100644
--- a/drivers/clk/clkdev.c
+++ b/drivers/clk/clkdev.c@@ -26,6 +26,8 @@ static LIST_HEAD(clocks); static DEFINE_MUTEX(clocks_mutex); +static struct clk * (*clkdev_get_helper)(const char *dev_id, + const char *con_id); #if defined(CONFIG_OF) && defined(CONFIG_COMMON_CLK) static struct clk *__of_clk_get(struct device_node *np, int index,
@@ -190,7 +192,13 @@ struct clk *clk_get_sys(const char *dev_id, const char *con_id) out: mutex_unlock(&clocks_mutex); - return cl ? clk : ERR_PTR(-ENOENT); + if (cl) + return clk; + + if (clkdev_get_helper) + return clkdev_get_helper(dev_id, con_id); + + return ERR_PTR(-ENOENT); } EXPORT_SYMBOL(clk_get_sys);
@@ -209,6 +217,18 @@ struct clk *clk_get(struct device *dev, const char *con_id) } EXPORT_SYMBOL(clk_get); +int clkdev_helper_register(struct clk * (*helper)(const char *, + const char *)) +{ + if (clkdev_get_helper) + return -EBUSY; + + clkdev_get_helper = helper; + + return 0; +} +EXPORT_SYMBOL(clkdev_helper_register); + void clk_put(struct clk *clk) { __clk_put(clk);
diff --git a/include/linux/clkdev.h b/include/linux/clkdev.h
index 2eabc86..173e2fa 100644
--- a/include/linux/clkdev.h
+++ b/include/linux/clkdev.h@@ -51,6 +51,7 @@ int clk_add_alias(const char *, const char *, const char *, struct device *); int clk_register_clkdev(struct clk *, const char *, const char *); int clk_hw_register_clkdev(struct clk_hw *, const char *, const char *); +int clkdev_helper_register(struct clk * (*)(const char *, const char *)); #ifdef CONFIG_COMMON_CLK int __clk_get(struct clk *clk);
--
1.9.1