1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2013 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/crm_regs.h>
12*4882a593Smuzhiyun #include <asm/mach-imx/sys_proto.h>
13*4882a593Smuzhiyun #include <netdev.h>
14*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC
15*4882a593Smuzhiyun #include <fsl_esdhc.h>
16*4882a593Smuzhiyun #endif
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC
19*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
20*4882a593Smuzhiyun #endif
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun static char soc_type[] = "xx0";
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #ifdef CONFIG_MXC_OCOTP
enable_ocotp_clk(unsigned char enable)25*4882a593Smuzhiyun void enable_ocotp_clk(unsigned char enable)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
28*4882a593Smuzhiyun u32 reg;
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun reg = readl(&ccm->ccgr6);
31*4882a593Smuzhiyun if (enable)
32*4882a593Smuzhiyun reg |= CCM_CCGR6_OCOTP_CTRL_MASK;
33*4882a593Smuzhiyun else
34*4882a593Smuzhiyun reg &= ~CCM_CCGR6_OCOTP_CTRL_MASK;
35*4882a593Smuzhiyun writel(reg, &ccm->ccgr6);
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun #endif
38*4882a593Smuzhiyun
get_mcu_main_clk(void)39*4882a593Smuzhiyun static u32 get_mcu_main_clk(void)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
42*4882a593Smuzhiyun u32 ccm_ccsr, ccm_cacrr, armclk_div;
43*4882a593Smuzhiyun u32 sysclk_sel, pll_pfd_sel = 0;
44*4882a593Smuzhiyun u32 freq = 0;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun ccm_ccsr = readl(&ccm->ccsr);
47*4882a593Smuzhiyun sysclk_sel = ccm_ccsr & CCM_CCSR_SYS_CLK_SEL_MASK;
48*4882a593Smuzhiyun sysclk_sel >>= CCM_CCSR_SYS_CLK_SEL_OFFSET;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun ccm_cacrr = readl(&ccm->cacrr);
51*4882a593Smuzhiyun armclk_div = ccm_cacrr & CCM_CACRR_ARM_CLK_DIV_MASK;
52*4882a593Smuzhiyun armclk_div >>= CCM_CACRR_ARM_CLK_DIV_OFFSET;
53*4882a593Smuzhiyun armclk_div += 1;
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun switch (sysclk_sel) {
56*4882a593Smuzhiyun case 0:
57*4882a593Smuzhiyun freq = FASE_CLK_FREQ;
58*4882a593Smuzhiyun break;
59*4882a593Smuzhiyun case 1:
60*4882a593Smuzhiyun freq = SLOW_CLK_FREQ;
61*4882a593Smuzhiyun break;
62*4882a593Smuzhiyun case 2:
63*4882a593Smuzhiyun pll_pfd_sel = ccm_ccsr & CCM_CCSR_PLL2_PFD_CLK_SEL_MASK;
64*4882a593Smuzhiyun pll_pfd_sel >>= CCM_CCSR_PLL2_PFD_CLK_SEL_OFFSET;
65*4882a593Smuzhiyun if (pll_pfd_sel == 0)
66*4882a593Smuzhiyun freq = PLL2_MAIN_FREQ;
67*4882a593Smuzhiyun else if (pll_pfd_sel == 1)
68*4882a593Smuzhiyun freq = PLL2_PFD1_FREQ;
69*4882a593Smuzhiyun else if (pll_pfd_sel == 2)
70*4882a593Smuzhiyun freq = PLL2_PFD2_FREQ;
71*4882a593Smuzhiyun else if (pll_pfd_sel == 3)
72*4882a593Smuzhiyun freq = PLL2_PFD3_FREQ;
73*4882a593Smuzhiyun else if (pll_pfd_sel == 4)
74*4882a593Smuzhiyun freq = PLL2_PFD4_FREQ;
75*4882a593Smuzhiyun break;
76*4882a593Smuzhiyun case 3:
77*4882a593Smuzhiyun freq = PLL2_MAIN_FREQ;
78*4882a593Smuzhiyun break;
79*4882a593Smuzhiyun case 4:
80*4882a593Smuzhiyun pll_pfd_sel = ccm_ccsr & CCM_CCSR_PLL1_PFD_CLK_SEL_MASK;
81*4882a593Smuzhiyun pll_pfd_sel >>= CCM_CCSR_PLL1_PFD_CLK_SEL_OFFSET;
82*4882a593Smuzhiyun if (pll_pfd_sel == 0)
83*4882a593Smuzhiyun freq = PLL1_MAIN_FREQ;
84*4882a593Smuzhiyun else if (pll_pfd_sel == 1)
85*4882a593Smuzhiyun freq = PLL1_PFD1_FREQ;
86*4882a593Smuzhiyun else if (pll_pfd_sel == 2)
87*4882a593Smuzhiyun freq = PLL1_PFD2_FREQ;
88*4882a593Smuzhiyun else if (pll_pfd_sel == 3)
89*4882a593Smuzhiyun freq = PLL1_PFD3_FREQ;
90*4882a593Smuzhiyun else if (pll_pfd_sel == 4)
91*4882a593Smuzhiyun freq = PLL1_PFD4_FREQ;
92*4882a593Smuzhiyun break;
93*4882a593Smuzhiyun case 5:
94*4882a593Smuzhiyun freq = PLL3_MAIN_FREQ;
95*4882a593Smuzhiyun break;
96*4882a593Smuzhiyun default:
97*4882a593Smuzhiyun printf("unsupported system clock select\n");
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun return freq / armclk_div;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
get_bus_clk(void)103*4882a593Smuzhiyun static u32 get_bus_clk(void)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
106*4882a593Smuzhiyun u32 ccm_cacrr, busclk_div;
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun ccm_cacrr = readl(&ccm->cacrr);
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun busclk_div = ccm_cacrr & CCM_CACRR_BUS_CLK_DIV_MASK;
111*4882a593Smuzhiyun busclk_div >>= CCM_CACRR_BUS_CLK_DIV_OFFSET;
112*4882a593Smuzhiyun busclk_div += 1;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun return get_mcu_main_clk() / busclk_div;
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
get_ipg_clk(void)117*4882a593Smuzhiyun static u32 get_ipg_clk(void)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
120*4882a593Smuzhiyun u32 ccm_cacrr, ipgclk_div;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun ccm_cacrr = readl(&ccm->cacrr);
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun ipgclk_div = ccm_cacrr & CCM_CACRR_IPG_CLK_DIV_MASK;
125*4882a593Smuzhiyun ipgclk_div >>= CCM_CACRR_IPG_CLK_DIV_OFFSET;
126*4882a593Smuzhiyun ipgclk_div += 1;
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun return get_bus_clk() / ipgclk_div;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
get_uart_clk(void)131*4882a593Smuzhiyun static u32 get_uart_clk(void)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun return get_ipg_clk();
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
get_sdhc_clk(void)136*4882a593Smuzhiyun static u32 get_sdhc_clk(void)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
139*4882a593Smuzhiyun u32 ccm_cscmr1, ccm_cscdr2, sdhc_clk_sel, sdhc_clk_div;
140*4882a593Smuzhiyun u32 freq = 0;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun ccm_cscmr1 = readl(&ccm->cscmr1);
143*4882a593Smuzhiyun sdhc_clk_sel = ccm_cscmr1 & CCM_CSCMR1_ESDHC1_CLK_SEL_MASK;
144*4882a593Smuzhiyun sdhc_clk_sel >>= CCM_CSCMR1_ESDHC1_CLK_SEL_OFFSET;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun ccm_cscdr2 = readl(&ccm->cscdr2);
147*4882a593Smuzhiyun sdhc_clk_div = ccm_cscdr2 & CCM_CSCDR2_ESDHC1_CLK_DIV_MASK;
148*4882a593Smuzhiyun sdhc_clk_div >>= CCM_CSCDR2_ESDHC1_CLK_DIV_OFFSET;
149*4882a593Smuzhiyun sdhc_clk_div += 1;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun switch (sdhc_clk_sel) {
152*4882a593Smuzhiyun case 0:
153*4882a593Smuzhiyun freq = PLL3_MAIN_FREQ;
154*4882a593Smuzhiyun break;
155*4882a593Smuzhiyun case 1:
156*4882a593Smuzhiyun freq = PLL3_PFD3_FREQ;
157*4882a593Smuzhiyun break;
158*4882a593Smuzhiyun case 2:
159*4882a593Smuzhiyun freq = PLL1_PFD3_FREQ;
160*4882a593Smuzhiyun break;
161*4882a593Smuzhiyun case 3:
162*4882a593Smuzhiyun freq = get_bus_clk();
163*4882a593Smuzhiyun break;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun return freq / sdhc_clk_div;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
get_fec_clk(void)169*4882a593Smuzhiyun u32 get_fec_clk(void)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
172*4882a593Smuzhiyun u32 ccm_cscmr2, rmii_clk_sel;
173*4882a593Smuzhiyun u32 freq = 0;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun ccm_cscmr2 = readl(&ccm->cscmr2);
176*4882a593Smuzhiyun rmii_clk_sel = ccm_cscmr2 & CCM_CSCMR2_RMII_CLK_SEL_MASK;
177*4882a593Smuzhiyun rmii_clk_sel >>= CCM_CSCMR2_RMII_CLK_SEL_OFFSET;
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun switch (rmii_clk_sel) {
180*4882a593Smuzhiyun case 0:
181*4882a593Smuzhiyun freq = ENET_EXTERNAL_CLK;
182*4882a593Smuzhiyun break;
183*4882a593Smuzhiyun case 1:
184*4882a593Smuzhiyun freq = AUDIO_EXTERNAL_CLK;
185*4882a593Smuzhiyun break;
186*4882a593Smuzhiyun case 2:
187*4882a593Smuzhiyun freq = PLL5_MAIN_FREQ;
188*4882a593Smuzhiyun break;
189*4882a593Smuzhiyun case 3:
190*4882a593Smuzhiyun freq = PLL5_MAIN_FREQ / 2;
191*4882a593Smuzhiyun break;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun return freq;
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun
get_i2c_clk(void)197*4882a593Smuzhiyun static u32 get_i2c_clk(void)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun return get_ipg_clk();
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
get_dspi_clk(void)202*4882a593Smuzhiyun static u32 get_dspi_clk(void)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun return get_ipg_clk();
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun
get_lpuart_clk(void)207*4882a593Smuzhiyun u32 get_lpuart_clk(void)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun return get_uart_clk();
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
mxc_get_clock(enum mxc_clock clk)212*4882a593Smuzhiyun unsigned int mxc_get_clock(enum mxc_clock clk)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun switch (clk) {
215*4882a593Smuzhiyun case MXC_ARM_CLK:
216*4882a593Smuzhiyun return get_mcu_main_clk();
217*4882a593Smuzhiyun case MXC_BUS_CLK:
218*4882a593Smuzhiyun return get_bus_clk();
219*4882a593Smuzhiyun case MXC_IPG_CLK:
220*4882a593Smuzhiyun return get_ipg_clk();
221*4882a593Smuzhiyun case MXC_UART_CLK:
222*4882a593Smuzhiyun return get_uart_clk();
223*4882a593Smuzhiyun case MXC_ESDHC_CLK:
224*4882a593Smuzhiyun return get_sdhc_clk();
225*4882a593Smuzhiyun case MXC_FEC_CLK:
226*4882a593Smuzhiyun return get_fec_clk();
227*4882a593Smuzhiyun case MXC_I2C_CLK:
228*4882a593Smuzhiyun return get_i2c_clk();
229*4882a593Smuzhiyun case MXC_DSPI_CLK:
230*4882a593Smuzhiyun return get_dspi_clk();
231*4882a593Smuzhiyun default:
232*4882a593Smuzhiyun break;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun return -1;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun /* Dump some core clocks */
do_vf610_showclocks(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])238*4882a593Smuzhiyun int do_vf610_showclocks(cmd_tbl_t *cmdtp, int flag, int argc,
239*4882a593Smuzhiyun char * const argv[])
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun printf("\n");
242*4882a593Smuzhiyun printf("cpu clock : %8d MHz\n", mxc_get_clock(MXC_ARM_CLK) / 1000000);
243*4882a593Smuzhiyun printf("bus clock : %8d MHz\n", mxc_get_clock(MXC_BUS_CLK) / 1000000);
244*4882a593Smuzhiyun printf("ipg clock : %8d MHz\n", mxc_get_clock(MXC_IPG_CLK) / 1000000);
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun return 0;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun U_BOOT_CMD(
250*4882a593Smuzhiyun clocks, CONFIG_SYS_MAXARGS, 1, do_vf610_showclocks,
251*4882a593Smuzhiyun "display clocks",
252*4882a593Smuzhiyun ""
253*4882a593Smuzhiyun );
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun #ifdef CONFIG_FEC_MXC
imx_get_mac_from_fuse(int dev_id,unsigned char * mac)256*4882a593Smuzhiyun void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
259*4882a593Smuzhiyun struct fuse_bank *bank = &ocotp->bank[4];
260*4882a593Smuzhiyun struct fuse_bank4_regs *fuse =
261*4882a593Smuzhiyun (struct fuse_bank4_regs *)bank->fuse_regs;
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun u32 value = readl(&fuse->mac_addr0);
264*4882a593Smuzhiyun mac[0] = (value >> 8);
265*4882a593Smuzhiyun mac[1] = value;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun value = readl(&fuse->mac_addr1);
268*4882a593Smuzhiyun mac[2] = value >> 24;
269*4882a593Smuzhiyun mac[3] = value >> 16;
270*4882a593Smuzhiyun mac[4] = value >> 8;
271*4882a593Smuzhiyun mac[5] = value;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun #endif
274*4882a593Smuzhiyun
get_cpu_rev(void)275*4882a593Smuzhiyun u32 get_cpu_rev(void)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun return MXC_CPU_VF610 << 12;
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun #if defined(CONFIG_DISPLAY_CPUINFO)
get_reset_cause(void)281*4882a593Smuzhiyun static char *get_reset_cause(void)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun u32 cause;
284*4882a593Smuzhiyun struct src *src_regs = (struct src *)SRC_BASE_ADDR;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun cause = readl(&src_regs->srsr);
287*4882a593Smuzhiyun writel(cause, &src_regs->srsr);
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun if (cause & SRC_SRSR_POR_RST)
290*4882a593Smuzhiyun return "POWER ON RESET";
291*4882a593Smuzhiyun else if (cause & SRC_SRSR_WDOG_A5)
292*4882a593Smuzhiyun return "WDOG A5";
293*4882a593Smuzhiyun else if (cause & SRC_SRSR_WDOG_M4)
294*4882a593Smuzhiyun return "WDOG M4";
295*4882a593Smuzhiyun else if (cause & SRC_SRSR_JTAG_RST)
296*4882a593Smuzhiyun return "JTAG HIGH-Z";
297*4882a593Smuzhiyun else if (cause & SRC_SRSR_SW_RST)
298*4882a593Smuzhiyun return "SW RESET";
299*4882a593Smuzhiyun else if (cause & SRC_SRSR_RESETB)
300*4882a593Smuzhiyun return "EXTERNAL RESET";
301*4882a593Smuzhiyun else
302*4882a593Smuzhiyun return "unknown reset";
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun
print_cpuinfo(void)305*4882a593Smuzhiyun int print_cpuinfo(void)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun printf("CPU: Freescale Vybrid VF%s at %d MHz\n",
308*4882a593Smuzhiyun soc_type, mxc_get_clock(MXC_ARM_CLK) / 1000000);
309*4882a593Smuzhiyun printf("Reset cause: %s\n", get_reset_cause());
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun return 0;
312*4882a593Smuzhiyun }
313*4882a593Smuzhiyun #endif
314*4882a593Smuzhiyun
arch_cpu_init(void)315*4882a593Smuzhiyun int arch_cpu_init(void)
316*4882a593Smuzhiyun {
317*4882a593Smuzhiyun struct mscm *mscm = (struct mscm *)MSCM_BASE_ADDR;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun soc_type[0] = mscm->cpxcount ? '6' : '5'; /*Dual Core => VF6x0 */
320*4882a593Smuzhiyun soc_type[1] = mscm->cpxcfg1 ? '1' : '0'; /* L2 Cache => VFx10 */
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun return 0;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun #ifdef CONFIG_ARCH_MISC_INIT
arch_misc_init(void)326*4882a593Smuzhiyun int arch_misc_init(void)
327*4882a593Smuzhiyun {
328*4882a593Smuzhiyun char soc[6];
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun strcpy(soc, "vf");
331*4882a593Smuzhiyun strcat(soc, soc_type);
332*4882a593Smuzhiyun env_set("soc", soc);
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun return 0;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun #endif
337*4882a593Smuzhiyun
cpu_eth_init(bd_t * bis)338*4882a593Smuzhiyun int cpu_eth_init(bd_t *bis)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun int rc = -ENODEV;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun #if defined(CONFIG_FEC_MXC)
343*4882a593Smuzhiyun rc = fecmxc_initialize(bis);
344*4882a593Smuzhiyun #endif
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun return rc;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC
cpu_mmc_init(bd_t * bis)350*4882a593Smuzhiyun int cpu_mmc_init(bd_t *bis)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun return fsl_esdhc_mmc_init(bis);
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun #endif
355*4882a593Smuzhiyun
get_clocks(void)356*4882a593Smuzhiyun int get_clocks(void)
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC
359*4882a593Smuzhiyun gd->arch.sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
360*4882a593Smuzhiyun #endif
361*4882a593Smuzhiyun return 0;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun #ifndef CONFIG_SYS_DCACHE_OFF
enable_caches(void)365*4882a593Smuzhiyun void enable_caches(void)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun #if defined(CONFIG_SYS_ARM_CACHE_WRITETHROUGH)
368*4882a593Smuzhiyun enum dcache_option option = DCACHE_WRITETHROUGH;
369*4882a593Smuzhiyun #else
370*4882a593Smuzhiyun enum dcache_option option = DCACHE_WRITEBACK;
371*4882a593Smuzhiyun #endif
372*4882a593Smuzhiyun dcache_enable();
373*4882a593Smuzhiyun icache_enable();
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun /* Enable caching on OCRAM */
376*4882a593Smuzhiyun mmu_set_region_dcache_behaviour(IRAM_BASE_ADDR, IRAM_SIZE, option);
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun #endif
379