xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv7/vf610/generic.c (revision 382bee57f19b4454e2015bc19a010bc2d0ab9337)
124e8bee5SAlison Wang /*
224e8bee5SAlison Wang  * Copyright 2013 Freescale Semiconductor, Inc.
324e8bee5SAlison Wang  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
524e8bee5SAlison Wang  */
624e8bee5SAlison Wang 
724e8bee5SAlison Wang #include <common.h>
824e8bee5SAlison Wang #include <asm/io.h>
924e8bee5SAlison Wang #include <asm/arch/imx-regs.h>
1024e8bee5SAlison Wang #include <asm/arch/clock.h>
1124e8bee5SAlison Wang #include <asm/arch/crm_regs.h>
12552a848eSStefano Babic #include <asm/mach-imx/sys_proto.h>
1324e8bee5SAlison Wang #include <netdev.h>
1424e8bee5SAlison Wang #ifdef CONFIG_FSL_ESDHC
1524e8bee5SAlison Wang #include <fsl_esdhc.h>
1624e8bee5SAlison Wang #endif
1724e8bee5SAlison Wang 
1824e8bee5SAlison Wang #ifdef CONFIG_FSL_ESDHC
1924e8bee5SAlison Wang DECLARE_GLOBAL_DATA_PTR;
2024e8bee5SAlison Wang #endif
2124e8bee5SAlison Wang 
221db503c4SSanchayan Maity static char soc_type[] = "xx0";
231db503c4SSanchayan Maity 
2424e8bee5SAlison Wang #ifdef CONFIG_MXC_OCOTP
enable_ocotp_clk(unsigned char enable)2524e8bee5SAlison Wang void enable_ocotp_clk(unsigned char enable)
2624e8bee5SAlison Wang {
2724e8bee5SAlison Wang 	struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
2824e8bee5SAlison Wang 	u32 reg;
2924e8bee5SAlison Wang 
3024e8bee5SAlison Wang 	reg = readl(&ccm->ccgr6);
3124e8bee5SAlison Wang 	if (enable)
3224e8bee5SAlison Wang 		reg |= CCM_CCGR6_OCOTP_CTRL_MASK;
3324e8bee5SAlison Wang 	else
3424e8bee5SAlison Wang 		reg &= ~CCM_CCGR6_OCOTP_CTRL_MASK;
3524e8bee5SAlison Wang 	writel(reg, &ccm->ccgr6);
3624e8bee5SAlison Wang }
3724e8bee5SAlison Wang #endif
3824e8bee5SAlison Wang 
get_mcu_main_clk(void)3924e8bee5SAlison Wang static u32 get_mcu_main_clk(void)
4024e8bee5SAlison Wang {
4124e8bee5SAlison Wang 	struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
4224e8bee5SAlison Wang 	u32 ccm_ccsr, ccm_cacrr, armclk_div;
4324e8bee5SAlison Wang 	u32 sysclk_sel, pll_pfd_sel = 0;
4424e8bee5SAlison Wang 	u32 freq = 0;
4524e8bee5SAlison Wang 
4624e8bee5SAlison Wang 	ccm_ccsr = readl(&ccm->ccsr);
4724e8bee5SAlison Wang 	sysclk_sel = ccm_ccsr & CCM_CCSR_SYS_CLK_SEL_MASK;
4824e8bee5SAlison Wang 	sysclk_sel >>= CCM_CCSR_SYS_CLK_SEL_OFFSET;
4924e8bee5SAlison Wang 
5024e8bee5SAlison Wang 	ccm_cacrr = readl(&ccm->cacrr);
5124e8bee5SAlison Wang 	armclk_div = ccm_cacrr & CCM_CACRR_ARM_CLK_DIV_MASK;
5224e8bee5SAlison Wang 	armclk_div >>= CCM_CACRR_ARM_CLK_DIV_OFFSET;
5324e8bee5SAlison Wang 	armclk_div += 1;
5424e8bee5SAlison Wang 
5524e8bee5SAlison Wang 	switch (sysclk_sel) {
5624e8bee5SAlison Wang 	case 0:
5724e8bee5SAlison Wang 		freq = FASE_CLK_FREQ;
5824e8bee5SAlison Wang 		break;
5924e8bee5SAlison Wang 	case 1:
6024e8bee5SAlison Wang 		freq = SLOW_CLK_FREQ;
6124e8bee5SAlison Wang 		break;
6224e8bee5SAlison Wang 	case 2:
6324e8bee5SAlison Wang 		pll_pfd_sel = ccm_ccsr & CCM_CCSR_PLL2_PFD_CLK_SEL_MASK;
6424e8bee5SAlison Wang 		pll_pfd_sel >>= CCM_CCSR_PLL2_PFD_CLK_SEL_OFFSET;
6524e8bee5SAlison Wang 		if (pll_pfd_sel == 0)
6624e8bee5SAlison Wang 			freq = PLL2_MAIN_FREQ;
6724e8bee5SAlison Wang 		else if (pll_pfd_sel == 1)
6824e8bee5SAlison Wang 			freq = PLL2_PFD1_FREQ;
6924e8bee5SAlison Wang 		else if (pll_pfd_sel == 2)
7024e8bee5SAlison Wang 			freq = PLL2_PFD2_FREQ;
7124e8bee5SAlison Wang 		else if (pll_pfd_sel == 3)
7224e8bee5SAlison Wang 			freq = PLL2_PFD3_FREQ;
7324e8bee5SAlison Wang 		else if (pll_pfd_sel == 4)
7424e8bee5SAlison Wang 			freq = PLL2_PFD4_FREQ;
7524e8bee5SAlison Wang 		break;
7624e8bee5SAlison Wang 	case 3:
7724e8bee5SAlison Wang 		freq = PLL2_MAIN_FREQ;
7824e8bee5SAlison Wang 		break;
7924e8bee5SAlison Wang 	case 4:
8024e8bee5SAlison Wang 		pll_pfd_sel = ccm_ccsr & CCM_CCSR_PLL1_PFD_CLK_SEL_MASK;
8124e8bee5SAlison Wang 		pll_pfd_sel >>= CCM_CCSR_PLL1_PFD_CLK_SEL_OFFSET;
8224e8bee5SAlison Wang 		if (pll_pfd_sel == 0)
8324e8bee5SAlison Wang 			freq = PLL1_MAIN_FREQ;
8424e8bee5SAlison Wang 		else if (pll_pfd_sel == 1)
8524e8bee5SAlison Wang 			freq = PLL1_PFD1_FREQ;
8624e8bee5SAlison Wang 		else if (pll_pfd_sel == 2)
8724e8bee5SAlison Wang 			freq = PLL1_PFD2_FREQ;
8824e8bee5SAlison Wang 		else if (pll_pfd_sel == 3)
8924e8bee5SAlison Wang 			freq = PLL1_PFD3_FREQ;
9024e8bee5SAlison Wang 		else if (pll_pfd_sel == 4)
9124e8bee5SAlison Wang 			freq = PLL1_PFD4_FREQ;
9224e8bee5SAlison Wang 		break;
9324e8bee5SAlison Wang 	case 5:
9424e8bee5SAlison Wang 		freq = PLL3_MAIN_FREQ;
9524e8bee5SAlison Wang 		break;
9624e8bee5SAlison Wang 	default:
9724e8bee5SAlison Wang 		printf("unsupported system clock select\n");
9824e8bee5SAlison Wang 	}
9924e8bee5SAlison Wang 
10024e8bee5SAlison Wang 	return freq / armclk_div;
10124e8bee5SAlison Wang }
10224e8bee5SAlison Wang 
get_bus_clk(void)10324e8bee5SAlison Wang static u32 get_bus_clk(void)
10424e8bee5SAlison Wang {
10524e8bee5SAlison Wang 	struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
10624e8bee5SAlison Wang 	u32 ccm_cacrr, busclk_div;
10724e8bee5SAlison Wang 
10824e8bee5SAlison Wang 	ccm_cacrr = readl(&ccm->cacrr);
10924e8bee5SAlison Wang 
11024e8bee5SAlison Wang 	busclk_div = ccm_cacrr & CCM_CACRR_BUS_CLK_DIV_MASK;
11124e8bee5SAlison Wang 	busclk_div >>= CCM_CACRR_BUS_CLK_DIV_OFFSET;
11224e8bee5SAlison Wang 	busclk_div += 1;
11324e8bee5SAlison Wang 
11424e8bee5SAlison Wang 	return get_mcu_main_clk() / busclk_div;
11524e8bee5SAlison Wang }
11624e8bee5SAlison Wang 
get_ipg_clk(void)11724e8bee5SAlison Wang static u32 get_ipg_clk(void)
11824e8bee5SAlison Wang {
11924e8bee5SAlison Wang 	struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
12024e8bee5SAlison Wang 	u32 ccm_cacrr, ipgclk_div;
12124e8bee5SAlison Wang 
12224e8bee5SAlison Wang 	ccm_cacrr = readl(&ccm->cacrr);
12324e8bee5SAlison Wang 
12424e8bee5SAlison Wang 	ipgclk_div = ccm_cacrr & CCM_CACRR_IPG_CLK_DIV_MASK;
12524e8bee5SAlison Wang 	ipgclk_div >>= CCM_CACRR_IPG_CLK_DIV_OFFSET;
12624e8bee5SAlison Wang 	ipgclk_div += 1;
12724e8bee5SAlison Wang 
12824e8bee5SAlison Wang 	return get_bus_clk() / ipgclk_div;
12924e8bee5SAlison Wang }
13024e8bee5SAlison Wang 
get_uart_clk(void)13124e8bee5SAlison Wang static u32 get_uart_clk(void)
13224e8bee5SAlison Wang {
13324e8bee5SAlison Wang 	return get_ipg_clk();
13424e8bee5SAlison Wang }
13524e8bee5SAlison Wang 
get_sdhc_clk(void)13624e8bee5SAlison Wang static u32 get_sdhc_clk(void)
13724e8bee5SAlison Wang {
13824e8bee5SAlison Wang 	struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
13924e8bee5SAlison Wang 	u32 ccm_cscmr1, ccm_cscdr2, sdhc_clk_sel, sdhc_clk_div;
14024e8bee5SAlison Wang 	u32 freq = 0;
14124e8bee5SAlison Wang 
14224e8bee5SAlison Wang 	ccm_cscmr1 = readl(&ccm->cscmr1);
14324e8bee5SAlison Wang 	sdhc_clk_sel = ccm_cscmr1 & CCM_CSCMR1_ESDHC1_CLK_SEL_MASK;
14424e8bee5SAlison Wang 	sdhc_clk_sel >>= CCM_CSCMR1_ESDHC1_CLK_SEL_OFFSET;
14524e8bee5SAlison Wang 
14624e8bee5SAlison Wang 	ccm_cscdr2 = readl(&ccm->cscdr2);
14724e8bee5SAlison Wang 	sdhc_clk_div = ccm_cscdr2 & CCM_CSCDR2_ESDHC1_CLK_DIV_MASK;
14824e8bee5SAlison Wang 	sdhc_clk_div >>= CCM_CSCDR2_ESDHC1_CLK_DIV_OFFSET;
14924e8bee5SAlison Wang 	sdhc_clk_div += 1;
15024e8bee5SAlison Wang 
15124e8bee5SAlison Wang 	switch (sdhc_clk_sel) {
15224e8bee5SAlison Wang 	case 0:
15324e8bee5SAlison Wang 		freq = PLL3_MAIN_FREQ;
15424e8bee5SAlison Wang 		break;
15524e8bee5SAlison Wang 	case 1:
15624e8bee5SAlison Wang 		freq = PLL3_PFD3_FREQ;
15724e8bee5SAlison Wang 		break;
15824e8bee5SAlison Wang 	case 2:
15924e8bee5SAlison Wang 		freq = PLL1_PFD3_FREQ;
16024e8bee5SAlison Wang 		break;
16124e8bee5SAlison Wang 	case 3:
16224e8bee5SAlison Wang 		freq = get_bus_clk();
16324e8bee5SAlison Wang 		break;
16424e8bee5SAlison Wang 	}
16524e8bee5SAlison Wang 
16624e8bee5SAlison Wang 	return freq / sdhc_clk_div;
16724e8bee5SAlison Wang }
16824e8bee5SAlison Wang 
get_fec_clk(void)16924e8bee5SAlison Wang u32 get_fec_clk(void)
17024e8bee5SAlison Wang {
17124e8bee5SAlison Wang 	struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
17224e8bee5SAlison Wang 	u32 ccm_cscmr2, rmii_clk_sel;
17324e8bee5SAlison Wang 	u32 freq = 0;
17424e8bee5SAlison Wang 
17524e8bee5SAlison Wang 	ccm_cscmr2 = readl(&ccm->cscmr2);
17624e8bee5SAlison Wang 	rmii_clk_sel = ccm_cscmr2 & CCM_CSCMR2_RMII_CLK_SEL_MASK;
17724e8bee5SAlison Wang 	rmii_clk_sel >>= CCM_CSCMR2_RMII_CLK_SEL_OFFSET;
17824e8bee5SAlison Wang 
17924e8bee5SAlison Wang 	switch (rmii_clk_sel) {
18024e8bee5SAlison Wang 	case 0:
18124e8bee5SAlison Wang 		freq = ENET_EXTERNAL_CLK;
18224e8bee5SAlison Wang 		break;
18324e8bee5SAlison Wang 	case 1:
18424e8bee5SAlison Wang 		freq = AUDIO_EXTERNAL_CLK;
18524e8bee5SAlison Wang 		break;
18624e8bee5SAlison Wang 	case 2:
18724e8bee5SAlison Wang 		freq = PLL5_MAIN_FREQ;
18824e8bee5SAlison Wang 		break;
18924e8bee5SAlison Wang 	case 3:
19024e8bee5SAlison Wang 		freq = PLL5_MAIN_FREQ / 2;
19124e8bee5SAlison Wang 		break;
19224e8bee5SAlison Wang 	}
19324e8bee5SAlison Wang 
19424e8bee5SAlison Wang 	return freq;
19524e8bee5SAlison Wang }
19624e8bee5SAlison Wang 
get_i2c_clk(void)1971221b3d7SAlison Wang static u32 get_i2c_clk(void)
1981221b3d7SAlison Wang {
1991221b3d7SAlison Wang 	return get_ipg_clk();
2001221b3d7SAlison Wang }
2011221b3d7SAlison Wang 
get_dspi_clk(void)202098d8584SBhuvanchandra DV static u32 get_dspi_clk(void)
203098d8584SBhuvanchandra DV {
204098d8584SBhuvanchandra DV 	return get_ipg_clk();
205098d8584SBhuvanchandra DV }
206098d8584SBhuvanchandra DV 
get_lpuart_clk(void)207c40d612bSPeng Fan u32 get_lpuart_clk(void)
208c40d612bSPeng Fan {
209c40d612bSPeng Fan 	return get_uart_clk();
210c40d612bSPeng Fan }
211c40d612bSPeng Fan 
mxc_get_clock(enum mxc_clock clk)21224e8bee5SAlison Wang unsigned int mxc_get_clock(enum mxc_clock clk)
21324e8bee5SAlison Wang {
21424e8bee5SAlison Wang 	switch (clk) {
21524e8bee5SAlison Wang 	case MXC_ARM_CLK:
21624e8bee5SAlison Wang 		return get_mcu_main_clk();
21724e8bee5SAlison Wang 	case MXC_BUS_CLK:
21824e8bee5SAlison Wang 		return get_bus_clk();
21924e8bee5SAlison Wang 	case MXC_IPG_CLK:
22024e8bee5SAlison Wang 		return get_ipg_clk();
22124e8bee5SAlison Wang 	case MXC_UART_CLK:
22224e8bee5SAlison Wang 		return get_uart_clk();
22324e8bee5SAlison Wang 	case MXC_ESDHC_CLK:
22424e8bee5SAlison Wang 		return get_sdhc_clk();
22524e8bee5SAlison Wang 	case MXC_FEC_CLK:
22624e8bee5SAlison Wang 		return get_fec_clk();
2271221b3d7SAlison Wang 	case MXC_I2C_CLK:
2281221b3d7SAlison Wang 		return get_i2c_clk();
229098d8584SBhuvanchandra DV 	case MXC_DSPI_CLK:
230098d8584SBhuvanchandra DV 		return get_dspi_clk();
23124e8bee5SAlison Wang 	default:
23224e8bee5SAlison Wang 		break;
23324e8bee5SAlison Wang 	}
23424e8bee5SAlison Wang 	return -1;
23524e8bee5SAlison Wang }
23624e8bee5SAlison Wang 
23724e8bee5SAlison Wang /* Dump some core clocks */
do_vf610_showclocks(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])23824e8bee5SAlison Wang int do_vf610_showclocks(cmd_tbl_t *cmdtp, int flag, int argc,
23924e8bee5SAlison Wang 			 char * const argv[])
24024e8bee5SAlison Wang {
24124e8bee5SAlison Wang 	printf("\n");
24224e8bee5SAlison Wang 	printf("cpu clock : %8d MHz\n", mxc_get_clock(MXC_ARM_CLK) / 1000000);
24324e8bee5SAlison Wang 	printf("bus clock : %8d MHz\n", mxc_get_clock(MXC_BUS_CLK) / 1000000);
24424e8bee5SAlison Wang 	printf("ipg clock : %8d MHz\n", mxc_get_clock(MXC_IPG_CLK) / 1000000);
24524e8bee5SAlison Wang 
24624e8bee5SAlison Wang 	return 0;
24724e8bee5SAlison Wang }
24824e8bee5SAlison Wang 
24924e8bee5SAlison Wang U_BOOT_CMD(
25024e8bee5SAlison Wang 	clocks, CONFIG_SYS_MAXARGS, 1, do_vf610_showclocks,
25124e8bee5SAlison Wang 	"display clocks",
25224e8bee5SAlison Wang 	""
25324e8bee5SAlison Wang );
25424e8bee5SAlison Wang 
25524e8bee5SAlison Wang #ifdef CONFIG_FEC_MXC
imx_get_mac_from_fuse(int dev_id,unsigned char * mac)25624e8bee5SAlison Wang void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
25724e8bee5SAlison Wang {
25824e8bee5SAlison Wang 	struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
25924e8bee5SAlison Wang 	struct fuse_bank *bank = &ocotp->bank[4];
26024e8bee5SAlison Wang 	struct fuse_bank4_regs *fuse =
26124e8bee5SAlison Wang 		(struct fuse_bank4_regs *)bank->fuse_regs;
26224e8bee5SAlison Wang 
26324e8bee5SAlison Wang 	u32 value = readl(&fuse->mac_addr0);
26424e8bee5SAlison Wang 	mac[0] = (value >> 8);
26524e8bee5SAlison Wang 	mac[1] = value;
26624e8bee5SAlison Wang 
26724e8bee5SAlison Wang 	value = readl(&fuse->mac_addr1);
26824e8bee5SAlison Wang 	mac[2] = value >> 24;
26924e8bee5SAlison Wang 	mac[3] = value >> 16;
27024e8bee5SAlison Wang 	mac[4] = value >> 8;
27124e8bee5SAlison Wang 	mac[5] = value;
27224e8bee5SAlison Wang }
27324e8bee5SAlison Wang #endif
27424e8bee5SAlison Wang 
get_cpu_rev(void)27537cf2152SPeng Fan u32 get_cpu_rev(void)
27637cf2152SPeng Fan {
27737cf2152SPeng Fan 	return MXC_CPU_VF610 << 12;
27837cf2152SPeng Fan }
27937cf2152SPeng Fan 
28024e8bee5SAlison Wang #if defined(CONFIG_DISPLAY_CPUINFO)
get_reset_cause(void)28124e8bee5SAlison Wang static char *get_reset_cause(void)
28224e8bee5SAlison Wang {
28324e8bee5SAlison Wang 	u32 cause;
28424e8bee5SAlison Wang 	struct src *src_regs = (struct src *)SRC_BASE_ADDR;
28524e8bee5SAlison Wang 
28624e8bee5SAlison Wang 	cause = readl(&src_regs->srsr);
28724e8bee5SAlison Wang 	writel(cause, &src_regs->srsr);
28824e8bee5SAlison Wang 
2899e89a64fSStefan Agner 	if (cause & SRC_SRSR_POR_RST)
2909e89a64fSStefan Agner 		return "POWER ON RESET";
2919e89a64fSStefan Agner 	else if (cause & SRC_SRSR_WDOG_A5)
2929e89a64fSStefan Agner 		return "WDOG A5";
2939e89a64fSStefan Agner 	else if (cause & SRC_SRSR_WDOG_M4)
2949e89a64fSStefan Agner 		return "WDOG M4";
2959e89a64fSStefan Agner 	else if (cause & SRC_SRSR_JTAG_RST)
29624e8bee5SAlison Wang 		return "JTAG HIGH-Z";
2979e89a64fSStefan Agner 	else if (cause & SRC_SRSR_SW_RST)
2989e89a64fSStefan Agner 		return "SW RESET";
2999e89a64fSStefan Agner 	else if (cause & SRC_SRSR_RESETB)
30024e8bee5SAlison Wang 		return "EXTERNAL RESET";
3019e89a64fSStefan Agner 	else
30224e8bee5SAlison Wang 		return "unknown reset";
30324e8bee5SAlison Wang }
30424e8bee5SAlison Wang 
print_cpuinfo(void)30524e8bee5SAlison Wang int print_cpuinfo(void)
30624e8bee5SAlison Wang {
3071db503c4SSanchayan Maity 	printf("CPU: Freescale Vybrid VF%s at %d MHz\n",
3081db503c4SSanchayan Maity 	       soc_type, mxc_get_clock(MXC_ARM_CLK) / 1000000);
30924e8bee5SAlison Wang 	printf("Reset cause: %s\n", get_reset_cause());
31024e8bee5SAlison Wang 
31124e8bee5SAlison Wang 	return 0;
31224e8bee5SAlison Wang }
31324e8bee5SAlison Wang #endif
31424e8bee5SAlison Wang 
arch_cpu_init(void)3151db503c4SSanchayan Maity int arch_cpu_init(void)
3161db503c4SSanchayan Maity {
3171db503c4SSanchayan Maity 	struct mscm *mscm = (struct mscm *)MSCM_BASE_ADDR;
3181db503c4SSanchayan Maity 
3191db503c4SSanchayan Maity 	soc_type[0] = mscm->cpxcount ? '6' : '5'; /*Dual Core => VF6x0 */
3201db503c4SSanchayan Maity 	soc_type[1] = mscm->cpxcfg1 ? '1' : '0'; /* L2 Cache => VFx10 */
3211db503c4SSanchayan Maity 
3221db503c4SSanchayan Maity 	return 0;
3231db503c4SSanchayan Maity }
3241db503c4SSanchayan Maity 
3251db503c4SSanchayan Maity #ifdef CONFIG_ARCH_MISC_INIT
arch_misc_init(void)3261db503c4SSanchayan Maity int arch_misc_init(void)
3271db503c4SSanchayan Maity {
3281db503c4SSanchayan Maity 	char soc[6];
3291db503c4SSanchayan Maity 
330d7255e8dSStefan Agner 	strcpy(soc, "vf");
3311db503c4SSanchayan Maity 	strcat(soc, soc_type);
332*382bee57SSimon Glass 	env_set("soc", soc);
3331db503c4SSanchayan Maity 
3341db503c4SSanchayan Maity 	return 0;
3351db503c4SSanchayan Maity }
3361db503c4SSanchayan Maity #endif
3371db503c4SSanchayan Maity 
cpu_eth_init(bd_t * bis)33824e8bee5SAlison Wang int cpu_eth_init(bd_t *bis)
33924e8bee5SAlison Wang {
34024e8bee5SAlison Wang 	int rc = -ENODEV;
34124e8bee5SAlison Wang 
34224e8bee5SAlison Wang #if defined(CONFIG_FEC_MXC)
34324e8bee5SAlison Wang 	rc = fecmxc_initialize(bis);
34424e8bee5SAlison Wang #endif
34524e8bee5SAlison Wang 
34624e8bee5SAlison Wang 	return rc;
34724e8bee5SAlison Wang }
34824e8bee5SAlison Wang 
34924e8bee5SAlison Wang #ifdef CONFIG_FSL_ESDHC
cpu_mmc_init(bd_t * bis)35024e8bee5SAlison Wang int cpu_mmc_init(bd_t *bis)
35124e8bee5SAlison Wang {
35224e8bee5SAlison Wang 	return fsl_esdhc_mmc_init(bis);
35324e8bee5SAlison Wang }
35424e8bee5SAlison Wang #endif
35524e8bee5SAlison Wang 
get_clocks(void)35624e8bee5SAlison Wang int get_clocks(void)
35724e8bee5SAlison Wang {
35824e8bee5SAlison Wang #ifdef CONFIG_FSL_ESDHC
35924e8bee5SAlison Wang 	gd->arch.sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
36024e8bee5SAlison Wang #endif
36124e8bee5SAlison Wang 	return 0;
36224e8bee5SAlison Wang }
3637a90a1f2SStefan Agner 
3647a90a1f2SStefan Agner #ifndef CONFIG_SYS_DCACHE_OFF
enable_caches(void)3657a90a1f2SStefan Agner void enable_caches(void)
3667a90a1f2SStefan Agner {
3677a90a1f2SStefan Agner #if defined(CONFIG_SYS_ARM_CACHE_WRITETHROUGH)
3687a90a1f2SStefan Agner 	enum dcache_option option = DCACHE_WRITETHROUGH;
3697a90a1f2SStefan Agner #else
3707a90a1f2SStefan Agner 	enum dcache_option option = DCACHE_WRITEBACK;
3717a90a1f2SStefan Agner #endif
3727a90a1f2SStefan Agner 	dcache_enable();
3737a90a1f2SStefan Agner 	icache_enable();
3747a90a1f2SStefan Agner 
3757a90a1f2SStefan Agner     /* Enable caching on OCRAM */
3767a90a1f2SStefan Agner 	mmu_set_region_dcache_behaviour(IRAM_BASE_ADDR, IRAM_SIZE, option);
3777a90a1f2SStefan Agner }
3787a90a1f2SStefan Agner #endif
379