2 * Copyright (C) 2012 Samsung Electronics
4 * SPDX-License-Identifier: GPL-2.0+
15 #include <asm/arch/cpu.h>
16 #include <asm/arch/dwmmc.h>
17 #include <asm/arch/gpio.h>
18 #include <asm/arch/mmc.h>
19 #include <asm/arch/pinmux.h>
20 #include <asm/arch/power.h>
21 #include <asm/arch/sromc.h>
22 #include <power/pmic.h>
23 #include <power/max77686_pmic.h>
26 DECLARE_GLOBAL_DATA_PTR
;
28 #if defined CONFIG_EXYNOS_TMU
30 * Boot Time Thermal Analysis for SoC temperature threshold breach
32 static void boot_temp_check(void)
36 switch (tmu_monitor(&temp
)) {
37 /* Status TRIPPED ans WARNING means corresponding threshold breach */
38 case TMU_STATUS_TRIPPED
:
39 puts("EXYNOS_TMU: TRIPPING! Device power going down ...\n");
43 case TMU_STATUS_WARNING
:
44 puts("EXYNOS_TMU: WARNING! Temperature very high\n");
47 * TMU_STATUS_INIT means something is wrong with temperature sensing
48 * and TMU status was changed back from NORMAL to INIT.
52 debug("EXYNOS_TMU: Unknown TMU state\n");
58 struct cros_ec_dev
*cros_ec_dev
; /* Pointer to cros_ec device */
59 int cros_ec_err
; /* Error for cros_ec, 0 if ok */
62 static struct local_info local
;
64 #ifdef CONFIG_USB_EHCI_EXYNOS
65 int board_usb_vbus_init(void)
67 struct exynos5_gpio_part1
*gpio1
= (struct exynos5_gpio_part1
*)
68 samsung_get_base_gpio_part1();
70 /* Enable VBUS power switch */
71 s5p_gpio_direction_output(&gpio1
->x2
, 6, 1);
73 /* VBUS turn ON time */
80 #ifdef CONFIG_SOUND_MAX98095
81 static void board_enable_audio_codec(void)
83 struct exynos5_gpio_part1
*gpio1
= (struct exynos5_gpio_part1
*)
84 samsung_get_base_gpio_part1();
86 /* Enable MAX98095 Codec */
87 s5p_gpio_direction_output(&gpio1
->x1
, 7, 1);
88 s5p_gpio_set_pull(&gpio1
->x1
, 7, GPIO_PULL_NONE
);
92 struct cros_ec_dev
*board_get_cros_ec_dev(void)
94 return local
.cros_ec_dev
;
97 static int board_init_cros_ec_devices(const void *blob
)
99 local
.cros_ec_err
= cros_ec_init(blob
, &local
.cros_ec_dev
);
100 if (local
.cros_ec_err
)
101 return -1; /* Will report in board_late_init() */
108 gd
->bd
->bi_boot_params
= (PHYS_SDRAM_1
+ 0x100UL
);
110 #if defined CONFIG_EXYNOS_TMU
111 if (tmu_init(gd
->fdt_blob
) != TMU_STATUS_NORMAL
) {
112 debug("%s: Failed to init TMU\n", __func__
);
118 #ifdef CONFIG_EXYNOS_SPI
122 if (board_init_cros_ec_devices(gd
->fdt_blob
))
125 #ifdef CONFIG_USB_EHCI_EXYNOS
126 board_usb_vbus_init();
128 #ifdef CONFIG_SOUND_MAX98095
129 board_enable_audio_codec();
139 for (i
= 0; i
< CONFIG_NR_DRAM_BANKS
; i
++) {
140 addr
= CONFIG_SYS_SDRAM_BASE
+ (i
* SDRAM_BANK_SIZE
);
141 gd
->ram_size
+= get_ram_size((long *)addr
, SDRAM_BANK_SIZE
);
146 #if defined(CONFIG_POWER)
147 static int pmic_reg_update(struct pmic
*p
, int reg
, uint regval
)
152 ret
= pmic_reg_read(p
, reg
, &val
);
154 debug("%s: PMIC %d register read failed\n", __func__
, reg
);
158 ret
= pmic_reg_write(p
, reg
, val
);
160 debug("%s: PMIC %d register write failed\n", __func__
, reg
);
166 int power_init_board(void)
172 i2c_init(CONFIG_SYS_I2C_SPEED
, CONFIG_SYS_I2C_SLAVE
);
174 if (pmic_init(I2C_PMIC
))
177 p
= pmic_get("MAX77686_PMIC");
184 if (pmic_reg_update(p
, MAX77686_REG_PMIC_32KHZ
, MAX77686_32KHCP_EN
))
187 if (pmic_reg_update(p
, MAX77686_REG_PMIC_BBAT
,
188 MAX77686_BBCHOSTEN
| MAX77686_BBCVS_3_5V
))
192 if (pmic_reg_write(p
, MAX77686_REG_PMIC_BUCK1OUT
,
193 MAX77686_BUCK1OUT_1V
)) {
194 debug("%s: PMIC %d register write failed\n", __func__
,
195 MAX77686_REG_PMIC_BUCK1OUT
);
199 if (pmic_reg_update(p
, MAX77686_REG_PMIC_BUCK1CRTL
,
200 MAX77686_BUCK1CTRL_EN
))
204 if (pmic_reg_write(p
, MAX77686_REG_PMIC_BUCK2DVS1
,
205 MAX77686_BUCK2DVS1_1_3V
)) {
206 debug("%s: PMIC %d register write failed\n", __func__
,
207 MAX77686_REG_PMIC_BUCK2DVS1
);
211 if (pmic_reg_update(p
, MAX77686_REG_PMIC_BUCK2CTRL1
,
212 MAX77686_BUCK2CTRL_ON
))
216 if (pmic_reg_write(p
, MAX77686_REG_PMIC_BUCK3DVS1
,
217 MAX77686_BUCK3DVS1_1_0125V
)) {
218 debug("%s: PMIC %d register write failed\n", __func__
,
219 MAX77686_REG_PMIC_BUCK3DVS1
);
223 if (pmic_reg_update(p
, MAX77686_REG_PMIC_BUCK3CTRL
,
224 MAX77686_BUCK3CTRL_ON
))
228 if (pmic_reg_write(p
, MAX77686_REG_PMIC_BUCK4DVS1
,
229 MAX77686_BUCK4DVS1_1_2V
)) {
230 debug("%s: PMIC %d register write failed\n", __func__
,
231 MAX77686_REG_PMIC_BUCK4DVS1
);
235 if (pmic_reg_update(p
, MAX77686_REG_PMIC_BUCK4CTRL1
,
236 MAX77686_BUCK3CTRL_ON
))
240 if (pmic_reg_update(p
, MAX77686_REG_PMIC_LDO2CTRL1
,
241 MAX77686_LD02CTRL1_1_5V
| EN_LDO
))
245 if (pmic_reg_update(p
, MAX77686_REG_PMIC_LDO3CTRL1
,
246 MAX77686_LD03CTRL1_1_8V
| EN_LDO
))
250 if (pmic_reg_update(p
, MAX77686_REG_PMIC_LDO5CTRL1
,
251 MAX77686_LD05CTRL1_1_8V
| EN_LDO
))
255 if (pmic_reg_update(p
, MAX77686_REG_PMIC_LDO10CTRL1
,
256 MAX77686_LD10CTRL1_1_8V
| EN_LDO
))
263 void dram_init_banksize(void)
268 for (i
= 0; i
< CONFIG_NR_DRAM_BANKS
; i
++) {
269 addr
= CONFIG_SYS_SDRAM_BASE
+ (i
* SDRAM_BANK_SIZE
);
270 size
= get_ram_size((long *)addr
, SDRAM_BANK_SIZE
);
272 gd
->bd
->bi_dram
[i
].start
= addr
;
273 gd
->bd
->bi_dram
[i
].size
= size
;
277 static int decode_sromc(const void *blob
, struct fdt_sromc
*config
)
282 node
= fdtdec_next_compatible(blob
, 0, COMPAT_SAMSUNG_EXYNOS5_SROMC
);
284 debug("Could not find SROMC node\n");
288 config
->bank
= fdtdec_get_int(blob
, node
, "bank", 0);
289 config
->width
= fdtdec_get_int(blob
, node
, "width", 2);
291 err
= fdtdec_get_int_array(blob
, node
, "srom-timing", config
->timing
,
292 FDT_SROM_TIMING_COUNT
);
294 debug("Could not decode SROMC configuration Error: %s\n",
296 return -FDT_ERR_NOTFOUND
;
301 int board_eth_init(bd_t
*bis
)
303 #ifdef CONFIG_SMC911X
304 u32 smc_bw_conf
, smc_bc_conf
;
305 struct fdt_sromc config
;
306 fdt_addr_t base_addr
;
309 node
= decode_sromc(gd
->fdt_blob
, &config
);
311 debug("%s: Could not find sromc configuration\n", __func__
);
314 node
= fdtdec_next_compatible(gd
->fdt_blob
, node
, COMPAT_SMSC_LAN9215
);
316 debug("%s: Could not find lan9215 configuration\n", __func__
);
320 /* We now have a node, so any problems from now on are errors */
321 base_addr
= fdtdec_get_addr(gd
->fdt_blob
, node
, "reg");
322 if (base_addr
== FDT_ADDR_T_NONE
) {
323 debug("%s: Could not find lan9215 address\n", __func__
);
327 /* Ethernet needs data bus width of 16 bits */
328 if (config
.width
!= 2) {
329 debug("%s: Unsupported bus width %d\n", __func__
,
333 smc_bw_conf
= SROMC_DATA16_WIDTH(config
.bank
)
334 | SROMC_BYTE_ENABLE(config
.bank
);
336 smc_bc_conf
= SROMC_BC_TACS(config
.timing
[FDT_SROM_TACS
]) |
337 SROMC_BC_TCOS(config
.timing
[FDT_SROM_TCOS
]) |
338 SROMC_BC_TACC(config
.timing
[FDT_SROM_TACC
]) |
339 SROMC_BC_TCOH(config
.timing
[FDT_SROM_TCOH
]) |
340 SROMC_BC_TAH(config
.timing
[FDT_SROM_TAH
]) |
341 SROMC_BC_TACP(config
.timing
[FDT_SROM_TACP
]) |
342 SROMC_BC_PMC(config
.timing
[FDT_SROM_PMC
]);
344 /* Select and configure the SROMC bank */
345 exynos_pinmux_config(PERIPH_ID_SROMC
, config
.bank
);
346 s5p_config_sromc(config
.bank
, smc_bw_conf
, smc_bc_conf
);
347 return smc911x_initialize(0, base_addr
);
352 #ifdef CONFIG_DISPLAY_BOARDINFO
355 const char *board_name
;
357 board_name
= fdt_getprop(gd
->fdt_blob
, 0, "model", NULL
);
358 if (board_name
== NULL
)
359 printf("\nUnknown Board\n");
361 printf("\nBoard: %s\n", board_name
);
367 #ifdef CONFIG_GENERIC_MMC
368 int board_mmc_init(bd_t
*bis
)
371 /* dwmmc initializattion for available channels */
372 ret
= exynos_dwmmc_init(gd
->fdt_blob
);
374 debug("dwmmc init failed\n");
380 static int board_uart_init(void)
382 int err
, uart_id
, ret
= 0;
384 for (uart_id
= PERIPH_ID_UART0
; uart_id
<= PERIPH_ID_UART3
; uart_id
++) {
385 err
= exynos_pinmux_config(uart_id
, PINMUX_FLAG_NONE
);
387 debug("UART%d not configured\n",
388 (uart_id
- PERIPH_ID_UART0
));
395 #ifdef CONFIG_BOARD_EARLY_INIT_F
396 int board_early_init_f(void)
399 err
= board_uart_init();
401 debug("UART init failed\n");
404 #ifdef CONFIG_SYS_I2C_INIT_BOARD
405 board_i2c_init(gd
->fdt_blob
);
412 void exynos_cfg_lcd_gpio(void)
414 struct exynos5_gpio_part1
*gpio1
=
415 (struct exynos5_gpio_part1
*)samsung_get_base_gpio_part1();
418 s5p_gpio_cfg_pin(&gpio1
->b2
, 0, GPIO_OUTPUT
);
419 s5p_gpio_set_value(&gpio1
->b2
, 0, 1);
422 s5p_gpio_cfg_pin(&gpio1
->x1
, 5, GPIO_OUTPUT
);
423 s5p_gpio_set_value(&gpio1
->x1
, 5, 1);
425 /* Set Hotplug detect for DP */
426 s5p_gpio_cfg_pin(&gpio1
->x0
, 7, GPIO_FUNC(0x3));
429 void exynos_set_dp_phy(unsigned int onoff
)
431 set_dp_phy_ctrl(onoff
);
435 #ifdef CONFIG_BOARD_LATE_INIT
436 int board_late_init(void)
438 stdio_print_current_devices();
440 if (local
.cros_ec_err
) {
441 /* Force console on */
442 gd
->flags
&= ~GD_FLG_SILENT
;
444 printf("cros-ec communications failure %d\n",
446 puts("\nPlease reset with Power+Refresh\n\n");
447 panic("Cannot init cros-ec device");