diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2008-11-08 15:05:55 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-11-27 07:38:21 -0500 |
commit | cf30fb4a4f2d261a6527a654a7fdc8636f1e5b16 (patch) | |
tree | 2bb46da438fe09e8c8bc14ad21e1755d8e1ed9f3 /arch | |
parent | 0318e693d3a56836632bf1a2cfdafb7f34bcc703 (diff) |
[ARM] realview: convert to clkdev and lookup clocks by device name
People often point to the Integrator/Versatile/Realview
implementations to justify using the consumer name as the sole
selector for clocks.
Eliminate this excuse by changing the Realview implementation, so
it provides a better example of how it should be done.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-realview/clock.c | 80 | ||||
-rw-r--r-- | arch/arm/mach-realview/clock.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-realview/core.c | 52 | ||||
-rw-r--r-- | arch/arm/mach-realview/core.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-realview/include/mach/clkdev.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-realview/realview_eb.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-realview/realview_pb1176.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-realview/realview_pb11mp.c | 2 |
9 files changed, 63 insertions, 90 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9722f8bb506c..d4fcf3009c38 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -218,6 +218,7 @@ config ARCH_REALVIEW | |||
218 | bool "ARM Ltd. RealView family" | 218 | bool "ARM Ltd. RealView family" |
219 | select ARM_AMBA | 219 | select ARM_AMBA |
220 | select HAVE_CLK | 220 | select HAVE_CLK |
221 | select COMMON_CLKDEV | ||
221 | select ICST307 | 222 | select ICST307 |
222 | select GENERIC_TIME | 223 | select GENERIC_TIME |
223 | select GENERIC_CLOCKEVENTS | 224 | select GENERIC_CLOCKEVENTS |
diff --git a/arch/arm/mach-realview/clock.c b/arch/arm/mach-realview/clock.c index 3347c4236a60..a7043115de72 100644 --- a/arch/arm/mach-realview/clock.c +++ b/arch/arm/mach-realview/clock.c | |||
@@ -10,9 +10,11 @@ | |||
10 | */ | 10 | */ |
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/device.h> | ||
13 | #include <linux/list.h> | 14 | #include <linux/list.h> |
14 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
15 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/string.h> | ||
16 | #include <linux/clk.h> | 18 | #include <linux/clk.h> |
17 | #include <linux/mutex.h> | 19 | #include <linux/mutex.h> |
18 | 20 | ||
@@ -20,32 +22,6 @@ | |||
20 | 22 | ||
21 | #include "clock.h" | 23 | #include "clock.h" |
22 | 24 | ||
23 | static LIST_HEAD(clocks); | ||
24 | static DEFINE_MUTEX(clocks_mutex); | ||
25 | |||
26 | struct clk *clk_get(struct device *dev, const char *id) | ||
27 | { | ||
28 | struct clk *p, *clk = ERR_PTR(-ENOENT); | ||
29 | |||
30 | mutex_lock(&clocks_mutex); | ||
31 | list_for_each_entry(p, &clocks, node) { | ||
32 | if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { | ||
33 | clk = p; | ||
34 | break; | ||
35 | } | ||
36 | } | ||
37 | mutex_unlock(&clocks_mutex); | ||
38 | |||
39 | return clk; | ||
40 | } | ||
41 | EXPORT_SYMBOL(clk_get); | ||
42 | |||
43 | void clk_put(struct clk *clk) | ||
44 | { | ||
45 | module_put(clk->owner); | ||
46 | } | ||
47 | EXPORT_SYMBOL(clk_put); | ||
48 | |||
49 | int clk_enable(struct clk *clk) | 25 | int clk_enable(struct clk *clk) |
50 | { | 26 | { |
51 | return 0; | 27 | return 0; |
@@ -65,7 +41,9 @@ EXPORT_SYMBOL(clk_get_rate); | |||
65 | 41 | ||
66 | long clk_round_rate(struct clk *clk, unsigned long rate) | 42 | long clk_round_rate(struct clk *clk, unsigned long rate) |
67 | { | 43 | { |
68 | return rate; | 44 | struct icst307_vco vco; |
45 | vco = icst307_khz_to_vco(clk->params, rate / 1000); | ||
46 | return icst307_khz(clk->params, vco) * 1000; | ||
69 | } | 47 | } |
70 | EXPORT_SYMBOL(clk_round_rate); | 48 | EXPORT_SYMBOL(clk_round_rate); |
71 | 49 | ||
@@ -78,57 +56,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
78 | 56 | ||
79 | vco = icst307_khz_to_vco(clk->params, rate / 1000); | 57 | vco = icst307_khz_to_vco(clk->params, rate / 1000); |
80 | clk->rate = icst307_khz(clk->params, vco) * 1000; | 58 | clk->rate = icst307_khz(clk->params, vco) * 1000; |
81 | |||
82 | printk("Clock %s: setting VCO reg params: S=%d R=%d V=%d\n", | ||
83 | clk->name, vco.s, vco.r, vco.v); | ||
84 | |||
85 | clk->setvco(clk, vco); | 59 | clk->setvco(clk, vco); |
86 | ret = 0; | 60 | ret = 0; |
87 | } | 61 | } |
88 | return ret; | 62 | return ret; |
89 | } | 63 | } |
90 | EXPORT_SYMBOL(clk_set_rate); | 64 | EXPORT_SYMBOL(clk_set_rate); |
91 | |||
92 | /* | ||
93 | * These are fixed clocks. | ||
94 | */ | ||
95 | static struct clk kmi_clk = { | ||
96 | .name = "KMIREFCLK", | ||
97 | .rate = 24000000, | ||
98 | }; | ||
99 | |||
100 | static struct clk uart_clk = { | ||
101 | .name = "UARTCLK", | ||
102 | .rate = 24000000, | ||
103 | }; | ||
104 | |||
105 | static struct clk mmci_clk = { | ||
106 | .name = "MCLK", | ||
107 | .rate = 24000000, | ||
108 | }; | ||
109 | |||
110 | int clk_register(struct clk *clk) | ||
111 | { | ||
112 | mutex_lock(&clocks_mutex); | ||
113 | list_add(&clk->node, &clocks); | ||
114 | mutex_unlock(&clocks_mutex); | ||
115 | return 0; | ||
116 | } | ||
117 | EXPORT_SYMBOL(clk_register); | ||
118 | |||
119 | void clk_unregister(struct clk *clk) | ||
120 | { | ||
121 | mutex_lock(&clocks_mutex); | ||
122 | list_del(&clk->node); | ||
123 | mutex_unlock(&clocks_mutex); | ||
124 | } | ||
125 | EXPORT_SYMBOL(clk_unregister); | ||
126 | |||
127 | static int __init clk_init(void) | ||
128 | { | ||
129 | clk_register(&kmi_clk); | ||
130 | clk_register(&uart_clk); | ||
131 | clk_register(&mmci_clk); | ||
132 | return 0; | ||
133 | } | ||
134 | arch_initcall(clk_init); | ||
diff --git a/arch/arm/mach-realview/clock.h b/arch/arm/mach-realview/clock.h index dadba695e181..ebbb0f06b600 100644 --- a/arch/arm/mach-realview/clock.h +++ b/arch/arm/mach-realview/clock.h | |||
@@ -12,14 +12,8 @@ struct module; | |||
12 | struct icst307_params; | 12 | struct icst307_params; |
13 | 13 | ||
14 | struct clk { | 14 | struct clk { |
15 | struct list_head node; | ||
16 | unsigned long rate; | 15 | unsigned long rate; |
17 | struct module *owner; | ||
18 | const char *name; | ||
19 | const struct icst307_params *params; | 16 | const struct icst307_params *params; |
20 | void *data; | 17 | void *data; |
21 | void (*setvco)(struct clk *, struct icst307_vco vco); | 18 | void (*setvco)(struct clk *, struct icst307_vco vco); |
22 | }; | 19 | }; |
23 | |||
24 | int clk_register(struct clk *clk); | ||
25 | void clk_unregister(struct clk *clk); | ||
diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c index 2f04d54711e7..2491374818e9 100644 --- a/arch/arm/mach-realview/core.c +++ b/arch/arm/mach-realview/core.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/clockchips.h> | 29 | #include <linux/clockchips.h> |
30 | #include <linux/io.h> | 30 | #include <linux/io.h> |
31 | 31 | ||
32 | #include <asm/clkdev.h> | ||
32 | #include <asm/system.h> | 33 | #include <asm/system.h> |
33 | #include <mach/hardware.h> | 34 | #include <mach/hardware.h> |
34 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
@@ -188,13 +189,60 @@ static void realview_oscvco_set(struct clk *clk, struct icst307_vco vco) | |||
188 | writel(0, sys_lock); | 189 | writel(0, sys_lock); |
189 | } | 190 | } |
190 | 191 | ||
191 | struct clk realview_clcd_clk = { | 192 | static struct clk oscvco_clk = { |
192 | .name = "CLCDCLK", | ||
193 | .params = &realview_oscvco_params, | 193 | .params = &realview_oscvco_params, |
194 | .setvco = realview_oscvco_set, | 194 | .setvco = realview_oscvco_set, |
195 | }; | 195 | }; |
196 | 196 | ||
197 | /* | 197 | /* |
198 | * These are fixed clocks. | ||
199 | */ | ||
200 | static struct clk ref24_clk = { | ||
201 | .rate = 24000000, | ||
202 | }; | ||
203 | |||
204 | static struct clk_lookup lookups[] = { | ||
205 | { /* UART0 */ | ||
206 | .dev_id = "dev:f1", | ||
207 | .clk = &ref24_clk, | ||
208 | }, { /* UART1 */ | ||
209 | .dev_id = "dev:f2", | ||
210 | .clk = &ref24_clk, | ||
211 | }, { /* UART2 */ | ||
212 | .dev_id = "dev:f3", | ||
213 | .clk = &ref24_clk, | ||
214 | }, { /* UART3 */ | ||
215 | .dev_id = "fpga:09", | ||
216 | .clk = &ref24_clk, | ||
217 | }, { /* KMI0 */ | ||
218 | .dev_id = "fpga:06", | ||
219 | .clk = &ref24_clk, | ||
220 | }, { /* KMI1 */ | ||
221 | .dev_id = "fpga:07", | ||
222 | .clk = &ref24_clk, | ||
223 | }, { /* MMC0 */ | ||
224 | .dev_id = "fpga:05", | ||
225 | .clk = &ref24_clk, | ||
226 | }, { /* EB:CLCD */ | ||
227 | .dev_id = "dev:20", | ||
228 | .clk = &oscvco_clk, | ||
229 | }, { /* PB:CLCD */ | ||
230 | .dev_id = "issp:20", | ||
231 | .clk = &oscvco_clk, | ||
232 | } | ||
233 | }; | ||
234 | |||
235 | static int __init clk_init(void) | ||
236 | { | ||
237 | int i; | ||
238 | |||
239 | for (i = 0; i < ARRAY_SIZE(lookups); i++) | ||
240 | clkdev_add(&lookups[i]); | ||
241 | return 0; | ||
242 | } | ||
243 | arch_initcall(clk_init); | ||
244 | |||
245 | /* | ||
198 | * CLCD support. | 246 | * CLCD support. |
199 | */ | 247 | */ |
200 | #define SYS_CLCD_NLCDIOON (1 << 2) | 248 | #define SYS_CLCD_NLCDIOON (1 << 2) |
diff --git a/arch/arm/mach-realview/core.h b/arch/arm/mach-realview/core.h index 3cea92c70d8f..614e8cb31713 100644 --- a/arch/arm/mach-realview/core.h +++ b/arch/arm/mach-realview/core.h | |||
@@ -48,7 +48,6 @@ extern struct platform_device realview_flash_device; | |||
48 | extern struct platform_device realview_i2c_device; | 48 | extern struct platform_device realview_i2c_device; |
49 | extern struct mmc_platform_data realview_mmc0_plat_data; | 49 | extern struct mmc_platform_data realview_mmc0_plat_data; |
50 | extern struct mmc_platform_data realview_mmc1_plat_data; | 50 | extern struct mmc_platform_data realview_mmc1_plat_data; |
51 | extern struct clk realview_clcd_clk; | ||
52 | extern struct clcd_board clcd_plat_data; | 51 | extern struct clcd_board clcd_plat_data; |
53 | extern void __iomem *gic_cpu_base_addr; | 52 | extern void __iomem *gic_cpu_base_addr; |
54 | #ifdef CONFIG_LOCAL_TIMERS | 53 | #ifdef CONFIG_LOCAL_TIMERS |
diff --git a/arch/arm/mach-realview/include/mach/clkdev.h b/arch/arm/mach-realview/include/mach/clkdev.h new file mode 100644 index 000000000000..04b37a89801c --- /dev/null +++ b/arch/arm/mach-realview/include/mach/clkdev.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __ASM_MACH_CLKDEV_H | ||
2 | #define __ASM_MACH_CLKDEV_H | ||
3 | |||
4 | #define __clk_get(clk) ({ 1; }) | ||
5 | #define __clk_put(clk) do { } while (0) | ||
6 | |||
7 | #endif | ||
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index eb829eb1ebe2..3420e2e719e6 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
@@ -372,8 +372,6 @@ static void __init realview_eb_init(void) | |||
372 | #endif | 372 | #endif |
373 | } | 373 | } |
374 | 374 | ||
375 | clk_register(&realview_clcd_clk); | ||
376 | |||
377 | realview_flash_register(&realview_eb_flash_resource, 1); | 375 | realview_flash_register(&realview_eb_flash_resource, 1); |
378 | platform_device_register(&realview_i2c_device); | 376 | platform_device_register(&realview_i2c_device); |
379 | eth_device_register(); | 377 | eth_device_register(); |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index cccdb3eb90fe..0481416d37c9 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
@@ -265,8 +265,6 @@ static void __init realview_pb1176_init(void) | |||
265 | l2x0_init(__io_address(REALVIEW_PB1176_L220_BASE), 0x00730000, 0xfe000fff); | 265 | l2x0_init(__io_address(REALVIEW_PB1176_L220_BASE), 0x00730000, 0xfe000fff); |
266 | #endif | 266 | #endif |
267 | 267 | ||
268 | clk_register(&realview_clcd_clk); | ||
269 | |||
270 | realview_flash_register(&realview_pb1176_flash_resource, 1); | 268 | realview_flash_register(&realview_pb1176_flash_resource, 1); |
271 | platform_device_register(&realview_pb1176_smsc911x_device); | 269 | platform_device_register(&realview_pb1176_smsc911x_device); |
272 | 270 | ||
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 8b863148ec18..6197dd8e8edf 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
@@ -312,8 +312,6 @@ static void __init realview_pb11mp_init(void) | |||
312 | l2x0_init(__io_address(REALVIEW_TC11MP_L220_BASE), 0x00790000, 0xfe000fff); | 312 | l2x0_init(__io_address(REALVIEW_TC11MP_L220_BASE), 0x00790000, 0xfe000fff); |
313 | #endif | 313 | #endif |
314 | 314 | ||
315 | clk_register(&realview_clcd_clk); | ||
316 | |||
317 | realview_flash_register(realview_pb11mp_flash_resource, | 315 | realview_flash_register(realview_pb11mp_flash_resource, |
318 | ARRAY_SIZE(realview_pb11mp_flash_resource)); | 316 | ARRAY_SIZE(realview_pb11mp_flash_resource)); |
319 | platform_device_register(&realview_pb11mp_smsc911x_device); | 317 | platform_device_register(&realview_pb11mp_smsc911x_device); |