1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright 2020 Toradex 4 */ 5 6#include <common.h> 7#include <command.h> 8#include <image.h> 9#include <init.h> 10#include <log.h> 11#include <asm/arch/clock.h> 12#include <asm/arch/ddr.h> 13#include <asm/arch/imx8mm_pins.h> 14#include <asm/arch/sys_proto.h> 15#include <asm/global_data.h> 16#include <asm/io.h> 17#include <asm/mach-imx/boot_mode.h> 18#include <asm/mach-imx/iomux-v3.h> 19#include <asm/sections.h> 20#include <cpu_func.h> 21#include <dm/device.h> 22#include <dm/device-internal.h> 23#include <dm/uclass.h> 24#include <dm/uclass-internal.h> 25#include <hang.h> 26#include <i2c.h> 27#include <power/pca9450.h> 28#include <power/pmic.h> 29#include <spl.h> 30 31DECLARE_GLOBAL_DATA_PTR; 32 33#define I2C_PMIC_BUS_ID 1 34 35int spl_board_boot_device(enum boot_device boot_dev_spl) 36{ 37 switch (boot_dev_spl) { 38 case MMC1_BOOT: /* eMMC */ 39 return BOOT_DEVICE_MMC1; 40 case SD2_BOOT: /* SD card */ 41 case MMC2_BOOT: 42 return BOOT_DEVICE_MMC2; 43 case USB_BOOT: 44 return BOOT_DEVICE_BOARD; 45 default: 46 return BOOT_DEVICE_NONE; 47 } 48} 49 50void spl_dram_init(void) 51{ 52 ddr_init(&dram_timing); 53} 54 55void spl_board_init(void) 56{ 57 arch_misc_init(); 58} 59 60#ifdef CONFIG_SPL_LOAD_FIT 61int board_fit_config_name_match(const char *name) 62{ 63 /* Just empty function now - can't decide what to choose */ 64 debug("%s: %s\n", __func__, name); 65 66 return 0; 67} 68#endif 69 70__weak void board_early_init(void) 71{ 72 init_uart_clk(0); 73} 74 75int power_init_board(void) 76{ 77 struct udevice *dev; 78 int ret; 79 80 if (IS_ENABLED(CONFIG_SPL_DM_PMIC_PCA9450)) { 81 ret = pmic_get("pmic@25", &dev); 82 if (ret == -ENODEV) { 83 puts("No pmic found\n"); 84 return ret; 85 } 86 87 if (ret != 0) 88 return ret; 89 90 /* BUCKxOUT_DVS0/1 control BUCK123 output, clear PRESET_EN */ 91 pmic_reg_write(dev, PCA9450_BUCK123_DVS, 0x29); 92 93 /* increase VDD_DRAM to 0.975v for 1.5Ghz DDR */ 94 pmic_reg_write(dev, PCA9450_BUCK3OUT_DVS0, 0x1c); 95 96 pmic_reg_write(dev, PCA9450_CONFIG2, 0x1); 97 98 return 0; 99 } 100 101 return 0; 102} 103 104void board_init_f(ulong dummy) 105{ 106 struct udevice *dev; 107 int ret; 108 109 arch_cpu_init(); 110 111 board_early_init(); 112 113 timer_init(); 114 115 /* Clear the BSS. */ 116 memset(__bss_start, 0, __bss_end - __bss_start); 117 118 ret = spl_early_init(); 119 if (ret) { 120 debug("spl_early_init() failed: %d\n", ret); 121 hang(); 122 } 123 124 ret = uclass_get_device_by_name(UCLASS_CLK, 125 "clock-controller@30380000", 126 &dev); 127 if (ret < 0) { 128 printf("Failed to find clock node. Check device tree\n"); 129 hang(); 130 } 131 132 preloader_console_init(); 133 134 enable_tzc380(); 135 136 power_init_board(); 137 138 /* DDR initialization */ 139 spl_dram_init(); 140 141 board_init_r(NULL, 0); 142} 143