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