1*83d290c5STom 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>
259a3aae22SChristian Riesch 
269a3aae22SChristian Riesch DECLARE_GLOBAL_DATA_PTR;
279a3aae22SChristian Riesch 
289a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_MASK    0x7f000000
299a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_SHIFT   24
309a3aae22SChristian Riesch 
319a3aae22SChristian Riesch /* Hardware version pinmux settings */
329a3aae22SChristian Riesch const struct pinmux_config hwversion_pins[] = {
339a3aae22SChristian Riesch 	{ pinmux(16), 8, 2 }, /* GP7[15] */
349a3aae22SChristian Riesch 	{ pinmux(16), 8, 3 }, /* GP7[14] */
359a3aae22SChristian Riesch 	{ pinmux(16), 8, 4 }, /* GP7[13] */
369a3aae22SChristian Riesch 	{ pinmux(16), 8, 5 }, /* GP7[12] */
379a3aae22SChristian Riesch 	{ pinmux(16), 8, 6 }, /* GP7[11] */
389a3aae22SChristian Riesch 	{ pinmux(16), 8, 7 }, /* GP7[10] */
399a3aae22SChristian Riesch 	{ pinmux(17), 8, 0 }, /* GP7[9] */
409a3aae22SChristian Riesch 	{ pinmux(17), 8, 1 }  /* GP7[8] */
419a3aae22SChristian Riesch };
429a3aae22SChristian Riesch 
439a3aae22SChristian Riesch const struct pinmux_resource pinmuxes[] = {
449a3aae22SChristian Riesch 	PINMUX_ITEM(uart2_pins_txrx),
459a3aae22SChristian Riesch 	PINMUX_ITEM(emac_pins_mii),
469a3aae22SChristian Riesch 	PINMUX_ITEM(emac_pins_mdio),
479a3aae22SChristian Riesch 	PINMUX_ITEM(emifa_pins_nor),
489a3aae22SChristian Riesch 	PINMUX_ITEM(emifa_pins_cs2),
499a3aae22SChristian Riesch 	PINMUX_ITEM(emifa_pins_cs3),
509a3aae22SChristian Riesch };
519a3aae22SChristian Riesch 
529a3aae22SChristian Riesch const int pinmuxes_size = ARRAY_SIZE(pinmuxes);
539a3aae22SChristian Riesch 
549a3aae22SChristian Riesch const struct lpsc_resource lpsc[] = {
559a3aae22SChristian Riesch 	{ DAVINCI_LPSC_AEMIF },	/* NAND, NOR */
569a3aae22SChristian Riesch 	{ DAVINCI_LPSC_EMAC },	/* image download */
579a3aae22SChristian Riesch 	{ DAVINCI_LPSC_UART2 },	/* console */
589a3aae22SChristian Riesch 	{ DAVINCI_LPSC_GPIO },
599a3aae22SChristian Riesch };
609a3aae22SChristian Riesch 
619a3aae22SChristian Riesch const int lpsc_size = ARRAY_SIZE(lpsc);
629a3aae22SChristian Riesch 
639a3aae22SChristian Riesch /* read board revision from GPIO7[8..14] */
649a3aae22SChristian Riesch u32 get_board_rev(void)
659a3aae22SChristian Riesch {
669a3aae22SChristian Riesch 	lpsc_on(DAVINCI_LPSC_GPIO);
679a3aae22SChristian Riesch 	if (davinci_configure_pin_mux(hwversion_pins,
689a3aae22SChristian Riesch 				      ARRAY_SIZE(hwversion_pins)) != 0)
699a3aae22SChristian Riesch 		return 0xffffffff;
709a3aae22SChristian Riesch 
719a3aae22SChristian Riesch 	return (davinci_gpio_bank67->in_data & CALIMAIN_HWVERSION_MASK)
729a3aae22SChristian Riesch 		>> CALIMAIN_HWVERSION_SHIFT;
739a3aae22SChristian Riesch }
749a3aae22SChristian Riesch 
759a3aae22SChristian Riesch /*
769a3aae22SChristian Riesch  * determine the oscillator frequency depending on the board revision
779a3aae22SChristian Riesch  *
789a3aae22SChristian Riesch  * rev 0x00  ... 25 MHz oscillator
799a3aae22SChristian Riesch  * rev 0x01  ... 24 MHz oscillator
809a3aae22SChristian Riesch  */
819a3aae22SChristian Riesch int calimain_get_osc_freq(void)
829a3aae22SChristian Riesch {
839a3aae22SChristian Riesch 	u32 rev;
849a3aae22SChristian Riesch 	int freq;
859a3aae22SChristian Riesch 
869a3aae22SChristian Riesch 	rev = get_board_rev();
879a3aae22SChristian Riesch 	switch (rev) {
889a3aae22SChristian Riesch 	case 0x00:
899a3aae22SChristian Riesch 		freq = 25000000;
909a3aae22SChristian Riesch 		break;
919a3aae22SChristian Riesch 	default:
929a3aae22SChristian Riesch 		freq = 24000000;
939a3aae22SChristian Riesch 		break;
949a3aae22SChristian Riesch 	}
959a3aae22SChristian Riesch 	return freq;
969a3aae22SChristian Riesch }
979a3aae22SChristian Riesch 
989a3aae22SChristian Riesch int board_init(void)
999a3aae22SChristian Riesch {
1009a3aae22SChristian Riesch 	int val;
1019a3aae22SChristian Riesch 
1029a3aae22SChristian Riesch 	irq_init();
1039a3aae22SChristian Riesch 
1049a3aae22SChristian Riesch 	/* address of boot parameters */
1059a3aae22SChristian Riesch 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
1069a3aae22SChristian Riesch 
1079a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC
1089a3aae22SChristian Riesch 	/* select emac MII mode */
1099a3aae22SChristian Riesch 	val = readl(&davinci_syscfg_regs->cfgchip3);
1109a3aae22SChristian Riesch 	val &= ~(1 << 8);
1119a3aae22SChristian Riesch 	writel(val, &davinci_syscfg_regs->cfgchip3);
1129a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */
1139a3aae22SChristian Riesch 
1149a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG
1159a3aae22SChristian Riesch 	davinci_hw_watchdog_enable();
1169a3aae22SChristian Riesch #endif
1179a3aae22SChristian Riesch 
1189a3aae22SChristian Riesch 	printf("Input clock frequency: %d Hz\n", calimain_get_osc_freq());
1199a3aae22SChristian Riesch 	printf("Board revision:        %d\n", get_board_rev());
1209a3aae22SChristian Riesch 
1219a3aae22SChristian Riesch 	return 0;
1229a3aae22SChristian Riesch }
1239a3aae22SChristian Riesch 
1249a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC
1259a3aae22SChristian Riesch /*
1269a3aae22SChristian Riesch  * Initializes on-board ethernet controllers.
1279a3aae22SChristian Riesch  */
1289a3aae22SChristian Riesch int board_eth_init(bd_t *bis)
1299a3aae22SChristian Riesch {
1309a3aae22SChristian Riesch 	if (!davinci_emac_initialize()) {
1319a3aae22SChristian Riesch 		printf("Error: Ethernet init failed!\n");
1329a3aae22SChristian Riesch 		return -1;
1339a3aae22SChristian Riesch 	}
1349a3aae22SChristian Riesch 
1359a3aae22SChristian Riesch 	return 0;
1369a3aae22SChristian Riesch }
1379a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */
1389a3aae22SChristian Riesch 
1399a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG
1409a3aae22SChristian Riesch void hw_watchdog_reset(void)
1419a3aae22SChristian Riesch {
1429a3aae22SChristian Riesch 	davinci_hw_watchdog_reset();
1439a3aae22SChristian Riesch }
1449a3aae22SChristian Riesch #endif
145