183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2a47a12beSStefan Roese /*
3a47a12beSStefan Roese * (C) Copyright 2000-2002
4a47a12beSStefan Roese * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5a47a12beSStefan Roese *
6a47a12beSStefan Roese * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
7a47a12beSStefan Roese */
8a47a12beSStefan Roese
9*07d538d2SMario Six #ifndef CONFIG_CLK_MPC83XX
10*07d538d2SMario Six
11a47a12beSStefan Roese #include <common.h>
12a47a12beSStefan Roese #include <mpc83xx.h>
13a47a12beSStefan Roese #include <command.h>
14a47a12beSStefan Roese #include <asm/processor.h>
15a47a12beSStefan Roese
16a47a12beSStefan Roese DECLARE_GLOBAL_DATA_PTR;
17a47a12beSStefan Roese
18a47a12beSStefan Roese /* ----------------------------------------------------------------- */
19a47a12beSStefan Roese
20a47a12beSStefan Roese typedef enum {
21a47a12beSStefan Roese _unk,
22a47a12beSStefan Roese _off,
23a47a12beSStefan Roese _byp,
24a47a12beSStefan Roese _x8,
25a47a12beSStefan Roese _x4,
26a47a12beSStefan Roese _x2,
27a47a12beSStefan Roese _x1,
28a47a12beSStefan Roese _1x,
29a47a12beSStefan Roese _1_5x,
30a47a12beSStefan Roese _2x,
31a47a12beSStefan Roese _2_5x,
32a47a12beSStefan Roese _3x
33a47a12beSStefan Roese } mult_t;
34a47a12beSStefan Roese
35a47a12beSStefan Roese typedef struct {
36a47a12beSStefan Roese mult_t core_csb_ratio;
37a47a12beSStefan Roese mult_t vco_divider;
38a47a12beSStefan Roese } corecnf_t;
39a47a12beSStefan Roese
40a2873bdeSKim Phillips static corecnf_t corecnf_tab[] = {
41a47a12beSStefan Roese {_byp, _byp}, /* 0x00 */
42a47a12beSStefan Roese {_byp, _byp}, /* 0x01 */
43a47a12beSStefan Roese {_byp, _byp}, /* 0x02 */
44a47a12beSStefan Roese {_byp, _byp}, /* 0x03 */
45a47a12beSStefan Roese {_byp, _byp}, /* 0x04 */
46a47a12beSStefan Roese {_byp, _byp}, /* 0x05 */
47a47a12beSStefan Roese {_byp, _byp}, /* 0x06 */
48a47a12beSStefan Roese {_byp, _byp}, /* 0x07 */
49a47a12beSStefan Roese {_1x, _x2}, /* 0x08 */
50a47a12beSStefan Roese {_1x, _x4}, /* 0x09 */
51a47a12beSStefan Roese {_1x, _x8}, /* 0x0A */
52a47a12beSStefan Roese {_1x, _x8}, /* 0x0B */
53a47a12beSStefan Roese {_1_5x, _x2}, /* 0x0C */
54a47a12beSStefan Roese {_1_5x, _x4}, /* 0x0D */
55a47a12beSStefan Roese {_1_5x, _x8}, /* 0x0E */
56a47a12beSStefan Roese {_1_5x, _x8}, /* 0x0F */
57a47a12beSStefan Roese {_2x, _x2}, /* 0x10 */
58a47a12beSStefan Roese {_2x, _x4}, /* 0x11 */
59a47a12beSStefan Roese {_2x, _x8}, /* 0x12 */
60a47a12beSStefan Roese {_2x, _x8}, /* 0x13 */
61a47a12beSStefan Roese {_2_5x, _x2}, /* 0x14 */
62a47a12beSStefan Roese {_2_5x, _x4}, /* 0x15 */
63a47a12beSStefan Roese {_2_5x, _x8}, /* 0x16 */
64a47a12beSStefan Roese {_2_5x, _x8}, /* 0x17 */
65a47a12beSStefan Roese {_3x, _x2}, /* 0x18 */
66a47a12beSStefan Roese {_3x, _x4}, /* 0x19 */
67a47a12beSStefan Roese {_3x, _x8}, /* 0x1A */
68a47a12beSStefan Roese {_3x, _x8}, /* 0x1B */
69a47a12beSStefan Roese };
70a47a12beSStefan Roese
71a47a12beSStefan Roese /* ----------------------------------------------------------------- */
72a47a12beSStefan Roese
73a47a12beSStefan Roese /*
74a47a12beSStefan Roese *
75a47a12beSStefan Roese */
get_clocks(void)76a47a12beSStefan Roese int get_clocks(void)
77a47a12beSStefan Roese {
78a47a12beSStefan Roese volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
79a47a12beSStefan Roese u32 pci_sync_in;
80a47a12beSStefan Roese u8 spmf;
81a47a12beSStefan Roese u8 clkin_div;
82a47a12beSStefan Roese u32 sccr;
83a47a12beSStefan Roese u32 corecnf_tab_index;
84a47a12beSStefan Roese u8 corepll;
85a47a12beSStefan Roese u32 lcrr;
86a47a12beSStefan Roese
87a47a12beSStefan Roese u32 csb_clk;
887c619ddcSIlya Yanok #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
897c619ddcSIlya Yanok defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x)
90a47a12beSStefan Roese u32 tsec1_clk;
91a47a12beSStefan Roese u32 tsec2_clk;
92a47a12beSStefan Roese u32 usbdr_clk;
93a88731a6SGerlando Falauto #elif defined(CONFIG_MPC8309)
94a88731a6SGerlando Falauto u32 usbdr_clk;
95a47a12beSStefan Roese #endif
96a47a12beSStefan Roese #ifdef CONFIG_MPC834x
97a47a12beSStefan Roese u32 usbmph_clk;
98a47a12beSStefan Roese #endif
99a47a12beSStefan Roese u32 core_clk;
100a47a12beSStefan Roese u32 i2c1_clk;
101a47a12beSStefan Roese #if !defined(CONFIG_MPC832x)
102a47a12beSStefan Roese u32 i2c2_clk;
103a47a12beSStefan Roese #endif
104a47a12beSStefan Roese #if defined(CONFIG_MPC8315)
105a47a12beSStefan Roese u32 tdm_clk;
106a47a12beSStefan Roese #endif
10727ef578dSRini van Zetten #if defined(CONFIG_FSL_ESDHC)
108a47a12beSStefan Roese u32 sdhc_clk;
109a47a12beSStefan Roese #endif
110a88731a6SGerlando Falauto #if !defined(CONFIG_MPC8309)
111a47a12beSStefan Roese u32 enc_clk;
112a88731a6SGerlando Falauto #endif
113a47a12beSStefan Roese u32 lbiu_clk;
114a47a12beSStefan Roese u32 lclk_clk;
115a47a12beSStefan Roese u32 mem_clk;
116a47a12beSStefan Roese #if defined(CONFIG_MPC8360)
117a47a12beSStefan Roese u32 mem_sec_clk;
118a47a12beSStefan Roese #endif
1194b5282deSGerlando Falauto #if defined(CONFIG_QE)
120a47a12beSStefan Roese u32 qepmf;
121a47a12beSStefan Roese u32 qepdf;
122a47a12beSStefan Roese u32 qe_clk;
123a47a12beSStefan Roese u32 brg_clk;
124a47a12beSStefan Roese #endif
1257c619ddcSIlya Yanok #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
1267c619ddcSIlya Yanok defined(CONFIG_MPC837x)
127a47a12beSStefan Roese u32 pciexp1_clk;
128a47a12beSStefan Roese u32 pciexp2_clk;
129a47a12beSStefan Roese #endif
130a47a12beSStefan Roese #if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315)
131a47a12beSStefan Roese u32 sata_clk;
132a47a12beSStefan Roese #endif
133a47a12beSStefan Roese
134a47a12beSStefan Roese if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
135a47a12beSStefan Roese return -1;
136a47a12beSStefan Roese
137a47a12beSStefan Roese clkin_div = ((im->clk.spmr & SPMR_CKID) >> SPMR_CKID_SHIFT);
138a47a12beSStefan Roese
139a47a12beSStefan Roese if (im->reset.rcwh & HRCWH_PCI_HOST) {
140a47a12beSStefan Roese #if defined(CONFIG_83XX_CLKIN)
141a47a12beSStefan Roese pci_sync_in = CONFIG_83XX_CLKIN / (1 + clkin_div);
142a47a12beSStefan Roese #else
143a47a12beSStefan Roese pci_sync_in = 0xDEADBEEF;
144a47a12beSStefan Roese #endif
145a47a12beSStefan Roese } else {
146a47a12beSStefan Roese #if defined(CONFIG_83XX_PCICLK)
147a47a12beSStefan Roese pci_sync_in = CONFIG_83XX_PCICLK;
148a47a12beSStefan Roese #else
149a47a12beSStefan Roese pci_sync_in = 0xDEADBEEF;
150a47a12beSStefan Roese #endif
151a47a12beSStefan Roese }
152a47a12beSStefan Roese
15326e5f794SJoakim Tjernlund spmf = (im->clk.spmr & SPMR_SPMF) >> SPMR_SPMF_SHIFT;
154a47a12beSStefan Roese csb_clk = pci_sync_in * (1 + clkin_div) * spmf;
155a47a12beSStefan Roese
156a47a12beSStefan Roese sccr = im->clk.sccr;
157a47a12beSStefan Roese
1587c619ddcSIlya Yanok #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
1597c619ddcSIlya Yanok defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x)
160a47a12beSStefan Roese switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) {
161a47a12beSStefan Roese case 0:
162a47a12beSStefan Roese tsec1_clk = 0;
163a47a12beSStefan Roese break;
164a47a12beSStefan Roese case 1:
165a47a12beSStefan Roese tsec1_clk = csb_clk;
166a47a12beSStefan Roese break;
167a47a12beSStefan Roese case 2:
168a47a12beSStefan Roese tsec1_clk = csb_clk / 2;
169a47a12beSStefan Roese break;
170a47a12beSStefan Roese case 3:
171a47a12beSStefan Roese tsec1_clk = csb_clk / 3;
172a47a12beSStefan Roese break;
173a47a12beSStefan Roese default:
174d7b4ca2bSRobert P. J. Day /* unknown SCCR_TSEC1CM value */
175a47a12beSStefan Roese return -2;
176a47a12beSStefan Roese }
1778afad91fSGerlando Falauto #endif
178a47a12beSStefan Roese
1798afad91fSGerlando Falauto #if defined(CONFIG_MPC830x) || defined(CONFIG_MPC831x) || \
1808afad91fSGerlando Falauto defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x)
181a47a12beSStefan Roese switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) {
182a47a12beSStefan Roese case 0:
183a47a12beSStefan Roese usbdr_clk = 0;
184a47a12beSStefan Roese break;
185a47a12beSStefan Roese case 1:
186a47a12beSStefan Roese usbdr_clk = csb_clk;
187a47a12beSStefan Roese break;
188a47a12beSStefan Roese case 2:
189a47a12beSStefan Roese usbdr_clk = csb_clk / 2;
190a47a12beSStefan Roese break;
191a47a12beSStefan Roese case 3:
192a47a12beSStefan Roese usbdr_clk = csb_clk / 3;
193a47a12beSStefan Roese break;
194a47a12beSStefan Roese default:
195d7b4ca2bSRobert P. J. Day /* unknown SCCR_USBDRCM value */
196a47a12beSStefan Roese return -3;
197a47a12beSStefan Roese }
198a47a12beSStefan Roese #endif
199a47a12beSStefan Roese
2007c619ddcSIlya Yanok #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC8315) || \
2017c619ddcSIlya Yanok defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x)
202a47a12beSStefan Roese switch ((sccr & SCCR_TSEC2CM) >> SCCR_TSEC2CM_SHIFT) {
203a47a12beSStefan Roese case 0:
204a47a12beSStefan Roese tsec2_clk = 0;
205a47a12beSStefan Roese break;
206a47a12beSStefan Roese case 1:
207a47a12beSStefan Roese tsec2_clk = csb_clk;
208a47a12beSStefan Roese break;
209a47a12beSStefan Roese case 2:
210a47a12beSStefan Roese tsec2_clk = csb_clk / 2;
211a47a12beSStefan Roese break;
212a47a12beSStefan Roese case 3:
213a47a12beSStefan Roese tsec2_clk = csb_clk / 3;
214a47a12beSStefan Roese break;
215a47a12beSStefan Roese default:
216d7b4ca2bSRobert P. J. Day /* unknown SCCR_TSEC2CM value */
217a47a12beSStefan Roese return -4;
218a47a12beSStefan Roese }
219a47a12beSStefan Roese #elif defined(CONFIG_MPC8313)
220a47a12beSStefan Roese tsec2_clk = tsec1_clk;
221a47a12beSStefan Roese
222a47a12beSStefan Roese if (!(sccr & SCCR_TSEC1ON))
223a47a12beSStefan Roese tsec1_clk = 0;
224a47a12beSStefan Roese if (!(sccr & SCCR_TSEC2ON))
225a47a12beSStefan Roese tsec2_clk = 0;
226a47a12beSStefan Roese #endif
227a47a12beSStefan Roese
228a47a12beSStefan Roese #if defined(CONFIG_MPC834x)
229a47a12beSStefan Roese switch ((sccr & SCCR_USBMPHCM) >> SCCR_USBMPHCM_SHIFT) {
230a47a12beSStefan Roese case 0:
231a47a12beSStefan Roese usbmph_clk = 0;
232a47a12beSStefan Roese break;
233a47a12beSStefan Roese case 1:
234a47a12beSStefan Roese usbmph_clk = csb_clk;
235a47a12beSStefan Roese break;
236a47a12beSStefan Roese case 2:
237a47a12beSStefan Roese usbmph_clk = csb_clk / 2;
238a47a12beSStefan Roese break;
239a47a12beSStefan Roese case 3:
240a47a12beSStefan Roese usbmph_clk = csb_clk / 3;
241a47a12beSStefan Roese break;
242a47a12beSStefan Roese default:
243d7b4ca2bSRobert P. J. Day /* unknown SCCR_USBMPHCM value */
244a47a12beSStefan Roese return -5;
245a47a12beSStefan Roese }
246a47a12beSStefan Roese
247a47a12beSStefan Roese if (usbmph_clk != 0 && usbdr_clk != 0 && usbmph_clk != usbdr_clk) {
248a47a12beSStefan Roese /* if USB MPH clock is not disabled and
249a47a12beSStefan Roese * USB DR clock is not disabled then
250a47a12beSStefan Roese * USB MPH & USB DR must have the same rate
251a47a12beSStefan Roese */
252a47a12beSStefan Roese return -6;
253a47a12beSStefan Roese }
254a47a12beSStefan Roese #endif
255a88731a6SGerlando Falauto #if !defined(CONFIG_MPC8309)
256a47a12beSStefan Roese switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) {
257a47a12beSStefan Roese case 0:
258a47a12beSStefan Roese enc_clk = 0;
259a47a12beSStefan Roese break;
260a47a12beSStefan Roese case 1:
261a47a12beSStefan Roese enc_clk = csb_clk;
262a47a12beSStefan Roese break;
263a47a12beSStefan Roese case 2:
264a47a12beSStefan Roese enc_clk = csb_clk / 2;
265a47a12beSStefan Roese break;
266a47a12beSStefan Roese case 3:
267a47a12beSStefan Roese enc_clk = csb_clk / 3;
268a47a12beSStefan Roese break;
269a47a12beSStefan Roese default:
270d7b4ca2bSRobert P. J. Day /* unknown SCCR_ENCCM value */
271a47a12beSStefan Roese return -7;
272a47a12beSStefan Roese }
273a88731a6SGerlando Falauto #endif
274a47a12beSStefan Roese
27527ef578dSRini van Zetten #if defined(CONFIG_FSL_ESDHC)
276a47a12beSStefan Roese switch ((sccr & SCCR_SDHCCM) >> SCCR_SDHCCM_SHIFT) {
277a47a12beSStefan Roese case 0:
278a47a12beSStefan Roese sdhc_clk = 0;
279a47a12beSStefan Roese break;
280a47a12beSStefan Roese case 1:
281a47a12beSStefan Roese sdhc_clk = csb_clk;
282a47a12beSStefan Roese break;
283a47a12beSStefan Roese case 2:
284a47a12beSStefan Roese sdhc_clk = csb_clk / 2;
285a47a12beSStefan Roese break;
286a47a12beSStefan Roese case 3:
287a47a12beSStefan Roese sdhc_clk = csb_clk / 3;
288a47a12beSStefan Roese break;
289a47a12beSStefan Roese default:
290d7b4ca2bSRobert P. J. Day /* unknown SCCR_SDHCCM value */
291a47a12beSStefan Roese return -8;
292a47a12beSStefan Roese }
293a47a12beSStefan Roese #endif
294a47a12beSStefan Roese #if defined(CONFIG_MPC8315)
295a47a12beSStefan Roese switch ((sccr & SCCR_TDMCM) >> SCCR_TDMCM_SHIFT) {
296a47a12beSStefan Roese case 0:
297a47a12beSStefan Roese tdm_clk = 0;
298a47a12beSStefan Roese break;
299a47a12beSStefan Roese case 1:
300a47a12beSStefan Roese tdm_clk = csb_clk;
301a47a12beSStefan Roese break;
302a47a12beSStefan Roese case 2:
303a47a12beSStefan Roese tdm_clk = csb_clk / 2;
304a47a12beSStefan Roese break;
305a47a12beSStefan Roese case 3:
306a47a12beSStefan Roese tdm_clk = csb_clk / 3;
307a47a12beSStefan Roese break;
308a47a12beSStefan Roese default:
309d7b4ca2bSRobert P. J. Day /* unknown SCCR_TDMCM value */
310a47a12beSStefan Roese return -8;
311a47a12beSStefan Roese }
312a47a12beSStefan Roese #endif
313a47a12beSStefan Roese
314a47a12beSStefan Roese #if defined(CONFIG_MPC834x)
315a47a12beSStefan Roese i2c1_clk = tsec2_clk;
316a47a12beSStefan Roese #elif defined(CONFIG_MPC8360)
317a47a12beSStefan Roese i2c1_clk = csb_clk;
318a47a12beSStefan Roese #elif defined(CONFIG_MPC832x)
319a47a12beSStefan Roese i2c1_clk = enc_clk;
3207c619ddcSIlya Yanok #elif defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x)
321a47a12beSStefan Roese i2c1_clk = enc_clk;
32227ef578dSRini van Zetten #elif defined(CONFIG_FSL_ESDHC)
323a47a12beSStefan Roese i2c1_clk = sdhc_clk;
3241bda1624SAndre Schwarz #elif defined(CONFIG_MPC837x)
3251bda1624SAndre Schwarz i2c1_clk = enc_clk;
326a88731a6SGerlando Falauto #elif defined(CONFIG_MPC8309)
327a88731a6SGerlando Falauto i2c1_clk = csb_clk;
328a47a12beSStefan Roese #endif
329a47a12beSStefan Roese #if !defined(CONFIG_MPC832x)
330a47a12beSStefan Roese i2c2_clk = csb_clk; /* i2c-2 clk is equal to csb clk */
331a47a12beSStefan Roese #endif
332a47a12beSStefan Roese
3337c619ddcSIlya Yanok #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
3347c619ddcSIlya Yanok defined(CONFIG_MPC837x)
335a47a12beSStefan Roese switch ((sccr & SCCR_PCIEXP1CM) >> SCCR_PCIEXP1CM_SHIFT) {
336a47a12beSStefan Roese case 0:
337a47a12beSStefan Roese pciexp1_clk = 0;
338a47a12beSStefan Roese break;
339a47a12beSStefan Roese case 1:
340a47a12beSStefan Roese pciexp1_clk = csb_clk;
341a47a12beSStefan Roese break;
342a47a12beSStefan Roese case 2:
343a47a12beSStefan Roese pciexp1_clk = csb_clk / 2;
344a47a12beSStefan Roese break;
345a47a12beSStefan Roese case 3:
346a47a12beSStefan Roese pciexp1_clk = csb_clk / 3;
347a47a12beSStefan Roese break;
348a47a12beSStefan Roese default:
349d7b4ca2bSRobert P. J. Day /* unknown SCCR_PCIEXP1CM value */
350a47a12beSStefan Roese return -9;
351a47a12beSStefan Roese }
352a47a12beSStefan Roese
353a47a12beSStefan Roese switch ((sccr & SCCR_PCIEXP2CM) >> SCCR_PCIEXP2CM_SHIFT) {
354a47a12beSStefan Roese case 0:
355a47a12beSStefan Roese pciexp2_clk = 0;
356a47a12beSStefan Roese break;
357a47a12beSStefan Roese case 1:
358a47a12beSStefan Roese pciexp2_clk = csb_clk;
359a47a12beSStefan Roese break;
360a47a12beSStefan Roese case 2:
361a47a12beSStefan Roese pciexp2_clk = csb_clk / 2;
362a47a12beSStefan Roese break;
363a47a12beSStefan Roese case 3:
364a47a12beSStefan Roese pciexp2_clk = csb_clk / 3;
365a47a12beSStefan Roese break;
366a47a12beSStefan Roese default:
367d7b4ca2bSRobert P. J. Day /* unknown SCCR_PCIEXP2CM value */
368a47a12beSStefan Roese return -10;
369a47a12beSStefan Roese }
370a47a12beSStefan Roese #endif
371a47a12beSStefan Roese
372a47a12beSStefan Roese #if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315)
373a47a12beSStefan Roese switch ((sccr & SCCR_SATA1CM) >> SCCR_SATA1CM_SHIFT) {
374a47a12beSStefan Roese case 0:
375a47a12beSStefan Roese sata_clk = 0;
376a47a12beSStefan Roese break;
377a47a12beSStefan Roese case 1:
378a47a12beSStefan Roese sata_clk = csb_clk;
379a47a12beSStefan Roese break;
380a47a12beSStefan Roese case 2:
381a47a12beSStefan Roese sata_clk = csb_clk / 2;
382a47a12beSStefan Roese break;
383a47a12beSStefan Roese case 3:
384a47a12beSStefan Roese sata_clk = csb_clk / 3;
385a47a12beSStefan Roese break;
386a47a12beSStefan Roese default:
387d7b4ca2bSRobert P. J. Day /* unknown SCCR_SATA1CM value */
388a47a12beSStefan Roese return -11;
389a47a12beSStefan Roese }
390a47a12beSStefan Roese #endif
391a47a12beSStefan Roese
392a47a12beSStefan Roese lbiu_clk = csb_clk *
39326e5f794SJoakim Tjernlund (1 + ((im->clk.spmr & SPMR_LBIUCM) >> SPMR_LBIUCM_SHIFT));
394f51cdaf1SBecky Bruce lcrr = (im->im_lbc.lcrr & LCRR_CLKDIV) >> LCRR_CLKDIV_SHIFT;
395a47a12beSStefan Roese switch (lcrr) {
396a47a12beSStefan Roese case 2:
397a47a12beSStefan Roese case 4:
398a47a12beSStefan Roese case 8:
399a47a12beSStefan Roese lclk_clk = lbiu_clk / lcrr;
400a47a12beSStefan Roese break;
401a47a12beSStefan Roese default:
402a47a12beSStefan Roese /* unknown lcrr */
403a47a12beSStefan Roese return -12;
404a47a12beSStefan Roese }
405a47a12beSStefan Roese
406a47a12beSStefan Roese mem_clk = csb_clk *
40726e5f794SJoakim Tjernlund (1 + ((im->clk.spmr & SPMR_DDRCM) >> SPMR_DDRCM_SHIFT));
40826e5f794SJoakim Tjernlund corepll = (im->clk.spmr & SPMR_COREPLL) >> SPMR_COREPLL_SHIFT;
40926e5f794SJoakim Tjernlund
410a47a12beSStefan Roese #if defined(CONFIG_MPC8360)
411a47a12beSStefan Roese mem_sec_clk = csb_clk * (1 +
41226e5f794SJoakim Tjernlund ((im->clk.spmr & SPMR_LBIUCM) >> SPMR_LBIUCM_SHIFT));
413a47a12beSStefan Roese #endif
414a47a12beSStefan Roese
415a47a12beSStefan Roese corecnf_tab_index = ((corepll & 0x1F) << 2) | ((corepll & 0x60) >> 5);
416b7707b04SRobert P. J. Day if (corecnf_tab_index > (ARRAY_SIZE(corecnf_tab))) {
417d7b4ca2bSRobert P. J. Day /* corecnf_tab_index is too high, possibly wrong value */
418a47a12beSStefan Roese return -11;
419a47a12beSStefan Roese }
420a47a12beSStefan Roese switch (corecnf_tab[corecnf_tab_index].core_csb_ratio) {
421a47a12beSStefan Roese case _byp:
422a47a12beSStefan Roese case _x1:
423a47a12beSStefan Roese case _1x:
424a47a12beSStefan Roese core_clk = csb_clk;
425a47a12beSStefan Roese break;
426a47a12beSStefan Roese case _1_5x:
427a47a12beSStefan Roese core_clk = (3 * csb_clk) / 2;
428a47a12beSStefan Roese break;
429a47a12beSStefan Roese case _2x:
430a47a12beSStefan Roese core_clk = 2 * csb_clk;
431a47a12beSStefan Roese break;
432a47a12beSStefan Roese case _2_5x:
433a47a12beSStefan Roese core_clk = (5 * csb_clk) / 2;
434a47a12beSStefan Roese break;
435a47a12beSStefan Roese case _3x:
436a47a12beSStefan Roese core_clk = 3 * csb_clk;
437a47a12beSStefan Roese break;
438a47a12beSStefan Roese default:
439d7b4ca2bSRobert P. J. Day /* unknown core to csb ratio */
440a47a12beSStefan Roese return -13;
441a47a12beSStefan Roese }
442a47a12beSStefan Roese
4434b5282deSGerlando Falauto #if defined(CONFIG_QE)
44426e5f794SJoakim Tjernlund qepmf = (im->clk.spmr & SPMR_CEPMF) >> SPMR_CEPMF_SHIFT;
44526e5f794SJoakim Tjernlund qepdf = (im->clk.spmr & SPMR_CEPDF) >> SPMR_CEPDF_SHIFT;
446a47a12beSStefan Roese qe_clk = (pci_sync_in * qepmf) / (1 + qepdf);
447a47a12beSStefan Roese brg_clk = qe_clk / 2;
448a47a12beSStefan Roese #endif
449a47a12beSStefan Roese
450c6731fe2SSimon Glass gd->arch.csb_clk = csb_clk;
4517c619ddcSIlya Yanok #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
4527c619ddcSIlya Yanok defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x)
453c6731fe2SSimon Glass gd->arch.tsec1_clk = tsec1_clk;
454c6731fe2SSimon Glass gd->arch.tsec2_clk = tsec2_clk;
455c6731fe2SSimon Glass gd->arch.usbdr_clk = usbdr_clk;
456a88731a6SGerlando Falauto #elif defined(CONFIG_MPC8309)
457c6731fe2SSimon Glass gd->arch.usbdr_clk = usbdr_clk;
458a47a12beSStefan Roese #endif
459a47a12beSStefan Roese #if defined(CONFIG_MPC834x)
460c6731fe2SSimon Glass gd->arch.usbmph_clk = usbmph_clk;
461a47a12beSStefan Roese #endif
462a47a12beSStefan Roese #if defined(CONFIG_MPC8315)
463c6731fe2SSimon Glass gd->arch.tdm_clk = tdm_clk;
464a47a12beSStefan Roese #endif
46527ef578dSRini van Zetten #if defined(CONFIG_FSL_ESDHC)
466e9adeca3SSimon Glass gd->arch.sdhc_clk = sdhc_clk;
467a47a12beSStefan Roese #endif
468c6731fe2SSimon Glass gd->arch.core_clk = core_clk;
469609e6ec3SSimon Glass gd->arch.i2c1_clk = i2c1_clk;
470a47a12beSStefan Roese #if !defined(CONFIG_MPC832x)
471609e6ec3SSimon Glass gd->arch.i2c2_clk = i2c2_clk;
472a47a12beSStefan Roese #endif
473a88731a6SGerlando Falauto #if !defined(CONFIG_MPC8309)
474c6731fe2SSimon Glass gd->arch.enc_clk = enc_clk;
475a88731a6SGerlando Falauto #endif
476c6731fe2SSimon Glass gd->arch.lbiu_clk = lbiu_clk;
477c6731fe2SSimon Glass gd->arch.lclk_clk = lclk_clk;
478a47a12beSStefan Roese gd->mem_clk = mem_clk;
479a47a12beSStefan Roese #if defined(CONFIG_MPC8360)
480c6731fe2SSimon Glass gd->arch.mem_sec_clk = mem_sec_clk;
481a47a12beSStefan Roese #endif
4824b5282deSGerlando Falauto #if defined(CONFIG_QE)
48345bae2e3SSimon Glass gd->arch.qe_clk = qe_clk;
4841206c184SSimon Glass gd->arch.brg_clk = brg_clk;
485a47a12beSStefan Roese #endif
486810cb190SBill Cook #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
487810cb190SBill Cook defined(CONFIG_MPC837x)
488c6731fe2SSimon Glass gd->arch.pciexp1_clk = pciexp1_clk;
489c6731fe2SSimon Glass gd->arch.pciexp2_clk = pciexp2_clk;
490a47a12beSStefan Roese #endif
491a47a12beSStefan Roese #if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315)
492c6731fe2SSimon Glass gd->arch.sata_clk = sata_clk;
493a47a12beSStefan Roese #endif
494a47a12beSStefan Roese gd->pci_clk = pci_sync_in;
495c6731fe2SSimon Glass gd->cpu_clk = gd->arch.core_clk;
496c6731fe2SSimon Glass gd->bus_clk = gd->arch.csb_clk;
497a47a12beSStefan Roese return 0;
498a47a12beSStefan Roese
499a47a12beSStefan Roese }
500a47a12beSStefan Roese
501a47a12beSStefan Roese /********************************************
502a47a12beSStefan Roese * get_bus_freq
503a47a12beSStefan Roese * return system bus freq in Hz
504a47a12beSStefan Roese *********************************************/
get_bus_freq(ulong dummy)505a47a12beSStefan Roese ulong get_bus_freq(ulong dummy)
506a47a12beSStefan Roese {
507c6731fe2SSimon Glass return gd->arch.csb_clk;
508a47a12beSStefan Roese }
509a47a12beSStefan Roese
510d29d17d7SYork Sun /********************************************
511d29d17d7SYork Sun * get_ddr_freq
512d29d17d7SYork Sun * return ddr bus freq in Hz
513d29d17d7SYork Sun *********************************************/
get_ddr_freq(ulong dummy)514d29d17d7SYork Sun ulong get_ddr_freq(ulong dummy)
515d29d17d7SYork Sun {
516d29d17d7SYork Sun return gd->mem_clk;
517d29d17d7SYork Sun }
518d29d17d7SYork Sun
do_clocks(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])519a2873bdeSKim Phillips static int do_clocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
520a47a12beSStefan Roese {
521a47a12beSStefan Roese char buf[32];
522a47a12beSStefan Roese
523a47a12beSStefan Roese printf("Clock configuration:\n");
524c6731fe2SSimon Glass printf(" Core: %-4s MHz\n",
525c6731fe2SSimon Glass strmhz(buf, gd->arch.core_clk));
526c6731fe2SSimon Glass printf(" Coherent System Bus: %-4s MHz\n",
527c6731fe2SSimon Glass strmhz(buf, gd->arch.csb_clk));
5284b5282deSGerlando Falauto #if defined(CONFIG_QE)
52945bae2e3SSimon Glass printf(" QE: %-4s MHz\n",
53045bae2e3SSimon Glass strmhz(buf, gd->arch.qe_clk));
5311206c184SSimon Glass printf(" BRG: %-4s MHz\n",
5321206c184SSimon Glass strmhz(buf, gd->arch.brg_clk));
533a47a12beSStefan Roese #endif
534c6731fe2SSimon Glass printf(" Local Bus Controller:%-4s MHz\n",
535c6731fe2SSimon Glass strmhz(buf, gd->arch.lbiu_clk));
536c6731fe2SSimon Glass printf(" Local Bus: %-4s MHz\n",
537c6731fe2SSimon Glass strmhz(buf, gd->arch.lclk_clk));
538a47a12beSStefan Roese printf(" DDR: %-4s MHz\n", strmhz(buf, gd->mem_clk));
539a47a12beSStefan Roese #if defined(CONFIG_MPC8360)
540c6731fe2SSimon Glass printf(" DDR Secondary: %-4s MHz\n",
541c6731fe2SSimon Glass strmhz(buf, gd->arch.mem_sec_clk));
542a47a12beSStefan Roese #endif
543a88731a6SGerlando Falauto #if !defined(CONFIG_MPC8309)
544c6731fe2SSimon Glass printf(" SEC: %-4s MHz\n",
545c6731fe2SSimon Glass strmhz(buf, gd->arch.enc_clk));
546a88731a6SGerlando Falauto #endif
547609e6ec3SSimon Glass printf(" I2C1: %-4s MHz\n",
548609e6ec3SSimon Glass strmhz(buf, gd->arch.i2c1_clk));
549a47a12beSStefan Roese #if !defined(CONFIG_MPC832x)
550609e6ec3SSimon Glass printf(" I2C2: %-4s MHz\n",
551609e6ec3SSimon Glass strmhz(buf, gd->arch.i2c2_clk));
552a47a12beSStefan Roese #endif
553a47a12beSStefan Roese #if defined(CONFIG_MPC8315)
554c6731fe2SSimon Glass printf(" TDM: %-4s MHz\n",
555c6731fe2SSimon Glass strmhz(buf, gd->arch.tdm_clk));
556a47a12beSStefan Roese #endif
55727ef578dSRini van Zetten #if defined(CONFIG_FSL_ESDHC)
558e9adeca3SSimon Glass printf(" SDHC: %-4s MHz\n",
559e9adeca3SSimon Glass strmhz(buf, gd->arch.sdhc_clk));
560a47a12beSStefan Roese #endif
5617c619ddcSIlya Yanok #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
5627c619ddcSIlya Yanok defined(CONFIG_MPC834x) || defined(CONFIG_MPC837x)
563c6731fe2SSimon Glass printf(" TSEC1: %-4s MHz\n",
564c6731fe2SSimon Glass strmhz(buf, gd->arch.tsec1_clk));
565c6731fe2SSimon Glass printf(" TSEC2: %-4s MHz\n",
566c6731fe2SSimon Glass strmhz(buf, gd->arch.tsec2_clk));
567c6731fe2SSimon Glass printf(" USB DR: %-4s MHz\n",
568c6731fe2SSimon Glass strmhz(buf, gd->arch.usbdr_clk));
569a88731a6SGerlando Falauto #elif defined(CONFIG_MPC8309)
570c6731fe2SSimon Glass printf(" USB DR: %-4s MHz\n",
571c6731fe2SSimon Glass strmhz(buf, gd->arch.usbdr_clk));
572a47a12beSStefan Roese #endif
573a47a12beSStefan Roese #if defined(CONFIG_MPC834x)
574c6731fe2SSimon Glass printf(" USB MPH: %-4s MHz\n",
575c6731fe2SSimon Glass strmhz(buf, gd->arch.usbmph_clk));
576a47a12beSStefan Roese #endif
577810cb190SBill Cook #if defined(CONFIG_MPC8308) || defined(CONFIG_MPC831x) || \
578810cb190SBill Cook defined(CONFIG_MPC837x)
579c6731fe2SSimon Glass printf(" PCIEXP1: %-4s MHz\n",
580c6731fe2SSimon Glass strmhz(buf, gd->arch.pciexp1_clk));
581c6731fe2SSimon Glass printf(" PCIEXP2: %-4s MHz\n",
582c6731fe2SSimon Glass strmhz(buf, gd->arch.pciexp2_clk));
583a47a12beSStefan Roese #endif
584a47a12beSStefan Roese #if defined(CONFIG_MPC837x) || defined(CONFIG_MPC8315)
585c6731fe2SSimon Glass printf(" SATA: %-4s MHz\n",
586c6731fe2SSimon Glass strmhz(buf, gd->arch.sata_clk));
587a47a12beSStefan Roese #endif
588a47a12beSStefan Roese return 0;
589a47a12beSStefan Roese }
590a47a12beSStefan Roese
591a47a12beSStefan Roese U_BOOT_CMD(clocks, 1, 0, do_clocks,
592a47a12beSStefan Roese "print clock configuration",
593a47a12beSStefan Roese " clocks"
594a47a12beSStefan Roese );
595*07d538d2SMario Six
596*07d538d2SMario Six #endif
597