183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 29a3aae22SChristian Riesch /* 39a3aae22SChristian Riesch * Copyright (C) 2011 OMICRON electronics GmbH 49a3aae22SChristian Riesch * 59a3aae22SChristian Riesch * Based on da850evm.c. Original Copyrights follow: 69a3aae22SChristian Riesch * 79a3aae22SChristian Riesch * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 89a3aae22SChristian Riesch * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com> 99a3aae22SChristian Riesch * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> 109a3aae22SChristian Riesch */ 119a3aae22SChristian Riesch 129a3aae22SChristian Riesch #include <common.h> 139a3aae22SChristian Riesch #include <i2c.h> 149a3aae22SChristian Riesch #include <net.h> 159a3aae22SChristian Riesch #include <netdev.h> 169a3aae22SChristian Riesch #include <watchdog.h> 179a3aae22SChristian Riesch #include <asm/io.h> 189a3aae22SChristian Riesch #include <asm/arch/hardware.h> 199a3aae22SChristian Riesch #include <asm/arch/gpio.h> 203e01ed00SKhoronzhuk, Ivan #include <asm/ti-common/davinci_nand.h> 219a3aae22SChristian Riesch #include <asm/arch/emac_defs.h> 229a3aae22SChristian Riesch #include <asm/arch/pinmux_defs.h> 239a3aae22SChristian Riesch #include <asm/arch/davinci_misc.h> 249a3aae22SChristian Riesch #include <asm/arch/timer_defs.h> 25*0f3cf2b3SKeerthy #include "../../../drivers/gpio/da8xx_gpio.h" 269a3aae22SChristian Riesch 279a3aae22SChristian Riesch DECLARE_GLOBAL_DATA_PTR; 289a3aae22SChristian Riesch 299a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_MASK 0x7f000000 309a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_SHIFT 24 319a3aae22SChristian Riesch 329a3aae22SChristian Riesch /* Hardware version pinmux settings */ 339a3aae22SChristian Riesch const struct pinmux_config hwversion_pins[] = { 349a3aae22SChristian Riesch { pinmux(16), 8, 2 }, /* GP7[15] */ 359a3aae22SChristian Riesch { pinmux(16), 8, 3 }, /* GP7[14] */ 369a3aae22SChristian Riesch { pinmux(16), 8, 4 }, /* GP7[13] */ 379a3aae22SChristian Riesch { pinmux(16), 8, 5 }, /* GP7[12] */ 389a3aae22SChristian Riesch { pinmux(16), 8, 6 }, /* GP7[11] */ 399a3aae22SChristian Riesch { pinmux(16), 8, 7 }, /* GP7[10] */ 409a3aae22SChristian Riesch { pinmux(17), 8, 0 }, /* GP7[9] */ 419a3aae22SChristian Riesch { pinmux(17), 8, 1 } /* GP7[8] */ 429a3aae22SChristian Riesch }; 439a3aae22SChristian Riesch 449a3aae22SChristian Riesch const struct pinmux_resource pinmuxes[] = { 459a3aae22SChristian Riesch PINMUX_ITEM(uart2_pins_txrx), 469a3aae22SChristian Riesch PINMUX_ITEM(emac_pins_mii), 479a3aae22SChristian Riesch PINMUX_ITEM(emac_pins_mdio), 489a3aae22SChristian Riesch PINMUX_ITEM(emifa_pins_nor), 499a3aae22SChristian Riesch PINMUX_ITEM(emifa_pins_cs2), 509a3aae22SChristian Riesch PINMUX_ITEM(emifa_pins_cs3), 519a3aae22SChristian Riesch }; 529a3aae22SChristian Riesch 539a3aae22SChristian Riesch const int pinmuxes_size = ARRAY_SIZE(pinmuxes); 549a3aae22SChristian Riesch 559a3aae22SChristian Riesch const struct lpsc_resource lpsc[] = { 569a3aae22SChristian Riesch { DAVINCI_LPSC_AEMIF }, /* NAND, NOR */ 579a3aae22SChristian Riesch { DAVINCI_LPSC_EMAC }, /* image download */ 589a3aae22SChristian Riesch { DAVINCI_LPSC_UART2 }, /* console */ 599a3aae22SChristian Riesch { DAVINCI_LPSC_GPIO }, 609a3aae22SChristian Riesch }; 619a3aae22SChristian Riesch 629a3aae22SChristian Riesch const int lpsc_size = ARRAY_SIZE(lpsc); 639a3aae22SChristian Riesch 649a3aae22SChristian Riesch /* read board revision from GPIO7[8..14] */ 659a3aae22SChristian Riesch u32 get_board_rev(void) 669a3aae22SChristian Riesch { 679a3aae22SChristian Riesch lpsc_on(DAVINCI_LPSC_GPIO); 689a3aae22SChristian Riesch if (davinci_configure_pin_mux(hwversion_pins, 699a3aae22SChristian Riesch ARRAY_SIZE(hwversion_pins)) != 0) 709a3aae22SChristian Riesch return 0xffffffff; 719a3aae22SChristian Riesch 729a3aae22SChristian Riesch return (davinci_gpio_bank67->in_data & CALIMAIN_HWVERSION_MASK) 739a3aae22SChristian Riesch >> CALIMAIN_HWVERSION_SHIFT; 749a3aae22SChristian Riesch } 759a3aae22SChristian Riesch 769a3aae22SChristian Riesch /* 779a3aae22SChristian Riesch * determine the oscillator frequency depending on the board revision 789a3aae22SChristian Riesch * 799a3aae22SChristian Riesch * rev 0x00 ... 25 MHz oscillator 809a3aae22SChristian Riesch * rev 0x01 ... 24 MHz oscillator 819a3aae22SChristian Riesch */ 829a3aae22SChristian Riesch int calimain_get_osc_freq(void) 839a3aae22SChristian Riesch { 849a3aae22SChristian Riesch u32 rev; 859a3aae22SChristian Riesch int freq; 869a3aae22SChristian Riesch 879a3aae22SChristian Riesch rev = get_board_rev(); 889a3aae22SChristian Riesch switch (rev) { 899a3aae22SChristian Riesch case 0x00: 909a3aae22SChristian Riesch freq = 25000000; 919a3aae22SChristian Riesch break; 929a3aae22SChristian Riesch default: 939a3aae22SChristian Riesch freq = 24000000; 949a3aae22SChristian Riesch break; 959a3aae22SChristian Riesch } 969a3aae22SChristian Riesch return freq; 979a3aae22SChristian Riesch } 989a3aae22SChristian Riesch 999a3aae22SChristian Riesch int board_init(void) 1009a3aae22SChristian Riesch { 1019a3aae22SChristian Riesch int val; 1029a3aae22SChristian Riesch 1039a3aae22SChristian Riesch irq_init(); 1049a3aae22SChristian Riesch 1059a3aae22SChristian Riesch /* address of boot parameters */ 1069a3aae22SChristian Riesch gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; 1079a3aae22SChristian Riesch 1089a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC 1099a3aae22SChristian Riesch /* select emac MII mode */ 1109a3aae22SChristian Riesch val = readl(&davinci_syscfg_regs->cfgchip3); 1119a3aae22SChristian Riesch val &= ~(1 << 8); 1129a3aae22SChristian Riesch writel(val, &davinci_syscfg_regs->cfgchip3); 1139a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */ 1149a3aae22SChristian Riesch 1159a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG 1169a3aae22SChristian Riesch davinci_hw_watchdog_enable(); 1179a3aae22SChristian Riesch #endif 1189a3aae22SChristian Riesch 1199a3aae22SChristian Riesch printf("Input clock frequency: %d Hz\n", calimain_get_osc_freq()); 1209a3aae22SChristian Riesch printf("Board revision: %d\n", get_board_rev()); 1219a3aae22SChristian Riesch 1229a3aae22SChristian Riesch return 0; 1239a3aae22SChristian Riesch } 1249a3aae22SChristian Riesch 1259a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC 1269a3aae22SChristian Riesch /* 1279a3aae22SChristian Riesch * Initializes on-board ethernet controllers. 1289a3aae22SChristian Riesch */ 1299a3aae22SChristian Riesch int board_eth_init(bd_t *bis) 1309a3aae22SChristian Riesch { 1319a3aae22SChristian Riesch if (!davinci_emac_initialize()) { 1329a3aae22SChristian Riesch printf("Error: Ethernet init failed!\n"); 1339a3aae22SChristian Riesch return -1; 1349a3aae22SChristian Riesch } 1359a3aae22SChristian Riesch 1369a3aae22SChristian Riesch return 0; 1379a3aae22SChristian Riesch } 1389a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */ 1399a3aae22SChristian Riesch 1409a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG 1419a3aae22SChristian Riesch void hw_watchdog_reset(void) 1429a3aae22SChristian Riesch { 1439a3aae22SChristian Riesch davinci_hw_watchdog_reset(); 1449a3aae22SChristian Riesch } 1459a3aae22SChristian Riesch #endif 146