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