[PATCH 02/23] clk clkdev: Add clkdev matching based on physbase

Sascha Hauer s.hauer at pengutronix.de
Mon Sep 24 07:04:31 EDT 2012


Most clock/device associations can be done based on the physical
base address of the corresponding device. So instead of depending
on string matching add an optional possibility to associate a clock
lookups with physical addresses. This also has the advantage that
the lookups for devicetree based devices can be identical to the
platform based devices.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 drivers/clk/clkdev.c   |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/clkdev.h |    3 +++
 2 files changed, 50 insertions(+)

diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c
index 717fea5..40bc006 100644
--- a/drivers/clk/clkdev.c
+++ b/drivers/clk/clkdev.c
@@ -62,6 +62,32 @@ static struct clk *clk_find(const char *dev_id, const char *con_id)
 	return clk;
 }
 
+static struct clk *clk_find_physbase(struct device_d *dev, const char *con_id)
+{
+	struct clk_lookup *p;
+	unsigned long start;
+
+	if (!dev || !dev->resource)
+		return ERR_PTR(-ENOSYS);
+
+	start = dev->resource[0].start;
+
+	list_for_each_entry(p, &clocks, node) {
+		if (!p->physbase)
+			continue;
+		if (p->physbase != start)
+			continue;
+		if (p->con_id) {
+			if (!con_id || strcmp(p->con_id, con_id))
+				continue;
+			return p->clk;
+		}
+		return p->clk;
+	}
+	return ERR_PTR(-ENOSYS);
+
+}
+
 struct clk *clk_get_sys(const char *dev_id, const char *con_id)
 {
 	struct clk *clk;
@@ -77,6 +103,11 @@ EXPORT_SYMBOL(clk_get_sys);
 struct clk *clk_get(struct device_d *dev, const char *con_id)
 {
 	const char *dev_id = dev ? dev_name(dev) : NULL;
+	struct clk *clk;
+
+	clk = clk_find_physbase(dev, con_id);
+	if (!IS_ERR(clk))
+		return clk;
 
 	return clk_get_sys(dev_id, con_id);
 }
@@ -166,3 +197,19 @@ void clkdev_drop(struct clk_lookup *cl)
 	kfree(cl);
 }
 EXPORT_SYMBOL(clkdev_drop);
+
+int clkdev_add_physbase(struct clk *clk, unsigned long base, const char *id)
+{
+	struct clk_lookup *cl;
+
+	cl = xzalloc(sizeof(*cl));
+
+	cl->clk = clk;
+	cl->con_id = id;
+	cl->physbase = base;
+
+	clkdev_add(cl);
+
+	return 0;
+}
+EXPORT_SYMBOL(clkdev_add_physbase);
diff --git a/include/linux/clkdev.h b/include/linux/clkdev.h
index d2eca99..d2f0d89 100644
--- a/include/linux/clkdev.h
+++ b/include/linux/clkdev.h
@@ -19,6 +19,7 @@ struct device_d;
 
 struct clk_lookup {
 	struct list_head	node;
+	unsigned long		physbase;
 	const char		*dev_id;
 	const char		*con_id;
 	struct clk		*clk;
@@ -33,6 +34,8 @@ void clkdev_drop(struct clk_lookup *cl);
 void clkdev_add_table(struct clk_lookup *, size_t);
 int clk_add_alias(const char *, const char *, char *, struct device_d *);
 
+int clkdev_add_physbase(struct clk *clk, unsigned long base, const char *id);
+
 #define CLKDEV_DEV_ID(_id, _clk)			\
 	{						\
 		.dev_id = _id,				\
-- 
1.7.10.4




More information about the barebox mailing list