184ad6884SPeter Tyser /* 284ad6884SPeter Tyser * (C) Copyright 2009 DENX Software Engineering 384ad6884SPeter Tyser * Author: John Rigby <jrigby@gmail.com> 484ad6884SPeter Tyser * 584ad6884SPeter Tyser * Based on mx27/generic.c: 684ad6884SPeter Tyser * Copyright (c) 2008 Eric Jarrige <eric.jarrige@armadeus.org> 784ad6884SPeter Tyser * Copyright (c) 2009 Ilya Yanok <yanok@emcraft.com> 884ad6884SPeter Tyser * 984ad6884SPeter Tyser * This program is free software; you can redistribute it and/or 1084ad6884SPeter Tyser * modify it under the terms of the GNU General Public License as 1184ad6884SPeter Tyser * published by the Free Software Foundation; either version 2 of 1284ad6884SPeter Tyser * the License, or (at your option) any later version. 1384ad6884SPeter Tyser * 1484ad6884SPeter Tyser * This program is distributed in the hope that it will be useful, 1584ad6884SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 1684ad6884SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1784ad6884SPeter Tyser * GNU General Public License for more details. 1884ad6884SPeter Tyser * 1984ad6884SPeter Tyser * You should have received a copy of the GNU General Public License 2084ad6884SPeter Tyser * along with this program; if not, write to the Free Software 2184ad6884SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 2284ad6884SPeter Tyser * MA 02111-1307 USA 2384ad6884SPeter Tyser */ 2484ad6884SPeter Tyser 2584ad6884SPeter Tyser #include <common.h> 2684ad6884SPeter Tyser #include <div64.h> 2784ad6884SPeter Tyser #include <netdev.h> 2884ad6884SPeter Tyser #include <asm/io.h> 2984ad6884SPeter Tyser #include <asm/arch/imx-regs.h> 3084ad6884SPeter Tyser #include <asm/arch/imx25-pinmux.h> 3142d25327STimo Ketola #include <asm/arch/clock.h> 3284ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 3384ad6884SPeter Tyser #include <asm/arch/mxcmmc.h> 3484ad6884SPeter Tyser #endif 3584ad6884SPeter Tyser 3642d25327STimo Ketola #ifdef CONFIG_FSL_ESDHC 3742d25327STimo Ketola DECLARE_GLOBAL_DATA_PTR; 3842d25327STimo Ketola #endif 3942d25327STimo Ketola 4084ad6884SPeter Tyser /* 4184ad6884SPeter Tyser * get the system pll clock in Hz 4284ad6884SPeter Tyser * 4384ad6884SPeter Tyser * mfi + mfn / (mfd +1) 4484ad6884SPeter Tyser * f = 2 * f_ref * -------------------- 4584ad6884SPeter Tyser * pd + 1 4684ad6884SPeter Tyser */ 4784ad6884SPeter Tyser static unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref) 4884ad6884SPeter Tyser { 4984ad6884SPeter Tyser unsigned int mfi = (pll >> CCM_PLL_MFI_SHIFT) 5084ad6884SPeter Tyser & CCM_PLL_MFI_MASK; 513c76add2SBenoît Thébaudeau int mfn = (pll >> CCM_PLL_MFN_SHIFT) 5284ad6884SPeter Tyser & CCM_PLL_MFN_MASK; 5384ad6884SPeter Tyser unsigned int mfd = (pll >> CCM_PLL_MFD_SHIFT) 5484ad6884SPeter Tyser & CCM_PLL_MFD_MASK; 5584ad6884SPeter Tyser unsigned int pd = (pll >> CCM_PLL_PD_SHIFT) 5684ad6884SPeter Tyser & CCM_PLL_PD_MASK; 5784ad6884SPeter Tyser 5884ad6884SPeter Tyser mfi = mfi <= 5 ? 5 : mfi; 593c76add2SBenoît Thébaudeau mfn = mfn >= 512 ? mfn - 1024 : mfn; 603c76add2SBenoît Thébaudeau mfd += 1; 613c76add2SBenoît Thébaudeau pd += 1; 6284ad6884SPeter Tyser 633c76add2SBenoît Thébaudeau return lldiv(2 * (u64) f_ref * (mfi * mfd + mfn), 643c76add2SBenoît Thébaudeau mfd * pd); 6584ad6884SPeter Tyser } 6684ad6884SPeter Tyser 6784ad6884SPeter Tyser static ulong imx_get_mpllclk(void) 6884ad6884SPeter Tyser { 6984ad6884SPeter Tyser struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; 701b2080f3SBenoît Thébaudeau ulong fref = MXC_HCLK; 7184ad6884SPeter Tyser 7284ad6884SPeter Tyser return imx_decode_pll(readl(&ccm->mpctl), fref); 7384ad6884SPeter Tyser } 7484ad6884SPeter Tyser 7584ad6884SPeter Tyser ulong imx_get_armclk(void) 7684ad6884SPeter Tyser { 7784ad6884SPeter Tyser struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; 7884ad6884SPeter Tyser ulong cctl = readl(&ccm->cctl); 7984ad6884SPeter Tyser ulong fref = imx_get_mpllclk(); 8084ad6884SPeter Tyser ulong div; 8184ad6884SPeter Tyser 8284ad6884SPeter Tyser if (cctl & CCM_CCTL_ARM_SRC) 83*fac7c817SBenoît Thébaudeau fref = lldiv((u64) fref * 3, 4); 8484ad6884SPeter Tyser 8584ad6884SPeter Tyser div = ((cctl >> CCM_CCTL_ARM_DIV_SHIFT) 8684ad6884SPeter Tyser & CCM_CCTL_ARM_DIV_MASK) + 1; 8784ad6884SPeter Tyser 88*fac7c817SBenoît Thébaudeau return fref / div; 8984ad6884SPeter Tyser } 9084ad6884SPeter Tyser 9184ad6884SPeter Tyser ulong imx_get_ahbclk(void) 9284ad6884SPeter Tyser { 9384ad6884SPeter Tyser struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; 9484ad6884SPeter Tyser ulong cctl = readl(&ccm->cctl); 9584ad6884SPeter Tyser ulong fref = imx_get_armclk(); 9684ad6884SPeter Tyser ulong div; 9784ad6884SPeter Tyser 9884ad6884SPeter Tyser div = ((cctl >> CCM_CCTL_AHB_DIV_SHIFT) 9984ad6884SPeter Tyser & CCM_CCTL_AHB_DIV_MASK) + 1; 10084ad6884SPeter Tyser 101*fac7c817SBenoît Thébaudeau return fref / div; 10284ad6884SPeter Tyser } 10384ad6884SPeter Tyser 10484ad6884SPeter Tyser ulong imx_get_perclk(int clk) 10584ad6884SPeter Tyser { 10684ad6884SPeter Tyser struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; 10784ad6884SPeter Tyser ulong fref = imx_get_ahbclk(); 10884ad6884SPeter Tyser ulong div; 10984ad6884SPeter Tyser 11084ad6884SPeter Tyser div = readl(&ccm->pcdr[CCM_PERCLK_REG(clk)]); 11184ad6884SPeter Tyser div = ((div >> CCM_PERCLK_SHIFT(clk)) & CCM_PERCLK_MASK) + 1; 11284ad6884SPeter Tyser 113*fac7c817SBenoît Thébaudeau return fref / div; 11484ad6884SPeter Tyser } 11584ad6884SPeter Tyser 11642d25327STimo Ketola unsigned int mxc_get_clock(enum mxc_clock clk) 11742d25327STimo Ketola { 11842d25327STimo Ketola if (clk >= MXC_CLK_NUM) 11942d25327STimo Ketola return -1; 12042d25327STimo Ketola switch (clk) { 12142d25327STimo Ketola case MXC_ARM_CLK: 12242d25327STimo Ketola return imx_get_armclk(); 12342d25327STimo Ketola case MXC_FEC_CLK: 12442d25327STimo Ketola return imx_get_ahbclk(); 12542d25327STimo Ketola default: 12642d25327STimo Ketola return imx_get_perclk(clk); 12742d25327STimo Ketola } 12842d25327STimo Ketola } 12942d25327STimo Ketola 130986d0d1bSFabio Estevam u32 get_cpu_rev(void) 131986d0d1bSFabio Estevam { 132986d0d1bSFabio Estevam u32 srev; 133986d0d1bSFabio Estevam u32 system_rev = 0x25000; 134986d0d1bSFabio Estevam 135986d0d1bSFabio Estevam /* read SREV register from IIM module */ 136986d0d1bSFabio Estevam struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE; 137986d0d1bSFabio Estevam srev = readl(&iim->iim_srev); 138986d0d1bSFabio Estevam 139986d0d1bSFabio Estevam switch (srev) { 140986d0d1bSFabio Estevam case 0x00: 141986d0d1bSFabio Estevam system_rev |= CHIP_REV_1_0; 142986d0d1bSFabio Estevam break; 143986d0d1bSFabio Estevam case 0x01: 144986d0d1bSFabio Estevam system_rev |= CHIP_REV_1_1; 145986d0d1bSFabio Estevam break; 1468a57fdc6SEric Benard case 0x02: 1478a57fdc6SEric Benard system_rev |= CHIP_REV_1_2; 1488a57fdc6SEric Benard break; 149986d0d1bSFabio Estevam default: 150986d0d1bSFabio Estevam system_rev |= 0x8000; 151986d0d1bSFabio Estevam break; 152986d0d1bSFabio Estevam } 153986d0d1bSFabio Estevam 154986d0d1bSFabio Estevam return system_rev; 155986d0d1bSFabio Estevam } 156986d0d1bSFabio Estevam 15784ad6884SPeter Tyser #if defined(CONFIG_DISPLAY_CPUINFO) 158e6ec1761SFabio Estevam static char *get_reset_cause(void) 159e6ec1761SFabio Estevam { 160e6ec1761SFabio Estevam /* read RCSR register from CCM module */ 161e6ec1761SFabio Estevam struct ccm_regs *ccm = 162e6ec1761SFabio Estevam (struct ccm_regs *)IMX_CCM_BASE; 163e6ec1761SFabio Estevam 164e6ec1761SFabio Estevam u32 cause = readl(&ccm->rcsr) & 0x0f; 165e6ec1761SFabio Estevam 166e6ec1761SFabio Estevam if (cause == 0) 167e6ec1761SFabio Estevam return "POR"; 168e6ec1761SFabio Estevam else if (cause == 1) 169e6ec1761SFabio Estevam return "RST"; 170e6ec1761SFabio Estevam else if ((cause & 2) == 2) 171e6ec1761SFabio Estevam return "WDOG"; 172e6ec1761SFabio Estevam else if ((cause & 4) == 4) 173e6ec1761SFabio Estevam return "SW RESET"; 174e6ec1761SFabio Estevam else if ((cause & 8) == 8) 175e6ec1761SFabio Estevam return "JTAG"; 176e6ec1761SFabio Estevam else 177e6ec1761SFabio Estevam return "unknown reset"; 178e6ec1761SFabio Estevam 179e6ec1761SFabio Estevam } 180e6ec1761SFabio Estevam 18184ad6884SPeter Tyser int print_cpuinfo(void) 18284ad6884SPeter Tyser { 18384ad6884SPeter Tyser char buf[32]; 184986d0d1bSFabio Estevam u32 cpurev = get_cpu_rev(); 18584ad6884SPeter Tyser 186957dc024SFabio Estevam printf("CPU: Freescale i.MX25 rev%d.%d%s at %s MHz\n", 187986d0d1bSFabio Estevam (cpurev & 0xF0) >> 4, (cpurev & 0x0F), 188986d0d1bSFabio Estevam ((cpurev & 0x8000) ? " unknown" : ""), 18934196b0aSJohn Rigby strmhz(buf, imx_get_armclk())); 190957dc024SFabio Estevam printf("Reset cause: %s\n\n", get_reset_cause()); 19184ad6884SPeter Tyser return 0; 19284ad6884SPeter Tyser } 19384ad6884SPeter Tyser #endif 19484ad6884SPeter Tyser 195e107c7e9SBenoît Thébaudeau void enable_caches(void) 196e107c7e9SBenoît Thébaudeau { 197e107c7e9SBenoît Thébaudeau #ifndef CONFIG_SYS_DCACHE_OFF 198e107c7e9SBenoît Thébaudeau /* Enable D-cache. I-cache is already enabled in start.S */ 199e107c7e9SBenoît Thébaudeau dcache_enable(); 200e107c7e9SBenoît Thébaudeau #endif 201e107c7e9SBenoît Thébaudeau } 202e107c7e9SBenoît Thébaudeau 20384ad6884SPeter Tyser int cpu_eth_init(bd_t *bis) 20484ad6884SPeter Tyser { 20584ad6884SPeter Tyser #if defined(CONFIG_FEC_MXC) 20684ad6884SPeter Tyser struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; 20784ad6884SPeter Tyser ulong val; 20884ad6884SPeter Tyser 20984ad6884SPeter Tyser val = readl(&ccm->cgr0); 21084ad6884SPeter Tyser val |= (1 << 23); 21184ad6884SPeter Tyser writel(val, &ccm->cgr0); 21284ad6884SPeter Tyser return fecmxc_initialize(bis); 21384ad6884SPeter Tyser #else 21484ad6884SPeter Tyser return 0; 21584ad6884SPeter Tyser #endif 21684ad6884SPeter Tyser } 21784ad6884SPeter Tyser 21842d25327STimo Ketola int get_clocks(void) 21942d25327STimo Ketola { 22042d25327STimo Ketola #ifdef CONFIG_FSL_ESDHC 22142d25327STimo Ketola gd->sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK); 22242d25327STimo Ketola #endif 22342d25327STimo Ketola return 0; 22442d25327STimo Ketola } 22542d25327STimo Ketola 22684ad6884SPeter Tyser /* 22784ad6884SPeter Tyser * Initializes on-chip MMC controllers. 22884ad6884SPeter Tyser * to override, implement board_mmc_init() 22984ad6884SPeter Tyser */ 23084ad6884SPeter Tyser int cpu_mmc_init(bd_t *bis) 23184ad6884SPeter Tyser { 23284ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 23384ad6884SPeter Tyser return mxc_mmc_init(bis); 23484ad6884SPeter Tyser #else 23584ad6884SPeter Tyser return 0; 23684ad6884SPeter Tyser #endif 23784ad6884SPeter Tyser } 23884ad6884SPeter Tyser 23984ad6884SPeter Tyser #ifdef CONFIG_MXC_UART 2409aa720b1SFabio Estevam void mx25_uart1_init_pins(void) 24184ad6884SPeter Tyser { 24284ad6884SPeter Tyser struct iomuxc_mux_ctl *muxctl; 24384ad6884SPeter Tyser struct iomuxc_pad_ctl *padctl; 24484ad6884SPeter Tyser u32 inpadctl; 24584ad6884SPeter Tyser u32 outpadctl; 24684ad6884SPeter Tyser u32 muxmode0; 24784ad6884SPeter Tyser 24884ad6884SPeter Tyser muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE; 24984ad6884SPeter Tyser padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE; 25084ad6884SPeter Tyser muxmode0 = MX25_PIN_MUX_MODE(0); 25184ad6884SPeter Tyser /* 25284ad6884SPeter Tyser * set up input pins with hysteresis and 100K pull-ups 25384ad6884SPeter Tyser */ 25484ad6884SPeter Tyser inpadctl = MX25_PIN_PAD_CTL_HYS 25584ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PKE 25684ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PU; 25784ad6884SPeter Tyser 25884ad6884SPeter Tyser /* 25984ad6884SPeter Tyser * set up output pins with 100K pull-downs 26084ad6884SPeter Tyser * FIXME: need to revisit this 26184ad6884SPeter Tyser * PUE is ignored if PKE is not set 26284ad6884SPeter Tyser * so the right value here is likely 26384ad6884SPeter Tyser * 0x0 for no pull up/down 26484ad6884SPeter Tyser * or 26584ad6884SPeter Tyser * 0xc0 for 100k pull down 26684ad6884SPeter Tyser */ 26784ad6884SPeter Tyser outpadctl = MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD; 26884ad6884SPeter Tyser 26984ad6884SPeter Tyser /* UART1 */ 27084ad6884SPeter Tyser /* rxd */ 27184ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_rxd); 27284ad6884SPeter Tyser writel(inpadctl, &padctl->pad_uart1_rxd); 27384ad6884SPeter Tyser 27484ad6884SPeter Tyser /* txd */ 27584ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_txd); 27684ad6884SPeter Tyser writel(outpadctl, &padctl->pad_uart1_txd); 27784ad6884SPeter Tyser 27884ad6884SPeter Tyser /* rts */ 27984ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_rts); 28084ad6884SPeter Tyser writel(outpadctl, &padctl->pad_uart1_rts); 28184ad6884SPeter Tyser 28284ad6884SPeter Tyser /* cts */ 28384ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_cts); 28484ad6884SPeter Tyser writel(inpadctl, &padctl->pad_uart1_cts); 28584ad6884SPeter Tyser } 28684ad6884SPeter Tyser #endif /* CONFIG_MXC_UART */ 28784ad6884SPeter Tyser 28884ad6884SPeter Tyser #ifdef CONFIG_FEC_MXC 28984ad6884SPeter Tyser void mx25_fec_init_pins(void) 29084ad6884SPeter Tyser { 29184ad6884SPeter Tyser struct iomuxc_mux_ctl *muxctl; 29284ad6884SPeter Tyser struct iomuxc_pad_ctl *padctl; 29384ad6884SPeter Tyser u32 inpadctl_100kpd; 29484ad6884SPeter Tyser u32 inpadctl_22kpu; 29584ad6884SPeter Tyser u32 outpadctl; 29684ad6884SPeter Tyser u32 muxmode0; 29784ad6884SPeter Tyser 29884ad6884SPeter Tyser muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE; 29984ad6884SPeter Tyser padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE; 30084ad6884SPeter Tyser muxmode0 = MX25_PIN_MUX_MODE(0); 30184ad6884SPeter Tyser inpadctl_100kpd = MX25_PIN_PAD_CTL_HYS 30284ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PKE 30384ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD; 30484ad6884SPeter Tyser inpadctl_22kpu = MX25_PIN_PAD_CTL_HYS 30584ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PKE 30684ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_22K_PU; 30784ad6884SPeter Tyser /* 30884ad6884SPeter Tyser * set up output pins with 100K pull-downs 30984ad6884SPeter Tyser * FIXME: need to revisit this 31084ad6884SPeter Tyser * PUE is ignored if PKE is not set 31184ad6884SPeter Tyser * so the right value here is likely 31284ad6884SPeter Tyser * 0x0 for no pull 31384ad6884SPeter Tyser * or 31484ad6884SPeter Tyser * 0xc0 for 100k pull down 31584ad6884SPeter Tyser */ 31684ad6884SPeter Tyser outpadctl = MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD; 31784ad6884SPeter Tyser 31884ad6884SPeter Tyser /* FEC_TX_CLK */ 31984ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tx_clk); 32084ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_tx_clk); 32184ad6884SPeter Tyser 32284ad6884SPeter Tyser /* FEC_RX_DV */ 32384ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_rx_dv); 32484ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_rx_dv); 32584ad6884SPeter Tyser 32684ad6884SPeter Tyser /* FEC_RDATA0 */ 32784ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_rdata0); 32884ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_rdata0); 32984ad6884SPeter Tyser 33084ad6884SPeter Tyser /* FEC_TDATA0 */ 33184ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tdata0); 33284ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_tdata0); 33384ad6884SPeter Tyser 33484ad6884SPeter Tyser /* FEC_TX_EN */ 33584ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tx_en); 33684ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_tx_en); 33784ad6884SPeter Tyser 33884ad6884SPeter Tyser /* FEC_MDC */ 33984ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_mdc); 34084ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_mdc); 34184ad6884SPeter Tyser 34284ad6884SPeter Tyser /* FEC_MDIO */ 34384ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_mdio); 34484ad6884SPeter Tyser writel(inpadctl_22kpu, &padctl->pad_fec_mdio); 34584ad6884SPeter Tyser 34684ad6884SPeter Tyser /* FEC_RDATA1 */ 34784ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_rdata1); 34884ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_rdata1); 34984ad6884SPeter Tyser 35084ad6884SPeter Tyser /* FEC_TDATA1 */ 35184ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tdata1); 35284ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_tdata1); 35384ad6884SPeter Tyser 35484ad6884SPeter Tyser } 355565e39c5SLiu Hui-R64343 356be252b65SFabio Estevam void imx_get_mac_from_fuse(int dev_id, unsigned char *mac) 357565e39c5SLiu Hui-R64343 { 358565e39c5SLiu Hui-R64343 int i; 359565e39c5SLiu Hui-R64343 struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE; 360565e39c5SLiu Hui-R64343 struct fuse_bank *bank = &iim->bank[0]; 361565e39c5SLiu Hui-R64343 struct fuse_bank0_regs *fuse = 362565e39c5SLiu Hui-R64343 (struct fuse_bank0_regs *)bank->fuse_regs; 363565e39c5SLiu Hui-R64343 364565e39c5SLiu Hui-R64343 for (i = 0; i < 6; i++) 365565e39c5SLiu Hui-R64343 mac[i] = readl(&fuse->mac_addr[i]) & 0xff; 366565e39c5SLiu Hui-R64343 } 36784ad6884SPeter Tyser #endif /* CONFIG_FEC_MXC */ 368