xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/s32v234/generic.c (revision 9702ec00e95dbc1fd66ef8e9624c649e1ee818e5)
1*9702ec00SEddy Petrișor /*
2*9702ec00SEddy Petrișor  * (C) Copyright 2013-2016, Freescale Semiconductor, Inc.
3*9702ec00SEddy Petrișor  *
4*9702ec00SEddy Petrișor  * SPDX-License-Identifier:	GPL-2.0+
5*9702ec00SEddy Petrișor  */
6*9702ec00SEddy Petrișor 
7*9702ec00SEddy Petrișor #include <common.h>
8*9702ec00SEddy Petrișor #include <asm/io.h>
9*9702ec00SEddy Petrișor #include <asm/arch/imx-regs.h>
10*9702ec00SEddy Petrișor #include <asm/arch/clock.h>
11*9702ec00SEddy Petrișor #include <asm/arch/mc_cgm_regs.h>
12*9702ec00SEddy Petrișor #include <asm/arch/mc_me_regs.h>
13*9702ec00SEddy Petrișor #include <asm/arch/mc_rgm_regs.h>
14*9702ec00SEddy Petrișor #include <netdev.h>
15*9702ec00SEddy Petrișor #include <div64.h>
16*9702ec00SEddy Petrișor #include <errno.h>
17*9702ec00SEddy Petrișor 
get_cpu_rev(void)18*9702ec00SEddy Petrișor u32 get_cpu_rev(void)
19*9702ec00SEddy Petrișor {
20*9702ec00SEddy Petrișor 	struct mscm_ir *mscmir = (struct mscm_ir *)MSCM_BASE_ADDR;
21*9702ec00SEddy Petrișor 	u32 cpu = readl(&mscmir->cpxtype);
22*9702ec00SEddy Petrișor 
23*9702ec00SEddy Petrișor 	return cpu;
24*9702ec00SEddy Petrișor }
25*9702ec00SEddy Petrișor 
26*9702ec00SEddy Petrișor DECLARE_GLOBAL_DATA_PTR;
27*9702ec00SEddy Petrișor 
get_pllfreq(u32 pll,u32 refclk_freq,u32 plldv,u32 pllfd,u32 selected_output)28*9702ec00SEddy Petrișor static uintptr_t get_pllfreq(u32 pll, u32 refclk_freq, u32 plldv,
29*9702ec00SEddy Petrișor 			     u32 pllfd, u32 selected_output)
30*9702ec00SEddy Petrișor {
31*9702ec00SEddy Petrișor 	u32 vco = 0, plldv_prediv = 0, plldv_mfd = 0, pllfd_mfn = 0;
32*9702ec00SEddy Petrișor 	u32 plldv_rfdphi_div = 0, fout = 0;
33*9702ec00SEddy Petrișor 	u32 dfs_portn = 0, dfs_mfn = 0, dfs_mfi = 0;
34*9702ec00SEddy Petrișor 
35*9702ec00SEddy Petrișor 	if (selected_output > DFS_MAXNUMBER) {
36*9702ec00SEddy Petrișor 		return -1;
37*9702ec00SEddy Petrișor 	}
38*9702ec00SEddy Petrișor 
39*9702ec00SEddy Petrișor 	plldv_prediv =
40*9702ec00SEddy Petrișor 	    (plldv & PLLDIG_PLLDV_PREDIV_MASK) >> PLLDIG_PLLDV_PREDIV_OFFSET;
41*9702ec00SEddy Petrișor 	plldv_mfd = (plldv & PLLDIG_PLLDV_MFD_MASK);
42*9702ec00SEddy Petrișor 
43*9702ec00SEddy Petrișor 	pllfd_mfn = (pllfd & PLLDIG_PLLFD_MFN_MASK);
44*9702ec00SEddy Petrișor 
45*9702ec00SEddy Petrișor 	plldv_prediv = plldv_prediv == 0 ? 1 : plldv_prediv;
46*9702ec00SEddy Petrișor 
47*9702ec00SEddy Petrișor 	/* The formula for VCO is from TR manual, rev. D */
48*9702ec00SEddy Petrișor 	vco = refclk_freq / plldv_prediv * (plldv_mfd + pllfd_mfn / 20481);
49*9702ec00SEddy Petrișor 
50*9702ec00SEddy Petrișor 	if (selected_output != 0) {
51*9702ec00SEddy Petrișor 		/* Determine the RFDPHI for PHI1 */
52*9702ec00SEddy Petrișor 		plldv_rfdphi_div =
53*9702ec00SEddy Petrișor 		    (plldv & PLLDIG_PLLDV_RFDPHI1_MASK) >>
54*9702ec00SEddy Petrișor 		    PLLDIG_PLLDV_RFDPHI1_OFFSET;
55*9702ec00SEddy Petrișor 		plldv_rfdphi_div = plldv_rfdphi_div == 0 ? 1 : plldv_rfdphi_div;
56*9702ec00SEddy Petrișor 		if (pll == ARM_PLL || pll == ENET_PLL || pll == DDR_PLL) {
57*9702ec00SEddy Petrișor 			dfs_portn =
58*9702ec00SEddy Petrișor 			    readl(DFS_DVPORTn(pll, selected_output - 1));
59*9702ec00SEddy Petrișor 			dfs_mfi =
60*9702ec00SEddy Petrișor 			    (dfs_portn & DFS_DVPORTn_MFI_MASK) >>
61*9702ec00SEddy Petrișor 			    DFS_DVPORTn_MFI_OFFSET;
62*9702ec00SEddy Petrișor 			dfs_mfn =
63*9702ec00SEddy Petrișor 			    (dfs_portn & DFS_DVPORTn_MFI_MASK) >>
64*9702ec00SEddy Petrișor 			    DFS_DVPORTn_MFI_OFFSET;
65*9702ec00SEddy Petrișor 			fout = vco / (dfs_mfi + (dfs_mfn / 256));
66*9702ec00SEddy Petrișor 		} else {
67*9702ec00SEddy Petrișor 			fout = vco / plldv_rfdphi_div;
68*9702ec00SEddy Petrișor 		}
69*9702ec00SEddy Petrișor 
70*9702ec00SEddy Petrișor 	} else {
71*9702ec00SEddy Petrișor 		/* Determine the RFDPHI for PHI0 */
72*9702ec00SEddy Petrișor 		plldv_rfdphi_div =
73*9702ec00SEddy Petrișor 		    (plldv & PLLDIG_PLLDV_RFDPHI_MASK) >>
74*9702ec00SEddy Petrișor 		    PLLDIG_PLLDV_RFDPHI_OFFSET;
75*9702ec00SEddy Petrișor 		fout = vco / plldv_rfdphi_div;
76*9702ec00SEddy Petrișor 	}
77*9702ec00SEddy Petrișor 
78*9702ec00SEddy Petrișor 	return fout;
79*9702ec00SEddy Petrișor 
80*9702ec00SEddy Petrișor }
81*9702ec00SEddy Petrișor 
82*9702ec00SEddy Petrișor /* Implemented for ARMPLL, PERIPH_PLL, ENET_PLL, DDR_PLL, VIDEO_LL */
decode_pll(enum pll_type pll,u32 refclk_freq,u32 selected_output)83*9702ec00SEddy Petrișor static uintptr_t decode_pll(enum pll_type pll, u32 refclk_freq,
84*9702ec00SEddy Petrișor 			    u32 selected_output)
85*9702ec00SEddy Petrișor {
86*9702ec00SEddy Petrișor 	u32 plldv, pllfd;
87*9702ec00SEddy Petrișor 
88*9702ec00SEddy Petrișor 	plldv = readl(PLLDIG_PLLDV(pll));
89*9702ec00SEddy Petrișor 	pllfd = readl(PLLDIG_PLLFD(pll));
90*9702ec00SEddy Petrișor 
91*9702ec00SEddy Petrișor 	return get_pllfreq(pll, refclk_freq, plldv, pllfd, selected_output);
92*9702ec00SEddy Petrișor }
93*9702ec00SEddy Petrișor 
get_mcu_main_clk(void)94*9702ec00SEddy Petrișor static u32 get_mcu_main_clk(void)
95*9702ec00SEddy Petrișor {
96*9702ec00SEddy Petrișor 	u32 coreclk_div;
97*9702ec00SEddy Petrișor 	u32 sysclk_sel;
98*9702ec00SEddy Petrișor 	u32 freq = 0;
99*9702ec00SEddy Petrișor 
100*9702ec00SEddy Petrișor 	sysclk_sel = readl(CGM_SC_SS(MC_CGM1_BASE_ADDR)) & MC_CGM_SC_SEL_MASK;
101*9702ec00SEddy Petrișor 	sysclk_sel >>= MC_CGM_SC_SEL_OFFSET;
102*9702ec00SEddy Petrișor 
103*9702ec00SEddy Petrișor 	coreclk_div =
104*9702ec00SEddy Petrișor 	    readl(CGM_SC_DCn(MC_CGM1_BASE_ADDR, 0)) & MC_CGM_SC_DCn_PREDIV_MASK;
105*9702ec00SEddy Petrișor 	coreclk_div >>= MC_CGM_SC_DCn_PREDIV_OFFSET;
106*9702ec00SEddy Petrișor 	coreclk_div += 1;
107*9702ec00SEddy Petrișor 
108*9702ec00SEddy Petrișor 	switch (sysclk_sel) {
109*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_FIRC:
110*9702ec00SEddy Petrișor 		freq = FIRC_CLK_FREQ;
111*9702ec00SEddy Petrișor 		break;
112*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_XOSC:
113*9702ec00SEddy Petrișor 		freq = XOSC_CLK_FREQ;
114*9702ec00SEddy Petrișor 		break;
115*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_ARMPLL:
116*9702ec00SEddy Petrișor 		/* ARMPLL has as source XOSC and CORE_CLK has as input PHI0 */
117*9702ec00SEddy Petrișor 		freq = decode_pll(ARM_PLL, XOSC_CLK_FREQ, 0);
118*9702ec00SEddy Petrișor 		break;
119*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_CLKDISABLE:
120*9702ec00SEddy Petrișor 		printf("Sysclk is disabled\n");
121*9702ec00SEddy Petrișor 		break;
122*9702ec00SEddy Petrișor 	default:
123*9702ec00SEddy Petrișor 		printf("unsupported system clock select\n");
124*9702ec00SEddy Petrișor 	}
125*9702ec00SEddy Petrișor 
126*9702ec00SEddy Petrișor 	return freq / coreclk_div;
127*9702ec00SEddy Petrișor }
128*9702ec00SEddy Petrișor 
get_sys_clk(u32 number)129*9702ec00SEddy Petrișor static u32 get_sys_clk(u32 number)
130*9702ec00SEddy Petrișor {
131*9702ec00SEddy Petrișor 	u32 sysclk_div, sysclk_div_number;
132*9702ec00SEddy Petrișor 	u32 sysclk_sel;
133*9702ec00SEddy Petrișor 	u32 freq = 0;
134*9702ec00SEddy Petrișor 
135*9702ec00SEddy Petrișor 	switch (number) {
136*9702ec00SEddy Petrișor 	case 3:
137*9702ec00SEddy Petrișor 		sysclk_div_number = 0;
138*9702ec00SEddy Petrișor 		break;
139*9702ec00SEddy Petrișor 	case 6:
140*9702ec00SEddy Petrișor 		sysclk_div_number = 1;
141*9702ec00SEddy Petrișor 		break;
142*9702ec00SEddy Petrișor 	default:
143*9702ec00SEddy Petrișor 		printf("unsupported system clock \n");
144*9702ec00SEddy Petrișor 		return -1;
145*9702ec00SEddy Petrișor 	}
146*9702ec00SEddy Petrișor 	sysclk_sel = readl(CGM_SC_SS(MC_CGM0_BASE_ADDR)) & MC_CGM_SC_SEL_MASK;
147*9702ec00SEddy Petrișor 	sysclk_sel >>= MC_CGM_SC_SEL_OFFSET;
148*9702ec00SEddy Petrișor 
149*9702ec00SEddy Petrișor 	sysclk_div =
150*9702ec00SEddy Petrișor 	    readl(CGM_SC_DCn(MC_CGM1_BASE_ADDR, sysclk_div_number)) &
151*9702ec00SEddy Petrișor 	    MC_CGM_SC_DCn_PREDIV_MASK;
152*9702ec00SEddy Petrișor 	sysclk_div >>= MC_CGM_SC_DCn_PREDIV_OFFSET;
153*9702ec00SEddy Petrișor 	sysclk_div += 1;
154*9702ec00SEddy Petrișor 
155*9702ec00SEddy Petrișor 	switch (sysclk_sel) {
156*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_FIRC:
157*9702ec00SEddy Petrișor 		freq = FIRC_CLK_FREQ;
158*9702ec00SEddy Petrișor 		break;
159*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_XOSC:
160*9702ec00SEddy Petrișor 		freq = XOSC_CLK_FREQ;
161*9702ec00SEddy Petrișor 		break;
162*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_ARMPLL:
163*9702ec00SEddy Petrișor 		/* ARMPLL has as source XOSC and SYSn_CLK has as input DFS1 */
164*9702ec00SEddy Petrișor 		freq = decode_pll(ARM_PLL, XOSC_CLK_FREQ, 1);
165*9702ec00SEddy Petrișor 		break;
166*9702ec00SEddy Petrișor 	case MC_CGM_SC_SEL_CLKDISABLE:
167*9702ec00SEddy Petrișor 		printf("Sysclk is disabled\n");
168*9702ec00SEddy Petrișor 		break;
169*9702ec00SEddy Petrișor 	default:
170*9702ec00SEddy Petrișor 		printf("unsupported system clock select\n");
171*9702ec00SEddy Petrișor 	}
172*9702ec00SEddy Petrișor 
173*9702ec00SEddy Petrișor 	return freq / sysclk_div;
174*9702ec00SEddy Petrișor }
175*9702ec00SEddy Petrișor 
get_peripherals_clk(void)176*9702ec00SEddy Petrișor static u32 get_peripherals_clk(void)
177*9702ec00SEddy Petrișor {
178*9702ec00SEddy Petrișor 	u32 aux5clk_div;
179*9702ec00SEddy Petrișor 	u32 freq = 0;
180*9702ec00SEddy Petrișor 
181*9702ec00SEddy Petrișor 	aux5clk_div =
182*9702ec00SEddy Petrișor 	    readl(CGM_ACn_DCm(MC_CGM0_BASE_ADDR, 5, 0)) &
183*9702ec00SEddy Petrișor 	    MC_CGM_ACn_DCm_PREDIV_MASK;
184*9702ec00SEddy Petrișor 	aux5clk_div >>= MC_CGM_ACn_DCm_PREDIV_OFFSET;
185*9702ec00SEddy Petrișor 	aux5clk_div += 1;
186*9702ec00SEddy Petrișor 
187*9702ec00SEddy Petrișor 	freq = decode_pll(PERIPH_PLL, XOSC_CLK_FREQ, 0);
188*9702ec00SEddy Petrișor 
189*9702ec00SEddy Petrișor 	return freq / aux5clk_div;
190*9702ec00SEddy Petrișor 
191*9702ec00SEddy Petrișor }
192*9702ec00SEddy Petrișor 
get_uart_clk(void)193*9702ec00SEddy Petrișor static u32 get_uart_clk(void)
194*9702ec00SEddy Petrișor {
195*9702ec00SEddy Petrișor 	u32 auxclk3_div, auxclk3_sel, freq = 0;
196*9702ec00SEddy Petrișor 
197*9702ec00SEddy Petrișor 	auxclk3_sel =
198*9702ec00SEddy Petrișor 	    readl(CGM_ACn_SS(MC_CGM0_BASE_ADDR, 3)) & MC_CGM_ACn_SEL_MASK;
199*9702ec00SEddy Petrișor 	auxclk3_sel >>= MC_CGM_ACn_SEL_OFFSET;
200*9702ec00SEddy Petrișor 
201*9702ec00SEddy Petrișor 	auxclk3_div =
202*9702ec00SEddy Petrișor 	    readl(CGM_ACn_DCm(MC_CGM0_BASE_ADDR, 3, 0)) &
203*9702ec00SEddy Petrișor 	    MC_CGM_ACn_DCm_PREDIV_MASK;
204*9702ec00SEddy Petrișor 	auxclk3_div >>= MC_CGM_ACn_DCm_PREDIV_OFFSET;
205*9702ec00SEddy Petrișor 	auxclk3_div += 1;
206*9702ec00SEddy Petrișor 
207*9702ec00SEddy Petrișor 	switch (auxclk3_sel) {
208*9702ec00SEddy Petrișor 	case MC_CGM_ACn_SEL_FIRC:
209*9702ec00SEddy Petrișor 		freq = FIRC_CLK_FREQ;
210*9702ec00SEddy Petrișor 		break;
211*9702ec00SEddy Petrișor 	case MC_CGM_ACn_SEL_XOSC:
212*9702ec00SEddy Petrișor 		freq = XOSC_CLK_FREQ;
213*9702ec00SEddy Petrișor 		break;
214*9702ec00SEddy Petrișor 	case MC_CGM_ACn_SEL_PERPLLDIVX:
215*9702ec00SEddy Petrișor 		freq = get_peripherals_clk() / 3;
216*9702ec00SEddy Petrișor 		break;
217*9702ec00SEddy Petrișor 	case MC_CGM_ACn_SEL_SYSCLK:
218*9702ec00SEddy Petrișor 		freq = get_sys_clk(6);
219*9702ec00SEddy Petrișor 		break;
220*9702ec00SEddy Petrișor 	default:
221*9702ec00SEddy Petrișor 		printf("unsupported system clock select\n");
222*9702ec00SEddy Petrișor 	}
223*9702ec00SEddy Petrișor 
224*9702ec00SEddy Petrișor 	return freq / auxclk3_div;
225*9702ec00SEddy Petrișor }
226*9702ec00SEddy Petrișor 
get_fec_clk(void)227*9702ec00SEddy Petrișor static u32 get_fec_clk(void)
228*9702ec00SEddy Petrișor {
229*9702ec00SEddy Petrișor 	u32 aux2clk_div;
230*9702ec00SEddy Petrișor 	u32 freq = 0;
231*9702ec00SEddy Petrișor 
232*9702ec00SEddy Petrișor 	aux2clk_div =
233*9702ec00SEddy Petrișor 	    readl(CGM_ACn_DCm(MC_CGM0_BASE_ADDR, 2, 0)) &
234*9702ec00SEddy Petrișor 	    MC_CGM_ACn_DCm_PREDIV_MASK;
235*9702ec00SEddy Petrișor 	aux2clk_div >>= MC_CGM_ACn_DCm_PREDIV_OFFSET;
236*9702ec00SEddy Petrișor 	aux2clk_div += 1;
237*9702ec00SEddy Petrișor 
238*9702ec00SEddy Petrișor 	freq = decode_pll(ENET_PLL, XOSC_CLK_FREQ, 0);
239*9702ec00SEddy Petrișor 
240*9702ec00SEddy Petrișor 	return freq / aux2clk_div;
241*9702ec00SEddy Petrișor }
242*9702ec00SEddy Petrișor 
get_usdhc_clk(void)243*9702ec00SEddy Petrișor static u32 get_usdhc_clk(void)
244*9702ec00SEddy Petrișor {
245*9702ec00SEddy Petrișor 	u32 aux15clk_div;
246*9702ec00SEddy Petrișor 	u32 freq = 0;
247*9702ec00SEddy Petrișor 
248*9702ec00SEddy Petrișor 	aux15clk_div =
249*9702ec00SEddy Petrișor 	    readl(CGM_ACn_DCm(MC_CGM0_BASE_ADDR, 15, 0)) &
250*9702ec00SEddy Petrișor 	    MC_CGM_ACn_DCm_PREDIV_MASK;
251*9702ec00SEddy Petrișor 	aux15clk_div >>= MC_CGM_ACn_DCm_PREDIV_OFFSET;
252*9702ec00SEddy Petrișor 	aux15clk_div += 1;
253*9702ec00SEddy Petrișor 
254*9702ec00SEddy Petrișor 	freq = decode_pll(ENET_PLL, XOSC_CLK_FREQ, 4);
255*9702ec00SEddy Petrișor 
256*9702ec00SEddy Petrișor 	return freq / aux15clk_div;
257*9702ec00SEddy Petrișor }
258*9702ec00SEddy Petrișor 
get_i2c_clk(void)259*9702ec00SEddy Petrișor static u32 get_i2c_clk(void)
260*9702ec00SEddy Petrișor {
261*9702ec00SEddy Petrișor 	return get_peripherals_clk();
262*9702ec00SEddy Petrișor }
263*9702ec00SEddy Petrișor 
264*9702ec00SEddy Petrișor /* return clocks in Hz */
mxc_get_clock(enum mxc_clock clk)265*9702ec00SEddy Petrișor unsigned int mxc_get_clock(enum mxc_clock clk)
266*9702ec00SEddy Petrișor {
267*9702ec00SEddy Petrișor 	switch (clk) {
268*9702ec00SEddy Petrișor 	case MXC_ARM_CLK:
269*9702ec00SEddy Petrișor 		return get_mcu_main_clk();
270*9702ec00SEddy Petrișor 	case MXC_PERIPHERALS_CLK:
271*9702ec00SEddy Petrișor 		return get_peripherals_clk();
272*9702ec00SEddy Petrișor 	case MXC_UART_CLK:
273*9702ec00SEddy Petrișor 		return get_uart_clk();
274*9702ec00SEddy Petrișor 	case MXC_FEC_CLK:
275*9702ec00SEddy Petrișor 		return get_fec_clk();
276*9702ec00SEddy Petrișor 	case MXC_I2C_CLK:
277*9702ec00SEddy Petrișor 		return get_i2c_clk();
278*9702ec00SEddy Petrișor 	case MXC_USDHC_CLK:
279*9702ec00SEddy Petrișor 		return get_usdhc_clk();
280*9702ec00SEddy Petrișor 	default:
281*9702ec00SEddy Petrișor 		break;
282*9702ec00SEddy Petrișor 	}
283*9702ec00SEddy Petrișor 	printf("Error: Unsupported function to read the frequency! \
284*9702ec00SEddy Petrișor 			Please define it correctly!");
285*9702ec00SEddy Petrișor 	return -1;
286*9702ec00SEddy Petrișor }
287*9702ec00SEddy Petrișor 
288*9702ec00SEddy Petrișor /* Not yet implemented - int soc_clk_dump(); */
289*9702ec00SEddy Petrișor 
290*9702ec00SEddy Petrișor #if defined(CONFIG_DISPLAY_CPUINFO)
get_reset_cause(void)291*9702ec00SEddy Petrișor static char *get_reset_cause(void)
292*9702ec00SEddy Petrișor {
293*9702ec00SEddy Petrișor 	u32 cause = readl(MC_RGM_BASE_ADDR + 0x300);
294*9702ec00SEddy Petrișor 
295*9702ec00SEddy Petrișor 	switch (cause) {
296*9702ec00SEddy Petrișor 	case F_SWT4:
297*9702ec00SEddy Petrișor 		return "WDOG";
298*9702ec00SEddy Petrișor 	case F_JTAG:
299*9702ec00SEddy Petrișor 		return "JTAG";
300*9702ec00SEddy Petrișor 	case F_FCCU_SOFT:
301*9702ec00SEddy Petrișor 		return "FCCU soft reaction";
302*9702ec00SEddy Petrișor 	case F_FCCU_HARD:
303*9702ec00SEddy Petrișor 		return "FCCU hard reaction";
304*9702ec00SEddy Petrișor 	case F_SOFT_FUNC:
305*9702ec00SEddy Petrișor 		return "Software Functional reset";
306*9702ec00SEddy Petrișor 	case F_ST_DONE:
307*9702ec00SEddy Petrișor 		return "Self Test done reset";
308*9702ec00SEddy Petrișor 	case F_EXT_RST:
309*9702ec00SEddy Petrișor 		return "External reset";
310*9702ec00SEddy Petrișor 	default:
311*9702ec00SEddy Petrișor 		return "unknown reset";
312*9702ec00SEddy Petrișor 	}
313*9702ec00SEddy Petrișor 
314*9702ec00SEddy Petrișor }
315*9702ec00SEddy Petrișor 
316*9702ec00SEddy Petrișor #define SRC_SCR_SW_RST					(1<<12)
317*9702ec00SEddy Petrișor 
reset_cpu(ulong addr)318*9702ec00SEddy Petrișor void reset_cpu(ulong addr)
319*9702ec00SEddy Petrișor {
320*9702ec00SEddy Petrișor 	printf("Feature not supported.\n");
321*9702ec00SEddy Petrișor };
322*9702ec00SEddy Petrișor 
print_cpuinfo(void)323*9702ec00SEddy Petrișor int print_cpuinfo(void)
324*9702ec00SEddy Petrișor {
325*9702ec00SEddy Petrișor 	printf("CPU:   Freescale Treerunner S32V234 at %d MHz\n",
326*9702ec00SEddy Petrișor 	       mxc_get_clock(MXC_ARM_CLK) / 1000000);
327*9702ec00SEddy Petrișor 	printf("Reset cause: %s\n", get_reset_cause());
328*9702ec00SEddy Petrișor 
329*9702ec00SEddy Petrișor 	return 0;
330*9702ec00SEddy Petrișor }
331*9702ec00SEddy Petrișor #endif
332*9702ec00SEddy Petrișor 
cpu_eth_init(bd_t * bis)333*9702ec00SEddy Petrișor int cpu_eth_init(bd_t * bis)
334*9702ec00SEddy Petrișor {
335*9702ec00SEddy Petrișor 	int rc = -ENODEV;
336*9702ec00SEddy Petrișor 
337*9702ec00SEddy Petrișor #if defined(CONFIG_FEC_MXC)
338*9702ec00SEddy Petrișor 	rc = fecmxc_initialize(bis);
339*9702ec00SEddy Petrișor #endif
340*9702ec00SEddy Petrișor 
341*9702ec00SEddy Petrișor 	return rc;
342*9702ec00SEddy Petrișor }
343*9702ec00SEddy Petrișor 
get_clocks(void)344*9702ec00SEddy Petrișor int get_clocks(void)
345*9702ec00SEddy Petrișor {
346*9702ec00SEddy Petrișor #ifdef CONFIG_FSL_ESDHC
347*9702ec00SEddy Petrișor 	gd->arch.sdhc_clk = mxc_get_clock(MXC_USDHC_CLK);
348*9702ec00SEddy Petrișor #endif
349*9702ec00SEddy Petrișor 	return 0;
350*9702ec00SEddy Petrișor }
351