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] */
get_board_rev(void)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 */
calimain_get_osc_freq(void)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
board_init(void)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 */
board_eth_init(bd_t * bis)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
hw_watchdog_reset(void)1419a3aae22SChristian Riesch void hw_watchdog_reset(void)
1429a3aae22SChristian Riesch {
1439a3aae22SChristian Riesch davinci_hw_watchdog_reset();
1449a3aae22SChristian Riesch }
1459a3aae22SChristian Riesch #endif
146