/* * (C) Copyright 2009 DENX Software Engineering * Author: John Rigby * * Based on imx27lite.c: * Copyright (C) 2008,2009 Eric Jarrige * Copyright (C) 2009 Ilya Yanok * And: * RedBoot tx25_misc.c Copyright (C) 2009 Red Hat * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * */ #include #include #include #include #include #include DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_FEC_MXC #define GPIO_FEC_RESET_B MXC_GPIO_PORT_TO_NUM(4, 7) #define GPIO_FEC_ENABLE_B MXC_GPIO_PORT_TO_NUM(4, 9) void tx25_fec_init(void) { struct iomuxc_mux_ctl *muxctl; struct iomuxc_pad_ctl *padctl; u32 gpio_mux_mode = MX25_PIN_MUX_MODE(5); u32 saved_rdata0_mode, saved_rdata1_mode, saved_rx_dv_mode; debug("tx25_fec_init\n"); /* * fec pin init is generic */ mx25_fec_init_pins(); /* * Set up the FEC_RESET_B and FEC_ENABLE GPIO pins. * * FEC_RESET_B: gpio4[7] is ALT 5 mode of pin D13 * FEC_ENABLE_B: gpio4[9] is ALT 5 mode of pin D11 */ muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE; padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE; writel(gpio_mux_mode, &muxctl->pad_d13); writel(gpio_mux_mode, &muxctl->pad_d11); writel(0x0, &padctl->pad_d13); writel(0x0, &padctl->pad_d11); /* drop PHY power and assert reset (low) */ gpio_direction_output(GPIO_FEC_RESET_B, 0); gpio_direction_output(GPIO_FEC_ENABLE_B, 0); mdelay(5); debug("resetting phy\n"); /* turn on PHY power leaving reset asserted */ gpio_set_value(GPIO_FEC_ENABLE_B, 1); mdelay(10); /* * Setup some strapping pins that are latched by the PHY * as reset goes high. * * Set PHY mode to 111 * mode0 comes from FEC_RDATA0 which is GPIO 3_10 in mux mode 5 * mode1 comes from FEC_RDATA1 which is GPIO 3_11 in mux mode 5 * mode2 is tied high so nothing to do * * Turn on RMII mode * RMII mode is selected by FEC_RX_DV which is GPIO 3_12 in mux mode */ /* * save three current mux modes and set each to gpio mode */ saved_rdata0_mode = readl(&muxctl->pad_fec_rdata0); saved_rdata1_mode = readl(&muxctl->pad_fec_rdata1); saved_rx_dv_mode = readl(&muxctl->pad_fec_rx_dv); writel(gpio_mux_mode, &muxctl->pad_fec_rdata0); writel(gpio_mux_mode, &muxctl->pad_fec_rdata1); writel(gpio_mux_mode, &muxctl->pad_fec_rx_dv); /* * set each to 1 and make each an output */ gpio_direction_output(MXC_GPIO_PORT_TO_NUM(3, 10), 1); gpio_direction_output(MXC_GPIO_PORT_TO_NUM(3, 11), 1); gpio_direction_output(MXC_GPIO_PORT_TO_NUM(3, 12), 1); mdelay(22); /* this value came from RedBoot */ /* * deassert PHY reset */ gpio_set_value(GPIO_FEC_RESET_B, 1); mdelay(5); /* * set FEC pins back */ writel(saved_rdata0_mode, &muxctl->pad_fec_rdata0); writel(saved_rdata1_mode, &muxctl->pad_fec_rdata1); writel(saved_rx_dv_mode, &muxctl->pad_fec_rx_dv); } #else #define tx25_fec_init() #endif int board_init() { #ifdef CONFIG_MXC_UART mx25_uart1_init_pins(); #endif /* board id for linux */ gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; return 0; } int board_late_init(void) { tx25_fec_init(); return 0; } int dram_init(void) { /* dram_init must store complete ramsize in gd->ram_size */ gd->ram_size = get_ram_size((void *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); return 0; } void dram_init_banksize(void) { gd->bd->bi_dram[0].start = PHYS_SDRAM_1; gd->bd->bi_dram[0].size = get_ram_size((void *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); #if CONFIG_NR_DRAM_BANKS > 1 gd->bd->bi_dram[1].start = PHYS_SDRAM_2; gd->bd->bi_dram[1].size = get_ram_size((void *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE); #else #endif } int checkboard(void) { printf("KARO TX25\n"); return 0; }