1*649a33e4SStefano Babic /* 2*649a33e4SStefano Babic * (C) Copyright 2010 3*649a33e4SStefano Babic * Stefano Babic, DENX Software Engineering, sbabic@denx.de 4*649a33e4SStefano Babic * 5*649a33e4SStefano Babic * Based on da850evm.c, original Copyrights follow: 6*649a33e4SStefano Babic * 7*649a33e4SStefano Babic * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 8*649a33e4SStefano Babic * 9*649a33e4SStefano Babic * Based on da830evm.c. Original Copyrights follow: 10*649a33e4SStefano Babic * 11*649a33e4SStefano Babic * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com> 12*649a33e4SStefano Babic * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> 13*649a33e4SStefano Babic * 14*649a33e4SStefano Babic * This program is free software; you can redistribute it and/or modify 15*649a33e4SStefano Babic * it under the terms of the GNU General Public License as published by 16*649a33e4SStefano Babic * the Free Software Foundation; either version 2 of the License, or 17*649a33e4SStefano Babic * (at your option) any later version. 18*649a33e4SStefano Babic * 19*649a33e4SStefano Babic * This program is distributed in the hope that it will be useful, 20*649a33e4SStefano Babic * but WITHOUT ANY WARRANTY; without even the implied warranty of 21*649a33e4SStefano Babic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22*649a33e4SStefano Babic * GNU General Public License for more details. 23*649a33e4SStefano Babic * 24*649a33e4SStefano Babic * You should have received a copy of the GNU General Public License 25*649a33e4SStefano Babic * along with this program; if not, write to the Free Software 26*649a33e4SStefano Babic * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 27*649a33e4SStefano Babic */ 28*649a33e4SStefano Babic 29*649a33e4SStefano Babic #include <common.h> 30*649a33e4SStefano Babic #include <i2c.h> 31*649a33e4SStefano Babic #include <net.h> 32*649a33e4SStefano Babic #include <netdev.h> 33*649a33e4SStefano Babic #include <asm/arch/hardware.h> 34*649a33e4SStefano Babic #include <asm/arch/emif_defs.h> 35*649a33e4SStefano Babic #include <asm/arch/emac_defs.h> 36*649a33e4SStefano Babic #include <asm/io.h> 37*649a33e4SStefano Babic #include <asm/arch/davinci_misc.h> 38*649a33e4SStefano Babic 39*649a33e4SStefano Babic DECLARE_GLOBAL_DATA_PTR; 40*649a33e4SStefano Babic 41*649a33e4SStefano Babic #define pinmux(x) (&davinci_syscfg_regs->pinmux[x]) 42*649a33e4SStefano Babic 43*649a33e4SStefano Babic /* SPI0 pin muxer settings */ 44*649a33e4SStefano Babic static const struct pinmux_config spi1_pins[] = { 45*649a33e4SStefano Babic { pinmux(5), 1, 1 }, 46*649a33e4SStefano Babic { pinmux(5), 1, 2 }, 47*649a33e4SStefano Babic { pinmux(5), 1, 4 }, 48*649a33e4SStefano Babic { pinmux(5), 1, 5 } 49*649a33e4SStefano Babic }; 50*649a33e4SStefano Babic 51*649a33e4SStefano Babic /* UART pin muxer settings */ 52*649a33e4SStefano Babic static const struct pinmux_config uart_pins[] = { 53*649a33e4SStefano Babic { pinmux(0), 4, 6 }, 54*649a33e4SStefano Babic { pinmux(0), 4, 7 }, 55*649a33e4SStefano Babic { pinmux(4), 2, 4 }, 56*649a33e4SStefano Babic { pinmux(4), 2, 5 } 57*649a33e4SStefano Babic }; 58*649a33e4SStefano Babic 59*649a33e4SStefano Babic #ifdef CONFIG_DRIVER_TI_EMAC 60*649a33e4SStefano Babic #define HAS_RMII 1 61*649a33e4SStefano Babic static const struct pinmux_config emac_pins[] = { 62*649a33e4SStefano Babic { pinmux(14), 8, 2 }, 63*649a33e4SStefano Babic { pinmux(14), 8, 3 }, 64*649a33e4SStefano Babic { pinmux(14), 8, 4 }, 65*649a33e4SStefano Babic { pinmux(14), 8, 5 }, 66*649a33e4SStefano Babic { pinmux(14), 8, 6 }, 67*649a33e4SStefano Babic { pinmux(14), 8, 7 }, 68*649a33e4SStefano Babic { pinmux(15), 8, 1 }, 69*649a33e4SStefano Babic { pinmux(4), 8, 0 }, 70*649a33e4SStefano Babic { pinmux(4), 8, 1 } 71*649a33e4SStefano Babic }; 72*649a33e4SStefano Babic #endif 73*649a33e4SStefano Babic 74*649a33e4SStefano Babic #ifdef CONFIG_NAND_DAVINCI 75*649a33e4SStefano Babic const struct pinmux_config nand_pins[] = { 76*649a33e4SStefano Babic { pinmux(7), 1, 1 }, 77*649a33e4SStefano Babic { pinmux(7), 1, 2 }, 78*649a33e4SStefano Babic { pinmux(7), 1, 4 }, 79*649a33e4SStefano Babic { pinmux(7), 1, 5 }, 80*649a33e4SStefano Babic { pinmux(9), 1, 0 }, 81*649a33e4SStefano Babic { pinmux(9), 1, 1 }, 82*649a33e4SStefano Babic { pinmux(9), 1, 2 }, 83*649a33e4SStefano Babic { pinmux(9), 1, 3 }, 84*649a33e4SStefano Babic { pinmux(9), 1, 4 }, 85*649a33e4SStefano Babic { pinmux(9), 1, 5 }, 86*649a33e4SStefano Babic { pinmux(9), 1, 6 }, 87*649a33e4SStefano Babic { pinmux(9), 1, 7 }, 88*649a33e4SStefano Babic { pinmux(12), 1, 5 }, 89*649a33e4SStefano Babic { pinmux(12), 1, 6 } 90*649a33e4SStefano Babic }; 91*649a33e4SStefano Babic #endif 92*649a33e4SStefano Babic 93*649a33e4SStefano Babic static const struct pinmux_resource pinmuxes[] = { 94*649a33e4SStefano Babic #ifdef CONFIG_SPI_FLASH 95*649a33e4SStefano Babic PINMUX_ITEM(spi1_pins), 96*649a33e4SStefano Babic #endif 97*649a33e4SStefano Babic PINMUX_ITEM(uart_pins), 98*649a33e4SStefano Babic #ifdef CONFIG_NAND_DAVINCI 99*649a33e4SStefano Babic PINMUX_ITEM(nand_pins), 100*649a33e4SStefano Babic #endif 101*649a33e4SStefano Babic }; 102*649a33e4SStefano Babic 103*649a33e4SStefano Babic static const struct lpsc_resource lpsc[] = { 104*649a33e4SStefano Babic { DAVINCI_LPSC_AEMIF }, /* NAND, NOR */ 105*649a33e4SStefano Babic { DAVINCI_LPSC_SPI1 }, /* Serial Flash */ 106*649a33e4SStefano Babic { DAVINCI_LPSC_EMAC }, /* image download */ 107*649a33e4SStefano Babic { DAVINCI_LPSC_UART2 }, /* console */ 108*649a33e4SStefano Babic { DAVINCI_LPSC_GPIO }, 109*649a33e4SStefano Babic }; 110*649a33e4SStefano Babic 111*649a33e4SStefano Babic int board_init(void) 112*649a33e4SStefano Babic { 113*649a33e4SStefano Babic #ifndef CONFIG_USE_IRQ 114*649a33e4SStefano Babic irq_init(); 115*649a33e4SStefano Babic #endif 116*649a33e4SStefano Babic 117*649a33e4SStefano Babic 118*649a33e4SStefano Babic #ifdef CONFIG_NAND_DAVINCI 119*649a33e4SStefano Babic /* 120*649a33e4SStefano Babic * NAND CS setup - cycle counts based on da850evm NAND timings in the 121*649a33e4SStefano Babic * Linux kernel @ 25MHz EMIFA 122*649a33e4SStefano Babic */ 123*649a33e4SStefano Babic writel((DAVINCI_ABCR_WSETUP(0) | 124*649a33e4SStefano Babic DAVINCI_ABCR_WSTROBE(0) | 125*649a33e4SStefano Babic DAVINCI_ABCR_WHOLD(0) | 126*649a33e4SStefano Babic DAVINCI_ABCR_RSETUP(0) | 127*649a33e4SStefano Babic DAVINCI_ABCR_RSTROBE(1) | 128*649a33e4SStefano Babic DAVINCI_ABCR_RHOLD(0) | 129*649a33e4SStefano Babic DAVINCI_ABCR_TA(0) | 130*649a33e4SStefano Babic DAVINCI_ABCR_ASIZE_8BIT), 131*649a33e4SStefano Babic &davinci_emif_regs->ab2cr); /* CS3 */ 132*649a33e4SStefano Babic #endif 133*649a33e4SStefano Babic 134*649a33e4SStefano Babic /* arch number of the board */ 135*649a33e4SStefano Babic gd->bd->bi_arch_number = MACH_TYPE_EA20; 136*649a33e4SStefano Babic 137*649a33e4SStefano Babic /* address of boot parameters */ 138*649a33e4SStefano Babic gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; 139*649a33e4SStefano Babic 140*649a33e4SStefano Babic /* 141*649a33e4SStefano Babic * Power on required peripherals 142*649a33e4SStefano Babic * ARM does not have access by default to PSC0 and PSC1 143*649a33e4SStefano Babic * assuming here that the DSP bootloader has set the IOPU 144*649a33e4SStefano Babic * such that PSC access is available to ARM 145*649a33e4SStefano Babic */ 146*649a33e4SStefano Babic if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc))) 147*649a33e4SStefano Babic return 1; 148*649a33e4SStefano Babic 149*649a33e4SStefano Babic /* setup the SUSPSRC for ARM to control emulation suspend */ 150*649a33e4SStefano Babic writel(readl(&davinci_syscfg_regs->suspsrc) & 151*649a33e4SStefano Babic ~(DAVINCI_SYSCFG_SUSPSRC_EMAC | DAVINCI_SYSCFG_SUSPSRC_I2C | 152*649a33e4SStefano Babic DAVINCI_SYSCFG_SUSPSRC_SPI1 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 | 153*649a33e4SStefano Babic DAVINCI_SYSCFG_SUSPSRC_UART2), 154*649a33e4SStefano Babic &davinci_syscfg_regs->suspsrc); 155*649a33e4SStefano Babic 156*649a33e4SStefano Babic /* configure pinmux settings */ 157*649a33e4SStefano Babic if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes))) 158*649a33e4SStefano Babic return 1; 159*649a33e4SStefano Babic 160*649a33e4SStefano Babic #ifdef CONFIG_DRIVER_TI_EMAC 161*649a33e4SStefano Babic if (davinci_configure_pin_mux(emac_pins, ARRAY_SIZE(emac_pins)) != 0) 162*649a33e4SStefano Babic return 1; 163*649a33e4SStefano Babic 164*649a33e4SStefano Babic davinci_emac_mii_mode_sel(HAS_RMII); 165*649a33e4SStefano Babic #endif /* CONFIG_DRIVER_TI_EMAC */ 166*649a33e4SStefano Babic 167*649a33e4SStefano Babic /* enable the console UART */ 168*649a33e4SStefano Babic writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST | 169*649a33e4SStefano Babic DAVINCI_UART_PWREMU_MGMT_UTRST), 170*649a33e4SStefano Babic &davinci_uart2_ctrl_regs->pwremu_mgmt); 171*649a33e4SStefano Babic 172*649a33e4SStefano Babic return 0; 173*649a33e4SStefano Babic } 174*649a33e4SStefano Babic 175*649a33e4SStefano Babic #ifdef CONFIG_DRIVER_TI_EMAC 176*649a33e4SStefano Babic 177*649a33e4SStefano Babic /* 178*649a33e4SStefano Babic * Initializes on-board ethernet controllers. 179*649a33e4SStefano Babic */ 180*649a33e4SStefano Babic int board_eth_init(bd_t *bis) 181*649a33e4SStefano Babic { 182*649a33e4SStefano Babic if (!davinci_emac_initialize()) { 183*649a33e4SStefano Babic printf("Error: Ethernet init failed!\n"); 184*649a33e4SStefano Babic return -1; 185*649a33e4SStefano Babic } 186*649a33e4SStefano Babic 187*649a33e4SStefano Babic /* 188*649a33e4SStefano Babic * This board has a RMII PHY. However, the MDC line on the SOM 189*649a33e4SStefano Babic * must not be disabled (there is no MII PHY on the 190*649a33e4SStefano Babic * baseboard) via the GPIO2[6], because this pin 191*649a33e4SStefano Babic * disables at the same time the SPI flash. 192*649a33e4SStefano Babic */ 193*649a33e4SStefano Babic 194*649a33e4SStefano Babic return 0; 195*649a33e4SStefano Babic } 196*649a33e4SStefano Babic #endif /* CONFIG_DRIVER_TI_EMAC */ 197