diff options
author | Eric Miao <eric.y.miao@gmail.com> | 2010-11-21 21:49:55 -0500 |
---|---|---|
committer | Eric Miao <eric.y.miao@gmail.com> | 2010-12-16 01:31:19 -0500 |
commit | 4029813c89926ae5d78cc2dff49d845d934424f6 (patch) | |
tree | eaa7e075d3f369aa710ae4e26fdf80ab9cdd588b /arch/arm/mach-pxa | |
parent | 2e8581e756ddbd0dea8b0d4059e9a82d2929de01 (diff) |
ARM: pxa: separate the clock support into clock-{pxa2xx,pxa3xx}.c
Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
Diffstat (limited to 'arch/arm/mach-pxa')
-rw-r--r-- | arch/arm/mach-pxa/Makefile | 6 | ||||
-rw-r--r-- | arch/arm/mach-pxa/clock-pxa2xx.c | 30 | ||||
-rw-r--r-- | arch/arm/mach-pxa/clock-pxa3xx.c | 161 | ||||
-rw-r--r-- | arch/arm/mach-pxa/clock.c | 26 | ||||
-rw-r--r-- | arch/arm/mach-pxa/clock.h | 21 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pxa25x.c | 41 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pxa27x.c | 51 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pxa3xx.c | 170 |
8 files changed, 266 insertions, 240 deletions
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index e2f89c2c6f49..c90789e3db1c 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile | |||
@@ -16,9 +16,9 @@ endif | |||
16 | # Generic drivers that other drivers may depend upon | 16 | # Generic drivers that other drivers may depend upon |
17 | 17 | ||
18 | # SoC-specific code | 18 | # SoC-specific code |
19 | obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa2xx.o pxa25x.o | 19 | obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o clock-pxa2xx.o pxa2xx.o pxa25x.o |
20 | obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa2xx.o pxa27x.o | 20 | obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o clock-pxa2xx.o pxa2xx.o pxa27x.o |
21 | obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o pxa3xx-ulpi.o | 21 | obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o clock-pxa3xx.o pxa3xx.o smemc.o pxa3xx-ulpi.o |
22 | obj-$(CONFIG_CPU_PXA300) += pxa300.o | 22 | obj-$(CONFIG_CPU_PXA300) += pxa300.o |
23 | obj-$(CONFIG_CPU_PXA320) += pxa320.o | 23 | obj-$(CONFIG_CPU_PXA320) += pxa320.o |
24 | obj-$(CONFIG_CPU_PXA930) += pxa930.o | 24 | obj-$(CONFIG_CPU_PXA930) += pxa930.o |
diff --git a/arch/arm/mach-pxa/clock-pxa2xx.c b/arch/arm/mach-pxa/clock-pxa2xx.c new file mode 100644 index 000000000000..416b3f06efb7 --- /dev/null +++ b/arch/arm/mach-pxa/clock-pxa2xx.c | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-pxa/clock-pxa2xx.c | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/init.h> | ||
12 | |||
13 | #include <mach/pxa2xx-regs.h> | ||
14 | |||
15 | #include "clock.h" | ||
16 | |||
17 | void clk_pxa2xx_cken_enable(struct clk *clk) | ||
18 | { | ||
19 | CKEN |= 1 << clk->cken; | ||
20 | } | ||
21 | |||
22 | void clk_pxa2xx_cken_disable(struct clk *clk) | ||
23 | { | ||
24 | CKEN &= ~(1 << clk->cken); | ||
25 | } | ||
26 | |||
27 | const struct clkops clk_pxa2xx_cken_ops = { | ||
28 | .enable = clk_pxa2xx_cken_enable, | ||
29 | .disable = clk_pxa2xx_cken_disable, | ||
30 | }; | ||
diff --git a/arch/arm/mach-pxa/clock-pxa3xx.c b/arch/arm/mach-pxa/clock-pxa3xx.c new file mode 100644 index 000000000000..34a36c4af19b --- /dev/null +++ b/arch/arm/mach-pxa/clock-pxa3xx.c | |||
@@ -0,0 +1,161 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-pxa/clock-pxa3xx.c | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/init.h> | ||
12 | |||
13 | #include <mach/pxa3xx-regs.h> | ||
14 | |||
15 | #include "clock.h" | ||
16 | |||
17 | /* Crystal clock: 13MHz */ | ||
18 | #define BASE_CLK 13000000 | ||
19 | |||
20 | /* Ring Oscillator Clock: 60MHz */ | ||
21 | #define RO_CLK 60000000 | ||
22 | |||
23 | #define ACCR_D0CS (1 << 26) | ||
24 | #define ACCR_PCCE (1 << 11) | ||
25 | |||
26 | /* crystal frequency to static memory controller multiplier (SMCFS) */ | ||
27 | static unsigned char smcfs_mult[8] = { 6, 0, 8, 0, 0, 16, }; | ||
28 | |||
29 | /* crystal frequency to HSIO bus frequency multiplier (HSS) */ | ||
30 | static unsigned char hss_mult[4] = { 8, 12, 16, 24 }; | ||
31 | |||
32 | /* | ||
33 | * Get the clock frequency as reflected by CCSR and the turbo flag. | ||
34 | * We assume these values have been applied via a fcs. | ||
35 | * If info is not 0 we also display the current settings. | ||
36 | */ | ||
37 | unsigned int pxa3xx_get_clk_frequency_khz(int info) | ||
38 | { | ||
39 | unsigned long acsr, xclkcfg; | ||
40 | unsigned int t, xl, xn, hss, ro, XL, XN, CLK, HSS; | ||
41 | |||
42 | /* Read XCLKCFG register turbo bit */ | ||
43 | __asm__ __volatile__("mrc\tp14, 0, %0, c6, c0, 0" : "=r"(xclkcfg)); | ||
44 | t = xclkcfg & 0x1; | ||
45 | |||
46 | acsr = ACSR; | ||
47 | |||
48 | xl = acsr & 0x1f; | ||
49 | xn = (acsr >> 8) & 0x7; | ||
50 | hss = (acsr >> 14) & 0x3; | ||
51 | |||
52 | XL = xl * BASE_CLK; | ||
53 | XN = xn * XL; | ||
54 | |||
55 | ro = acsr & ACCR_D0CS; | ||
56 | |||
57 | CLK = (ro) ? RO_CLK : ((t) ? XN : XL); | ||
58 | HSS = (ro) ? RO_CLK : hss_mult[hss] * BASE_CLK; | ||
59 | |||
60 | if (info) { | ||
61 | pr_info("RO Mode clock: %d.%02dMHz (%sactive)\n", | ||
62 | RO_CLK / 1000000, (RO_CLK % 1000000) / 10000, | ||
63 | (ro) ? "" : "in"); | ||
64 | pr_info("Run Mode clock: %d.%02dMHz (*%d)\n", | ||
65 | XL / 1000000, (XL % 1000000) / 10000, xl); | ||
66 | pr_info("Turbo Mode clock: %d.%02dMHz (*%d, %sactive)\n", | ||
67 | XN / 1000000, (XN % 1000000) / 10000, xn, | ||
68 | (t) ? "" : "in"); | ||
69 | pr_info("HSIO bus clock: %d.%02dMHz\n", | ||
70 | HSS / 1000000, (HSS % 1000000) / 10000); | ||
71 | } | ||
72 | |||
73 | return CLK / 1000; | ||
74 | } | ||
75 | |||
76 | /* | ||
77 | * Return the current AC97 clock frequency. | ||
78 | */ | ||
79 | static unsigned long clk_pxa3xx_ac97_getrate(struct clk *clk) | ||
80 | { | ||
81 | unsigned long rate = 312000000; | ||
82 | unsigned long ac97_div; | ||
83 | |||
84 | ac97_div = AC97_DIV; | ||
85 | |||
86 | /* This may loose precision for some rates but won't for the | ||
87 | * standard 24.576MHz. | ||
88 | */ | ||
89 | rate /= (ac97_div >> 12) & 0x7fff; | ||
90 | rate *= (ac97_div & 0xfff); | ||
91 | |||
92 | return rate; | ||
93 | } | ||
94 | |||
95 | /* | ||
96 | * Return the current HSIO bus clock frequency | ||
97 | */ | ||
98 | static unsigned long clk_pxa3xx_hsio_getrate(struct clk *clk) | ||
99 | { | ||
100 | unsigned long acsr; | ||
101 | unsigned int hss, hsio_clk; | ||
102 | |||
103 | acsr = ACSR; | ||
104 | |||
105 | hss = (acsr >> 14) & 0x3; | ||
106 | hsio_clk = (acsr & ACCR_D0CS) ? RO_CLK : hss_mult[hss] * BASE_CLK; | ||
107 | |||
108 | return hsio_clk; | ||
109 | } | ||
110 | |||
111 | void clk_pxa3xx_cken_enable(struct clk *clk) | ||
112 | { | ||
113 | unsigned long mask = 1ul << (clk->cken & 0x1f); | ||
114 | |||
115 | if (clk->cken < 32) | ||
116 | CKENA |= mask; | ||
117 | else | ||
118 | CKENB |= mask; | ||
119 | } | ||
120 | |||
121 | void clk_pxa3xx_cken_disable(struct clk *clk) | ||
122 | { | ||
123 | unsigned long mask = 1ul << (clk->cken & 0x1f); | ||
124 | |||
125 | if (clk->cken < 32) | ||
126 | CKENA &= ~mask; | ||
127 | else | ||
128 | CKENB &= ~mask; | ||
129 | } | ||
130 | |||
131 | const struct clkops clk_pxa3xx_cken_ops = { | ||
132 | .enable = clk_pxa3xx_cken_enable, | ||
133 | .disable = clk_pxa3xx_cken_disable, | ||
134 | }; | ||
135 | |||
136 | const struct clkops clk_pxa3xx_hsio_ops = { | ||
137 | .enable = clk_pxa3xx_cken_enable, | ||
138 | .disable = clk_pxa3xx_cken_disable, | ||
139 | .getrate = clk_pxa3xx_hsio_getrate, | ||
140 | }; | ||
141 | |||
142 | const struct clkops clk_pxa3xx_ac97_ops = { | ||
143 | .enable = clk_pxa3xx_cken_enable, | ||
144 | .disable = clk_pxa3xx_cken_disable, | ||
145 | .getrate = clk_pxa3xx_ac97_getrate, | ||
146 | }; | ||
147 | |||
148 | static void clk_pout_enable(struct clk *clk) | ||
149 | { | ||
150 | OSCC |= OSCC_PEN; | ||
151 | } | ||
152 | |||
153 | static void clk_pout_disable(struct clk *clk) | ||
154 | { | ||
155 | OSCC &= ~OSCC_PEN; | ||
156 | } | ||
157 | |||
158 | const struct clkops clk_pxa3xx_pout_ops = { | ||
159 | .enable = clk_pout_enable, | ||
160 | .disable = clk_pout_disable, | ||
161 | }; | ||
diff --git a/arch/arm/mach-pxa/clock.c b/arch/arm/mach-pxa/clock.c index abba0089a2ae..8184fe2d71c3 100644 --- a/arch/arm/mach-pxa/clock.c +++ b/arch/arm/mach-pxa/clock.c | |||
@@ -3,21 +3,12 @@ | |||
3 | */ | 3 | */ |
4 | #include <linux/module.h> | 4 | #include <linux/module.h> |
5 | #include <linux/kernel.h> | 5 | #include <linux/kernel.h> |
6 | #include <linux/list.h> | ||
7 | #include <linux/errno.h> | ||
8 | #include <linux/err.h> | ||
9 | #include <linux/string.h> | ||
10 | #include <linux/clk.h> | 6 | #include <linux/clk.h> |
11 | #include <linux/spinlock.h> | 7 | #include <linux/spinlock.h> |
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/delay.h> | 8 | #include <linux/delay.h> |
14 | 9 | ||
15 | #include <asm/clkdev.h> | 10 | #include <asm/clkdev.h> |
16 | #include <mach/pxa2xx-regs.h> | ||
17 | #include <mach/hardware.h> | ||
18 | 11 | ||
19 | #include "devices.h" | ||
20 | #include "generic.h" | ||
21 | #include "clock.h" | 12 | #include "clock.h" |
22 | 13 | ||
23 | static DEFINE_SPINLOCK(clocks_lock); | 14 | static DEFINE_SPINLOCK(clocks_lock); |
@@ -63,18 +54,19 @@ unsigned long clk_get_rate(struct clk *clk) | |||
63 | } | 54 | } |
64 | EXPORT_SYMBOL(clk_get_rate); | 55 | EXPORT_SYMBOL(clk_get_rate); |
65 | 56 | ||
66 | 57 | void clk_dummy_enable(struct clk *clk) | |
67 | void clk_cken_enable(struct clk *clk) | ||
68 | { | 58 | { |
69 | CKEN |= 1 << clk->cken; | ||
70 | } | 59 | } |
71 | 60 | ||
72 | void clk_cken_disable(struct clk *clk) | 61 | void clk_dummy_disable(struct clk *clk) |
73 | { | 62 | { |
74 | CKEN &= ~(1 << clk->cken); | ||
75 | } | 63 | } |
76 | 64 | ||
77 | const struct clkops clk_cken_ops = { | 65 | const struct clkops clk_dummy_ops = { |
78 | .enable = clk_cken_enable, | 66 | .enable = clk_dummy_enable, |
79 | .disable = clk_cken_disable, | 67 | .disable = clk_dummy_disable, |
68 | }; | ||
69 | |||
70 | struct clk clk_dummy = { | ||
71 | .ops = &clk_dummy_ops, | ||
80 | }; | 72 | }; |
diff --git a/arch/arm/mach-pxa/clock.h b/arch/arm/mach-pxa/clock.h index f09ecb1a379e..04348781ad79 100644 --- a/arch/arm/mach-pxa/clock.h +++ b/arch/arm/mach-pxa/clock.h | |||
@@ -14,6 +14,12 @@ struct clk { | |||
14 | unsigned int enabled; | 14 | unsigned int enabled; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | void clk_dummy_enable(struct clk *); | ||
18 | void clk_dummy_disable(struct clk *); | ||
19 | |||
20 | extern const struct clkops clk_dummy_ops; | ||
21 | extern struct clk clk_dummy; | ||
22 | |||
17 | #define INIT_CLKREG(_clk,_devname,_conname) \ | 23 | #define INIT_CLKREG(_clk,_devname,_conname) \ |
18 | { \ | 24 | { \ |
19 | .clk = _clk, \ | 25 | .clk = _clk, \ |
@@ -34,18 +40,18 @@ struct clk clk_##_name = { \ | |||
34 | .delay = _delay, \ | 40 | .delay = _delay, \ |
35 | } | 41 | } |
36 | 42 | ||
37 | #define DEFINE_CKEN(_name, _cken, _rate, _delay) \ | 43 | #define DEFINE_PXA2_CKEN(_name, _cken, _rate, _delay) \ |
38 | struct clk clk_##_name = { \ | 44 | struct clk clk_##_name = { \ |
39 | .ops = &clk_cken_ops, \ | 45 | .ops = &clk_pxa2xx_cken_ops, \ |
40 | .rate = _rate, \ | 46 | .rate = _rate, \ |
41 | .cken = CKEN_##_cken, \ | 47 | .cken = CKEN_##_cken, \ |
42 | .delay = _delay, \ | 48 | .delay = _delay, \ |
43 | } | 49 | } |
44 | 50 | ||
45 | extern const struct clkops clk_cken_ops; | 51 | extern const struct clkops clk_pxa2xx_cken_ops; |
46 | 52 | ||
47 | void clk_cken_enable(struct clk *clk); | 53 | void clk_pxa2xx_cken_enable(struct clk *clk); |
48 | void clk_cken_disable(struct clk *clk); | 54 | void clk_pxa2xx_cken_disable(struct clk *clk); |
49 | 55 | ||
50 | #ifdef CONFIG_PXA3xx | 56 | #ifdef CONFIG_PXA3xx |
51 | #define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \ | 57 | #define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \ |
@@ -57,7 +63,10 @@ struct clk clk_##_name = { \ | |||
57 | } | 63 | } |
58 | 64 | ||
59 | extern const struct clkops clk_pxa3xx_cken_ops; | 65 | extern const struct clkops clk_pxa3xx_cken_ops; |
66 | extern const struct clkops clk_pxa3xx_hsio_ops; | ||
67 | extern const struct clkops clk_pxa3xx_ac97_ops; | ||
68 | extern const struct clkops clk_pxa3xx_pout_ops; | ||
69 | |||
60 | extern void clk_pxa3xx_cken_enable(struct clk *); | 70 | extern void clk_pxa3xx_cken_enable(struct clk *); |
61 | extern void clk_pxa3xx_cken_disable(struct clk *); | 71 | extern void clk_pxa3xx_cken_disable(struct clk *); |
62 | #endif | 72 | #endif |
63 | |||
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 23136b6afa8e..f29775e3e18d 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -106,8 +106,8 @@ static unsigned long clk_pxa25x_lcd_getrate(struct clk *clk) | |||
106 | } | 106 | } |
107 | 107 | ||
108 | static const struct clkops clk_pxa25x_lcd_ops = { | 108 | static const struct clkops clk_pxa25x_lcd_ops = { |
109 | .enable = clk_cken_enable, | 109 | .enable = clk_pxa2xx_cken_enable, |
110 | .disable = clk_cken_disable, | 110 | .disable = clk_pxa2xx_cken_disable, |
111 | .getrate = clk_pxa25x_lcd_getrate, | 111 | .getrate = clk_pxa25x_lcd_getrate, |
112 | }; | 112 | }; |
113 | 113 | ||
@@ -162,31 +162,29 @@ static const struct clkops clk_pxa25x_gpio11_ops = { | |||
162 | * 95.842MHz -> MMC 19.169MHz, I2C 31.949MHz, FICP 47.923MHz, USB 47.923MHz | 162 | * 95.842MHz -> MMC 19.169MHz, I2C 31.949MHz, FICP 47.923MHz, USB 47.923MHz |
163 | * 147.456MHz -> UART 14.7456MHz, AC97 12.288MHz, I2S 5.672MHz (allegedly) | 163 | * 147.456MHz -> UART 14.7456MHz, AC97 12.288MHz, I2S 5.672MHz (allegedly) |
164 | */ | 164 | */ |
165 | static DEFINE_CKEN(pxa25x_hwuart, HWUART, 14745600, 1); | ||
166 | |||
167 | static struct clk_lookup pxa25x_hwuart_clkreg = | ||
168 | INIT_CLKREG(&clk_pxa25x_hwuart, "pxa2xx-uart.3", NULL); | ||
169 | 165 | ||
170 | /* | 166 | /* |
171 | * PXA 2xx clock declarations. | 167 | * PXA 2xx clock declarations. |
172 | */ | 168 | */ |
169 | static DEFINE_PXA2_CKEN(pxa25x_hwuart, HWUART, 14745600, 1); | ||
170 | static DEFINE_PXA2_CKEN(pxa25x_ffuart, FFUART, 14745600, 1); | ||
171 | static DEFINE_PXA2_CKEN(pxa25x_btuart, BTUART, 14745600, 1); | ||
172 | static DEFINE_PXA2_CKEN(pxa25x_stuart, STUART, 14745600, 1); | ||
173 | static DEFINE_PXA2_CKEN(pxa25x_usb, USB, 47923000, 5); | ||
174 | static DEFINE_PXA2_CKEN(pxa25x_mmc, MMC, 19169000, 0); | ||
175 | static DEFINE_PXA2_CKEN(pxa25x_i2c, I2C, 31949000, 0); | ||
176 | static DEFINE_PXA2_CKEN(pxa25x_ssp, SSP, 3686400, 0); | ||
177 | static DEFINE_PXA2_CKEN(pxa25x_nssp, NSSP, 3686400, 0); | ||
178 | static DEFINE_PXA2_CKEN(pxa25x_assp, ASSP, 3686400, 0); | ||
179 | static DEFINE_PXA2_CKEN(pxa25x_pwm0, PWM0, 3686400, 0); | ||
180 | static DEFINE_PXA2_CKEN(pxa25x_pwm1, PWM1, 3686400, 0); | ||
181 | static DEFINE_PXA2_CKEN(pxa25x_ac97, AC97, 24576000, 0); | ||
182 | static DEFINE_PXA2_CKEN(pxa25x_i2s, I2S, 14745600, 0); | ||
183 | static DEFINE_PXA2_CKEN(pxa25x_ficp, FICP, 47923000, 0); | ||
184 | |||
173 | static DEFINE_CK(pxa25x_lcd, LCD, &clk_pxa25x_lcd_ops); | 185 | static DEFINE_CK(pxa25x_lcd, LCD, &clk_pxa25x_lcd_ops); |
174 | static DEFINE_CKEN(pxa25x_ffuart, FFUART, 14745600, 1); | ||
175 | static DEFINE_CKEN(pxa25x_btuart, BTUART, 14745600, 1); | ||
176 | static DEFINE_CKEN(pxa25x_stuart, STUART, 14745600, 1); | ||
177 | static DEFINE_CKEN(pxa25x_usb, USB, 47923000, 5); | ||
178 | static DEFINE_CLK(pxa25x_gpio11, &clk_pxa25x_gpio11_ops, 3686400, 0); | 186 | static DEFINE_CLK(pxa25x_gpio11, &clk_pxa25x_gpio11_ops, 3686400, 0); |
179 | static DEFINE_CLK(pxa25x_gpio12, &clk_pxa25x_gpio12_ops, 32768, 0); | 187 | static DEFINE_CLK(pxa25x_gpio12, &clk_pxa25x_gpio12_ops, 32768, 0); |
180 | static DEFINE_CKEN(pxa25x_mmc, MMC, 19169000, 0); | ||
181 | static DEFINE_CKEN(pxa25x_i2c, I2C, 31949000, 0); | ||
182 | static DEFINE_CKEN(pxa25x_ssp, SSP, 3686400, 0); | ||
183 | static DEFINE_CKEN(pxa25x_nssp, NSSP, 3686400, 0); | ||
184 | static DEFINE_CKEN(pxa25x_assp, ASSP, 3686400, 0); | ||
185 | static DEFINE_CKEN(pxa25x_pwm0, PWM0, 3686400, 0); | ||
186 | static DEFINE_CKEN(pxa25x_pwm1, PWM1, 3686400, 0); | ||
187 | static DEFINE_CKEN(pxa25x_ac97, AC97, 24576000, 0); | ||
188 | static DEFINE_CKEN(pxa25x_i2s, I2S, 14745600, 0); | ||
189 | static DEFINE_CKEN(pxa25x_ficp, FICP, 47923000, 0); | ||
190 | 188 | ||
191 | static struct clk_lookup pxa25x_clkregs[] = { | 189 | static struct clk_lookup pxa25x_clkregs[] = { |
192 | INIT_CLKREG(&clk_pxa25x_lcd, "pxa2xx-fb", NULL), | 190 | INIT_CLKREG(&clk_pxa25x_lcd, "pxa2xx-fb", NULL), |
@@ -209,6 +207,9 @@ static struct clk_lookup pxa25x_clkregs[] = { | |||
209 | INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"), | 207 | INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"), |
210 | }; | 208 | }; |
211 | 209 | ||
210 | static struct clk_lookup pxa25x_hwuart_clkreg = | ||
211 | INIT_CLKREG(&clk_pxa25x_hwuart, "pxa2xx-uart.3", NULL); | ||
212 | |||
212 | #ifdef CONFIG_PM | 213 | #ifdef CONFIG_PM |
213 | 214 | ||
214 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x | 215 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x |
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 839548d94185..13242f2a3392 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
@@ -161,36 +161,37 @@ static unsigned long clk_pxa27x_lcd_getrate(struct clk *clk) | |||
161 | } | 161 | } |
162 | 162 | ||
163 | static const struct clkops clk_pxa27x_lcd_ops = { | 163 | static const struct clkops clk_pxa27x_lcd_ops = { |
164 | .enable = clk_cken_enable, | 164 | .enable = clk_pxa2xx_cken_enable, |
165 | .disable = clk_cken_disable, | 165 | .disable = clk_pxa2xx_cken_disable, |
166 | .getrate = clk_pxa27x_lcd_getrate, | 166 | .getrate = clk_pxa27x_lcd_getrate, |
167 | }; | 167 | }; |
168 | 168 | ||
169 | static DEFINE_PXA2_CKEN(pxa27x_ffuart, FFUART, 14857000, 1); | ||
170 | static DEFINE_PXA2_CKEN(pxa27x_btuart, BTUART, 14857000, 1); | ||
171 | static DEFINE_PXA2_CKEN(pxa27x_stuart, STUART, 14857000, 1); | ||
172 | static DEFINE_PXA2_CKEN(pxa27x_i2s, I2S, 14682000, 0); | ||
173 | static DEFINE_PXA2_CKEN(pxa27x_i2c, I2C, 32842000, 0); | ||
174 | static DEFINE_PXA2_CKEN(pxa27x_usb, USB, 48000000, 5); | ||
175 | static DEFINE_PXA2_CKEN(pxa27x_mmc, MMC, 19500000, 0); | ||
176 | static DEFINE_PXA2_CKEN(pxa27x_ficp, FICP, 48000000, 0); | ||
177 | static DEFINE_PXA2_CKEN(pxa27x_usbhost, USBHOST, 48000000, 0); | ||
178 | static DEFINE_PXA2_CKEN(pxa27x_pwri2c, PWRI2C, 13000000, 0); | ||
179 | static DEFINE_PXA2_CKEN(pxa27x_keypad, KEYPAD, 32768, 0); | ||
180 | static DEFINE_PXA2_CKEN(pxa27x_ssp1, SSP1, 13000000, 0); | ||
181 | static DEFINE_PXA2_CKEN(pxa27x_ssp2, SSP2, 13000000, 0); | ||
182 | static DEFINE_PXA2_CKEN(pxa27x_ssp3, SSP3, 13000000, 0); | ||
183 | static DEFINE_PXA2_CKEN(pxa27x_pwm0, PWM0, 13000000, 0); | ||
184 | static DEFINE_PXA2_CKEN(pxa27x_pwm1, PWM1, 13000000, 0); | ||
185 | static DEFINE_PXA2_CKEN(pxa27x_ac97, AC97, 24576000, 0); | ||
186 | static DEFINE_PXA2_CKEN(pxa27x_ac97conf, AC97CONF, 24576000, 0); | ||
187 | static DEFINE_PXA2_CKEN(pxa27x_msl, MSL, 48000000, 0); | ||
188 | static DEFINE_PXA2_CKEN(pxa27x_usim, USIM, 48000000, 0); | ||
189 | static DEFINE_PXA2_CKEN(pxa27x_memstk, MEMSTK, 19500000, 0); | ||
190 | static DEFINE_PXA2_CKEN(pxa27x_im, IM, 0, 0); | ||
191 | static DEFINE_PXA2_CKEN(pxa27x_memc, MEMC, 0, 0); | ||
192 | |||
169 | static DEFINE_CK(pxa27x_lcd, LCD, &clk_pxa27x_lcd_ops); | 193 | static DEFINE_CK(pxa27x_lcd, LCD, &clk_pxa27x_lcd_ops); |
170 | static DEFINE_CK(pxa27x_camera, CAMERA, &clk_pxa27x_lcd_ops); | 194 | static DEFINE_CK(pxa27x_camera, CAMERA, &clk_pxa27x_lcd_ops); |
171 | static DEFINE_CKEN(pxa27x_ffuart, FFUART, 14857000, 1); | ||
172 | static DEFINE_CKEN(pxa27x_btuart, BTUART, 14857000, 1); | ||
173 | static DEFINE_CKEN(pxa27x_stuart, STUART, 14857000, 1); | ||
174 | static DEFINE_CKEN(pxa27x_i2s, I2S, 14682000, 0); | ||
175 | static DEFINE_CKEN(pxa27x_i2c, I2C, 32842000, 0); | ||
176 | static DEFINE_CKEN(pxa27x_usb, USB, 48000000, 5); | ||
177 | static DEFINE_CKEN(pxa27x_mmc, MMC, 19500000, 0); | ||
178 | static DEFINE_CKEN(pxa27x_ficp, FICP, 48000000, 0); | ||
179 | static DEFINE_CKEN(pxa27x_usbhost, USBHOST, 48000000, 0); | ||
180 | static DEFINE_CKEN(pxa27x_pwri2c, PWRI2C, 13000000, 0); | ||
181 | static DEFINE_CKEN(pxa27x_keypad, KEYPAD, 32768, 0); | ||
182 | static DEFINE_CKEN(pxa27x_ssp1, SSP1, 13000000, 0); | ||
183 | static DEFINE_CKEN(pxa27x_ssp2, SSP2, 13000000, 0); | ||
184 | static DEFINE_CKEN(pxa27x_ssp3, SSP3, 13000000, 0); | ||
185 | static DEFINE_CKEN(pxa27x_pwm0, PWM0, 13000000, 0); | ||
186 | static DEFINE_CKEN(pxa27x_pwm1, PWM1, 13000000, 0); | ||
187 | static DEFINE_CKEN(pxa27x_ac97, AC97, 24576000, 0); | ||
188 | static DEFINE_CKEN(pxa27x_ac97conf, AC97CONF, 24576000, 0); | ||
189 | static DEFINE_CKEN(pxa27x_msl, MSL, 48000000, 0); | ||
190 | static DEFINE_CKEN(pxa27x_usim, USIM, 48000000, 0); | ||
191 | static DEFINE_CKEN(pxa27x_memstk, MEMSTK, 19500000, 0); | ||
192 | static DEFINE_CKEN(pxa27x_im, IM, 0, 0); | ||
193 | static DEFINE_CKEN(pxa27x_memc, MEMC, 0, 0); | ||
194 | 195 | ||
195 | static struct clk_lookup pxa27x_clkregs[] = { | 196 | static struct clk_lookup pxa27x_clkregs[] = { |
196 | INIT_CLKREG(&clk_pxa27x_lcd, "pxa2xx-fb", NULL), | 197 | INIT_CLKREG(&clk_pxa27x_lcd, "pxa2xx-fb", NULL), |
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index a0b123c99a4d..b239c1ab3ed9 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -38,184 +38,15 @@ | |||
38 | #include "devices.h" | 38 | #include "devices.h" |
39 | #include "clock.h" | 39 | #include "clock.h" |
40 | 40 | ||
41 | /* Crystal clock: 13MHz */ | ||
42 | #define BASE_CLK 13000000 | ||
43 | |||
44 | /* Ring Oscillator Clock: 60MHz */ | ||
45 | #define RO_CLK 60000000 | ||
46 | |||
47 | #define ACCR_D0CS (1 << 26) | ||
48 | #define ACCR_PCCE (1 << 11) | ||
49 | |||
50 | #define PECR_IE(n) ((1 << ((n) * 2)) << 28) | 41 | #define PECR_IE(n) ((1 << ((n) * 2)) << 28) |
51 | #define PECR_IS(n) ((1 << ((n) * 2)) << 29) | 42 | #define PECR_IS(n) ((1 << ((n) * 2)) << 29) |
52 | 43 | ||
53 | /* crystal frequency to static memory controller multiplier (SMCFS) */ | ||
54 | static unsigned char smcfs_mult[8] = { 6, 0, 8, 0, 0, 16, }; | ||
55 | |||
56 | /* crystal frequency to HSIO bus frequency multiplier (HSS) */ | ||
57 | static unsigned char hss_mult[4] = { 8, 12, 16, 24 }; | ||
58 | |||
59 | /* | ||
60 | * Get the clock frequency as reflected by CCSR and the turbo flag. | ||
61 | * We assume these values have been applied via a fcs. | ||
62 | * If info is not 0 we also display the current settings. | ||
63 | */ | ||
64 | unsigned int pxa3xx_get_clk_frequency_khz(int info) | ||
65 | { | ||
66 | unsigned long acsr, xclkcfg; | ||
67 | unsigned int t, xl, xn, hss, ro, XL, XN, CLK, HSS; | ||
68 | |||
69 | /* Read XCLKCFG register turbo bit */ | ||
70 | __asm__ __volatile__("mrc\tp14, 0, %0, c6, c0, 0" : "=r"(xclkcfg)); | ||
71 | t = xclkcfg & 0x1; | ||
72 | |||
73 | acsr = ACSR; | ||
74 | |||
75 | xl = acsr & 0x1f; | ||
76 | xn = (acsr >> 8) & 0x7; | ||
77 | hss = (acsr >> 14) & 0x3; | ||
78 | |||
79 | XL = xl * BASE_CLK; | ||
80 | XN = xn * XL; | ||
81 | |||
82 | ro = acsr & ACCR_D0CS; | ||
83 | |||
84 | CLK = (ro) ? RO_CLK : ((t) ? XN : XL); | ||
85 | HSS = (ro) ? RO_CLK : hss_mult[hss] * BASE_CLK; | ||
86 | |||
87 | if (info) { | ||
88 | pr_info("RO Mode clock: %d.%02dMHz (%sactive)\n", | ||
89 | RO_CLK / 1000000, (RO_CLK % 1000000) / 10000, | ||
90 | (ro) ? "" : "in"); | ||
91 | pr_info("Run Mode clock: %d.%02dMHz (*%d)\n", | ||
92 | XL / 1000000, (XL % 1000000) / 10000, xl); | ||
93 | pr_info("Turbo Mode clock: %d.%02dMHz (*%d, %sactive)\n", | ||
94 | XN / 1000000, (XN % 1000000) / 10000, xn, | ||
95 | (t) ? "" : "in"); | ||
96 | pr_info("HSIO bus clock: %d.%02dMHz\n", | ||
97 | HSS / 1000000, (HSS % 1000000) / 10000); | ||
98 | } | ||
99 | |||
100 | return CLK / 1000; | ||
101 | } | ||
102 | |||
103 | void pxa3xx_clear_reset_status(unsigned int mask) | 44 | void pxa3xx_clear_reset_status(unsigned int mask) |
104 | { | 45 | { |
105 | /* RESET_STATUS_* has a 1:1 mapping with ARSR */ | 46 | /* RESET_STATUS_* has a 1:1 mapping with ARSR */ |
106 | ARSR = mask; | 47 | ARSR = mask; |
107 | } | 48 | } |
108 | 49 | ||
109 | /* | ||
110 | * Return the current AC97 clock frequency. | ||
111 | */ | ||
112 | static unsigned long clk_pxa3xx_ac97_getrate(struct clk *clk) | ||
113 | { | ||
114 | unsigned long rate = 312000000; | ||
115 | unsigned long ac97_div; | ||
116 | |||
117 | ac97_div = AC97_DIV; | ||
118 | |||
119 | /* This may loose precision for some rates but won't for the | ||
120 | * standard 24.576MHz. | ||
121 | */ | ||
122 | rate /= (ac97_div >> 12) & 0x7fff; | ||
123 | rate *= (ac97_div & 0xfff); | ||
124 | |||
125 | return rate; | ||
126 | } | ||
127 | |||
128 | /* | ||
129 | * Return the current HSIO bus clock frequency | ||
130 | */ | ||
131 | static unsigned long clk_pxa3xx_hsio_getrate(struct clk *clk) | ||
132 | { | ||
133 | unsigned long acsr; | ||
134 | unsigned int hss, hsio_clk; | ||
135 | |||
136 | acsr = ACSR; | ||
137 | |||
138 | hss = (acsr >> 14) & 0x3; | ||
139 | hsio_clk = (acsr & ACCR_D0CS) ? RO_CLK : hss_mult[hss] * BASE_CLK; | ||
140 | |||
141 | return hsio_clk; | ||
142 | } | ||
143 | |||
144 | void clk_pxa3xx_cken_enable(struct clk *clk) | ||
145 | { | ||
146 | unsigned long mask = 1ul << (clk->cken & 0x1f); | ||
147 | |||
148 | if (clk->cken < 32) | ||
149 | CKENA |= mask; | ||
150 | else | ||
151 | CKENB |= mask; | ||
152 | } | ||
153 | |||
154 | void clk_pxa3xx_cken_disable(struct clk *clk) | ||
155 | { | ||
156 | unsigned long mask = 1ul << (clk->cken & 0x1f); | ||
157 | |||
158 | if (clk->cken < 32) | ||
159 | CKENA &= ~mask; | ||
160 | else | ||
161 | CKENB &= ~mask; | ||
162 | } | ||
163 | |||
164 | const struct clkops clk_pxa3xx_cken_ops = { | ||
165 | .enable = clk_pxa3xx_cken_enable, | ||
166 | .disable = clk_pxa3xx_cken_disable, | ||
167 | }; | ||
168 | |||
169 | static const struct clkops clk_pxa3xx_hsio_ops = { | ||
170 | .enable = clk_pxa3xx_cken_enable, | ||
171 | .disable = clk_pxa3xx_cken_disable, | ||
172 | .getrate = clk_pxa3xx_hsio_getrate, | ||
173 | }; | ||
174 | |||
175 | static const struct clkops clk_pxa3xx_ac97_ops = { | ||
176 | .enable = clk_pxa3xx_cken_enable, | ||
177 | .disable = clk_pxa3xx_cken_disable, | ||
178 | .getrate = clk_pxa3xx_ac97_getrate, | ||
179 | }; | ||
180 | |||
181 | static void clk_pout_enable(struct clk *clk) | ||
182 | { | ||
183 | OSCC |= OSCC_PEN; | ||
184 | } | ||
185 | |||
186 | static void clk_pout_disable(struct clk *clk) | ||
187 | { | ||
188 | OSCC &= ~OSCC_PEN; | ||
189 | } | ||
190 | |||
191 | static const struct clkops clk_pout_ops = { | ||
192 | .enable = clk_pout_enable, | ||
193 | .disable = clk_pout_disable, | ||
194 | }; | ||
195 | |||
196 | static void clk_dummy_enable(struct clk *clk) | ||
197 | { | ||
198 | } | ||
199 | |||
200 | static void clk_dummy_disable(struct clk *clk) | ||
201 | { | ||
202 | } | ||
203 | |||
204 | static const struct clkops clk_dummy_ops = { | ||
205 | .enable = clk_dummy_enable, | ||
206 | .disable = clk_dummy_disable, | ||
207 | }; | ||
208 | |||
209 | static struct clk clk_pxa3xx_pout = { | ||
210 | .ops = &clk_pout_ops, | ||
211 | .rate = 13000000, | ||
212 | .delay = 70, | ||
213 | }; | ||
214 | |||
215 | static struct clk clk_dummy = { | ||
216 | .ops = &clk_dummy_ops, | ||
217 | }; | ||
218 | |||
219 | static DEFINE_PXA3_CKEN(pxa3xx_ffuart, FFUART, 14857000, 1); | 50 | static DEFINE_PXA3_CKEN(pxa3xx_ffuart, FFUART, 14857000, 1); |
220 | static DEFINE_PXA3_CKEN(pxa3xx_btuart, BTUART, 14857000, 1); | 51 | static DEFINE_PXA3_CKEN(pxa3xx_btuart, BTUART, 14857000, 1); |
221 | static DEFINE_PXA3_CKEN(pxa3xx_stuart, STUART, 14857000, 1); | 52 | static DEFINE_PXA3_CKEN(pxa3xx_stuart, STUART, 14857000, 1); |
@@ -236,6 +67,7 @@ static DEFINE_PXA3_CKEN(pxa3xx_mmc2, MMC2, 19500000, 0); | |||
236 | static DEFINE_CK(pxa3xx_lcd, LCD, &clk_pxa3xx_hsio_ops); | 67 | static DEFINE_CK(pxa3xx_lcd, LCD, &clk_pxa3xx_hsio_ops); |
237 | static DEFINE_CK(pxa3xx_camera, CAMERA, &clk_pxa3xx_hsio_ops); | 68 | static DEFINE_CK(pxa3xx_camera, CAMERA, &clk_pxa3xx_hsio_ops); |
238 | static DEFINE_CK(pxa3xx_ac97, AC97, &clk_pxa3xx_ac97_ops); | 69 | static DEFINE_CK(pxa3xx_ac97, AC97, &clk_pxa3xx_ac97_ops); |
70 | static DEFINE_CLK(pxa3xx_pout, &clk_pxa3xx_pout_ops, 13000000, 70); | ||
239 | 71 | ||
240 | static struct clk_lookup pxa3xx_clkregs[] = { | 72 | static struct clk_lookup pxa3xx_clkregs[] = { |
241 | INIT_CLKREG(&clk_pxa3xx_pout, NULL, "CLK_POUT"), | 73 | INIT_CLKREG(&clk_pxa3xx_pout, NULL, "CLK_POUT"), |