xref: /rk3399_rockchip-uboot/arch/powerpc/cpu/mpc83xx/speed.c (revision dc557e9a1fe00ca9d884bd88feef5bebf23fede4)
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