1*9a3aae22SChristian Riesch /* 2*9a3aae22SChristian Riesch * Copyright (C) 2011 OMICRON electronics GmbH 3*9a3aae22SChristian Riesch * 4*9a3aae22SChristian Riesch * Based on da850evm.c. Original Copyrights follow: 5*9a3aae22SChristian Riesch * 6*9a3aae22SChristian Riesch * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 7*9a3aae22SChristian Riesch * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com> 8*9a3aae22SChristian Riesch * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> 9*9a3aae22SChristian Riesch * 10*9a3aae22SChristian Riesch * This program is free software; you can redistribute it and/or modify 11*9a3aae22SChristian Riesch * it under the terms of the GNU General Public License as published by 12*9a3aae22SChristian Riesch * the Free Software Foundation; either version 2 of the License, or 13*9a3aae22SChristian Riesch * (at your option) any later version. 14*9a3aae22SChristian Riesch * 15*9a3aae22SChristian Riesch * This program is distributed in the hope that it will be useful, 16*9a3aae22SChristian Riesch * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*9a3aae22SChristian Riesch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*9a3aae22SChristian Riesch * GNU General Public License for more details. 19*9a3aae22SChristian Riesch * 20*9a3aae22SChristian Riesch * You should have received a copy of the GNU General Public License 21*9a3aae22SChristian Riesch * along with this program; if not, write to the Free Software 22*9a3aae22SChristian Riesch * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23*9a3aae22SChristian Riesch */ 24*9a3aae22SChristian Riesch 25*9a3aae22SChristian Riesch #include <common.h> 26*9a3aae22SChristian Riesch #include <i2c.h> 27*9a3aae22SChristian Riesch #include <net.h> 28*9a3aae22SChristian Riesch #include <netdev.h> 29*9a3aae22SChristian Riesch #include <watchdog.h> 30*9a3aae22SChristian Riesch #include <asm/io.h> 31*9a3aae22SChristian Riesch #include <asm/arch/hardware.h> 32*9a3aae22SChristian Riesch #include <asm/arch/gpio.h> 33*9a3aae22SChristian Riesch #include <asm/arch/emif_defs.h> 34*9a3aae22SChristian Riesch #include <asm/arch/emac_defs.h> 35*9a3aae22SChristian Riesch #include <asm/arch/pinmux_defs.h> 36*9a3aae22SChristian Riesch #include <asm/arch/davinci_misc.h> 37*9a3aae22SChristian Riesch #include <asm/arch/timer_defs.h> 38*9a3aae22SChristian Riesch 39*9a3aae22SChristian Riesch DECLARE_GLOBAL_DATA_PTR; 40*9a3aae22SChristian Riesch 41*9a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_MASK 0x7f000000 42*9a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_SHIFT 24 43*9a3aae22SChristian Riesch 44*9a3aae22SChristian Riesch /* Hardware version pinmux settings */ 45*9a3aae22SChristian Riesch const struct pinmux_config hwversion_pins[] = { 46*9a3aae22SChristian Riesch { pinmux(16), 8, 2 }, /* GP7[15] */ 47*9a3aae22SChristian Riesch { pinmux(16), 8, 3 }, /* GP7[14] */ 48*9a3aae22SChristian Riesch { pinmux(16), 8, 4 }, /* GP7[13] */ 49*9a3aae22SChristian Riesch { pinmux(16), 8, 5 }, /* GP7[12] */ 50*9a3aae22SChristian Riesch { pinmux(16), 8, 6 }, /* GP7[11] */ 51*9a3aae22SChristian Riesch { pinmux(16), 8, 7 }, /* GP7[10] */ 52*9a3aae22SChristian Riesch { pinmux(17), 8, 0 }, /* GP7[9] */ 53*9a3aae22SChristian Riesch { pinmux(17), 8, 1 } /* GP7[8] */ 54*9a3aae22SChristian Riesch }; 55*9a3aae22SChristian Riesch 56*9a3aae22SChristian Riesch const struct pinmux_resource pinmuxes[] = { 57*9a3aae22SChristian Riesch PINMUX_ITEM(uart2_pins_txrx), 58*9a3aae22SChristian Riesch PINMUX_ITEM(emac_pins_mii), 59*9a3aae22SChristian Riesch PINMUX_ITEM(emac_pins_mdio), 60*9a3aae22SChristian Riesch PINMUX_ITEM(emifa_pins_nor), 61*9a3aae22SChristian Riesch PINMUX_ITEM(emifa_pins_cs2), 62*9a3aae22SChristian Riesch PINMUX_ITEM(emifa_pins_cs3), 63*9a3aae22SChristian Riesch }; 64*9a3aae22SChristian Riesch 65*9a3aae22SChristian Riesch const int pinmuxes_size = ARRAY_SIZE(pinmuxes); 66*9a3aae22SChristian Riesch 67*9a3aae22SChristian Riesch const struct lpsc_resource lpsc[] = { 68*9a3aae22SChristian Riesch { DAVINCI_LPSC_AEMIF }, /* NAND, NOR */ 69*9a3aae22SChristian Riesch { DAVINCI_LPSC_EMAC }, /* image download */ 70*9a3aae22SChristian Riesch { DAVINCI_LPSC_UART2 }, /* console */ 71*9a3aae22SChristian Riesch { DAVINCI_LPSC_GPIO }, 72*9a3aae22SChristian Riesch }; 73*9a3aae22SChristian Riesch 74*9a3aae22SChristian Riesch const int lpsc_size = ARRAY_SIZE(lpsc); 75*9a3aae22SChristian Riesch 76*9a3aae22SChristian Riesch /* read board revision from GPIO7[8..14] */ 77*9a3aae22SChristian Riesch u32 get_board_rev(void) 78*9a3aae22SChristian Riesch { 79*9a3aae22SChristian Riesch lpsc_on(DAVINCI_LPSC_GPIO); 80*9a3aae22SChristian Riesch if (davinci_configure_pin_mux(hwversion_pins, 81*9a3aae22SChristian Riesch ARRAY_SIZE(hwversion_pins)) != 0) 82*9a3aae22SChristian Riesch return 0xffffffff; 83*9a3aae22SChristian Riesch 84*9a3aae22SChristian Riesch return (davinci_gpio_bank67->in_data & CALIMAIN_HWVERSION_MASK) 85*9a3aae22SChristian Riesch >> CALIMAIN_HWVERSION_SHIFT; 86*9a3aae22SChristian Riesch } 87*9a3aae22SChristian Riesch 88*9a3aae22SChristian Riesch /* 89*9a3aae22SChristian Riesch * determine the oscillator frequency depending on the board revision 90*9a3aae22SChristian Riesch * 91*9a3aae22SChristian Riesch * rev 0x00 ... 25 MHz oscillator 92*9a3aae22SChristian Riesch * rev 0x01 ... 24 MHz oscillator 93*9a3aae22SChristian Riesch */ 94*9a3aae22SChristian Riesch int calimain_get_osc_freq(void) 95*9a3aae22SChristian Riesch { 96*9a3aae22SChristian Riesch u32 rev; 97*9a3aae22SChristian Riesch int freq; 98*9a3aae22SChristian Riesch 99*9a3aae22SChristian Riesch rev = get_board_rev(); 100*9a3aae22SChristian Riesch switch (rev) { 101*9a3aae22SChristian Riesch case 0x00: 102*9a3aae22SChristian Riesch freq = 25000000; 103*9a3aae22SChristian Riesch break; 104*9a3aae22SChristian Riesch default: 105*9a3aae22SChristian Riesch freq = 24000000; 106*9a3aae22SChristian Riesch break; 107*9a3aae22SChristian Riesch } 108*9a3aae22SChristian Riesch return freq; 109*9a3aae22SChristian Riesch } 110*9a3aae22SChristian Riesch 111*9a3aae22SChristian Riesch int board_init(void) 112*9a3aae22SChristian Riesch { 113*9a3aae22SChristian Riesch int val; 114*9a3aae22SChristian Riesch 115*9a3aae22SChristian Riesch #ifndef CONFIG_USE_IRQ 116*9a3aae22SChristian Riesch irq_init(); 117*9a3aae22SChristian Riesch #endif 118*9a3aae22SChristian Riesch 119*9a3aae22SChristian Riesch /* address of boot parameters */ 120*9a3aae22SChristian Riesch gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; 121*9a3aae22SChristian Riesch 122*9a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC 123*9a3aae22SChristian Riesch /* select emac MII mode */ 124*9a3aae22SChristian Riesch val = readl(&davinci_syscfg_regs->cfgchip3); 125*9a3aae22SChristian Riesch val &= ~(1 << 8); 126*9a3aae22SChristian Riesch writel(val, &davinci_syscfg_regs->cfgchip3); 127*9a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */ 128*9a3aae22SChristian Riesch 129*9a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG 130*9a3aae22SChristian Riesch davinci_hw_watchdog_enable(); 131*9a3aae22SChristian Riesch #endif 132*9a3aae22SChristian Riesch 133*9a3aae22SChristian Riesch printf("Input clock frequency: %d Hz\n", calimain_get_osc_freq()); 134*9a3aae22SChristian Riesch printf("Board revision: %d\n", get_board_rev()); 135*9a3aae22SChristian Riesch 136*9a3aae22SChristian Riesch return 0; 137*9a3aae22SChristian Riesch } 138*9a3aae22SChristian Riesch 139*9a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC 140*9a3aae22SChristian Riesch /* 141*9a3aae22SChristian Riesch * Initializes on-board ethernet controllers. 142*9a3aae22SChristian Riesch */ 143*9a3aae22SChristian Riesch int board_eth_init(bd_t *bis) 144*9a3aae22SChristian Riesch { 145*9a3aae22SChristian Riesch if (!davinci_emac_initialize()) { 146*9a3aae22SChristian Riesch printf("Error: Ethernet init failed!\n"); 147*9a3aae22SChristian Riesch return -1; 148*9a3aae22SChristian Riesch } 149*9a3aae22SChristian Riesch 150*9a3aae22SChristian Riesch return 0; 151*9a3aae22SChristian Riesch } 152*9a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */ 153*9a3aae22SChristian Riesch 154*9a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG 155*9a3aae22SChristian Riesch void hw_watchdog_reset(void) 156*9a3aae22SChristian Riesch { 157*9a3aae22SChristian Riesch davinci_hw_watchdog_reset(); 158*9a3aae22SChristian Riesch } 159*9a3aae22SChristian Riesch #endif 160*9a3aae22SChristian Riesch 161*9a3aae22SChristian Riesch #if defined(CONFIG_BOOTCOUNT_LIMIT) 162*9a3aae22SChristian Riesch void bootcount_store(ulong a) 163*9a3aae22SChristian Riesch { 164*9a3aae22SChristian Riesch struct davinci_rtc *reg = 165*9a3aae22SChristian Riesch (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; 166*9a3aae22SChristian Riesch 167*9a3aae22SChristian Riesch /* 168*9a3aae22SChristian Riesch * write RTC kick register to enable write 169*9a3aae22SChristian Riesch * for RTC Scratch registers. Cratch0 and 1 are 170*9a3aae22SChristian Riesch * used for bootcount values. 171*9a3aae22SChristian Riesch */ 172*9a3aae22SChristian Riesch writel(RTC_KICK0R_WE, ®->kick0r); 173*9a3aae22SChristian Riesch writel(RTC_KICK1R_WE, ®->kick1r); 174*9a3aae22SChristian Riesch writel(a, ®->scratch0); 175*9a3aae22SChristian Riesch writel(BOOTCOUNT_MAGIC, ®->scratch1); 176*9a3aae22SChristian Riesch } 177*9a3aae22SChristian Riesch 178*9a3aae22SChristian Riesch ulong bootcount_load(void) 179*9a3aae22SChristian Riesch { 180*9a3aae22SChristian Riesch struct davinci_rtc *reg = 181*9a3aae22SChristian Riesch (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; 182*9a3aae22SChristian Riesch 183*9a3aae22SChristian Riesch if (readl(®->scratch1) != BOOTCOUNT_MAGIC) 184*9a3aae22SChristian Riesch return 0; 185*9a3aae22SChristian Riesch else 186*9a3aae22SChristian Riesch return readl(®->scratch0); 187*9a3aae22SChristian Riesch } 188*9a3aae22SChristian Riesch #endif 189