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@xxxxxxxxxxxxxx> --- 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 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox