1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <linux/bitops.h>
21enum ratio {
22 RAT_UNK,
23 RAT_BYP,
24 RAT_1_TO_8,
25 RAT_1_TO_4,
26 RAT_1_TO_2,
27 RAT_1_TO_1,
28 RAT_1_5_TO_1,
29 RAT_2_TO_1,
30 RAT_2_5_TO_1,
31 RAT_3_TO_1
32};
33
34
35
36
37
38
39struct corecnf {
40 int core_csb_ratio;
41 int vco_divider;
42};
43
44
45
46
47
48static const struct corecnf corecnf_tab[] = {
49 {RAT_BYP, RAT_BYP},
50 {RAT_BYP, RAT_BYP},
51 {RAT_BYP, RAT_BYP},
52 {RAT_BYP, RAT_BYP},
53 {RAT_BYP, RAT_BYP},
54 {RAT_BYP, RAT_BYP},
55 {RAT_BYP, RAT_BYP},
56 {RAT_BYP, RAT_BYP},
57 {RAT_1_TO_1, RAT_1_TO_2},
58 {RAT_1_TO_1, RAT_1_TO_4},
59 {RAT_1_TO_1, RAT_1_TO_8},
60 {RAT_1_TO_1, RAT_1_TO_8},
61 {RAT_1_5_TO_1, RAT_1_TO_2},
62 {RAT_1_5_TO_1, RAT_1_TO_4},
63 {RAT_1_5_TO_1, RAT_1_TO_8},
64 {RAT_1_5_TO_1, RAT_1_TO_8},
65 {RAT_2_TO_1, RAT_1_TO_2},
66 {RAT_2_TO_1, RAT_1_TO_4},
67 {RAT_2_TO_1, RAT_1_TO_8},
68 {RAT_2_TO_1, RAT_1_TO_8},
69 {RAT_2_5_TO_1, RAT_1_TO_2},
70 {RAT_2_5_TO_1, RAT_1_TO_4},
71 {RAT_2_5_TO_1, RAT_1_TO_8},
72 {RAT_2_5_TO_1, RAT_1_TO_8},
73 {RAT_3_TO_1, RAT_1_TO_2},
74 {RAT_3_TO_1, RAT_1_TO_4},
75 {RAT_3_TO_1, RAT_1_TO_8},
76 {RAT_3_TO_1, RAT_1_TO_8},
77};
78
79
80
81
82
83
84enum reg_type {
85 REG_SCCR,
86 REG_SPMR,
87};
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102enum mode_type {
103 TYPE_INVALID = 0,
104 TYPE_SCCR_STANDARD,
105 TYPE_SCCR_ONOFF,
106 TYPE_SPMR_DIRECT_MULTIPLY,
107 TYPE_SPECIAL,
108};
109
110
111static const char * const names[] = {
112 [MPC83XX_CLK_CORE] = "Core",
113 [MPC83XX_CLK_CSB] = "Coherent System Bus",
114 [MPC83XX_CLK_QE] = "QE",
115 [MPC83XX_CLK_BRG] = "BRG",
116 [MPC83XX_CLK_LBIU] = "Local Bus Controller",
117 [MPC83XX_CLK_LCLK] = "Local Bus",
118 [MPC83XX_CLK_MEM] = "DDR",
119 [MPC83XX_CLK_MEM_SEC] = "DDR Secondary",
120 [MPC83XX_CLK_ENC] = "SEC",
121 [MPC83XX_CLK_I2C1] = "I2C1",
122 [MPC83XX_CLK_I2C2] = "I2C2",
123 [MPC83XX_CLK_TDM] = "TDM",
124 [MPC83XX_CLK_SDHC] = "SDHC",
125 [MPC83XX_CLK_TSEC1] = "TSEC1",
126 [MPC83XX_CLK_TSEC2] = "TSEC2",
127 [MPC83XX_CLK_USBDR] = "USB DR",
128 [MPC83XX_CLK_USBMPH] = "USB MPH",
129 [MPC83XX_CLK_PCIEXP1] = "PCIEXP1",
130 [MPC83XX_CLK_PCIEXP2] = "PCIEXP2",
131 [MPC83XX_CLK_SATA] = "SATA",
132 [MPC83XX_CLK_DMAC] = "DMAC",
133 [MPC83XX_CLK_PCI] = "PCI",
134};
135
136
137
138
139
140
141
142
143
144struct clk_mode {
145 u8 low;
146 u8 high;
147 int type;
148};
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164static void set_mode(struct clk_mode *mode, u8 low, u8 high, int type)
165{
166 mode->low = low;
167 mode->high = high;
168 mode->type = type;
169}
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185static int retrieve_mode(int clk, int soc_type, struct clk_mode *mode)
186{
187 switch (clk) {
188 case MPC83XX_CLK_CORE:
189 case MPC83XX_CLK_CSB:
190 case MPC83XX_CLK_QE:
191 case MPC83XX_CLK_BRG:
192 case MPC83XX_CLK_LCLK:
193 case MPC83XX_CLK_I2C2:
194 set_mode(mode, 0, 0, TYPE_SPECIAL);
195 break;
196 case MPC83XX_CLK_MEM:
197 set_mode(mode, 1, 1, TYPE_SPMR_DIRECT_MULTIPLY);
198 break;
199 case MPC83XX_CLK_LBIU:
200 case MPC83XX_CLK_MEM_SEC:
201 set_mode(mode, 0, 0, TYPE_SPMR_DIRECT_MULTIPLY);
202 break;
203 case MPC83XX_CLK_TSEC1:
204 set_mode(mode, 0, 1, TYPE_SCCR_STANDARD);
205 break;
206 case MPC83XX_CLK_TSEC2:
207 if (soc_type == SOC_MPC8313)
208 set_mode(mode, 2, 3, TYPE_SCCR_STANDARD);
209 else
210 set_mode(mode, 0, 1, TYPE_SCCR_STANDARD);
211 break;
212 case MPC83XX_CLK_SDHC:
213 set_mode(mode, 4, 5, TYPE_SCCR_STANDARD);
214 break;
215 case MPC83XX_CLK_ENC:
216 set_mode(mode, 6, 7, TYPE_SCCR_STANDARD);
217 break;
218 case MPC83XX_CLK_I2C1:
219 if (soc_type == SOC_MPC8349)
220 set_mode(mode, 2, 3, TYPE_SCCR_STANDARD);
221 else
222 set_mode(mode, 6, 7, TYPE_SCCR_STANDARD);
223 break;
224 case MPC83XX_CLK_PCIEXP1:
225 set_mode(mode, 10, 11, TYPE_SCCR_STANDARD);
226 break;
227 case MPC83XX_CLK_PCIEXP2:
228 set_mode(mode, 12, 13, TYPE_SCCR_STANDARD);
229 break;
230 case MPC83XX_CLK_USBDR:
231 if (soc_type == SOC_MPC8313 || soc_type == SOC_MPC8349)
232 set_mode(mode, 10, 11, TYPE_SCCR_STANDARD);
233 else
234 set_mode(mode, 8, 9, TYPE_SCCR_STANDARD);
235 break;
236 case MPC83XX_CLK_USBMPH:
237 set_mode(mode, 8, 9, TYPE_SCCR_STANDARD);
238 break;
239 case MPC83XX_CLK_PCI:
240 set_mode(mode, 15, 15, TYPE_SCCR_ONOFF);
241 break;
242 case MPC83XX_CLK_DMAC:
243 set_mode(mode, 26, 27, TYPE_SCCR_STANDARD);
244 break;
245 case MPC83XX_CLK_SATA:
246
247 if (soc_type == SOC_MPC8379) {
248 set_mode(mode, 24, 25, TYPE_SCCR_STANDARD);
249 set_mode(mode, 26, 27, TYPE_SCCR_STANDARD);
250 set_mode(mode, 28, 29, TYPE_SCCR_STANDARD);
251 set_mode(mode, 30, 31, TYPE_SCCR_STANDARD);
252 } else {
253 set_mode(mode, 18, 19, TYPE_SCCR_STANDARD);
254 set_mode(mode, 20, 21, TYPE_SCCR_STANDARD);
255 }
256 break;
257 case MPC83XX_CLK_TDM:
258 set_mode(mode, 26, 27, TYPE_SCCR_STANDARD);
259 break;
260 default:
261 debug("%s: Unknown clock type %d on soc type %d\n",
262 __func__, clk, soc_type);
263 set_mode(mode, 0, 0, TYPE_INVALID);
264 return -EINVAL;
265 }
266
267 return 0;
268}
269
270
271
272
273
274
275
276static inline u32 get_spmr(immap_t *im)
277{
278 u32 res = in_be32(&im->clk.spmr);
279
280 return res;
281}
282
283
284
285
286
287
288
289static inline u32 get_sccr(immap_t *im)
290{
291 u32 res = in_be32(&im->clk.sccr);
292
293 return res;
294}
295
296
297
298
299
300
301
302static inline u32 get_lcrr(immap_t *im)
303{
304 u32 res = in_be32(&im->im_lbc.lcrr);
305
306 return res;
307}
308
309
310
311
312
313
314
315static inline u32 get_pci_sync_in(immap_t *im)
316{
317 u8 clkin_div;
318
319 clkin_div = (get_spmr(im) & SPMR_CKID) >> SPMR_CKID_SHIFT;
320 return CONFIG_SYS_CLK_FREQ / (1 + clkin_div);
321}
322
323
324
325
326
327
328
329static inline u32 get_csb_clk(immap_t *im)
330{
331 u8 spmf;
332
333 spmf = (get_spmr(im) & SPMR_SPMF) >> SPMR_SPMF_SHIFT;
334 return CONFIG_SYS_CLK_FREQ * spmf;
335}
336
337
338
339
340
341
342
343
344static inline uint spmr_field(immap_t *im, u32 mask)
345{
346
347 uint shift = mask ? ffs(mask) - 1 : 0;
348
349 return (get_spmr(im) & mask) >> shift;
350}
351
352
353
354
355
356
357
358
359static inline uint sccr_field(immap_t *im, u32 mask)
360{
361
362 uint shift = mask ? ffs(mask) - 1 : 0;
363
364 return (get_sccr(im) & mask) >> shift;
365}
366
367
368
369
370
371
372
373
374static inline uint lcrr_field(immap_t *im, u32 mask)
375{
376
377 uint shift = mask ? ffs(mask) - 1 : 0;
378
379 return (get_lcrr(im) & mask) >> shift;
380}
381