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) 83fac7c817SBenoî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 88fac7c817SBenoî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 101fac7c817SBenoît Thébaudeau return fref / div; 10284ad6884SPeter Tyser } 10384ad6884SPeter Tyser 104c3b51890SBenoît Thébaudeau static ulong imx_get_ipgclk(void) 105c3b51890SBenoît Thébaudeau { 106c3b51890SBenoît Thébaudeau return imx_get_ahbclk() / 2; 107c3b51890SBenoît Thébaudeau } 108c3b51890SBenoît Thébaudeau 10984ad6884SPeter Tyser ulong imx_get_perclk(int clk) 11084ad6884SPeter Tyser { 11184ad6884SPeter Tyser struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; 11284ad6884SPeter Tyser ulong fref = imx_get_ahbclk(); 11384ad6884SPeter Tyser ulong div; 11484ad6884SPeter Tyser 11584ad6884SPeter Tyser div = readl(&ccm->pcdr[CCM_PERCLK_REG(clk)]); 11684ad6884SPeter Tyser div = ((div >> CCM_PERCLK_SHIFT(clk)) & CCM_PERCLK_MASK) + 1; 11784ad6884SPeter Tyser 118fac7c817SBenoît Thébaudeau return fref / div; 11984ad6884SPeter Tyser } 12084ad6884SPeter Tyser 12142d25327STimo Ketola unsigned int mxc_get_clock(enum mxc_clock clk) 12242d25327STimo Ketola { 12342d25327STimo Ketola if (clk >= MXC_CLK_NUM) 12442d25327STimo Ketola return -1; 12542d25327STimo Ketola switch (clk) { 12642d25327STimo Ketola case MXC_ARM_CLK: 12742d25327STimo Ketola return imx_get_armclk(); 128c3b51890SBenoît Thébaudeau case MXC_AHB_CLK: 129c3b51890SBenoît Thébaudeau return imx_get_ahbclk(); 130c3b51890SBenoît Thébaudeau case MXC_IPG_CLK: 131c3b51890SBenoît Thébaudeau case MXC_CSPI_CLK: 13242d25327STimo Ketola case MXC_FEC_CLK: 133*17c7cf71SBenoît Thébaudeau return imx_get_ipgclk(); 13442d25327STimo Ketola default: 13542d25327STimo Ketola return imx_get_perclk(clk); 13642d25327STimo Ketola } 13742d25327STimo Ketola } 13842d25327STimo Ketola 139986d0d1bSFabio Estevam u32 get_cpu_rev(void) 140986d0d1bSFabio Estevam { 141986d0d1bSFabio Estevam u32 srev; 142986d0d1bSFabio Estevam u32 system_rev = 0x25000; 143986d0d1bSFabio Estevam 144986d0d1bSFabio Estevam /* read SREV register from IIM module */ 145986d0d1bSFabio Estevam struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE; 146986d0d1bSFabio Estevam srev = readl(&iim->iim_srev); 147986d0d1bSFabio Estevam 148986d0d1bSFabio Estevam switch (srev) { 149986d0d1bSFabio Estevam case 0x00: 150986d0d1bSFabio Estevam system_rev |= CHIP_REV_1_0; 151986d0d1bSFabio Estevam break; 152986d0d1bSFabio Estevam case 0x01: 153986d0d1bSFabio Estevam system_rev |= CHIP_REV_1_1; 154986d0d1bSFabio Estevam break; 1558a57fdc6SEric Benard case 0x02: 1568a57fdc6SEric Benard system_rev |= CHIP_REV_1_2; 1578a57fdc6SEric Benard break; 158986d0d1bSFabio Estevam default: 159986d0d1bSFabio Estevam system_rev |= 0x8000; 160986d0d1bSFabio Estevam break; 161986d0d1bSFabio Estevam } 162986d0d1bSFabio Estevam 163986d0d1bSFabio Estevam return system_rev; 164986d0d1bSFabio Estevam } 165986d0d1bSFabio Estevam 16684ad6884SPeter Tyser #if defined(CONFIG_DISPLAY_CPUINFO) 167e6ec1761SFabio Estevam static char *get_reset_cause(void) 168e6ec1761SFabio Estevam { 169e6ec1761SFabio Estevam /* read RCSR register from CCM module */ 170e6ec1761SFabio Estevam struct ccm_regs *ccm = 171e6ec1761SFabio Estevam (struct ccm_regs *)IMX_CCM_BASE; 172e6ec1761SFabio Estevam 173e6ec1761SFabio Estevam u32 cause = readl(&ccm->rcsr) & 0x0f; 174e6ec1761SFabio Estevam 175e6ec1761SFabio Estevam if (cause == 0) 176e6ec1761SFabio Estevam return "POR"; 177e6ec1761SFabio Estevam else if (cause == 1) 178e6ec1761SFabio Estevam return "RST"; 179e6ec1761SFabio Estevam else if ((cause & 2) == 2) 180e6ec1761SFabio Estevam return "WDOG"; 181e6ec1761SFabio Estevam else if ((cause & 4) == 4) 182e6ec1761SFabio Estevam return "SW RESET"; 183e6ec1761SFabio Estevam else if ((cause & 8) == 8) 184e6ec1761SFabio Estevam return "JTAG"; 185e6ec1761SFabio Estevam else 186e6ec1761SFabio Estevam return "unknown reset"; 187e6ec1761SFabio Estevam 188e6ec1761SFabio Estevam } 189e6ec1761SFabio Estevam 19084ad6884SPeter Tyser int print_cpuinfo(void) 19184ad6884SPeter Tyser { 19284ad6884SPeter Tyser char buf[32]; 193986d0d1bSFabio Estevam u32 cpurev = get_cpu_rev(); 19484ad6884SPeter Tyser 195957dc024SFabio Estevam printf("CPU: Freescale i.MX25 rev%d.%d%s at %s MHz\n", 196986d0d1bSFabio Estevam (cpurev & 0xF0) >> 4, (cpurev & 0x0F), 197986d0d1bSFabio Estevam ((cpurev & 0x8000) ? " unknown" : ""), 19834196b0aSJohn Rigby strmhz(buf, imx_get_armclk())); 199957dc024SFabio Estevam printf("Reset cause: %s\n\n", get_reset_cause()); 20084ad6884SPeter Tyser return 0; 20184ad6884SPeter Tyser } 20284ad6884SPeter Tyser #endif 20384ad6884SPeter Tyser 204e107c7e9SBenoît Thébaudeau void enable_caches(void) 205e107c7e9SBenoît Thébaudeau { 206e107c7e9SBenoît Thébaudeau #ifndef CONFIG_SYS_DCACHE_OFF 207e107c7e9SBenoît Thébaudeau /* Enable D-cache. I-cache is already enabled in start.S */ 208e107c7e9SBenoît Thébaudeau dcache_enable(); 209e107c7e9SBenoît Thébaudeau #endif 210e107c7e9SBenoît Thébaudeau } 211e107c7e9SBenoît Thébaudeau 21284ad6884SPeter Tyser int cpu_eth_init(bd_t *bis) 21384ad6884SPeter Tyser { 21484ad6884SPeter Tyser #if defined(CONFIG_FEC_MXC) 21584ad6884SPeter Tyser struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; 21684ad6884SPeter Tyser ulong val; 21784ad6884SPeter Tyser 21884ad6884SPeter Tyser val = readl(&ccm->cgr0); 21984ad6884SPeter Tyser val |= (1 << 23); 22084ad6884SPeter Tyser writel(val, &ccm->cgr0); 22184ad6884SPeter Tyser return fecmxc_initialize(bis); 22284ad6884SPeter Tyser #else 22384ad6884SPeter Tyser return 0; 22484ad6884SPeter Tyser #endif 22584ad6884SPeter Tyser } 22684ad6884SPeter Tyser 22742d25327STimo Ketola int get_clocks(void) 22842d25327STimo Ketola { 22942d25327STimo Ketola #ifdef CONFIG_FSL_ESDHC 23042d25327STimo Ketola gd->sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK); 23142d25327STimo Ketola #endif 23242d25327STimo Ketola return 0; 23342d25327STimo Ketola } 23442d25327STimo Ketola 23584ad6884SPeter Tyser /* 23684ad6884SPeter Tyser * Initializes on-chip MMC controllers. 23784ad6884SPeter Tyser * to override, implement board_mmc_init() 23884ad6884SPeter Tyser */ 23984ad6884SPeter Tyser int cpu_mmc_init(bd_t *bis) 24084ad6884SPeter Tyser { 24184ad6884SPeter Tyser #ifdef CONFIG_MXC_MMC 24284ad6884SPeter Tyser return mxc_mmc_init(bis); 24384ad6884SPeter Tyser #else 24484ad6884SPeter Tyser return 0; 24584ad6884SPeter Tyser #endif 24684ad6884SPeter Tyser } 24784ad6884SPeter Tyser 24884ad6884SPeter Tyser #ifdef CONFIG_MXC_UART 2499aa720b1SFabio Estevam void mx25_uart1_init_pins(void) 25084ad6884SPeter Tyser { 25184ad6884SPeter Tyser struct iomuxc_mux_ctl *muxctl; 25284ad6884SPeter Tyser struct iomuxc_pad_ctl *padctl; 25384ad6884SPeter Tyser u32 inpadctl; 25484ad6884SPeter Tyser u32 outpadctl; 25584ad6884SPeter Tyser u32 muxmode0; 25684ad6884SPeter Tyser 25784ad6884SPeter Tyser muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE; 25884ad6884SPeter Tyser padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE; 25984ad6884SPeter Tyser muxmode0 = MX25_PIN_MUX_MODE(0); 26084ad6884SPeter Tyser /* 26184ad6884SPeter Tyser * set up input pins with hysteresis and 100K pull-ups 26284ad6884SPeter Tyser */ 26384ad6884SPeter Tyser inpadctl = MX25_PIN_PAD_CTL_HYS 26484ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PKE 26584ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PU; 26684ad6884SPeter Tyser 26784ad6884SPeter Tyser /* 26884ad6884SPeter Tyser * set up output pins with 100K pull-downs 26984ad6884SPeter Tyser * FIXME: need to revisit this 27084ad6884SPeter Tyser * PUE is ignored if PKE is not set 27184ad6884SPeter Tyser * so the right value here is likely 27284ad6884SPeter Tyser * 0x0 for no pull up/down 27384ad6884SPeter Tyser * or 27484ad6884SPeter Tyser * 0xc0 for 100k pull down 27584ad6884SPeter Tyser */ 27684ad6884SPeter Tyser outpadctl = MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD; 27784ad6884SPeter Tyser 27884ad6884SPeter Tyser /* UART1 */ 27984ad6884SPeter Tyser /* rxd */ 28084ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_rxd); 28184ad6884SPeter Tyser writel(inpadctl, &padctl->pad_uart1_rxd); 28284ad6884SPeter Tyser 28384ad6884SPeter Tyser /* txd */ 28484ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_txd); 28584ad6884SPeter Tyser writel(outpadctl, &padctl->pad_uart1_txd); 28684ad6884SPeter Tyser 28784ad6884SPeter Tyser /* rts */ 28884ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_rts); 28984ad6884SPeter Tyser writel(outpadctl, &padctl->pad_uart1_rts); 29084ad6884SPeter Tyser 29184ad6884SPeter Tyser /* cts */ 29284ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_uart1_cts); 29384ad6884SPeter Tyser writel(inpadctl, &padctl->pad_uart1_cts); 29484ad6884SPeter Tyser } 29584ad6884SPeter Tyser #endif /* CONFIG_MXC_UART */ 29684ad6884SPeter Tyser 29784ad6884SPeter Tyser #ifdef CONFIG_FEC_MXC 29884ad6884SPeter Tyser void mx25_fec_init_pins(void) 29984ad6884SPeter Tyser { 30084ad6884SPeter Tyser struct iomuxc_mux_ctl *muxctl; 30184ad6884SPeter Tyser struct iomuxc_pad_ctl *padctl; 30284ad6884SPeter Tyser u32 inpadctl_100kpd; 30384ad6884SPeter Tyser u32 inpadctl_22kpu; 30484ad6884SPeter Tyser u32 outpadctl; 30584ad6884SPeter Tyser u32 muxmode0; 30684ad6884SPeter Tyser 30784ad6884SPeter Tyser muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE; 30884ad6884SPeter Tyser padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE; 30984ad6884SPeter Tyser muxmode0 = MX25_PIN_MUX_MODE(0); 31084ad6884SPeter Tyser inpadctl_100kpd = MX25_PIN_PAD_CTL_HYS 31184ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PKE 31284ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD; 31384ad6884SPeter Tyser inpadctl_22kpu = MX25_PIN_PAD_CTL_HYS 31484ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PKE 31584ad6884SPeter Tyser | MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_22K_PU; 31684ad6884SPeter Tyser /* 31784ad6884SPeter Tyser * set up output pins with 100K pull-downs 31884ad6884SPeter Tyser * FIXME: need to revisit this 31984ad6884SPeter Tyser * PUE is ignored if PKE is not set 32084ad6884SPeter Tyser * so the right value here is likely 32184ad6884SPeter Tyser * 0x0 for no pull 32284ad6884SPeter Tyser * or 32384ad6884SPeter Tyser * 0xc0 for 100k pull down 32484ad6884SPeter Tyser */ 32584ad6884SPeter Tyser outpadctl = MX25_PIN_PAD_CTL_PUE | MX25_PIN_PAD_CTL_100K_PD; 32684ad6884SPeter Tyser 32784ad6884SPeter Tyser /* FEC_TX_CLK */ 32884ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tx_clk); 32984ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_tx_clk); 33084ad6884SPeter Tyser 33184ad6884SPeter Tyser /* FEC_RX_DV */ 33284ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_rx_dv); 33384ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_rx_dv); 33484ad6884SPeter Tyser 33584ad6884SPeter Tyser /* FEC_RDATA0 */ 33684ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_rdata0); 33784ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_rdata0); 33884ad6884SPeter Tyser 33984ad6884SPeter Tyser /* FEC_TDATA0 */ 34084ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tdata0); 34184ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_tdata0); 34284ad6884SPeter Tyser 34384ad6884SPeter Tyser /* FEC_TX_EN */ 34484ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tx_en); 34584ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_tx_en); 34684ad6884SPeter Tyser 34784ad6884SPeter Tyser /* FEC_MDC */ 34884ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_mdc); 34984ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_mdc); 35084ad6884SPeter Tyser 35184ad6884SPeter Tyser /* FEC_MDIO */ 35284ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_mdio); 35384ad6884SPeter Tyser writel(inpadctl_22kpu, &padctl->pad_fec_mdio); 35484ad6884SPeter Tyser 35584ad6884SPeter Tyser /* FEC_RDATA1 */ 35684ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_rdata1); 35784ad6884SPeter Tyser writel(inpadctl_100kpd, &padctl->pad_fec_rdata1); 35884ad6884SPeter Tyser 35984ad6884SPeter Tyser /* FEC_TDATA1 */ 36084ad6884SPeter Tyser writel(muxmode0, &muxctl->pad_fec_tdata1); 36184ad6884SPeter Tyser writel(outpadctl, &padctl->pad_fec_tdata1); 36284ad6884SPeter Tyser 36384ad6884SPeter Tyser } 364565e39c5SLiu Hui-R64343 365be252b65SFabio Estevam void imx_get_mac_from_fuse(int dev_id, unsigned char *mac) 366565e39c5SLiu Hui-R64343 { 367565e39c5SLiu Hui-R64343 int i; 368565e39c5SLiu Hui-R64343 struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE; 369565e39c5SLiu Hui-R64343 struct fuse_bank *bank = &iim->bank[0]; 370565e39c5SLiu Hui-R64343 struct fuse_bank0_regs *fuse = 371565e39c5SLiu Hui-R64343 (struct fuse_bank0_regs *)bank->fuse_regs; 372565e39c5SLiu Hui-R64343 373565e39c5SLiu Hui-R64343 for (i = 0; i < 6; i++) 374565e39c5SLiu Hui-R64343 mac[i] = readl(&fuse->mac_addr[i]) & 0xff; 375565e39c5SLiu Hui-R64343 } 37684ad6884SPeter Tyser #endif /* CONFIG_FEC_MXC */ 377