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 * 584ad6884SPeter Tyser * This program is free software; you can redistribute it and/or 684ad6884SPeter Tyser * modify it under the terms of the GNU General Public License as 784ad6884SPeter Tyser * published by the Free Software Foundation; either version 2 of 884ad6884SPeter Tyser * the License, or (at your option) any later version. 984ad6884SPeter Tyser * 1084ad6884SPeter Tyser * This program is distributed in the hope that it will be useful, 1184ad6884SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 1284ad6884SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1384ad6884SPeter Tyser * GNU General Public License for more details. 1484ad6884SPeter Tyser * 1584ad6884SPeter Tyser * You should have received a copy of the GNU General Public License 1684ad6884SPeter Tyser * along with this program; if not, write to the Free Software 1784ad6884SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 1884ad6884SPeter Tyser * MA 02111-1307 USA 1984ad6884SPeter Tyser */ 2084ad6884SPeter Tyser 2184ad6884SPeter Tyser #include <common.h> 2284ad6884SPeter Tyser #include <div64.h> 2384ad6884SPeter Tyser #include <netdev.h> 2484ad6884SPeter Tyser #include <asm/io.h> 2584ad6884SPeter Tyser #include <asm/arch/imx-regs.h> 26fa47a286SHelmut Raiger #include <asm/arch/clock.h> 27*e71c39deStrem #include <asm/arch/gpio.h> 2884ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 2984ad6884SPeter Tyser #include <asm/arch/mxcmmc.h> 3084ad6884SPeter Tyser #endif 3184ad6884SPeter Tyser 3284ad6884SPeter Tyser /* 3384ad6884SPeter Tyser * get the system pll clock in Hz 3484ad6884SPeter Tyser * 3584ad6884SPeter Tyser * mfi + mfn / (mfd +1) 3684ad6884SPeter Tyser * f = 2 * f_ref * -------------------- 3784ad6884SPeter Tyser * pd + 1 3884ad6884SPeter Tyser */ 39fa47a286SHelmut Raiger static unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref) 4084ad6884SPeter Tyser { 4184ad6884SPeter Tyser unsigned int mfi = (pll >> 10) & 0xf; 4284ad6884SPeter Tyser unsigned int mfn = pll & 0x3ff; 4384ad6884SPeter Tyser unsigned int mfd = (pll >> 16) & 0x3ff; 4484ad6884SPeter Tyser unsigned int pd = (pll >> 26) & 0xf; 4584ad6884SPeter Tyser 4684ad6884SPeter Tyser mfi = mfi <= 5 ? 5 : mfi; 4784ad6884SPeter Tyser 4884ad6884SPeter Tyser return lldiv(2 * (u64)f_ref * (mfi * (mfd + 1) + mfn), 4984ad6884SPeter Tyser (mfd + 1) * (pd + 1)); 5084ad6884SPeter Tyser } 5184ad6884SPeter Tyser 5284ad6884SPeter Tyser static ulong clk_in_32k(void) 5384ad6884SPeter Tyser { 5484ad6884SPeter Tyser return 1024 * CONFIG_MX27_CLK32; 5584ad6884SPeter Tyser } 5684ad6884SPeter Tyser 5784ad6884SPeter Tyser static ulong clk_in_26m(void) 5884ad6884SPeter Tyser { 5984ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 6084ad6884SPeter Tyser 6184ad6884SPeter Tyser if (readl(&pll->cscr) & CSCR_OSC26M_DIV1P5) { 6284ad6884SPeter Tyser /* divide by 1.5 */ 6384ad6884SPeter Tyser return 26000000 * 2 / 3; 6484ad6884SPeter Tyser } else { 6584ad6884SPeter Tyser return 26000000; 6684ad6884SPeter Tyser } 6784ad6884SPeter Tyser } 6884ad6884SPeter Tyser 69fa47a286SHelmut Raiger static ulong imx_get_mpllclk(void) 7084ad6884SPeter Tyser { 7184ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 7284ad6884SPeter Tyser ulong cscr = readl(&pll->cscr); 7384ad6884SPeter Tyser ulong fref; 7484ad6884SPeter Tyser 7584ad6884SPeter Tyser if (cscr & CSCR_MCU_SEL) 7684ad6884SPeter Tyser fref = clk_in_26m(); 7784ad6884SPeter Tyser else 7884ad6884SPeter Tyser fref = clk_in_32k(); 7984ad6884SPeter Tyser 8084ad6884SPeter Tyser return imx_decode_pll(readl(&pll->mpctl0), fref); 8184ad6884SPeter Tyser } 8284ad6884SPeter Tyser 83fa47a286SHelmut Raiger static ulong imx_get_armclk(void) 8484ad6884SPeter Tyser { 8584ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 8684ad6884SPeter Tyser ulong cscr = readl(&pll->cscr); 8784ad6884SPeter Tyser ulong fref = imx_get_mpllclk(); 8884ad6884SPeter Tyser ulong div; 8984ad6884SPeter Tyser 9084ad6884SPeter Tyser if (!(cscr & CSCR_ARM_SRC_MPLL)) 9184ad6884SPeter Tyser fref = lldiv((fref * 2), 3); 9284ad6884SPeter Tyser 9384ad6884SPeter Tyser div = ((cscr >> 12) & 0x3) + 1; 9484ad6884SPeter Tyser 9584ad6884SPeter Tyser return lldiv(fref, div); 9684ad6884SPeter Tyser } 9784ad6884SPeter Tyser 98fa47a286SHelmut Raiger static ulong imx_get_ahbclk(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 = imx_get_mpllclk(); 10384ad6884SPeter Tyser ulong div; 10484ad6884SPeter Tyser 10584ad6884SPeter Tyser div = ((cscr >> 8) & 0x3) + 1; 10684ad6884SPeter Tyser 10784ad6884SPeter Tyser return lldiv(fref * 2, 3 * div); 10884ad6884SPeter Tyser } 10984ad6884SPeter Tyser 110fa47a286SHelmut Raiger static __attribute__((unused)) ulong imx_get_spllclk(void) 11184ad6884SPeter Tyser { 11284ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 11384ad6884SPeter Tyser ulong cscr = readl(&pll->cscr); 11484ad6884SPeter Tyser ulong fref; 11584ad6884SPeter Tyser 11684ad6884SPeter Tyser if (cscr & CSCR_SP_SEL) 11784ad6884SPeter Tyser fref = clk_in_26m(); 11884ad6884SPeter Tyser else 11984ad6884SPeter Tyser fref = clk_in_32k(); 12084ad6884SPeter Tyser 12184ad6884SPeter Tyser return imx_decode_pll(readl(&pll->spctl0), fref); 12284ad6884SPeter Tyser } 12384ad6884SPeter Tyser 12484ad6884SPeter Tyser static ulong imx_decode_perclk(ulong div) 12584ad6884SPeter Tyser { 12684ad6884SPeter Tyser return lldiv((imx_get_mpllclk() * 2), (div * 3)); 12784ad6884SPeter Tyser } 12884ad6884SPeter Tyser 129fa47a286SHelmut Raiger static ulong imx_get_perclk1(void) 13084ad6884SPeter Tyser { 13184ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 13284ad6884SPeter Tyser 13384ad6884SPeter Tyser return imx_decode_perclk((readl(&pll->pcdr1) & 0x3f) + 1); 13484ad6884SPeter Tyser } 13584ad6884SPeter Tyser 136fa47a286SHelmut Raiger static ulong imx_get_perclk2(void) 13784ad6884SPeter Tyser { 13884ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 13984ad6884SPeter Tyser 14084ad6884SPeter Tyser return imx_decode_perclk(((readl(&pll->pcdr1) >> 8) & 0x3f) + 1); 14184ad6884SPeter Tyser } 14284ad6884SPeter Tyser 143fa47a286SHelmut Raiger static __attribute__((unused)) ulong imx_get_perclk3(void) 14484ad6884SPeter Tyser { 14584ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 14684ad6884SPeter Tyser 14784ad6884SPeter Tyser return imx_decode_perclk(((readl(&pll->pcdr1) >> 16) & 0x3f) + 1); 14884ad6884SPeter Tyser } 14984ad6884SPeter Tyser 150fa47a286SHelmut Raiger static __attribute__((unused)) ulong imx_get_perclk4(void) 15184ad6884SPeter Tyser { 15284ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 15384ad6884SPeter Tyser 15484ad6884SPeter Tyser return imx_decode_perclk(((readl(&pll->pcdr1) >> 24) & 0x3f) + 1); 15584ad6884SPeter Tyser } 15684ad6884SPeter Tyser 157fa47a286SHelmut Raiger unsigned int mxc_get_clock(enum mxc_clock clk) 158fa47a286SHelmut Raiger { 159fa47a286SHelmut Raiger switch (clk) { 160fa47a286SHelmut Raiger case MXC_ARM_CLK: 161fa47a286SHelmut Raiger return imx_get_armclk(); 162fa47a286SHelmut Raiger case MXC_UART_CLK: 163fa47a286SHelmut Raiger return imx_get_perclk1(); 164fa47a286SHelmut Raiger case MXC_FEC_CLK: 165fa47a286SHelmut Raiger return imx_get_ahbclk(); 166fa47a286SHelmut Raiger case MXC_ESDHC_CLK: 167fa47a286SHelmut Raiger return imx_get_perclk2(); 168fa47a286SHelmut Raiger } 169fa47a286SHelmut Raiger return -1; 170fa47a286SHelmut Raiger } 171fa47a286SHelmut Raiger 172fa47a286SHelmut Raiger 17384ad6884SPeter Tyser #if defined(CONFIG_DISPLAY_CPUINFO) 17484ad6884SPeter Tyser int print_cpuinfo (void) 17584ad6884SPeter Tyser { 17684ad6884SPeter Tyser char buf[32]; 17784ad6884SPeter Tyser 17884ad6884SPeter Tyser printf("CPU: Freescale i.MX27 at %s MHz\n\n", 17984ad6884SPeter Tyser strmhz(buf, imx_get_mpllclk())); 18084ad6884SPeter Tyser return 0; 18184ad6884SPeter Tyser } 18284ad6884SPeter Tyser #endif 18384ad6884SPeter Tyser 18484ad6884SPeter Tyser int cpu_eth_init(bd_t *bis) 18584ad6884SPeter Tyser { 18684ad6884SPeter Tyser #if defined(CONFIG_FEC_MXC) 18784ad6884SPeter Tyser struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE; 18884ad6884SPeter Tyser 18984ad6884SPeter Tyser /* enable FEC clock */ 19084ad6884SPeter Tyser writel(readl(&pll->pccr1) | PCCR1_HCLK_FEC, &pll->pccr1); 19184ad6884SPeter Tyser writel(readl(&pll->pccr0) | PCCR0_FEC_EN, &pll->pccr0); 19284ad6884SPeter Tyser return fecmxc_initialize(bis); 19384ad6884SPeter Tyser #else 19484ad6884SPeter Tyser return 0; 19584ad6884SPeter Tyser #endif 19684ad6884SPeter Tyser } 19784ad6884SPeter Tyser 19884ad6884SPeter Tyser /* 19984ad6884SPeter Tyser * Initializes on-chip MMC controllers. 20084ad6884SPeter Tyser * to override, implement board_mmc_init() 20184ad6884SPeter Tyser */ 20284ad6884SPeter Tyser int cpu_mmc_init(bd_t *bis) 20384ad6884SPeter Tyser { 20484ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 20584ad6884SPeter Tyser return mxc_mmc_init(bis); 20684ad6884SPeter Tyser #else 20784ad6884SPeter Tyser return 0; 20884ad6884SPeter Tyser #endif 20984ad6884SPeter Tyser } 21084ad6884SPeter Tyser 21184ad6884SPeter Tyser void imx_gpio_mode(int gpio_mode) 21284ad6884SPeter Tyser { 213*e71c39deStrem struct gpio_port_regs *regs = (struct gpio_port_regs *)IMX_GPIO_BASE; 21484ad6884SPeter Tyser unsigned int pin = gpio_mode & GPIO_PIN_MASK; 21584ad6884SPeter Tyser unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; 21684ad6884SPeter Tyser unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> GPIO_OCR_SHIFT; 21784ad6884SPeter Tyser unsigned int aout = (gpio_mode & GPIO_AOUT_MASK) >> GPIO_AOUT_SHIFT; 21884ad6884SPeter Tyser unsigned int bout = (gpio_mode & GPIO_BOUT_MASK) >> GPIO_BOUT_SHIFT; 21984ad6884SPeter Tyser unsigned int tmp; 22084ad6884SPeter Tyser 22184ad6884SPeter Tyser /* Pullup enable */ 22284ad6884SPeter Tyser if (gpio_mode & GPIO_PUEN) { 22384ad6884SPeter Tyser writel(readl(®s->port[port].puen) | (1 << pin), 22484ad6884SPeter Tyser ®s->port[port].puen); 22584ad6884SPeter Tyser } else { 22684ad6884SPeter Tyser writel(readl(®s->port[port].puen) & ~(1 << pin), 22784ad6884SPeter Tyser ®s->port[port].puen); 22884ad6884SPeter Tyser } 22984ad6884SPeter Tyser 23084ad6884SPeter Tyser /* Data direction */ 23184ad6884SPeter Tyser if (gpio_mode & GPIO_OUT) { 232*e71c39deStrem writel(readl(®s->port[port].gpio_dir) | 1 << pin, 233*e71c39deStrem ®s->port[port].gpio_dir); 23484ad6884SPeter Tyser } else { 235*e71c39deStrem writel(readl(®s->port[port].gpio_dir) & ~(1 << pin), 236*e71c39deStrem ®s->port[port].gpio_dir); 23784ad6884SPeter Tyser } 23884ad6884SPeter Tyser 23984ad6884SPeter Tyser /* Primary / alternate function */ 24084ad6884SPeter Tyser if (gpio_mode & GPIO_AF) { 24184ad6884SPeter Tyser writel(readl(®s->port[port].gpr) | (1 << pin), 24284ad6884SPeter Tyser ®s->port[port].gpr); 24384ad6884SPeter Tyser } else { 24484ad6884SPeter Tyser writel(readl(®s->port[port].gpr) & ~(1 << pin), 24584ad6884SPeter Tyser ®s->port[port].gpr); 24684ad6884SPeter Tyser } 24784ad6884SPeter Tyser 24884ad6884SPeter Tyser /* use as gpio? */ 24984ad6884SPeter Tyser if (!(gpio_mode & (GPIO_PF | GPIO_AF))) { 25084ad6884SPeter Tyser writel(readl(®s->port[port].gius) | (1 << pin), 25184ad6884SPeter Tyser ®s->port[port].gius); 25284ad6884SPeter Tyser } else { 25384ad6884SPeter Tyser writel(readl(®s->port[port].gius) & ~(1 << pin), 25484ad6884SPeter Tyser ®s->port[port].gius); 25584ad6884SPeter Tyser } 25684ad6884SPeter Tyser 25784ad6884SPeter Tyser /* Output / input configuration */ 25884ad6884SPeter Tyser if (pin < 16) { 25984ad6884SPeter Tyser tmp = readl(®s->port[port].ocr1); 26084ad6884SPeter Tyser tmp &= ~(3 << (pin * 2)); 26184ad6884SPeter Tyser tmp |= (ocr << (pin * 2)); 26284ad6884SPeter Tyser writel(tmp, ®s->port[port].ocr1); 26384ad6884SPeter Tyser 26484ad6884SPeter Tyser writel(readl(®s->port[port].iconfa1) & ~(3 << (pin * 2)), 26584ad6884SPeter Tyser ®s->port[port].iconfa1); 26684ad6884SPeter Tyser writel(readl(®s->port[port].iconfa1) | aout << (pin * 2), 26784ad6884SPeter Tyser ®s->port[port].iconfa1); 26884ad6884SPeter Tyser writel(readl(®s->port[port].iconfb1) & ~(3 << (pin * 2)), 26984ad6884SPeter Tyser ®s->port[port].iconfb1); 27084ad6884SPeter Tyser writel(readl(®s->port[port].iconfb1) | bout << (pin * 2), 27184ad6884SPeter Tyser ®s->port[port].iconfb1); 27284ad6884SPeter Tyser } else { 27384ad6884SPeter Tyser pin -= 16; 27484ad6884SPeter Tyser 27584ad6884SPeter Tyser tmp = readl(®s->port[port].ocr2); 27684ad6884SPeter Tyser tmp &= ~(3 << (pin * 2)); 27784ad6884SPeter Tyser tmp |= (ocr << (pin * 2)); 27884ad6884SPeter Tyser writel(tmp, ®s->port[port].ocr2); 27984ad6884SPeter Tyser 28084ad6884SPeter Tyser writel(readl(®s->port[port].iconfa2) & ~(3 << (pin * 2)), 28184ad6884SPeter Tyser ®s->port[port].iconfa2); 28284ad6884SPeter Tyser writel(readl(®s->port[port].iconfa2) | aout << (pin * 2), 28384ad6884SPeter Tyser ®s->port[port].iconfa2); 28484ad6884SPeter Tyser writel(readl(®s->port[port].iconfb2) & ~(3 << (pin * 2)), 28584ad6884SPeter Tyser ®s->port[port].iconfb2); 28684ad6884SPeter Tyser writel(readl(®s->port[port].iconfb2) | bout << (pin * 2), 28784ad6884SPeter Tyser ®s->port[port].iconfb2); 28884ad6884SPeter Tyser } 28984ad6884SPeter Tyser } 29084ad6884SPeter Tyser 29184ad6884SPeter Tyser #ifdef CONFIG_MXC_UART 2923f7bfbddSFabio Estevam void mx27_uart1_init_pins(void) 29384ad6884SPeter Tyser { 29484ad6884SPeter Tyser int i; 29584ad6884SPeter Tyser unsigned int mode[] = { 29684ad6884SPeter Tyser PE12_PF_UART1_TXD, 29784ad6884SPeter Tyser PE13_PF_UART1_RXD, 29884ad6884SPeter Tyser }; 29984ad6884SPeter Tyser 30084ad6884SPeter Tyser for (i = 0; i < ARRAY_SIZE(mode); i++) 30184ad6884SPeter Tyser imx_gpio_mode(mode[i]); 30284ad6884SPeter Tyser 30384ad6884SPeter Tyser } 30484ad6884SPeter Tyser #endif /* CONFIG_MXC_UART */ 30584ad6884SPeter Tyser 30684ad6884SPeter Tyser #ifdef CONFIG_FEC_MXC 30784ad6884SPeter Tyser void mx27_fec_init_pins(void) 30884ad6884SPeter Tyser { 30984ad6884SPeter Tyser int i; 31084ad6884SPeter Tyser unsigned int mode[] = { 31184ad6884SPeter Tyser PD0_AIN_FEC_TXD0, 31284ad6884SPeter Tyser PD1_AIN_FEC_TXD1, 31384ad6884SPeter Tyser PD2_AIN_FEC_TXD2, 31484ad6884SPeter Tyser PD3_AIN_FEC_TXD3, 31584ad6884SPeter Tyser PD4_AOUT_FEC_RX_ER, 31684ad6884SPeter Tyser PD5_AOUT_FEC_RXD1, 31784ad6884SPeter Tyser PD6_AOUT_FEC_RXD2, 31884ad6884SPeter Tyser PD7_AOUT_FEC_RXD3, 31984ad6884SPeter Tyser PD8_AF_FEC_MDIO, 32084ad6884SPeter Tyser PD9_AIN_FEC_MDC | GPIO_PUEN, 32184ad6884SPeter Tyser PD10_AOUT_FEC_CRS, 32284ad6884SPeter Tyser PD11_AOUT_FEC_TX_CLK, 32384ad6884SPeter Tyser PD12_AOUT_FEC_RXD0, 32484ad6884SPeter Tyser PD13_AOUT_FEC_RX_DV, 32584ad6884SPeter Tyser PD14_AOUT_FEC_CLR, 32684ad6884SPeter Tyser PD15_AOUT_FEC_COL, 32784ad6884SPeter Tyser PD16_AIN_FEC_TX_ER, 32884ad6884SPeter Tyser PF23_AIN_FEC_TX_EN, 32984ad6884SPeter Tyser }; 33084ad6884SPeter Tyser 33184ad6884SPeter Tyser for (i = 0; i < ARRAY_SIZE(mode); i++) 33284ad6884SPeter Tyser imx_gpio_mode(mode[i]); 33384ad6884SPeter Tyser } 334565e39c5SLiu Hui-R64343 335be252b65SFabio Estevam void imx_get_mac_from_fuse(int dev_id, unsigned char *mac) 336565e39c5SLiu Hui-R64343 { 337565e39c5SLiu Hui-R64343 int i; 338565e39c5SLiu Hui-R64343 struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE; 339565e39c5SLiu Hui-R64343 struct fuse_bank *bank = &iim->bank[0]; 340565e39c5SLiu Hui-R64343 struct fuse_bank0_regs *fuse = 341565e39c5SLiu Hui-R64343 (struct fuse_bank0_regs *)bank->fuse_regs; 342565e39c5SLiu Hui-R64343 343565e39c5SLiu Hui-R64343 for (i = 0; i < 6; i++) 344565e39c5SLiu Hui-R64343 mac[6 - 1 - i] = readl(&fuse->mac_addr[i]) & 0xff; 345565e39c5SLiu Hui-R64343 } 34684ad6884SPeter Tyser #endif /* CONFIG_FEC_MXC */ 34784ad6884SPeter Tyser 34884ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 3491e65c2beSHeiko Schocher void mx27_sd1_init_pins(void) 3501e65c2beSHeiko Schocher { 3511e65c2beSHeiko Schocher int i; 3521e65c2beSHeiko Schocher unsigned int mode[] = { 3531e65c2beSHeiko Schocher PE18_PF_SD1_D0, 3541e65c2beSHeiko Schocher PE19_PF_SD1_D1, 3551e65c2beSHeiko Schocher PE20_PF_SD1_D2, 3561e65c2beSHeiko Schocher PE21_PF_SD1_D3, 3571e65c2beSHeiko Schocher PE22_PF_SD1_CMD, 3581e65c2beSHeiko Schocher PE23_PF_SD1_CLK, 3591e65c2beSHeiko Schocher }; 3601e65c2beSHeiko Schocher 3611e65c2beSHeiko Schocher for (i = 0; i < ARRAY_SIZE(mode); i++) 3621e65c2beSHeiko Schocher imx_gpio_mode(mode[i]); 3631e65c2beSHeiko Schocher 3641e65c2beSHeiko Schocher } 3651e65c2beSHeiko Schocher 36684ad6884SPeter Tyser void mx27_sd2_init_pins(void) 36784ad6884SPeter Tyser { 36884ad6884SPeter Tyser int i; 36984ad6884SPeter Tyser unsigned int mode[] = { 37084ad6884SPeter Tyser PB4_PF_SD2_D0, 37184ad6884SPeter Tyser PB5_PF_SD2_D1, 37284ad6884SPeter Tyser PB6_PF_SD2_D2, 37384ad6884SPeter Tyser PB7_PF_SD2_D3, 37484ad6884SPeter Tyser PB8_PF_SD2_CMD, 37584ad6884SPeter Tyser PB9_PF_SD2_CLK, 37684ad6884SPeter Tyser }; 37784ad6884SPeter Tyser 37884ad6884SPeter Tyser for (i = 0; i < ARRAY_SIZE(mode); i++) 37984ad6884SPeter Tyser imx_gpio_mode(mode[i]); 38084ad6884SPeter Tyser 38184ad6884SPeter Tyser } 38284ad6884SPeter Tyser #endif /* CONFIG_MXC_MMC */ 383