diff options
Diffstat (limited to 'arch/sh/kernel/cpu/sh4a/clock-sh7343.c')
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/clock-sh7343.c | 213 |
1 files changed, 146 insertions, 67 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7343.c b/arch/sh/kernel/cpu/sh4a/clock-sh7343.c index a066c438b40..71291ae201b 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7343.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7343.c | |||
@@ -37,8 +37,6 @@ | |||
37 | 37 | ||
38 | /* Fixed 32 KHz root clock for RTC and Power Management purposes */ | 38 | /* Fixed 32 KHz root clock for RTC and Power Management purposes */ |
39 | static struct clk r_clk = { | 39 | static struct clk r_clk = { |
40 | .name = "rclk", | ||
41 | .id = -1, | ||
42 | .rate = 32768, | 40 | .rate = 32768, |
43 | }; | 41 | }; |
44 | 42 | ||
@@ -47,8 +45,6 @@ static struct clk r_clk = { | |||
47 | * from the platform code. | 45 | * from the platform code. |
48 | */ | 46 | */ |
49 | struct clk extal_clk = { | 47 | struct clk extal_clk = { |
50 | .name = "extal", | ||
51 | .id = -1, | ||
52 | .rate = 33333333, | 48 | .rate = 33333333, |
53 | }; | 49 | }; |
54 | 50 | ||
@@ -70,8 +66,6 @@ static struct clk_ops dll_clk_ops = { | |||
70 | }; | 66 | }; |
71 | 67 | ||
72 | static struct clk dll_clk = { | 68 | static struct clk dll_clk = { |
73 | .name = "dll_clk", | ||
74 | .id = -1, | ||
75 | .ops = &dll_clk_ops, | 69 | .ops = &dll_clk_ops, |
76 | .parent = &r_clk, | 70 | .parent = &r_clk, |
77 | .flags = CLK_ENABLE_ON_INIT, | 71 | .flags = CLK_ENABLE_ON_INIT, |
@@ -92,8 +86,6 @@ static struct clk_ops pll_clk_ops = { | |||
92 | }; | 86 | }; |
93 | 87 | ||
94 | static struct clk pll_clk = { | 88 | static struct clk pll_clk = { |
95 | .name = "pll_clk", | ||
96 | .id = -1, | ||
97 | .ops = &pll_clk_ops, | 89 | .ops = &pll_clk_ops, |
98 | .flags = CLK_ENABLE_ON_INIT, | 90 | .flags = CLK_ENABLE_ON_INIT, |
99 | }; | 91 | }; |
@@ -122,18 +114,18 @@ static struct clk_div4_table div4_table = { | |||
122 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, | 114 | enum { DIV4_I, DIV4_U, DIV4_SH, DIV4_B, DIV4_B3, DIV4_P, |
123 | DIV4_SIUA, DIV4_SIUB, DIV4_NR }; | 115 | DIV4_SIUA, DIV4_SIUB, DIV4_NR }; |
124 | 116 | ||
125 | #define DIV4(_str, _reg, _bit, _mask, _flags) \ | 117 | #define DIV4(_reg, _bit, _mask, _flags) \ |
126 | SH_CLK_DIV4(_str, &pll_clk, _reg, _bit, _mask, _flags) | 118 | SH_CLK_DIV4(&pll_clk, _reg, _bit, _mask, _flags) |
127 | 119 | ||
128 | struct clk div4_clks[DIV4_NR] = { | 120 | struct clk div4_clks[DIV4_NR] = { |
129 | [DIV4_I] = DIV4("cpu_clk", FRQCR, 20, 0x1fff, CLK_ENABLE_ON_INIT), | 121 | [DIV4_I] = DIV4(FRQCR, 20, 0x1fff, CLK_ENABLE_ON_INIT), |
130 | [DIV4_U] = DIV4("umem_clk", FRQCR, 16, 0x1fff, CLK_ENABLE_ON_INIT), | 122 | [DIV4_U] = DIV4(FRQCR, 16, 0x1fff, CLK_ENABLE_ON_INIT), |
131 | [DIV4_SH] = DIV4("shyway_clk", FRQCR, 12, 0x1fff, CLK_ENABLE_ON_INIT), | 123 | [DIV4_SH] = DIV4(FRQCR, 12, 0x1fff, CLK_ENABLE_ON_INIT), |
132 | [DIV4_B] = DIV4("bus_clk", FRQCR, 8, 0x1fff, CLK_ENABLE_ON_INIT), | 124 | [DIV4_B] = DIV4(FRQCR, 8, 0x1fff, CLK_ENABLE_ON_INIT), |
133 | [DIV4_B3] = DIV4("b3_clk", FRQCR, 4, 0x1fff, CLK_ENABLE_ON_INIT), | 125 | [DIV4_B3] = DIV4(FRQCR, 4, 0x1fff, CLK_ENABLE_ON_INIT), |
134 | [DIV4_P] = DIV4("peripheral_clk", FRQCR, 0, 0x1fff, 0), | 126 | [DIV4_P] = DIV4(FRQCR, 0, 0x1fff, 0), |
135 | [DIV4_SIUA] = DIV4("siua_clk", SCLKACR, 0, 0x1fff, 0), | 127 | [DIV4_SIUA] = DIV4(SCLKACR, 0, 0x1fff, 0), |
136 | [DIV4_SIUB] = DIV4("siub_clk", SCLKBCR, 0, 0x1fff, 0), | 128 | [DIV4_SIUB] = DIV4(SCLKBCR, 0, 0x1fff, 0), |
137 | }; | 129 | }; |
138 | 130 | ||
139 | enum { DIV6_V, DIV6_NR }; | 131 | enum { DIV6_V, DIV6_NR }; |
@@ -142,61 +134,148 @@ struct clk div6_clks[DIV6_NR] = { | |||
142 | [DIV6_V] = SH_CLK_DIV6(&pll_clk, VCLKCR, 0), | 134 | [DIV6_V] = SH_CLK_DIV6(&pll_clk, VCLKCR, 0), |
143 | }; | 135 | }; |
144 | 136 | ||
145 | #define MSTP(_str, _parent, _reg, _bit, _flags) \ | 137 | #define MSTP(_parent, _reg, _bit, _flags) \ |
146 | SH_CLK_MSTP32(_str, -1, _parent, _reg, _bit, _flags) | 138 | SH_CLK_MSTP32(_parent, _reg, _bit, _flags) |
147 | 139 | ||
148 | static struct clk mstp_clks[] = { | 140 | enum { MSTP031, MSTP030, MSTP029, MSTP028, MSTP026, |
149 | MSTP("tlb0", &div4_clks[DIV4_I], MSTPCR0, 31, CLK_ENABLE_ON_INIT), | 141 | MSTP023, MSTP022, MSTP021, MSTP020, MSTP019, MSTP018, MSTP017, MSTP016, |
150 | MSTP("ic0", &div4_clks[DIV4_I], MSTPCR0, 30, CLK_ENABLE_ON_INIT), | 142 | MSTP015, MSTP014, MSTP013, MSTP012, MSTP011, MSTP010, |
151 | MSTP("oc0", &div4_clks[DIV4_I], MSTPCR0, 29, CLK_ENABLE_ON_INIT), | 143 | MSTP007, MSTP006, MSTP005, MSTP004, MSTP003, MSTP002, MSTP001, |
152 | MSTP("uram0", &div4_clks[DIV4_U], MSTPCR0, 28, CLK_ENABLE_ON_INIT), | 144 | MSTP109, MSTP108, MSTP100, |
153 | MSTP("xymem0", &div4_clks[DIV4_B], MSTPCR0, 26, CLK_ENABLE_ON_INIT), | 145 | MSTP225, MSTP224, MSTP218, MSTP217, MSTP216, |
154 | MSTP("intc3", &div4_clks[DIV4_P], MSTPCR0, 23, 0), | 146 | MSTP214, MSTP213, MSTP212, MSTP211, MSTP208, |
155 | MSTP("intc0", &div4_clks[DIV4_P], MSTPCR0, 22, 0), | 147 | MSTP206, MSTP205, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, |
156 | MSTP("dmac0", &div4_clks[DIV4_P], MSTPCR0, 21, 0), | 148 | MSTP_NR }; |
157 | MSTP("sh0", &div4_clks[DIV4_P], MSTPCR0, 20, 0), | 149 | |
158 | MSTP("hudi0", &div4_clks[DIV4_P], MSTPCR0, 19, 0), | 150 | static struct clk mstp_clks[MSTP_NR] = { |
159 | MSTP("ubc0", &div4_clks[DIV4_P], MSTPCR0, 17, 0), | 151 | [MSTP031] = MSTP(&div4_clks[DIV4_I], MSTPCR0, 31, CLK_ENABLE_ON_INIT), |
160 | MSTP("tmu_fck", &div4_clks[DIV4_P], MSTPCR0, 15, 0), | 152 | [MSTP030] = MSTP(&div4_clks[DIV4_I], MSTPCR0, 30, CLK_ENABLE_ON_INIT), |
161 | MSTP("cmt_fck", &r_clk, MSTPCR0, 14, 0), | 153 | [MSTP029] = MSTP(&div4_clks[DIV4_I], MSTPCR0, 29, CLK_ENABLE_ON_INIT), |
162 | MSTP("rwdt0", &r_clk, MSTPCR0, 13, 0), | 154 | [MSTP028] = MSTP(&div4_clks[DIV4_U], MSTPCR0, 28, CLK_ENABLE_ON_INIT), |
163 | MSTP("mfi0", &div4_clks[DIV4_P], MSTPCR0, 11, 0), | 155 | [MSTP026] = MSTP(&div4_clks[DIV4_B], MSTPCR0, 26, CLK_ENABLE_ON_INIT), |
164 | MSTP("flctl0", &div4_clks[DIV4_P], MSTPCR0, 10, 0), | 156 | [MSTP023] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 23, 0), |
165 | SH_CLK_MSTP32("sci_fck", 0, &div4_clks[DIV4_P], MSTPCR0, 7, 0), | 157 | [MSTP022] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 22, 0), |
166 | SH_CLK_MSTP32("sci_fck", 1, &div4_clks[DIV4_P], MSTPCR0, 6, 0), | 158 | [MSTP021] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 21, 0), |
167 | SH_CLK_MSTP32("sci_fck", 2, &div4_clks[DIV4_P], MSTPCR0, 5, 0), | 159 | [MSTP020] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 20, 0), |
168 | SH_CLK_MSTP32("sci_fck", 3, &div4_clks[DIV4_P], MSTPCR0, 4, 0), | 160 | [MSTP019] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 19, 0), |
169 | MSTP("sio0", &div4_clks[DIV4_P], MSTPCR0, 3, 0), | 161 | [MSTP017] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 17, 0), |
170 | MSTP("siof0", &div4_clks[DIV4_P], MSTPCR0, 2, 0), | 162 | [MSTP015] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 15, 0), |
171 | MSTP("siof1", &div4_clks[DIV4_P], MSTPCR0, 1, 0), | 163 | [MSTP014] = MSTP(&r_clk, MSTPCR0, 14, 0), |
172 | 164 | [MSTP013] = MSTP(&r_clk, MSTPCR0, 13, 0), | |
173 | MSTP("i2c0", &div4_clks[DIV4_P], MSTPCR1, 9, 0), | 165 | [MSTP011] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 11, 0), |
174 | MSTP("i2c1", &div4_clks[DIV4_P], MSTPCR1, 8, 0), | 166 | [MSTP010] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 10, 0), |
175 | 167 | [MSTP007] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 7, 0), | |
176 | MSTP("tpu0", &div4_clks[DIV4_P], MSTPCR2, 25, 0), | 168 | [MSTP006] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 6, 0), |
177 | MSTP("irda0", &div4_clks[DIV4_P], MSTPCR2, 24, 0), | 169 | [MSTP005] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 5, 0), |
178 | MSTP("sdhi0", &div4_clks[DIV4_P], MSTPCR2, 18, 0), | 170 | [MSTP004] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 4, 0), |
179 | MSTP("mmcif0", &div4_clks[DIV4_P], MSTPCR2, 17, 0), | 171 | [MSTP003] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 3, 0), |
180 | MSTP("sim0", &div4_clks[DIV4_P], MSTPCR2, 16, 0), | 172 | [MSTP002] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 2, 0), |
181 | MSTP("keysc0", &r_clk, MSTPCR2, 14, 0), | 173 | [MSTP001] = MSTP(&div4_clks[DIV4_P], MSTPCR0, 1, 0), |
182 | MSTP("tsif0", &div4_clks[DIV4_P], MSTPCR2, 13, 0), | 174 | |
183 | MSTP("s3d40", &div4_clks[DIV4_P], MSTPCR2, 12, 0), | 175 | [MSTP109] = MSTP(&div4_clks[DIV4_P], MSTPCR1, 9, 0), |
184 | MSTP("usbf0", &div4_clks[DIV4_P], MSTPCR2, 11, 0), | 176 | [MSTP108] = MSTP(&div4_clks[DIV4_P], MSTPCR1, 8, 0), |
185 | MSTP("siu0", &div4_clks[DIV4_B], MSTPCR2, 8, 0), | 177 | |
186 | MSTP("jpu0", &div4_clks[DIV4_B], MSTPCR2, 6, CLK_ENABLE_ON_INIT), | 178 | [MSTP225] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 25, 0), |
187 | MSTP("vou0", &div4_clks[DIV4_B], MSTPCR2, 5, 0), | 179 | [MSTP224] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 24, 0), |
188 | MSTP("beu0", &div4_clks[DIV4_B], MSTPCR2, 4, 0), | 180 | [MSTP218] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 18, 0), |
189 | MSTP("ceu0", &div4_clks[DIV4_B], MSTPCR2, 3, 0), | 181 | [MSTP217] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 17, 0), |
190 | MSTP("veu0", &div4_clks[DIV4_B], MSTPCR2, 2, CLK_ENABLE_ON_INIT), | 182 | [MSTP216] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 16, 0), |
191 | MSTP("vpu0", &div4_clks[DIV4_B], MSTPCR2, 1, CLK_ENABLE_ON_INIT), | 183 | [MSTP214] = MSTP(&r_clk, MSTPCR2, 14, 0), |
192 | MSTP("lcdc0", &div4_clks[DIV4_B], MSTPCR2, 0, 0), | 184 | [MSTP213] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 13, 0), |
185 | [MSTP212] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 12, 0), | ||
186 | [MSTP211] = MSTP(&div4_clks[DIV4_P], MSTPCR2, 11, 0), | ||
187 | [MSTP208] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 8, 0), | ||
188 | [MSTP206] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 6, CLK_ENABLE_ON_INIT), | ||
189 | [MSTP205] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 5, 0), | ||
190 | [MSTP204] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 4, 0), | ||
191 | [MSTP203] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 3, 0), | ||
192 | [MSTP202] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 2, CLK_ENABLE_ON_INIT), | ||
193 | [MSTP201] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 1, CLK_ENABLE_ON_INIT), | ||
194 | [MSTP200] = MSTP(&div4_clks[DIV4_B], MSTPCR2, 0, 0), | ||
193 | }; | 195 | }; |
194 | 196 | ||
195 | #define CLKDEV_CON_ID(_id, _clk) { .con_id = _id, .clk = _clk } | 197 | #define CLKDEV_CON_ID(_id, _clk) { .con_id = _id, .clk = _clk } |
196 | 198 | ||
197 | static struct clk_lookup lookups[] = { | 199 | static struct clk_lookup lookups[] = { |
200 | /* main clocks */ | ||
201 | CLKDEV_CON_ID("rclk", &r_clk), | ||
202 | CLKDEV_CON_ID("extal", &extal_clk), | ||
203 | CLKDEV_CON_ID("dll_clk", &dll_clk), | ||
204 | CLKDEV_CON_ID("pll_clk", &pll_clk), | ||
205 | |||
206 | /* DIV4 clocks */ | ||
207 | CLKDEV_CON_ID("cpu_clk", &div4_clks[DIV4_I]), | ||
208 | CLKDEV_CON_ID("umem_clk", &div4_clks[DIV4_U]), | ||
209 | CLKDEV_CON_ID("shyway_clk", &div4_clks[DIV4_SH]), | ||
210 | CLKDEV_CON_ID("bus_clk", &div4_clks[DIV4_B]), | ||
211 | CLKDEV_CON_ID("b3_clk", &div4_clks[DIV4_B3]), | ||
212 | CLKDEV_CON_ID("peripheral_clk", &div4_clks[DIV4_P]), | ||
213 | CLKDEV_CON_ID("siua_clk", &div4_clks[DIV4_SIUA]), | ||
214 | CLKDEV_CON_ID("siub_clk", &div4_clks[DIV4_SIUB]), | ||
215 | |||
198 | /* DIV6 clocks */ | 216 | /* DIV6 clocks */ |
199 | CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]), | 217 | CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]), |
218 | |||
219 | /* MSTP32 clocks */ | ||
220 | CLKDEV_CON_ID("tlb0", &mstp_clks[MSTP031]), | ||
221 | CLKDEV_CON_ID("ic0", &mstp_clks[MSTP030]), | ||
222 | CLKDEV_CON_ID("oc0", &mstp_clks[MSTP029]), | ||
223 | CLKDEV_CON_ID("uram0", &mstp_clks[MSTP028]), | ||
224 | CLKDEV_CON_ID("xymem0", &mstp_clks[MSTP026]), | ||
225 | CLKDEV_CON_ID("intc3", &mstp_clks[MSTP023]), | ||
226 | CLKDEV_CON_ID("intc0", &mstp_clks[MSTP022]), | ||
227 | CLKDEV_CON_ID("dmac0", &mstp_clks[MSTP021]), | ||
228 | CLKDEV_CON_ID("sh0", &mstp_clks[MSTP020]), | ||
229 | CLKDEV_CON_ID("hudi0", &mstp_clks[MSTP019]), | ||
230 | CLKDEV_CON_ID("ubc0", &mstp_clks[MSTP017]), | ||
231 | CLKDEV_CON_ID("tmu_fck", &mstp_clks[MSTP015]), | ||
232 | CLKDEV_CON_ID("cmt_fck", &mstp_clks[MSTP014]), | ||
233 | CLKDEV_CON_ID("rwdt0", &mstp_clks[MSTP013]), | ||
234 | CLKDEV_CON_ID("mfi0", &mstp_clks[MSTP011]), | ||
235 | CLKDEV_CON_ID("flctl0", &mstp_clks[MSTP010]), | ||
236 | { | ||
237 | /* SCIF0 */ | ||
238 | .dev_id = "sh-sci.0", | ||
239 | .con_id = "sci_fck", | ||
240 | .clk = &mstp_clks[MSTP007], | ||
241 | }, { | ||
242 | /* SCIF1 */ | ||
243 | .dev_id = "sh-sci.1", | ||
244 | .con_id = "sci_fck", | ||
245 | .clk = &mstp_clks[MSTP006], | ||
246 | }, { | ||
247 | /* SCIF2 */ | ||
248 | .dev_id = "sh-sci.2", | ||
249 | .con_id = "sci_fck", | ||
250 | .clk = &mstp_clks[MSTP005], | ||
251 | }, { | ||
252 | /* SCIF3 */ | ||
253 | .dev_id = "sh-sci.3", | ||
254 | .con_id = "sci_fck", | ||
255 | .clk = &mstp_clks[MSTP004], | ||
256 | }, | ||
257 | CLKDEV_CON_ID("sio0", &mstp_clks[MSTP003]), | ||
258 | CLKDEV_CON_ID("siof0", &mstp_clks[MSTP002]), | ||
259 | CLKDEV_CON_ID("siof1", &mstp_clks[MSTP001]), | ||
260 | CLKDEV_CON_ID("i2c0", &mstp_clks[MSTP109]), | ||
261 | CLKDEV_CON_ID("i2c1", &mstp_clks[MSTP108]), | ||
262 | CLKDEV_CON_ID("tpu0", &mstp_clks[MSTP225]), | ||
263 | CLKDEV_CON_ID("irda0", &mstp_clks[MSTP224]), | ||
264 | CLKDEV_CON_ID("sdhi0", &mstp_clks[MSTP218]), | ||
265 | CLKDEV_CON_ID("mmcif0", &mstp_clks[MSTP217]), | ||
266 | CLKDEV_CON_ID("sim0", &mstp_clks[MSTP216]), | ||
267 | CLKDEV_CON_ID("keysc0", &mstp_clks[MSTP214]), | ||
268 | CLKDEV_CON_ID("tsif0", &mstp_clks[MSTP213]), | ||
269 | CLKDEV_CON_ID("s3d40", &mstp_clks[MSTP212]), | ||
270 | CLKDEV_CON_ID("usbf0", &mstp_clks[MSTP211]), | ||
271 | CLKDEV_CON_ID("siu0", &mstp_clks[MSTP208]), | ||
272 | CLKDEV_CON_ID("jpu0", &mstp_clks[MSTP206]), | ||
273 | CLKDEV_CON_ID("vou0", &mstp_clks[MSTP205]), | ||
274 | CLKDEV_CON_ID("beu0", &mstp_clks[MSTP204]), | ||
275 | CLKDEV_CON_ID("ceu0", &mstp_clks[MSTP203]), | ||
276 | CLKDEV_CON_ID("veu0", &mstp_clks[MSTP202]), | ||
277 | CLKDEV_CON_ID("vpu0", &mstp_clks[MSTP201]), | ||
278 | CLKDEV_CON_ID("lcdc0", &mstp_clks[MSTP200]), | ||
200 | }; | 279 | }; |
201 | 280 | ||
202 | int __init arch_clk_init(void) | 281 | int __init arch_clk_init(void) |
@@ -221,7 +300,7 @@ int __init arch_clk_init(void) | |||
221 | ret = sh_clk_div6_register(div6_clks, DIV6_NR); | 300 | ret = sh_clk_div6_register(div6_clks, DIV6_NR); |
222 | 301 | ||
223 | if (!ret) | 302 | if (!ret) |
224 | ret = sh_clk_mstp32_register(mstp_clks, ARRAY_SIZE(mstp_clks)); | 303 | ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); |
225 | 304 | ||
226 | return ret; | 305 | return ret; |
227 | } | 306 | } |