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