Commit f2f6c2556dcc432e50003bc8fa4d62d95906f149
Committed by
Mike Turquette
1 parent
4cfe54e579
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
clk: add common of_clk_init() function
Modify of_clk_init function so that it will determine which driver to initialize based on device tree instead of each driver registering to it. Based on a similar patch for drivers/irqchip by Thomas Petazzoni and drivers/clocksource by Stephen Warren. Signed-off-by: Prashant Gaikwad <pgaikwad@nvidia.com> Tested-by: Tony Prisk <linux@prisktech.co.nz> Tested-by: Pawel Moll <pawel.moll@arm.com> Tested-by: Rob Herring <rob.herring@calxeda.com> Tested-by: Josh Cartwright <josh.cartwright@ni.com> Reviewed-by: Josh Cartwright <josh.cartwright@ni.com> Acked-by: Maxime Ripard <maxime.ripard@anandra.org> Signed-off-by: Mike Turquette <mturquette@linaro.org> [mturquette@linaro.org: merge conflict from missing CLKSRC_OF_TABLES()] Signed-off-by: Mike Turquette <mturquette@linaro.org>
Showing 4 changed files with 26 additions and 0 deletions Side-by-side Diff
drivers/clk/clk-fixed-rate.c
drivers/clk/clk.c
... | ... | @@ -18,6 +18,7 @@ |
18 | 18 | #include <linux/slab.h> |
19 | 19 | #include <linux/of.h> |
20 | 20 | #include <linux/device.h> |
21 | +#include <linux/init.h> | |
21 | 22 | |
22 | 23 | static DEFINE_SPINLOCK(enable_lock); |
23 | 24 | static DEFINE_MUTEX(prepare_lock); |
... | ... | @@ -1803,6 +1804,11 @@ |
1803 | 1804 | void *data; |
1804 | 1805 | }; |
1805 | 1806 | |
1807 | +extern struct of_device_id __clk_of_table[]; | |
1808 | + | |
1809 | +static const struct of_device_id __clk_of_table_sentinel | |
1810 | + __used __section(__clk_of_table_end); | |
1811 | + | |
1806 | 1812 | static LIST_HEAD(of_clk_providers); |
1807 | 1813 | static DEFINE_MUTEX(of_clk_lock); |
1808 | 1814 | |
... | ... | @@ -1930,6 +1936,9 @@ |
1930 | 1936 | void __init of_clk_init(const struct of_device_id *matches) |
1931 | 1937 | { |
1932 | 1938 | struct device_node *np; |
1939 | + | |
1940 | + if (!matches) | |
1941 | + matches = __clk_of_table; | |
1933 | 1942 | |
1934 | 1943 | for_each_matching_node(np, matches) { |
1935 | 1944 | const struct of_device_id *match = of_match_node(matches, np); |
include/asm-generic/vmlinux.lds.h
... | ... | @@ -150,6 +150,15 @@ |
150 | 150 | #endif |
151 | 151 | |
152 | 152 | |
153 | +#ifdef CONFIG_COMMON_CLK | |
154 | +#define CLK_OF_TABLES() . = ALIGN(8); \ | |
155 | + VMLINUX_SYMBOL(__clk_of_table) = .; \ | |
156 | + *(__clk_of_table) \ | |
157 | + *(__clk_of_table_end) | |
158 | +#else | |
159 | +#define CLK_OF_TABLES() | |
160 | +#endif | |
161 | + | |
153 | 162 | #define KERNEL_DTB() \ |
154 | 163 | STRUCT_ALIGN(); \ |
155 | 164 | VMLINUX_SYMBOL(__dtb_start) = .; \ |
... | ... | @@ -493,6 +502,7 @@ |
493 | 502 | DEV_DISCARD(init.rodata) \ |
494 | 503 | CPU_DISCARD(init.rodata) \ |
495 | 504 | MEM_DISCARD(init.rodata) \ |
505 | + CLK_OF_TABLES() \ | |
496 | 506 | KERNEL_DTB() |
497 | 507 | |
498 | 508 | #define INIT_TEXT \ |
include/linux/clk-provider.h
... | ... | @@ -379,7 +379,13 @@ |
379 | 379 | }; |
380 | 380 | struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data); |
381 | 381 | const char *of_clk_get_parent_name(struct device_node *np, int index); |
382 | + | |
382 | 383 | void of_clk_init(const struct of_device_id *matches); |
384 | + | |
385 | +#define CLK_OF_DECLARE(name, compat, fn) \ | |
386 | + static const struct of_device_id __clk_of_table_##name \ | |
387 | + __used __section(__clk_of_table) \ | |
388 | + = { .compatible = compat, .data = fn }; | |
383 | 389 | |
384 | 390 | #endif /* CONFIG_COMMON_CLK */ |
385 | 391 | #endif /* CLK_PROVIDER_H */ |