aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2008-06-30 14:47:59 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-07-09 15:54:14 -0400
commitbdb08cb2d3491d441dd403dfb88d90ba90fb7232 (patch)
tree390117716c0f4f30a50636a5a0ef1e828e48d1fa
parent5e329d1c7f5fe6adfee99c783fa98bda7dae8ac5 (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>
-rw-r--r--arch/arm/mach-pxa/clock.c3
-rw-r--r--arch/arm/mach-pxa/clock.h12
-rw-r--r--arch/arm/mach-pxa/pxa25x.c8
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}
52EXPORT_SYMBOL(clk_get); 55EXPORT_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
38extern const struct clkops clk_cken_ops; 50extern const struct clkops clk_cken_ops;
39 51
40void clk_cken_enable(struct clk *clk); 52void 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 */
120static struct clk pxa25x_clks[] = { 124static 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
147static 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