xref: /openbmc/u-boot/board/bosch/shc/board.c (revision e5fd39c8)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2d8ccbe93SHeiko Schocher /*
3d8ccbe93SHeiko Schocher  * board.c
4d8ccbe93SHeiko Schocher  *
5d8ccbe93SHeiko Schocher  * (C) Copyright 2016
6d8ccbe93SHeiko Schocher  * Heiko Schocher, DENX Software Engineering, hs@denx.de.
7d8ccbe93SHeiko Schocher  *
8d8ccbe93SHeiko Schocher  * Based on:
9d8ccbe93SHeiko Schocher  * Board functions for TI AM335X based boards
10d8ccbe93SHeiko Schocher  *
11d8ccbe93SHeiko Schocher  * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
12d8ccbe93SHeiko Schocher  */
13d8ccbe93SHeiko Schocher 
14d8ccbe93SHeiko Schocher #include <common.h>
15d8ccbe93SHeiko Schocher #include <errno.h>
16d8ccbe93SHeiko Schocher #include <spl.h>
17d8ccbe93SHeiko Schocher #include <asm/arch/cpu.h>
18d8ccbe93SHeiko Schocher #include <asm/arch/hardware.h>
19d8ccbe93SHeiko Schocher #include <asm/arch/omap.h>
20d8ccbe93SHeiko Schocher #include <asm/arch/ddr_defs.h>
21d8ccbe93SHeiko Schocher #include <asm/arch/clock.h>
22d8ccbe93SHeiko Schocher #include <asm/arch/gpio.h>
23d8ccbe93SHeiko Schocher #include <asm/arch/mmc_host_def.h>
24d8ccbe93SHeiko Schocher #include <asm/arch/sys_proto.h>
25d8ccbe93SHeiko Schocher #include <asm/arch/mem.h>
26d8ccbe93SHeiko Schocher #include <asm/io.h>
27d8ccbe93SHeiko Schocher #include <asm/emif.h>
28d8ccbe93SHeiko Schocher #include <asm/gpio.h>
29d8ccbe93SHeiko Schocher #include <i2c.h>
30d8ccbe93SHeiko Schocher #include <miiphy.h>
31d8ccbe93SHeiko Schocher #include <cpsw.h>
32d8ccbe93SHeiko Schocher #include <power/tps65217.h>
33d8ccbe93SHeiko Schocher #include <environment.h>
34d8ccbe93SHeiko Schocher #include <watchdog.h>
35d8ccbe93SHeiko Schocher #include <environment.h>
36d8ccbe93SHeiko Schocher #include "mmc.h"
37d8ccbe93SHeiko Schocher #include "board.h"
38d8ccbe93SHeiko Schocher 
39d8ccbe93SHeiko Schocher DECLARE_GLOBAL_DATA_PTR;
40d8ccbe93SHeiko Schocher 
41d8ccbe93SHeiko Schocher static struct shc_eeprom __attribute__((section(".data"))) header;
42d8ccbe93SHeiko Schocher static int shc_eeprom_valid;
43d8ccbe93SHeiko Schocher 
44d8ccbe93SHeiko Schocher /*
45d8ccbe93SHeiko Schocher  * Read header information from EEPROM into global structure.
46d8ccbe93SHeiko Schocher  */
read_eeprom(void)47d8ccbe93SHeiko Schocher static int read_eeprom(void)
48d8ccbe93SHeiko Schocher {
49d8ccbe93SHeiko Schocher 	/* Check if baseboard eeprom is available */
50d8ccbe93SHeiko Schocher 	if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
51d8ccbe93SHeiko Schocher 		puts("Could not probe the EEPROM; something fundamentally wrong on the I2C bus.\n");
52d8ccbe93SHeiko Schocher 		return -ENODEV;
53d8ccbe93SHeiko Schocher 	}
54d8ccbe93SHeiko Schocher 
55d8ccbe93SHeiko Schocher 	/* read the eeprom using i2c */
56d8ccbe93SHeiko Schocher 	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)&header,
57d8ccbe93SHeiko Schocher 		     sizeof(header))) {
58d8ccbe93SHeiko Schocher 		puts("Could not read the EEPROM; something fundamentally wrong on the I2C bus.\n");
59d8ccbe93SHeiko Schocher 		return -EIO;
60d8ccbe93SHeiko Schocher 	}
61d8ccbe93SHeiko Schocher 
62d8ccbe93SHeiko Schocher 	if (header.magic != HDR_MAGIC) {
63d8ccbe93SHeiko Schocher 		printf("Incorrect magic number (0x%x) in EEPROM\n",
64d8ccbe93SHeiko Schocher 		       header.magic);
65d8ccbe93SHeiko Schocher 		return -EIO;
66d8ccbe93SHeiko Schocher 	}
67d8ccbe93SHeiko Schocher 
68d8ccbe93SHeiko Schocher 	shc_eeprom_valid = 1;
69d8ccbe93SHeiko Schocher 
70d8ccbe93SHeiko Schocher 	return 0;
71d8ccbe93SHeiko Schocher }
72d8ccbe93SHeiko Schocher 
shc_request_gpio(void)73d8ccbe93SHeiko Schocher static void shc_request_gpio(void)
74d8ccbe93SHeiko Schocher {
75d8ccbe93SHeiko Schocher 	gpio_request(LED_PWR_BL_GPIO, "LED PWR BL");
76d8ccbe93SHeiko Schocher 	gpio_request(LED_PWR_RD_GPIO, "LED PWR RD");
77d8ccbe93SHeiko Schocher 	gpio_request(RESET_GPIO, "reset");
78d8ccbe93SHeiko Schocher 	gpio_request(WIFI_REGEN_GPIO, "WIFI REGEN");
79d8ccbe93SHeiko Schocher 	gpio_request(WIFI_RST_GPIO, "WIFI rst");
80d8ccbe93SHeiko Schocher 	gpio_request(ZIGBEE_RST_GPIO, "ZigBee rst");
81d8ccbe93SHeiko Schocher 	gpio_request(BIDCOS_RST_GPIO, "BIDCOS rst");
82d8ccbe93SHeiko Schocher 	gpio_request(ENOC_RST_GPIO, "ENOC rst");
83d8ccbe93SHeiko Schocher #if defined CONFIG_B_SAMPLE
84d8ccbe93SHeiko Schocher 	gpio_request(LED_PWR_GN_GPIO, "LED PWR GN");
85d8ccbe93SHeiko Schocher 	gpio_request(LED_CONN_BL_GPIO, "LED CONN BL");
86d8ccbe93SHeiko Schocher 	gpio_request(LED_CONN_RD_GPIO, "LED CONN RD");
87d8ccbe93SHeiko Schocher 	gpio_request(LED_CONN_GN_GPIO, "LED CONN GN");
88d8ccbe93SHeiko Schocher #else
89d8ccbe93SHeiko Schocher 	gpio_request(LED_LAN_BL_GPIO, "LED LAN BL");
90d8ccbe93SHeiko Schocher 	gpio_request(LED_LAN_RD_GPIO, "LED LAN RD");
91d8ccbe93SHeiko Schocher 	gpio_request(LED_CLOUD_BL_GPIO, "LED CLOUD BL");
92d8ccbe93SHeiko Schocher 	gpio_request(LED_CLOUD_RD_GPIO, "LED CLOUD RD");
93d8ccbe93SHeiko Schocher 	gpio_request(LED_PWM_GPIO, "LED PWM");
94d8ccbe93SHeiko Schocher 	gpio_request(Z_WAVE_RST_GPIO, "Z WAVE rst");
95d8ccbe93SHeiko Schocher #endif
96d8ccbe93SHeiko Schocher 	gpio_request(BACK_BUTTON_GPIO, "Back button");
97d8ccbe93SHeiko Schocher 	gpio_request(FRONT_BUTTON_GPIO, "Front button");
98d8ccbe93SHeiko Schocher }
99d8ccbe93SHeiko Schocher 
100d8ccbe93SHeiko Schocher /*
101d8ccbe93SHeiko Schocher  * Function which forces all installed modules into running state for ICT
102d8ccbe93SHeiko Schocher  * testing. Called by SPL.
103d8ccbe93SHeiko Schocher  */
force_modules_running(void)104d8ccbe93SHeiko Schocher static void __maybe_unused force_modules_running(void)
105d8ccbe93SHeiko Schocher {
106d8ccbe93SHeiko Schocher 	/* Wi-Fi power regulator enable - high = enabled */
107d8ccbe93SHeiko Schocher 	gpio_direction_output(WIFI_REGEN_GPIO, 1);
108d8ccbe93SHeiko Schocher 	/*
109d8ccbe93SHeiko Schocher 	 * Wait for Wi-Fi power regulator to reach a stable voltage
110d8ccbe93SHeiko Schocher 	 * (soft-start time, max. 350 µs)
111d8ccbe93SHeiko Schocher 	 */
112d8ccbe93SHeiko Schocher 	__udelay(350);
113d8ccbe93SHeiko Schocher 
114d8ccbe93SHeiko Schocher 	/* Wi-Fi module reset - high = running */
115d8ccbe93SHeiko Schocher 	gpio_direction_output(WIFI_RST_GPIO, 1);
116d8ccbe93SHeiko Schocher 
117d8ccbe93SHeiko Schocher 	/* ZigBee reset - high = running */
118d8ccbe93SHeiko Schocher 	gpio_direction_output(ZIGBEE_RST_GPIO, 1);
119d8ccbe93SHeiko Schocher 
120d8ccbe93SHeiko Schocher 	/* BidCos reset - high = running */
121d8ccbe93SHeiko Schocher 	gpio_direction_output(BIDCOS_RST_GPIO, 1);
122d8ccbe93SHeiko Schocher 
123d8ccbe93SHeiko Schocher #if !defined(CONFIG_B_SAMPLE)
124d8ccbe93SHeiko Schocher 	/* Z-Wave reset - high = running */
125d8ccbe93SHeiko Schocher 	gpio_direction_output(Z_WAVE_RST_GPIO, 1);
126d8ccbe93SHeiko Schocher #endif
127d8ccbe93SHeiko Schocher 
128d8ccbe93SHeiko Schocher 	/* EnOcean reset - low = running */
129d8ccbe93SHeiko Schocher 	gpio_direction_output(ENOC_RST_GPIO, 0);
130d8ccbe93SHeiko Schocher }
131d8ccbe93SHeiko Schocher 
132d8ccbe93SHeiko Schocher /*
133d8ccbe93SHeiko Schocher  * Function which forces all installed modules into reset - to be released by
134d8ccbe93SHeiko Schocher  * the OS, called by SPL
135d8ccbe93SHeiko Schocher  */
force_modules_reset(void)136d8ccbe93SHeiko Schocher static void __maybe_unused force_modules_reset(void)
137d8ccbe93SHeiko Schocher {
138d8ccbe93SHeiko Schocher 	/* Wi-Fi module reset - low = reset */
139d8ccbe93SHeiko Schocher 	gpio_direction_output(WIFI_RST_GPIO, 0);
140d8ccbe93SHeiko Schocher 
141d8ccbe93SHeiko Schocher 	/* Wi-Fi power regulator enable - low = disabled */
142d8ccbe93SHeiko Schocher 	gpio_direction_output(WIFI_REGEN_GPIO, 0);
143d8ccbe93SHeiko Schocher 
144d8ccbe93SHeiko Schocher 	/* ZigBee reset - low = reset */
145d8ccbe93SHeiko Schocher 	gpio_direction_output(ZIGBEE_RST_GPIO, 0);
146d8ccbe93SHeiko Schocher 
147d8ccbe93SHeiko Schocher 	/* BidCos reset - low = reset */
148d8ccbe93SHeiko Schocher 	/*gpio_direction_output(BIDCOS_RST_GPIO, 0);*/
149d8ccbe93SHeiko Schocher 
150d8ccbe93SHeiko Schocher #if !defined(CONFIG_B_SAMPLE)
151d8ccbe93SHeiko Schocher 	/* Z-Wave reset - low = reset */
152d8ccbe93SHeiko Schocher 	gpio_direction_output(Z_WAVE_RST_GPIO, 0);
153d8ccbe93SHeiko Schocher #endif
154d8ccbe93SHeiko Schocher 
155d8ccbe93SHeiko Schocher 	/* EnOcean reset - high = reset*/
156d8ccbe93SHeiko Schocher 	gpio_direction_output(ENOC_RST_GPIO, 1);
157d8ccbe93SHeiko Schocher }
158d8ccbe93SHeiko Schocher 
159d8ccbe93SHeiko Schocher /*
160d8ccbe93SHeiko Schocher  * Function to set the LEDs in the state "Bootloader booting"
161d8ccbe93SHeiko Schocher  */
leds_set_booting(void)162d8ccbe93SHeiko Schocher static void __maybe_unused leds_set_booting(void)
163d8ccbe93SHeiko Schocher {
164d8ccbe93SHeiko Schocher #if defined(CONFIG_B_SAMPLE)
165d8ccbe93SHeiko Schocher 
166d8ccbe93SHeiko Schocher 	/* Turn all red LEDs on */
167d8ccbe93SHeiko Schocher 	gpio_direction_output(LED_PWR_RD_GPIO, 1);
168d8ccbe93SHeiko Schocher 	gpio_direction_output(LED_CONN_RD_GPIO, 1);
169d8ccbe93SHeiko Schocher 
170d8ccbe93SHeiko Schocher #else /* All other SHCs starting with B2-Sample */
171d8ccbe93SHeiko Schocher 	/* Set the PWM GPIO */
172d8ccbe93SHeiko Schocher 	gpio_direction_output(LED_PWM_GPIO, 1);
173d8ccbe93SHeiko Schocher 	/* Turn all red LEDs on */
174d8ccbe93SHeiko Schocher 	gpio_direction_output(LED_PWR_RD_GPIO, 1);
175d8ccbe93SHeiko Schocher 	gpio_direction_output(LED_LAN_RD_GPIO, 1);
176d8ccbe93SHeiko Schocher 	gpio_direction_output(LED_CLOUD_RD_GPIO, 1);
177d8ccbe93SHeiko Schocher 
178d8ccbe93SHeiko Schocher #endif
179d8ccbe93SHeiko Schocher }
180d8ccbe93SHeiko Schocher 
181d8ccbe93SHeiko Schocher /*
182d8ccbe93SHeiko Schocher  * Function to set the LEDs in the state "Bootloader error"
183d8ccbe93SHeiko Schocher  */
leds_set_failure(int state)184d8ccbe93SHeiko Schocher static void leds_set_failure(int state)
185d8ccbe93SHeiko Schocher {
186d8ccbe93SHeiko Schocher #if defined(CONFIG_B_SAMPLE)
187d8ccbe93SHeiko Schocher 	/* Turn all blue and green LEDs off */
188d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_BL_GPIO, 0);
189d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_GN_GPIO, 0);
190d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CONN_BL_GPIO, 0);
191d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CONN_GN_GPIO, 0);
192d8ccbe93SHeiko Schocher 
193d8ccbe93SHeiko Schocher 	/* Turn all red LEDs to 'state' */
194d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_RD_GPIO, state);
195d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CONN_RD_GPIO, state);
196d8ccbe93SHeiko Schocher 
197d8ccbe93SHeiko Schocher #else /* All other SHCs starting with B2-Sample */
198d8ccbe93SHeiko Schocher 	/* Set the PWM GPIO */
199d8ccbe93SHeiko Schocher 	gpio_direction_output(LED_PWM_GPIO, 1);
200d8ccbe93SHeiko Schocher 
201d8ccbe93SHeiko Schocher 	/* Turn all blue LEDs off */
202d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_BL_GPIO, 0);
203d8ccbe93SHeiko Schocher 	gpio_set_value(LED_LAN_BL_GPIO, 0);
204d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CLOUD_BL_GPIO, 0);
205d8ccbe93SHeiko Schocher 
206d8ccbe93SHeiko Schocher 	/* Turn all red LEDs to 'state' */
207d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_RD_GPIO, state);
208d8ccbe93SHeiko Schocher 	gpio_set_value(LED_LAN_RD_GPIO, state);
209d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CLOUD_RD_GPIO, state);
210d8ccbe93SHeiko Schocher #endif
211d8ccbe93SHeiko Schocher }
212d8ccbe93SHeiko Schocher 
213d8ccbe93SHeiko Schocher /*
214d8ccbe93SHeiko Schocher  * Function to set the LEDs in the state "Bootloader finished"
215d8ccbe93SHeiko Schocher  */
leds_set_finish(void)216d8ccbe93SHeiko Schocher static void leds_set_finish(void)
217d8ccbe93SHeiko Schocher {
218d8ccbe93SHeiko Schocher #if defined(CONFIG_B_SAMPLE)
219d8ccbe93SHeiko Schocher 	/* Turn all LEDs off */
220d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_BL_GPIO, 0);
221d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_RD_GPIO, 0);
222d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_GN_GPIO, 0);
223d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CONN_BL_GPIO, 0);
224d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CONN_RD_GPIO, 0);
225d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CONN_GN_GPIO, 0);
226d8ccbe93SHeiko Schocher #else /* All other SHCs starting with B2-Sample */
227d8ccbe93SHeiko Schocher 	/* Turn all LEDs off */
228d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_BL_GPIO, 0);
229d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWR_RD_GPIO, 0);
230d8ccbe93SHeiko Schocher 	gpio_set_value(LED_LAN_BL_GPIO, 0);
231d8ccbe93SHeiko Schocher 	gpio_set_value(LED_LAN_RD_GPIO, 0);
232d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CLOUD_BL_GPIO, 0);
233d8ccbe93SHeiko Schocher 	gpio_set_value(LED_CLOUD_RD_GPIO, 0);
234d8ccbe93SHeiko Schocher 
235d8ccbe93SHeiko Schocher 	/* Turn off the PWM GPIO and mux it to EHRPWM */
236d8ccbe93SHeiko Schocher 	gpio_set_value(LED_PWM_GPIO, 0);
237d8ccbe93SHeiko Schocher 	enable_shc_board_pwm_pin_mux();
238d8ccbe93SHeiko Schocher #endif
239d8ccbe93SHeiko Schocher }
240d8ccbe93SHeiko Schocher 
check_button_status(void)241d8ccbe93SHeiko Schocher static void check_button_status(void)
242d8ccbe93SHeiko Schocher {
243d8ccbe93SHeiko Schocher 	ulong value;
244d8ccbe93SHeiko Schocher 	gpio_direction_input(FRONT_BUTTON_GPIO);
245d8ccbe93SHeiko Schocher 	value = gpio_get_value(FRONT_BUTTON_GPIO);
246d8ccbe93SHeiko Schocher 
247d8ccbe93SHeiko Schocher 	if (value == 0) {
248d8ccbe93SHeiko Schocher 		printf("front button activated !\n");
249382bee57SSimon Glass 		env_set("harakiri", "1");
250d8ccbe93SHeiko Schocher 	}
251d8ccbe93SHeiko Schocher }
252d8ccbe93SHeiko Schocher 
253*a36c70a3SHeiko Schocher #if defined(CONFIG_SPL_BUILD)
254d8ccbe93SHeiko Schocher #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)255d8ccbe93SHeiko Schocher int spl_start_uboot(void)
256d8ccbe93SHeiko Schocher {
257d8ccbe93SHeiko Schocher 	return 1;
258d8ccbe93SHeiko Schocher }
259d8ccbe93SHeiko Schocher #endif
260d8ccbe93SHeiko Schocher 
shc_board_early_init(void)261d8ccbe93SHeiko Schocher static void shc_board_early_init(void)
262d8ccbe93SHeiko Schocher {
263d8ccbe93SHeiko Schocher 	shc_request_gpio();
264d8ccbe93SHeiko Schocher # ifdef CONFIG_SHC_ICT
265d8ccbe93SHeiko Schocher 	/* Force all modules into enabled state for ICT testing */
266d8ccbe93SHeiko Schocher 	force_modules_running();
267d8ccbe93SHeiko Schocher # else
268d8ccbe93SHeiko Schocher 	/* Force all modules to enter Reset state until released by the OS */
269d8ccbe93SHeiko Schocher 	force_modules_reset();
270d8ccbe93SHeiko Schocher # endif
271d8ccbe93SHeiko Schocher 	leds_set_booting();
272d8ccbe93SHeiko Schocher }
273d8ccbe93SHeiko Schocher 
274*a36c70a3SHeiko Schocher static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
275*a36c70a3SHeiko Schocher 
276d8ccbe93SHeiko Schocher #define MPU_SPREADING_PERMILLE 18 /* Spread 1.8 percent */
277d8ccbe93SHeiko Schocher #define OSC	(V_OSCK/1000000)
278d8ccbe93SHeiko Schocher /* Bosch: Predivider must be fixed to 4, so N = 4-1 */
279d8ccbe93SHeiko Schocher #define MPUPLL_N        (4-1)
280d8ccbe93SHeiko Schocher /* Bosch: Fref = 24 MHz / (N+1) = 24 MHz / 4 = 6 MHz */
281d8ccbe93SHeiko Schocher #define MPUPLL_FREF (OSC / (MPUPLL_N + 1))
282d8ccbe93SHeiko Schocher 
283d8ccbe93SHeiko Schocher const struct dpll_params dpll_ddr_shc = {
284d8ccbe93SHeiko Schocher 		400, OSC-1, 1, -1, -1, -1, -1};
285d8ccbe93SHeiko Schocher 
get_dpll_ddr_params(void)286d8ccbe93SHeiko Schocher const struct dpll_params *get_dpll_ddr_params(void)
287d8ccbe93SHeiko Schocher {
288d8ccbe93SHeiko Schocher 	return &dpll_ddr_shc;
289d8ccbe93SHeiko Schocher }
290d8ccbe93SHeiko Schocher 
291d8ccbe93SHeiko Schocher /*
292d8ccbe93SHeiko Schocher  * As we enabled downspread SSC with 1.8%, the values needed to be corrected
293d8ccbe93SHeiko Schocher  * such that the 20% overshoot will not lead to too high frequencies.
294d8ccbe93SHeiko Schocher  * In all cases, this is achieved by subtracting one from M (6 MHz less).
295d8ccbe93SHeiko Schocher  * Example: 600 MHz CPU
296d8ccbe93SHeiko Schocher  *   Step size: 24 MHz OSC, N = 4 (fix) --> Fref = 6 MHz
297d8ccbe93SHeiko Schocher  *   600 MHz - 6 MHz (1x Fref) = 594 MHz
298d8ccbe93SHeiko Schocher  *   SSC: 594 MHz * 1.8% = 10.7 MHz SSC
299d8ccbe93SHeiko Schocher  *   Overshoot: 10.7 MHz * 20 % = 2.2 MHz
300d8ccbe93SHeiko Schocher  *   --> Fmax = 594 MHz + 2.2 MHz = 596.2 MHz, lower than 600 MHz --> OK!
301d8ccbe93SHeiko Schocher  */
302d8ccbe93SHeiko Schocher const struct dpll_params dpll_mpu_shc_opp100 = {
303d8ccbe93SHeiko Schocher 		99, MPUPLL_N, 1, -1, -1, -1, -1};
304d8ccbe93SHeiko Schocher 
am33xx_spl_board_init(void)305d8ccbe93SHeiko Schocher void am33xx_spl_board_init(void)
306d8ccbe93SHeiko Schocher {
307d8ccbe93SHeiko Schocher 	int sil_rev;
308d8ccbe93SHeiko Schocher 	int mpu_vdd;
309d8ccbe93SHeiko Schocher 
310d8ccbe93SHeiko Schocher 	puts(BOARD_ID_STR);
311d8ccbe93SHeiko Schocher 
312d8ccbe93SHeiko Schocher 	/*
313d8ccbe93SHeiko Schocher 	 * Set CORE Frequency to OPP100
314d8ccbe93SHeiko Schocher 	 * Hint: DCDC3 (CORE) defaults to 1.100V (for OPP100)
315d8ccbe93SHeiko Schocher 	 */
316d8ccbe93SHeiko Schocher 	do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
317d8ccbe93SHeiko Schocher 
318d8ccbe93SHeiko Schocher 	sil_rev = readl(&cdev->deviceid) >> 28;
319d8ccbe93SHeiko Schocher 	if (sil_rev < 2) {
320d8ccbe93SHeiko Schocher 		puts("We do not support Silicon Revisions below 2.0!\n");
321d8ccbe93SHeiko Schocher 		return;
322d8ccbe93SHeiko Schocher 	}
323d8ccbe93SHeiko Schocher 
324d8ccbe93SHeiko Schocher 	dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
325d8ccbe93SHeiko Schocher 	if (i2c_probe(TPS65217_CHIP_PM))
326d8ccbe93SHeiko Schocher 		return;
327d8ccbe93SHeiko Schocher 
328d8ccbe93SHeiko Schocher 	/*
329d8ccbe93SHeiko Schocher 	 * Retrieve the CPU max frequency by reading the efuse
330d8ccbe93SHeiko Schocher 	 * SHC-Default: 600 MHz
331d8ccbe93SHeiko Schocher 	 */
332d8ccbe93SHeiko Schocher 	switch (dpll_mpu_opp100.m) {
333d8ccbe93SHeiko Schocher 	case MPUPLL_M_1000:
334d8ccbe93SHeiko Schocher 		mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
335d8ccbe93SHeiko Schocher 		break;
336d8ccbe93SHeiko Schocher 	case MPUPLL_M_800:
337d8ccbe93SHeiko Schocher 		mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
338d8ccbe93SHeiko Schocher 		break;
339d8ccbe93SHeiko Schocher 	case MPUPLL_M_720:
340d8ccbe93SHeiko Schocher 		mpu_vdd = TPS65217_DCDC_VOLT_SEL_1200MV;
341d8ccbe93SHeiko Schocher 		break;
342d8ccbe93SHeiko Schocher 	case MPUPLL_M_600:
343d8ccbe93SHeiko Schocher 		mpu_vdd = TPS65217_DCDC_VOLT_SEL_1100MV;
344d8ccbe93SHeiko Schocher 		break;
345d8ccbe93SHeiko Schocher 	case MPUPLL_M_300:
346d8ccbe93SHeiko Schocher 		mpu_vdd = TPS65217_DCDC_VOLT_SEL_950MV;
347d8ccbe93SHeiko Schocher 		break;
348d8ccbe93SHeiko Schocher 	default:
349d8ccbe93SHeiko Schocher 		puts("Cannot determine the frequency, failing!\n");
350d8ccbe93SHeiko Schocher 		return;
351d8ccbe93SHeiko Schocher 	}
352d8ccbe93SHeiko Schocher 
353d8ccbe93SHeiko Schocher 	if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
354d8ccbe93SHeiko Schocher 		puts("tps65217_voltage_update failure\n");
355d8ccbe93SHeiko Schocher 		return;
356d8ccbe93SHeiko Schocher 	}
357d8ccbe93SHeiko Schocher 
358d8ccbe93SHeiko Schocher 	/* Set MPU Frequency to what we detected */
359d8ccbe93SHeiko Schocher 	printf("MPU reference clock runs at %d MHz\n", MPUPLL_FREF);
360d8ccbe93SHeiko Schocher 	printf("Setting MPU clock to %d MHz\n", MPUPLL_FREF *
361d8ccbe93SHeiko Schocher 	       dpll_mpu_shc_opp100.m);
362d8ccbe93SHeiko Schocher 	do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_shc_opp100);
363d8ccbe93SHeiko Schocher 
364d8ccbe93SHeiko Schocher 	/* Enable Spread Spectrum for this freq to be clean on EMI side */
365d8ccbe93SHeiko Schocher 	set_mpu_spreadspectrum(MPU_SPREADING_PERMILLE);
366d8ccbe93SHeiko Schocher 
367d8ccbe93SHeiko Schocher 	/*
368d8ccbe93SHeiko Schocher 	 * Using the default voltages for the PMIC (TPS65217D)
369d8ccbe93SHeiko Schocher 	 * LS1 = 1.8V (VDD_1V8)
370d8ccbe93SHeiko Schocher 	 * LS2 = 3.3V (VDD_3V3A)
371d8ccbe93SHeiko Schocher 	 * LDO1 = 1.8V (VIO and VRTC)
372d8ccbe93SHeiko Schocher 	 * LDO2 = 3.3V (VDD_3V3AUX)
373d8ccbe93SHeiko Schocher 	 */
374d8ccbe93SHeiko Schocher 	shc_board_early_init();
375d8ccbe93SHeiko Schocher }
376d8ccbe93SHeiko Schocher 
set_uart_mux_conf(void)377d8ccbe93SHeiko Schocher void set_uart_mux_conf(void)
378d8ccbe93SHeiko Schocher {
379d8ccbe93SHeiko Schocher 	enable_uart0_pin_mux();
380d8ccbe93SHeiko Schocher }
381d8ccbe93SHeiko Schocher 
set_mux_conf_regs(void)382d8ccbe93SHeiko Schocher void set_mux_conf_regs(void)
383d8ccbe93SHeiko Schocher {
384d8ccbe93SHeiko Schocher 	enable_shc_board_pin_mux();
385d8ccbe93SHeiko Schocher }
386d8ccbe93SHeiko Schocher 
387d8ccbe93SHeiko Schocher const struct ctrl_ioregs ioregs_evmsk = {
388d8ccbe93SHeiko Schocher 	.cm0ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
389d8ccbe93SHeiko Schocher 	.cm1ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
390d8ccbe93SHeiko Schocher 	.cm2ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
391d8ccbe93SHeiko Schocher 	.dt0ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
392d8ccbe93SHeiko Schocher 	.dt1ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
393d8ccbe93SHeiko Schocher };
394d8ccbe93SHeiko Schocher 
395d8ccbe93SHeiko Schocher static const struct ddr_data ddr3_shc_data = {
396d8ccbe93SHeiko Schocher 	.datardsratio0 = MT41K256M16HA125E_RD_DQS,
397d8ccbe93SHeiko Schocher 	.datawdsratio0 = MT41K256M16HA125E_WR_DQS,
398d8ccbe93SHeiko Schocher 	.datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
399d8ccbe93SHeiko Schocher 	.datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
400d8ccbe93SHeiko Schocher };
401d8ccbe93SHeiko Schocher 
402d8ccbe93SHeiko Schocher static const struct cmd_control ddr3_shc_cmd_ctrl_data = {
403d8ccbe93SHeiko Schocher 	.cmd0csratio = MT41K256M16HA125E_RATIO,
404d8ccbe93SHeiko Schocher 	.cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
405d8ccbe93SHeiko Schocher 
406d8ccbe93SHeiko Schocher 	.cmd1csratio = MT41K256M16HA125E_RATIO,
407d8ccbe93SHeiko Schocher 	.cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
408d8ccbe93SHeiko Schocher 
409d8ccbe93SHeiko Schocher 	.cmd2csratio = MT41K256M16HA125E_RATIO,
410d8ccbe93SHeiko Schocher 	.cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
411d8ccbe93SHeiko Schocher };
412d8ccbe93SHeiko Schocher 
413d8ccbe93SHeiko Schocher static struct emif_regs ddr3_shc_emif_reg_data = {
414d8ccbe93SHeiko Schocher 	.sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
415d8ccbe93SHeiko Schocher 	.ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
416d8ccbe93SHeiko Schocher 	.sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
417d8ccbe93SHeiko Schocher 	.sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
418d8ccbe93SHeiko Schocher 	.sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
419d8ccbe93SHeiko Schocher 	.zq_config = MT41K256M16HA125E_ZQ_CFG,
420d8ccbe93SHeiko Schocher 	.emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY |
421d8ccbe93SHeiko Schocher 				PHY_EN_DYN_PWRDN,
422d8ccbe93SHeiko Schocher };
423d8ccbe93SHeiko Schocher 
sdram_init(void)424d8ccbe93SHeiko Schocher void sdram_init(void)
425d8ccbe93SHeiko Schocher {
426d8ccbe93SHeiko Schocher 	/* Configure the DDR3 RAM */
427d8ccbe93SHeiko Schocher 	config_ddr(400, &ioregs_evmsk, &ddr3_shc_data,
428d8ccbe93SHeiko Schocher 		   &ddr3_shc_cmd_ctrl_data, &ddr3_shc_emif_reg_data, 0);
429d8ccbe93SHeiko Schocher }
430d8ccbe93SHeiko Schocher #endif
431d8ccbe93SHeiko Schocher 
432d8ccbe93SHeiko Schocher /*
433d8ccbe93SHeiko Schocher  * Basic board specific setup.  Pinmux has been handled already.
434d8ccbe93SHeiko Schocher  */
board_init(void)435d8ccbe93SHeiko Schocher int board_init(void)
436d8ccbe93SHeiko Schocher {
437d8ccbe93SHeiko Schocher #if defined(CONFIG_HW_WATCHDOG)
438d8ccbe93SHeiko Schocher 	hw_watchdog_init();
439d8ccbe93SHeiko Schocher #endif
440d8ccbe93SHeiko Schocher 	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
441d8ccbe93SHeiko Schocher 	if (read_eeprom() < 0)
442d8ccbe93SHeiko Schocher 		puts("EEPROM Content Invalid.\n");
443d8ccbe93SHeiko Schocher 
444d8ccbe93SHeiko Schocher 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
445d8ccbe93SHeiko Schocher #if defined(CONFIG_NOR) || defined(CONFIG_NAND)
446d8ccbe93SHeiko Schocher 	gpmc_init();
447d8ccbe93SHeiko Schocher #endif
448d8ccbe93SHeiko Schocher 	shc_request_gpio();
449d8ccbe93SHeiko Schocher 
450d8ccbe93SHeiko Schocher 	return 0;
451d8ccbe93SHeiko Schocher }
452d8ccbe93SHeiko Schocher 
453d8ccbe93SHeiko Schocher #ifdef CONFIG_BOARD_LATE_INIT
board_late_init(void)454d8ccbe93SHeiko Schocher int board_late_init(void)
455d8ccbe93SHeiko Schocher {
456d8ccbe93SHeiko Schocher 	check_button_status();
457d8ccbe93SHeiko Schocher #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
458d8ccbe93SHeiko Schocher 	if (shc_eeprom_valid)
459d8ccbe93SHeiko Schocher 		if (is_valid_ethaddr(header.mac_addr))
460fd1e959eSSimon Glass 			eth_env_set_enetaddr("ethaddr", header.mac_addr);
461d8ccbe93SHeiko Schocher #endif
462d8ccbe93SHeiko Schocher 
463d8ccbe93SHeiko Schocher 	return 0;
464d8ccbe93SHeiko Schocher }
465d8ccbe93SHeiko Schocher #endif
466d8ccbe93SHeiko Schocher 
467d8ccbe93SHeiko Schocher #if defined(CONFIG_USB_ETHER) && \
468b432b1ebSFaiz Abbas 	(!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USB_ETHER))
board_eth_init(bd_t * bis)469*a36c70a3SHeiko Schocher int board_eth_init(bd_t *bis)
470*a36c70a3SHeiko Schocher {
471*a36c70a3SHeiko Schocher 	return usb_eth_initialize(bis);
472d8ccbe93SHeiko Schocher }
473d8ccbe93SHeiko Schocher #endif
474d8ccbe93SHeiko Schocher 
475d8ccbe93SHeiko Schocher #ifdef CONFIG_SHOW_BOOT_PROGRESS
bosch_check_reset_pin(void)476d8ccbe93SHeiko Schocher static void bosch_check_reset_pin(void)
477d8ccbe93SHeiko Schocher {
478d8ccbe93SHeiko Schocher 	if (readl(GPIO1_BASE + OMAP_GPIO_IRQSTATUS_SET_0) & RESET_MASK) {
479d8ccbe93SHeiko Schocher 		printf("Resetting ...\n");
480d8ccbe93SHeiko Schocher 		writel(RESET_MASK, GPIO1_BASE + OMAP_GPIO_IRQSTATUS_SET_0);
481d8ccbe93SHeiko Schocher 		disable_interrupts();
482d8ccbe93SHeiko Schocher 		reset_cpu(0);
483d8ccbe93SHeiko Schocher 		/*NOTREACHED*/
484d8ccbe93SHeiko Schocher 	}
485d8ccbe93SHeiko Schocher }
486d8ccbe93SHeiko Schocher 
hang_bosch(const char * cause,int code)487d8ccbe93SHeiko Schocher static void hang_bosch(const char *cause, int code)
488d8ccbe93SHeiko Schocher {
489d8ccbe93SHeiko Schocher 	int lv;
490d8ccbe93SHeiko Schocher 
491d8ccbe93SHeiko Schocher 	gpio_direction_input(RESET_GPIO);
492d8ccbe93SHeiko Schocher 
493d8ccbe93SHeiko Schocher 	/* Enable reset pin interrupt on falling edge */
494d8ccbe93SHeiko Schocher 	writel(RESET_MASK, GPIO1_BASE + OMAP_GPIO_IRQSTATUS_SET_0);
495d8ccbe93SHeiko Schocher 	writel(RESET_MASK, GPIO1_BASE + OMAP_GPIO_FALLINGDETECT);
496d8ccbe93SHeiko Schocher 	enable_interrupts();
497d8ccbe93SHeiko Schocher 
498d8ccbe93SHeiko Schocher 	puts(cause);
499d8ccbe93SHeiko Schocher 	for (;;) {
500d8ccbe93SHeiko Schocher 		for (lv = 0; lv < code; lv++) {
501d8ccbe93SHeiko Schocher 			bosch_check_reset_pin();
502d8ccbe93SHeiko Schocher 			leds_set_failure(1);
503d8ccbe93SHeiko Schocher 			__udelay(150 * 1000);
504d8ccbe93SHeiko Schocher 			leds_set_failure(0);
505d8ccbe93SHeiko Schocher 			__udelay(150 * 1000);
506d8ccbe93SHeiko Schocher 		}
507d8ccbe93SHeiko Schocher #if defined(BLINK_CODE)
508d8ccbe93SHeiko Schocher 		__udelay(300 * 1000);
509d8ccbe93SHeiko Schocher #endif
510d8ccbe93SHeiko Schocher 	}
511d8ccbe93SHeiko Schocher }
512d8ccbe93SHeiko Schocher 
show_boot_progress(int val)513d8ccbe93SHeiko Schocher void show_boot_progress(int val)
514d8ccbe93SHeiko Schocher {
515d8ccbe93SHeiko Schocher 	switch (val) {
516d8ccbe93SHeiko Schocher 	case BOOTSTAGE_ID_NEED_RESET:
517d8ccbe93SHeiko Schocher 		hang_bosch("need reset", 4);
518d8ccbe93SHeiko Schocher 		break;
519d8ccbe93SHeiko Schocher 	}
520d8ccbe93SHeiko Schocher }
521d8ccbe93SHeiko Schocher 
arch_preboot_os(void)522d8ccbe93SHeiko Schocher void arch_preboot_os(void)
523d8ccbe93SHeiko Schocher {
524d8ccbe93SHeiko Schocher 	leds_set_finish();
525d8ccbe93SHeiko Schocher }
526d8ccbe93SHeiko Schocher #endif
527