184ad6884SPeter Tyser /* 284ad6884SPeter Tyser * Copyright (c) 2008 Eric Jarrige <eric.jarrige@armadeus.org> 384ad6884SPeter Tyser * Copyright (c) 2009 Ilya Yanok <yanok@emcraft.com> 484ad6884SPeter Tyser * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 684ad6884SPeter Tyser */ 784ad6884SPeter Tyser 884ad6884SPeter Tyser #include <common.h> 984ad6884SPeter Tyser #include <div64.h> 1084ad6884SPeter Tyser #include <netdev.h> 1184ad6884SPeter Tyser #include <asm/io.h> 1284ad6884SPeter Tyser #include <asm/arch/imx-regs.h> 13fa47a286SHelmut Raiger #include <asm/arch/clock.h> 14e71c39deStrem #include <asm/arch/gpio.h> 15*49ea15d5SPeng Fan #include <asm/imx-common/sys_proto.h> 1684ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 1784ad6884SPeter Tyser #include <asm/arch/mxcmmc.h> 1884ad6884SPeter Tyser #endif 1984ad6884SPeter Tyser 2084ad6884SPeter Tyser /* 2184ad6884SPeter Tyser * get the system pll clock in Hz 2284ad6884SPeter Tyser * 2384ad6884SPeter Tyser * mfi + mfn / (mfd +1) 2484ad6884SPeter Tyser * f = 2 * f_ref * -------------------- 2584ad6884SPeter Tyser * pd + 1 2684ad6884SPeter Tyser */ 27fa47a286SHelmut Raiger static unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref) 2884ad6884SPeter Tyser { 2984ad6884SPeter Tyser unsigned int mfi = (pll >> 10) & 0xf; 3084ad6884SPeter Tyser unsigned int mfn = pll & 0x3ff; 3184ad6884SPeter Tyser unsigned int mfd = (pll >> 16) & 0x3ff; 3284ad6884SPeter Tyser unsigned int pd = (pll >> 26) & 0xf; 3384ad6884SPeter Tyser 3484ad6884SPeter Tyser mfi = mfi <= 5 ? 5 : mfi; 3584ad6884SPeter Tyser 3684ad6884SPeter Tyser return lldiv(2 * (u64)f_ref * (mfi * (mfd + 1) + mfn), 3784ad6884SPeter Tyser (mfd + 1) * (pd + 1)); 3884ad6884SPeter Tyser } 3984ad6884SPeter Tyser 4084ad6884SPeter Tyser static ulong clk_in_32k(void) 4184ad6884SPeter Tyser { 4284ad6884SPeter Tyser return 1024 * CONFIG_MX27_CLK32; 4384ad6884SPeter Tyser } 4484ad6884SPeter Tyser 4584ad6884SPeter Tyser static ulong clk_in_26m(void) 4684ad6884SPeter Tyser { 4784ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 4884ad6884SPeter Tyser 4984ad6884SPeter Tyser if (readl(&pll->cscr) & CSCR_OSC26M_DIV1P5) { 5084ad6884SPeter Tyser /* divide by 1.5 */ 5184ad6884SPeter Tyser return 26000000 * 2 / 3; 5284ad6884SPeter Tyser } else { 5384ad6884SPeter Tyser return 26000000; 5484ad6884SPeter Tyser } 5584ad6884SPeter Tyser } 5684ad6884SPeter Tyser 57fa47a286SHelmut Raiger static ulong imx_get_mpllclk(void) 5884ad6884SPeter Tyser { 5984ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 6084ad6884SPeter Tyser ulong cscr = readl(&pll->cscr); 6184ad6884SPeter Tyser ulong fref; 6284ad6884SPeter Tyser 6384ad6884SPeter Tyser if (cscr & CSCR_MCU_SEL) 6484ad6884SPeter Tyser fref = clk_in_26m(); 6584ad6884SPeter Tyser else 6684ad6884SPeter Tyser fref = clk_in_32k(); 6784ad6884SPeter Tyser 6884ad6884SPeter Tyser return imx_decode_pll(readl(&pll->mpctl0), fref); 6984ad6884SPeter Tyser } 7084ad6884SPeter Tyser 71fa47a286SHelmut Raiger static ulong imx_get_armclk(void) 7284ad6884SPeter Tyser { 7384ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 7484ad6884SPeter Tyser ulong cscr = readl(&pll->cscr); 7584ad6884SPeter Tyser ulong fref = imx_get_mpllclk(); 7684ad6884SPeter Tyser ulong div; 7784ad6884SPeter Tyser 7884ad6884SPeter Tyser if (!(cscr & CSCR_ARM_SRC_MPLL)) 7984ad6884SPeter Tyser fref = lldiv((fref * 2), 3); 8084ad6884SPeter Tyser 8184ad6884SPeter Tyser div = ((cscr >> 12) & 0x3) + 1; 8284ad6884SPeter Tyser 8384ad6884SPeter Tyser return lldiv(fref, div); 8484ad6884SPeter Tyser } 8584ad6884SPeter Tyser 86fa47a286SHelmut Raiger static ulong imx_get_ahbclk(void) 8784ad6884SPeter Tyser { 8884ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 8984ad6884SPeter Tyser ulong cscr = readl(&pll->cscr); 9084ad6884SPeter Tyser ulong fref = imx_get_mpllclk(); 9184ad6884SPeter Tyser ulong div; 9284ad6884SPeter Tyser 9384ad6884SPeter Tyser div = ((cscr >> 8) & 0x3) + 1; 9484ad6884SPeter Tyser 9584ad6884SPeter Tyser return lldiv(fref * 2, 3 * div); 9684ad6884SPeter Tyser } 9784ad6884SPeter Tyser 98fa47a286SHelmut Raiger static __attribute__((unused)) ulong imx_get_spllclk(void) 9984ad6884SPeter Tyser { 10084ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 10184ad6884SPeter Tyser ulong cscr = readl(&pll->cscr); 10284ad6884SPeter Tyser ulong fref; 10384ad6884SPeter Tyser 10484ad6884SPeter Tyser if (cscr & CSCR_SP_SEL) 10584ad6884SPeter Tyser fref = clk_in_26m(); 10684ad6884SPeter Tyser else 10784ad6884SPeter Tyser fref = clk_in_32k(); 10884ad6884SPeter Tyser 10984ad6884SPeter Tyser return imx_decode_pll(readl(&pll->spctl0), fref); 11084ad6884SPeter Tyser } 11184ad6884SPeter Tyser 11284ad6884SPeter Tyser static ulong imx_decode_perclk(ulong div) 11384ad6884SPeter Tyser { 11484ad6884SPeter Tyser return lldiv((imx_get_mpllclk() * 2), (div * 3)); 11584ad6884SPeter Tyser } 11684ad6884SPeter Tyser 117fa47a286SHelmut Raiger static ulong imx_get_perclk1(void) 11884ad6884SPeter Tyser { 11984ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 12084ad6884SPeter Tyser 12184ad6884SPeter Tyser return imx_decode_perclk((readl(&pll->pcdr1) & 0x3f) + 1); 12284ad6884SPeter Tyser } 12384ad6884SPeter Tyser 124fa47a286SHelmut Raiger static ulong imx_get_perclk2(void) 12584ad6884SPeter Tyser { 12684ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 12784ad6884SPeter Tyser 12884ad6884SPeter Tyser return imx_decode_perclk(((readl(&pll->pcdr1) >> 8) & 0x3f) + 1); 12984ad6884SPeter Tyser } 13084ad6884SPeter Tyser 131fa47a286SHelmut Raiger static __attribute__((unused)) ulong imx_get_perclk3(void) 13284ad6884SPeter Tyser { 13384ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 13484ad6884SPeter Tyser 13584ad6884SPeter Tyser return imx_decode_perclk(((readl(&pll->pcdr1) >> 16) & 0x3f) + 1); 13684ad6884SPeter Tyser } 13784ad6884SPeter Tyser 138fa47a286SHelmut Raiger static __attribute__((unused)) ulong imx_get_perclk4(void) 13984ad6884SPeter Tyser { 14084ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 14184ad6884SPeter Tyser 14284ad6884SPeter Tyser return imx_decode_perclk(((readl(&pll->pcdr1) >> 24) & 0x3f) + 1); 14384ad6884SPeter Tyser } 14484ad6884SPeter Tyser 145fa47a286SHelmut Raiger unsigned int mxc_get_clock(enum mxc_clock clk) 146fa47a286SHelmut Raiger { 147fa47a286SHelmut Raiger switch (clk) { 148fa47a286SHelmut Raiger case MXC_ARM_CLK: 149fa47a286SHelmut Raiger return imx_get_armclk(); 15079713f0aStrem case MXC_I2C_CLK: 15179713f0aStrem return imx_get_ahbclk()/2; 152fa47a286SHelmut Raiger case MXC_UART_CLK: 153fa47a286SHelmut Raiger return imx_get_perclk1(); 154fa47a286SHelmut Raiger case MXC_FEC_CLK: 155fa47a286SHelmut Raiger return imx_get_ahbclk(); 156fa47a286SHelmut Raiger case MXC_ESDHC_CLK: 157fa47a286SHelmut Raiger return imx_get_perclk2(); 158fa47a286SHelmut Raiger } 159fa47a286SHelmut Raiger return -1; 160fa47a286SHelmut Raiger } 161fa47a286SHelmut Raiger 162fa47a286SHelmut Raiger 163*49ea15d5SPeng Fan u32 get_cpu_rev(void) 164*49ea15d5SPeng Fan { 165*49ea15d5SPeng Fan return MXC_CPU_MX27 << 12; 166*49ea15d5SPeng Fan } 167*49ea15d5SPeng Fan 16884ad6884SPeter Tyser #if defined(CONFIG_DISPLAY_CPUINFO) 16984ad6884SPeter Tyser int print_cpuinfo (void) 17084ad6884SPeter Tyser { 17184ad6884SPeter Tyser char buf[32]; 17284ad6884SPeter Tyser 17384ad6884SPeter Tyser printf("CPU: Freescale i.MX27 at %s MHz\n\n", 17484ad6884SPeter Tyser strmhz(buf, imx_get_mpllclk())); 17584ad6884SPeter Tyser return 0; 17684ad6884SPeter Tyser } 17784ad6884SPeter Tyser #endif 17884ad6884SPeter Tyser 17984ad6884SPeter Tyser int cpu_eth_init(bd_t *bis) 18084ad6884SPeter Tyser { 18184ad6884SPeter Tyser #if defined(CONFIG_FEC_MXC) 18284ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 18384ad6884SPeter Tyser 18484ad6884SPeter Tyser /* enable FEC clock */ 18584ad6884SPeter Tyser writel(readl(&pll->pccr1) | PCCR1_HCLK_FEC, &pll->pccr1); 18684ad6884SPeter Tyser writel(readl(&pll->pccr0) | PCCR0_FEC_EN, &pll->pccr0); 18784ad6884SPeter Tyser return fecmxc_initialize(bis); 18884ad6884SPeter Tyser #else 18984ad6884SPeter Tyser return 0; 19084ad6884SPeter Tyser #endif 19184ad6884SPeter Tyser } 19284ad6884SPeter Tyser 19384ad6884SPeter Tyser /* 19484ad6884SPeter Tyser * Initializes on-chip MMC controllers. 19584ad6884SPeter Tyser * to override, implement board_mmc_init() 19684ad6884SPeter Tyser */ 19784ad6884SPeter Tyser int cpu_mmc_init(bd_t *bis) 19884ad6884SPeter Tyser { 19984ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 20084ad6884SPeter Tyser return mxc_mmc_init(bis); 20184ad6884SPeter Tyser #else 20284ad6884SPeter Tyser return 0; 20384ad6884SPeter Tyser #endif 20484ad6884SPeter Tyser } 20584ad6884SPeter Tyser 20684ad6884SPeter Tyser void imx_gpio_mode(int gpio_mode) 20784ad6884SPeter Tyser { 208e71c39deStrem struct gpio_port_regs *regs = (struct gpio_port_regs *)IMX_GPIO_BASE; 20984ad6884SPeter Tyser unsigned int pin = gpio_mode & GPIO_PIN_MASK; 21084ad6884SPeter Tyser unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; 21184ad6884SPeter Tyser unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> GPIO_OCR_SHIFT; 21284ad6884SPeter Tyser unsigned int aout = (gpio_mode & GPIO_AOUT_MASK) >> GPIO_AOUT_SHIFT; 21384ad6884SPeter Tyser unsigned int bout = (gpio_mode & GPIO_BOUT_MASK) >> GPIO_BOUT_SHIFT; 21484ad6884SPeter Tyser unsigned int tmp; 21584ad6884SPeter Tyser 21684ad6884SPeter Tyser /* Pullup enable */ 21784ad6884SPeter Tyser if (gpio_mode & GPIO_PUEN) { 21884ad6884SPeter Tyser writel(readl(®s->port[port].puen) | (1 << pin), 21984ad6884SPeter Tyser ®s->port[port].puen); 22084ad6884SPeter Tyser } else { 22184ad6884SPeter Tyser writel(readl(®s->port[port].puen) & ~(1 << pin), 22284ad6884SPeter Tyser ®s->port[port].puen); 22384ad6884SPeter Tyser } 22484ad6884SPeter Tyser 22584ad6884SPeter Tyser /* Data direction */ 22684ad6884SPeter Tyser if (gpio_mode & GPIO_OUT) { 227e71c39deStrem writel(readl(®s->port[port].gpio_dir) | 1 << pin, 228e71c39deStrem ®s->port[port].gpio_dir); 22984ad6884SPeter Tyser } else { 230e71c39deStrem writel(readl(®s->port[port].gpio_dir) & ~(1 << pin), 231e71c39deStrem ®s->port[port].gpio_dir); 23284ad6884SPeter Tyser } 23384ad6884SPeter Tyser 23484ad6884SPeter Tyser /* Primary / alternate function */ 23584ad6884SPeter Tyser if (gpio_mode & GPIO_AF) { 23684ad6884SPeter Tyser writel(readl(®s->port[port].gpr) | (1 << pin), 23784ad6884SPeter Tyser ®s->port[port].gpr); 23884ad6884SPeter Tyser } else { 23984ad6884SPeter Tyser writel(readl(®s->port[port].gpr) & ~(1 << pin), 24084ad6884SPeter Tyser ®s->port[port].gpr); 24184ad6884SPeter Tyser } 24284ad6884SPeter Tyser 24384ad6884SPeter Tyser /* use as gpio? */ 24484ad6884SPeter Tyser if (!(gpio_mode & (GPIO_PF | GPIO_AF))) { 24584ad6884SPeter Tyser writel(readl(®s->port[port].gius) | (1 << pin), 24684ad6884SPeter Tyser ®s->port[port].gius); 24784ad6884SPeter Tyser } else { 24884ad6884SPeter Tyser writel(readl(®s->port[port].gius) & ~(1 << pin), 24984ad6884SPeter Tyser ®s->port[port].gius); 25084ad6884SPeter Tyser } 25184ad6884SPeter Tyser 25284ad6884SPeter Tyser /* Output / input configuration */ 25384ad6884SPeter Tyser if (pin < 16) { 25484ad6884SPeter Tyser tmp = readl(®s->port[port].ocr1); 25584ad6884SPeter Tyser tmp &= ~(3 << (pin * 2)); 25684ad6884SPeter Tyser tmp |= (ocr << (pin * 2)); 25784ad6884SPeter Tyser writel(tmp, ®s->port[port].ocr1); 25884ad6884SPeter Tyser 25984ad6884SPeter Tyser writel(readl(®s->port[port].iconfa1) & ~(3 << (pin * 2)), 26084ad6884SPeter Tyser ®s->port[port].iconfa1); 26184ad6884SPeter Tyser writel(readl(®s->port[port].iconfa1) | aout << (pin * 2), 26284ad6884SPeter Tyser ®s->port[port].iconfa1); 26384ad6884SPeter Tyser writel(readl(®s->port[port].iconfb1) & ~(3 << (pin * 2)), 26484ad6884SPeter Tyser ®s->port[port].iconfb1); 26584ad6884SPeter Tyser writel(readl(®s->port[port].iconfb1) | bout << (pin * 2), 26684ad6884SPeter Tyser ®s->port[port].iconfb1); 26784ad6884SPeter Tyser } else { 26884ad6884SPeter Tyser pin -= 16; 26984ad6884SPeter Tyser 27084ad6884SPeter Tyser tmp = readl(®s->port[port].ocr2); 27184ad6884SPeter Tyser tmp &= ~(3 << (pin * 2)); 27284ad6884SPeter Tyser tmp |= (ocr << (pin * 2)); 27384ad6884SPeter Tyser writel(tmp, ®s->port[port].ocr2); 27484ad6884SPeter Tyser 27584ad6884SPeter Tyser writel(readl(®s->port[port].iconfa2) & ~(3 << (pin * 2)), 27684ad6884SPeter Tyser ®s->port[port].iconfa2); 27784ad6884SPeter Tyser writel(readl(®s->port[port].iconfa2) | aout << (pin * 2), 27884ad6884SPeter Tyser ®s->port[port].iconfa2); 27984ad6884SPeter Tyser writel(readl(®s->port[port].iconfb2) & ~(3 << (pin * 2)), 28084ad6884SPeter Tyser ®s->port[port].iconfb2); 28184ad6884SPeter Tyser writel(readl(®s->port[port].iconfb2) | bout << (pin * 2), 28284ad6884SPeter Tyser ®s->port[port].iconfb2); 28384ad6884SPeter Tyser } 28484ad6884SPeter Tyser } 28584ad6884SPeter Tyser 28684ad6884SPeter Tyser #ifdef CONFIG_MXC_UART 2873f7bfbddSFabio Estevam void mx27_uart1_init_pins(void) 28884ad6884SPeter Tyser { 28984ad6884SPeter Tyser int i; 29084ad6884SPeter Tyser unsigned int mode[] = { 29184ad6884SPeter Tyser PE12_PF_UART1_TXD, 29284ad6884SPeter Tyser PE13_PF_UART1_RXD, 29384ad6884SPeter Tyser }; 29484ad6884SPeter Tyser 29584ad6884SPeter Tyser for (i = 0; i < ARRAY_SIZE(mode); i++) 29684ad6884SPeter Tyser imx_gpio_mode(mode[i]); 29784ad6884SPeter Tyser 29884ad6884SPeter Tyser } 29984ad6884SPeter Tyser #endif /* CONFIG_MXC_UART */ 30084ad6884SPeter Tyser 30184ad6884SPeter Tyser #ifdef CONFIG_FEC_MXC 30284ad6884SPeter Tyser void mx27_fec_init_pins(void) 30384ad6884SPeter Tyser { 30484ad6884SPeter Tyser int i; 30584ad6884SPeter Tyser unsigned int mode[] = { 30684ad6884SPeter Tyser PD0_AIN_FEC_TXD0, 30784ad6884SPeter Tyser PD1_AIN_FEC_TXD1, 30884ad6884SPeter Tyser PD2_AIN_FEC_TXD2, 30984ad6884SPeter Tyser PD3_AIN_FEC_TXD3, 31084ad6884SPeter Tyser PD4_AOUT_FEC_RX_ER, 31184ad6884SPeter Tyser PD5_AOUT_FEC_RXD1, 31284ad6884SPeter Tyser PD6_AOUT_FEC_RXD2, 31384ad6884SPeter Tyser PD7_AOUT_FEC_RXD3, 31484ad6884SPeter Tyser PD8_AF_FEC_MDIO, 31584ad6884SPeter Tyser PD9_AIN_FEC_MDC | GPIO_PUEN, 31684ad6884SPeter Tyser PD10_AOUT_FEC_CRS, 31784ad6884SPeter Tyser PD11_AOUT_FEC_TX_CLK, 31884ad6884SPeter Tyser PD12_AOUT_FEC_RXD0, 31984ad6884SPeter Tyser PD13_AOUT_FEC_RX_DV, 32084ad6884SPeter Tyser PD14_AOUT_FEC_CLR, 32184ad6884SPeter Tyser PD15_AOUT_FEC_COL, 32284ad6884SPeter Tyser PD16_AIN_FEC_TX_ER, 32384ad6884SPeter Tyser PF23_AIN_FEC_TX_EN, 32484ad6884SPeter Tyser }; 32584ad6884SPeter Tyser 32684ad6884SPeter Tyser for (i = 0; i < ARRAY_SIZE(mode); i++) 32784ad6884SPeter Tyser imx_gpio_mode(mode[i]); 32884ad6884SPeter Tyser } 329565e39c5SLiu Hui-R64343 330be252b65SFabio Estevam void imx_get_mac_from_fuse(int dev_id, unsigned char *mac) 331565e39c5SLiu Hui-R64343 { 332565e39c5SLiu Hui-R64343 int i; 333565e39c5SLiu Hui-R64343 struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE; 334565e39c5SLiu Hui-R64343 struct fuse_bank *bank = &iim->bank[0]; 335565e39c5SLiu Hui-R64343 struct fuse_bank0_regs *fuse = 336565e39c5SLiu Hui-R64343 (struct fuse_bank0_regs *)bank->fuse_regs; 337565e39c5SLiu Hui-R64343 338565e39c5SLiu Hui-R64343 for (i = 0; i < 6; i++) 339565e39c5SLiu Hui-R64343 mac[6 - 1 - i] = readl(&fuse->mac_addr[i]) & 0xff; 340565e39c5SLiu Hui-R64343 } 34184ad6884SPeter Tyser #endif /* CONFIG_FEC_MXC */ 34284ad6884SPeter Tyser 34384ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 3441e65c2beSHeiko Schocher void mx27_sd1_init_pins(void) 3451e65c2beSHeiko Schocher { 3461e65c2beSHeiko Schocher int i; 3471e65c2beSHeiko Schocher unsigned int mode[] = { 3481e65c2beSHeiko Schocher PE18_PF_SD1_D0, 3491e65c2beSHeiko Schocher PE19_PF_SD1_D1, 3501e65c2beSHeiko Schocher PE20_PF_SD1_D2, 3511e65c2beSHeiko Schocher PE21_PF_SD1_D3, 3521e65c2beSHeiko Schocher PE22_PF_SD1_CMD, 3531e65c2beSHeiko Schocher PE23_PF_SD1_CLK, 3541e65c2beSHeiko Schocher }; 3551e65c2beSHeiko Schocher 3561e65c2beSHeiko Schocher for (i = 0; i < ARRAY_SIZE(mode); i++) 3571e65c2beSHeiko Schocher imx_gpio_mode(mode[i]); 3581e65c2beSHeiko Schocher 3591e65c2beSHeiko Schocher } 3601e65c2beSHeiko Schocher 36184ad6884SPeter Tyser void mx27_sd2_init_pins(void) 36284ad6884SPeter Tyser { 36384ad6884SPeter Tyser int i; 36484ad6884SPeter Tyser unsigned int mode[] = { 36584ad6884SPeter Tyser PB4_PF_SD2_D0, 36684ad6884SPeter Tyser PB5_PF_SD2_D1, 36784ad6884SPeter Tyser PB6_PF_SD2_D2, 36884ad6884SPeter Tyser PB7_PF_SD2_D3, 36984ad6884SPeter Tyser PB8_PF_SD2_CMD, 37084ad6884SPeter Tyser PB9_PF_SD2_CLK, 37184ad6884SPeter Tyser }; 37284ad6884SPeter Tyser 37384ad6884SPeter Tyser for (i = 0; i < ARRAY_SIZE(mode); i++) 37484ad6884SPeter Tyser imx_gpio_mode(mode[i]); 37584ad6884SPeter Tyser 37684ad6884SPeter Tyser } 37784ad6884SPeter Tyser #endif /* CONFIG_MXC_MMC */ 3786247c465Strem 3796247c465Strem #ifndef CONFIG_SYS_DCACHE_OFF 3806247c465Strem void enable_caches(void) 3816247c465Strem { 3826247c465Strem /* Enable D-cache. I-cache is already enabled in start.S */ 3836247c465Strem dcache_enable(); 3846247c465Strem } 3856247c465Strem #endif /* CONFIG_SYS_DCACHE_OFF */ 386