diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2008-06-30 14:47:59 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-07-09 15:54:14 -0400 |
commit | bdb08cb2d3491d441dd403dfb88d90ba90fb7232 (patch) | |
tree | 390117716c0f4f30a50636a5a0ef1e828e48d1fa /arch | |
parent | 5e329d1c7f5fe6adfee99c783fa98bda7dae8ac5 (diff) |
[ARM] pxa: allow clk aliases
We need to support more than one name+device for a struct clk for a
small number of peripherals. We do this by re-using struct clk alias
to another struct clk - IOW, if we find that the entry we're using is
an alias, we return the aliased entry not the one we found.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-pxa/clock.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-pxa/clock.h | 12 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pxa25x.c | 8 |
3 files changed, 23 insertions, 0 deletions
diff --git a/arch/arm/mach-pxa/clock.c b/arch/arm/mach-pxa/clock.c index e97dc59813c8..68afc396b4a1 100644 --- a/arch/arm/mach-pxa/clock.c +++ b/arch/arm/mach-pxa/clock.c | |||
@@ -47,6 +47,9 @@ struct clk *clk_get(struct device *dev, const char *id) | |||
47 | clk = p; | 47 | clk = p; |
48 | mutex_unlock(&clocks_mutex); | 48 | mutex_unlock(&clocks_mutex); |
49 | 49 | ||
50 | if (!IS_ERR(clk) && clk->ops == NULL) | ||
51 | clk = clk->other; | ||
52 | |||
50 | return clk; | 53 | return clk; |
51 | } | 54 | } |
52 | EXPORT_SYMBOL(clk_get); | 55 | EXPORT_SYMBOL(clk_get); |
diff --git a/arch/arm/mach-pxa/clock.h b/arch/arm/mach-pxa/clock.h index bc6b77e1592e..83cbfaba485d 100644 --- a/arch/arm/mach-pxa/clock.h +++ b/arch/arm/mach-pxa/clock.h | |||
@@ -15,6 +15,7 @@ struct clk { | |||
15 | unsigned int cken; | 15 | unsigned int cken; |
16 | unsigned int delay; | 16 | unsigned int delay; |
17 | unsigned int enabled; | 17 | unsigned int enabled; |
18 | struct clk *other; | ||
18 | }; | 19 | }; |
19 | 20 | ||
20 | #define INIT_CKEN(_name, _cken, _rate, _delay, _dev) \ | 21 | #define INIT_CKEN(_name, _cken, _rate, _delay, _dev) \ |
@@ -35,6 +36,17 @@ struct clk { | |||
35 | .cken = CKEN_##_cken, \ | 36 | .cken = CKEN_##_cken, \ |
36 | } | 37 | } |
37 | 38 | ||
39 | /* | ||
40 | * This is a placeholder to alias one clock device+name pair | ||
41 | * to another struct clk. | ||
42 | */ | ||
43 | #define INIT_CKOTHER(_name, _other, _dev) \ | ||
44 | { \ | ||
45 | .name = _name, \ | ||
46 | .dev = _dev, \ | ||
47 | .other = _other, \ | ||
48 | } | ||
49 | |||
38 | extern const struct clkops clk_cken_ops; | 50 | extern const struct clkops clk_cken_ops; |
39 | 51 | ||
40 | void clk_cken_enable(struct clk *clk); | 52 | void clk_cken_enable(struct clk *clk); |
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index e5b417d14bb0..09ee131d24a1 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -117,6 +117,10 @@ static struct clk pxa25x_hwuart_clk = | |||
117 | INIT_CKEN("UARTCLK", HWUART, 14745600, 1, &pxa_device_hwuart.dev) | 117 | INIT_CKEN("UARTCLK", HWUART, 14745600, 1, &pxa_device_hwuart.dev) |
118 | ; | 118 | ; |
119 | 119 | ||
120 | /* | ||
121 | * PXA 2xx clock declarations. Order is important (see aliases below) | ||
122 | * Please be careful not to disrupt the ordering. | ||
123 | */ | ||
120 | static struct clk pxa25x_clks[] = { | 124 | static struct clk pxa25x_clks[] = { |
121 | INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), | 125 | INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), |
122 | INIT_CKEN("UARTCLK", FFUART, 14745600, 1, &pxa_device_ffuart.dev), | 126 | INIT_CKEN("UARTCLK", FFUART, 14745600, 1, &pxa_device_ffuart.dev), |
@@ -140,6 +144,8 @@ static struct clk pxa25x_clks[] = { | |||
140 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), | 144 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), |
141 | }; | 145 | }; |
142 | 146 | ||
147 | static struct clk gpio7_clk = INIT_CKOTHER("GPIO7_CK", &pxa25x_clks[4], NULL); | ||
148 | |||
143 | #ifdef CONFIG_PM | 149 | #ifdef CONFIG_PM |
144 | 150 | ||
145 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x | 151 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x |
@@ -311,6 +317,8 @@ static int __init pxa25x_init(void) | |||
311 | if (cpu_is_pxa25x()) | 317 | if (cpu_is_pxa25x()) |
312 | ret = platform_device_register(&pxa_device_hwuart); | 318 | ret = platform_device_register(&pxa_device_hwuart); |
313 | 319 | ||
320 | clks_register(&gpio7_clk, 1); | ||
321 | |||
314 | return ret; | 322 | return ret; |
315 | } | 323 | } |
316 | 324 | ||