171ebb335SRajeshwari Birje /* 271ebb335SRajeshwari Birje * (C) Copyright 2013 SAMSUNG Electronics 371ebb335SRajeshwari Birje * Rajeshwari Shinde <rajeshwari.s@samsung.com> 471ebb335SRajeshwari Birje * 571ebb335SRajeshwari Birje * SPDX-License-Identifier: GPL-2.0+ 671ebb335SRajeshwari Birje */ 771ebb335SRajeshwari Birje 871ebb335SRajeshwari Birje #include <common.h> 971ebb335SRajeshwari Birje #include <cros_ec.h> 1071ebb335SRajeshwari Birje #include <errno.h> 1171ebb335SRajeshwari Birje #include <fdtdec.h> 1271ebb335SRajeshwari Birje #include <spi.h> 1371ebb335SRajeshwari Birje #include <tmu.h> 1471ebb335SRajeshwari Birje #include <netdev.h> 1571ebb335SRajeshwari Birje #include <asm/io.h> 1671ebb335SRajeshwari Birje #include <asm/arch/board.h> 1771ebb335SRajeshwari Birje #include <asm/arch/cpu.h> 1871ebb335SRajeshwari Birje #include <asm/arch/dwmmc.h> 1971ebb335SRajeshwari Birje #include <asm/arch/gpio.h> 2071ebb335SRajeshwari Birje #include <asm/arch/mmc.h> 2171ebb335SRajeshwari Birje #include <asm/arch/pinmux.h> 2271ebb335SRajeshwari Birje #include <asm/arch/power.h> 2371ebb335SRajeshwari Birje #include <power/pmic.h> 2471ebb335SRajeshwari Birje #include <asm/arch/sromc.h> 2571ebb335SRajeshwari Birje #include <power/max77686_pmic.h> 2671ebb335SRajeshwari Birje 2771ebb335SRajeshwari Birje DECLARE_GLOBAL_DATA_PTR; 2871ebb335SRajeshwari Birje 2971ebb335SRajeshwari Birje struct local_info { 3071ebb335SRajeshwari Birje struct cros_ec_dev *cros_ec_dev; /* Pointer to cros_ec device */ 3171ebb335SRajeshwari Birje int cros_ec_err; /* Error for cros_ec, 0 if ok */ 3271ebb335SRajeshwari Birje }; 3371ebb335SRajeshwari Birje 3471ebb335SRajeshwari Birje static struct local_info local; 3571ebb335SRajeshwari Birje 3671ebb335SRajeshwari Birje #if defined CONFIG_EXYNOS_TMU 3771ebb335SRajeshwari Birje /* Boot Time Thermal Analysis for SoC temperature threshold breach */ 3871ebb335SRajeshwari Birje static void boot_temp_check(void) 3971ebb335SRajeshwari Birje { 4071ebb335SRajeshwari Birje int temp; 4171ebb335SRajeshwari Birje 4271ebb335SRajeshwari Birje switch (tmu_monitor(&temp)) { 4371ebb335SRajeshwari Birje case TMU_STATUS_NORMAL: 4471ebb335SRajeshwari Birje break; 4571ebb335SRajeshwari Birje case TMU_STATUS_TRIPPED: 4671ebb335SRajeshwari Birje /* 4771ebb335SRajeshwari Birje * Status TRIPPED ans WARNING means corresponding threshold 4871ebb335SRajeshwari Birje * breach 4971ebb335SRajeshwari Birje */ 5071ebb335SRajeshwari Birje puts("EXYNOS_TMU: TRIPPING! Device power going down ...\n"); 5171ebb335SRajeshwari Birje set_ps_hold_ctrl(); 5271ebb335SRajeshwari Birje hang(); 5371ebb335SRajeshwari Birje break; 5471ebb335SRajeshwari Birje case TMU_STATUS_WARNING: 5571ebb335SRajeshwari Birje puts("EXYNOS_TMU: WARNING! Temperature very high\n"); 5671ebb335SRajeshwari Birje break; 5771ebb335SRajeshwari Birje case TMU_STATUS_INIT: 5871ebb335SRajeshwari Birje /* 5971ebb335SRajeshwari Birje * TMU_STATUS_INIT means something is wrong with temperature 6071ebb335SRajeshwari Birje * sensing and TMU status was changed back from NORMAL to INIT. 6171ebb335SRajeshwari Birje */ 6271ebb335SRajeshwari Birje puts("EXYNOS_TMU: WARNING! Temperature sensing not done\n"); 6371ebb335SRajeshwari Birje break; 6471ebb335SRajeshwari Birje default: 6571ebb335SRajeshwari Birje debug("EXYNOS_TMU: Unknown TMU state\n"); 6671ebb335SRajeshwari Birje } 6771ebb335SRajeshwari Birje } 6871ebb335SRajeshwari Birje #endif 6971ebb335SRajeshwari Birje 7071ebb335SRajeshwari Birje int board_init(void) 7171ebb335SRajeshwari Birje { 7271ebb335SRajeshwari Birje gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); 7371ebb335SRajeshwari Birje #if defined CONFIG_EXYNOS_TMU 7471ebb335SRajeshwari Birje if (tmu_init(gd->fdt_blob) != TMU_STATUS_NORMAL) { 7571ebb335SRajeshwari Birje debug("%s: Failed to init TMU\n", __func__); 7671ebb335SRajeshwari Birje return -1; 7771ebb335SRajeshwari Birje } 7871ebb335SRajeshwari Birje boot_temp_check(); 7971ebb335SRajeshwari Birje #endif 8071ebb335SRajeshwari Birje 8171ebb335SRajeshwari Birje #ifdef CONFIG_EXYNOS_SPI 8271ebb335SRajeshwari Birje spi_init(); 8371ebb335SRajeshwari Birje #endif 8471ebb335SRajeshwari Birje return exynos_init(); 8571ebb335SRajeshwari Birje } 8671ebb335SRajeshwari Birje 8771ebb335SRajeshwari Birje int dram_init(void) 8871ebb335SRajeshwari Birje { 8971ebb335SRajeshwari Birje int i; 9071ebb335SRajeshwari Birje u32 addr; 9171ebb335SRajeshwari Birje 9271ebb335SRajeshwari Birje for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 9371ebb335SRajeshwari Birje addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); 9471ebb335SRajeshwari Birje gd->ram_size += get_ram_size((long *)addr, SDRAM_BANK_SIZE); 9571ebb335SRajeshwari Birje } 9671ebb335SRajeshwari Birje return 0; 9771ebb335SRajeshwari Birje } 9871ebb335SRajeshwari Birje 9971ebb335SRajeshwari Birje void dram_init_banksize(void) 10071ebb335SRajeshwari Birje { 10171ebb335SRajeshwari Birje int i; 10271ebb335SRajeshwari Birje u32 addr, size; 10371ebb335SRajeshwari Birje 10471ebb335SRajeshwari Birje for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 10571ebb335SRajeshwari Birje addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); 10671ebb335SRajeshwari Birje size = get_ram_size((long *)addr, SDRAM_BANK_SIZE); 10771ebb335SRajeshwari Birje 10871ebb335SRajeshwari Birje gd->bd->bi_dram[i].start = addr; 10971ebb335SRajeshwari Birje gd->bd->bi_dram[i].size = size; 11071ebb335SRajeshwari Birje } 11171ebb335SRajeshwari Birje } 11271ebb335SRajeshwari Birje 11371ebb335SRajeshwari Birje static int board_uart_init(void) 11471ebb335SRajeshwari Birje { 11571ebb335SRajeshwari Birje int err, uart_id, ret = 0; 11671ebb335SRajeshwari Birje 11771ebb335SRajeshwari Birje for (uart_id = PERIPH_ID_UART0; uart_id <= PERIPH_ID_UART3; uart_id++) { 11871ebb335SRajeshwari Birje err = exynos_pinmux_config(uart_id, PINMUX_FLAG_NONE); 11971ebb335SRajeshwari Birje if (err) { 12071ebb335SRajeshwari Birje debug("UART%d not configured\n", 12171ebb335SRajeshwari Birje (uart_id - PERIPH_ID_UART0)); 12271ebb335SRajeshwari Birje ret |= err; 12371ebb335SRajeshwari Birje } 12471ebb335SRajeshwari Birje } 12571ebb335SRajeshwari Birje return ret; 12671ebb335SRajeshwari Birje } 12771ebb335SRajeshwari Birje 12871ebb335SRajeshwari Birje #ifdef CONFIG_BOARD_EARLY_INIT_F 12971ebb335SRajeshwari Birje int board_early_init_f(void) 13071ebb335SRajeshwari Birje { 13171ebb335SRajeshwari Birje int err; 13271ebb335SRajeshwari Birje 13371ebb335SRajeshwari Birje err = board_uart_init(); 13471ebb335SRajeshwari Birje if (err) { 13571ebb335SRajeshwari Birje debug("UART init failed\n"); 13671ebb335SRajeshwari Birje return err; 13771ebb335SRajeshwari Birje } 13871ebb335SRajeshwari Birje 13971ebb335SRajeshwari Birje #ifdef CONFIG_SYS_I2C_INIT_BOARD 14071ebb335SRajeshwari Birje board_i2c_init(gd->fdt_blob); 14171ebb335SRajeshwari Birje #endif 14271ebb335SRajeshwari Birje 14371ebb335SRajeshwari Birje return err; 14471ebb335SRajeshwari Birje } 14571ebb335SRajeshwari Birje #endif 14671ebb335SRajeshwari Birje 14771ebb335SRajeshwari Birje struct cros_ec_dev *board_get_cros_ec_dev(void) 14871ebb335SRajeshwari Birje { 14971ebb335SRajeshwari Birje return local.cros_ec_dev; 15071ebb335SRajeshwari Birje } 15171ebb335SRajeshwari Birje 152*e106bd9bSRajeshwari Birje #ifdef CONFIG_CROS_EC 15371ebb335SRajeshwari Birje static int board_init_cros_ec_devices(const void *blob) 15471ebb335SRajeshwari Birje { 15571ebb335SRajeshwari Birje local.cros_ec_err = cros_ec_init(blob, &local.cros_ec_dev); 15671ebb335SRajeshwari Birje if (local.cros_ec_err) 15771ebb335SRajeshwari Birje return -1; /* Will report in board_late_init() */ 15871ebb335SRajeshwari Birje 15971ebb335SRajeshwari Birje return 0; 16071ebb335SRajeshwari Birje } 161*e106bd9bSRajeshwari Birje #endif 16271ebb335SRajeshwari Birje 16371ebb335SRajeshwari Birje #if defined(CONFIG_POWER) 16471ebb335SRajeshwari Birje #ifdef CONFIG_POWER_MAX77686 16571ebb335SRajeshwari Birje static int pmic_reg_update(struct pmic *p, int reg, uint regval) 16671ebb335SRajeshwari Birje { 16771ebb335SRajeshwari Birje u32 val; 16871ebb335SRajeshwari Birje int ret = 0; 16971ebb335SRajeshwari Birje 17071ebb335SRajeshwari Birje ret = pmic_reg_read(p, reg, &val); 17171ebb335SRajeshwari Birje if (ret) { 17271ebb335SRajeshwari Birje debug("%s: PMIC %d register read failed\n", __func__, reg); 17371ebb335SRajeshwari Birje return -1; 17471ebb335SRajeshwari Birje } 17571ebb335SRajeshwari Birje val |= regval; 17671ebb335SRajeshwari Birje ret = pmic_reg_write(p, reg, val); 17771ebb335SRajeshwari Birje if (ret) { 17871ebb335SRajeshwari Birje debug("%s: PMIC %d register write failed\n", __func__, reg); 17971ebb335SRajeshwari Birje return -1; 18071ebb335SRajeshwari Birje } 18171ebb335SRajeshwari Birje return 0; 18271ebb335SRajeshwari Birje } 18371ebb335SRajeshwari Birje 18471ebb335SRajeshwari Birje static int max77686_init(void) 18571ebb335SRajeshwari Birje { 18671ebb335SRajeshwari Birje struct pmic *p; 18771ebb335SRajeshwari Birje 18871ebb335SRajeshwari Birje if (pmic_init(I2C_PMIC)) 18971ebb335SRajeshwari Birje return -1; 19071ebb335SRajeshwari Birje 19171ebb335SRajeshwari Birje p = pmic_get("MAX77686_PMIC"); 19271ebb335SRajeshwari Birje if (!p) 19371ebb335SRajeshwari Birje return -ENODEV; 19471ebb335SRajeshwari Birje 19571ebb335SRajeshwari Birje if (pmic_probe(p)) 19671ebb335SRajeshwari Birje return -1; 19771ebb335SRajeshwari Birje 19871ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_32KHZ, MAX77686_32KHCP_EN)) 19971ebb335SRajeshwari Birje return -1; 20071ebb335SRajeshwari Birje 20171ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_BBAT, 20271ebb335SRajeshwari Birje MAX77686_BBCHOSTEN | MAX77686_BBCVS_3_5V)) 20371ebb335SRajeshwari Birje return -1; 20471ebb335SRajeshwari Birje 20571ebb335SRajeshwari Birje /* VDD_MIF */ 20671ebb335SRajeshwari Birje if (pmic_reg_write(p, MAX77686_REG_PMIC_BUCK1OUT, 20771ebb335SRajeshwari Birje MAX77686_BUCK1OUT_1V)) { 20871ebb335SRajeshwari Birje debug("%s: PMIC %d register write failed\n", __func__, 20971ebb335SRajeshwari Birje MAX77686_REG_PMIC_BUCK1OUT); 21071ebb335SRajeshwari Birje return -1; 21171ebb335SRajeshwari Birje } 21271ebb335SRajeshwari Birje 21371ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_BUCK1CRTL, 21471ebb335SRajeshwari Birje MAX77686_BUCK1CTRL_EN)) 21571ebb335SRajeshwari Birje return -1; 21671ebb335SRajeshwari Birje 21771ebb335SRajeshwari Birje /* VDD_ARM */ 21871ebb335SRajeshwari Birje if (pmic_reg_write(p, MAX77686_REG_PMIC_BUCK2DVS1, 21971ebb335SRajeshwari Birje MAX77686_BUCK2DVS1_1_3V)) { 22071ebb335SRajeshwari Birje debug("%s: PMIC %d register write failed\n", __func__, 22171ebb335SRajeshwari Birje MAX77686_REG_PMIC_BUCK2DVS1); 22271ebb335SRajeshwari Birje return -1; 22371ebb335SRajeshwari Birje } 22471ebb335SRajeshwari Birje 22571ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_BUCK2CTRL1, 22671ebb335SRajeshwari Birje MAX77686_BUCK2CTRL_ON)) 22771ebb335SRajeshwari Birje return -1; 22871ebb335SRajeshwari Birje 22971ebb335SRajeshwari Birje /* VDD_INT */ 23071ebb335SRajeshwari Birje if (pmic_reg_write(p, MAX77686_REG_PMIC_BUCK3DVS1, 23171ebb335SRajeshwari Birje MAX77686_BUCK3DVS1_1_0125V)) { 23271ebb335SRajeshwari Birje debug("%s: PMIC %d register write failed\n", __func__, 23371ebb335SRajeshwari Birje MAX77686_REG_PMIC_BUCK3DVS1); 23471ebb335SRajeshwari Birje return -1; 23571ebb335SRajeshwari Birje } 23671ebb335SRajeshwari Birje 23771ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_BUCK3CTRL, 23871ebb335SRajeshwari Birje MAX77686_BUCK3CTRL_ON)) 23971ebb335SRajeshwari Birje return -1; 24071ebb335SRajeshwari Birje 24171ebb335SRajeshwari Birje /* VDD_G3D */ 24271ebb335SRajeshwari Birje if (pmic_reg_write(p, MAX77686_REG_PMIC_BUCK4DVS1, 24371ebb335SRajeshwari Birje MAX77686_BUCK4DVS1_1_2V)) { 24471ebb335SRajeshwari Birje debug("%s: PMIC %d register write failed\n", __func__, 24571ebb335SRajeshwari Birje MAX77686_REG_PMIC_BUCK4DVS1); 24671ebb335SRajeshwari Birje return -1; 24771ebb335SRajeshwari Birje } 24871ebb335SRajeshwari Birje 24971ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_BUCK4CTRL1, 25071ebb335SRajeshwari Birje MAX77686_BUCK3CTRL_ON)) 25171ebb335SRajeshwari Birje return -1; 25271ebb335SRajeshwari Birje 25371ebb335SRajeshwari Birje /* VDD_LDO2 */ 25471ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_LDO2CTRL1, 25571ebb335SRajeshwari Birje MAX77686_LD02CTRL1_1_5V | EN_LDO)) 25671ebb335SRajeshwari Birje return -1; 25771ebb335SRajeshwari Birje 25871ebb335SRajeshwari Birje /* VDD_LDO3 */ 25971ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_LDO3CTRL1, 26071ebb335SRajeshwari Birje MAX77686_LD03CTRL1_1_8V | EN_LDO)) 26171ebb335SRajeshwari Birje return -1; 26271ebb335SRajeshwari Birje 26371ebb335SRajeshwari Birje /* VDD_LDO5 */ 26471ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_LDO5CTRL1, 26571ebb335SRajeshwari Birje MAX77686_LD05CTRL1_1_8V | EN_LDO)) 26671ebb335SRajeshwari Birje return -1; 26771ebb335SRajeshwari Birje 26871ebb335SRajeshwari Birje /* VDD_LDO10 */ 26971ebb335SRajeshwari Birje if (pmic_reg_update(p, MAX77686_REG_PMIC_LDO10CTRL1, 27071ebb335SRajeshwari Birje MAX77686_LD10CTRL1_1_8V | EN_LDO)) 27171ebb335SRajeshwari Birje return -1; 27271ebb335SRajeshwari Birje 27371ebb335SRajeshwari Birje return 0; 27471ebb335SRajeshwari Birje } 27571ebb335SRajeshwari Birje #endif 27671ebb335SRajeshwari Birje 27771ebb335SRajeshwari Birje int power_init_board(void) 27871ebb335SRajeshwari Birje { 27971ebb335SRajeshwari Birje int ret = 0; 28071ebb335SRajeshwari Birje 28171ebb335SRajeshwari Birje set_ps_hold_ctrl(); 28271ebb335SRajeshwari Birje 28371ebb335SRajeshwari Birje #ifdef CONFIG_POWER_MAX77686 28471ebb335SRajeshwari Birje ret = max77686_init(); 28571ebb335SRajeshwari Birje #endif 28671ebb335SRajeshwari Birje 28771ebb335SRajeshwari Birje return ret; 28871ebb335SRajeshwari Birje } 28971ebb335SRajeshwari Birje #endif 29071ebb335SRajeshwari Birje 29171ebb335SRajeshwari Birje #ifdef CONFIG_OF_CONTROL 29271ebb335SRajeshwari Birje static int decode_sromc(const void *blob, struct fdt_sromc *config) 29371ebb335SRajeshwari Birje { 29471ebb335SRajeshwari Birje int err; 29571ebb335SRajeshwari Birje int node; 29671ebb335SRajeshwari Birje 29771ebb335SRajeshwari Birje node = fdtdec_next_compatible(blob, 0, COMPAT_SAMSUNG_EXYNOS5_SROMC); 29871ebb335SRajeshwari Birje if (node < 0) { 29971ebb335SRajeshwari Birje debug("Could not find SROMC node\n"); 30071ebb335SRajeshwari Birje return node; 30171ebb335SRajeshwari Birje } 30271ebb335SRajeshwari Birje 30371ebb335SRajeshwari Birje config->bank = fdtdec_get_int(blob, node, "bank", 0); 30471ebb335SRajeshwari Birje config->width = fdtdec_get_int(blob, node, "width", 2); 30571ebb335SRajeshwari Birje 30671ebb335SRajeshwari Birje err = fdtdec_get_int_array(blob, node, "srom-timing", config->timing, 30771ebb335SRajeshwari Birje FDT_SROM_TIMING_COUNT); 30871ebb335SRajeshwari Birje if (err < 0) { 30971ebb335SRajeshwari Birje debug("Could not decode SROMC configuration Error: %s\n", 31071ebb335SRajeshwari Birje fdt_strerror(err)); 31171ebb335SRajeshwari Birje return -FDT_ERR_NOTFOUND; 31271ebb335SRajeshwari Birje } 31371ebb335SRajeshwari Birje return 0; 31471ebb335SRajeshwari Birje } 31571ebb335SRajeshwari Birje 31671ebb335SRajeshwari Birje int board_eth_init(bd_t *bis) 31771ebb335SRajeshwari Birje { 31871ebb335SRajeshwari Birje #ifdef CONFIG_SMC911X 31971ebb335SRajeshwari Birje u32 smc_bw_conf, smc_bc_conf; 32071ebb335SRajeshwari Birje struct fdt_sromc config; 32171ebb335SRajeshwari Birje fdt_addr_t base_addr; 32271ebb335SRajeshwari Birje int node; 32371ebb335SRajeshwari Birje 32471ebb335SRajeshwari Birje node = decode_sromc(gd->fdt_blob, &config); 32571ebb335SRajeshwari Birje if (node < 0) { 32671ebb335SRajeshwari Birje debug("%s: Could not find sromc configuration\n", __func__); 32771ebb335SRajeshwari Birje return 0; 32871ebb335SRajeshwari Birje } 32971ebb335SRajeshwari Birje node = fdtdec_next_compatible(gd->fdt_blob, node, COMPAT_SMSC_LAN9215); 33071ebb335SRajeshwari Birje if (node < 0) { 33171ebb335SRajeshwari Birje debug("%s: Could not find lan9215 configuration\n", __func__); 33271ebb335SRajeshwari Birje return 0; 33371ebb335SRajeshwari Birje } 33471ebb335SRajeshwari Birje 33571ebb335SRajeshwari Birje /* We now have a node, so any problems from now on are errors */ 33671ebb335SRajeshwari Birje base_addr = fdtdec_get_addr(gd->fdt_blob, node, "reg"); 33771ebb335SRajeshwari Birje if (base_addr == FDT_ADDR_T_NONE) { 33871ebb335SRajeshwari Birje debug("%s: Could not find lan9215 address\n", __func__); 33971ebb335SRajeshwari Birje return -1; 34071ebb335SRajeshwari Birje } 34171ebb335SRajeshwari Birje 34271ebb335SRajeshwari Birje /* Ethernet needs data bus width of 16 bits */ 34371ebb335SRajeshwari Birje if (config.width != 2) { 34471ebb335SRajeshwari Birje debug("%s: Unsupported bus width %d\n", __func__, 34571ebb335SRajeshwari Birje config.width); 34671ebb335SRajeshwari Birje return -1; 34771ebb335SRajeshwari Birje } 34871ebb335SRajeshwari Birje smc_bw_conf = SROMC_DATA16_WIDTH(config.bank) 34971ebb335SRajeshwari Birje | SROMC_BYTE_ENABLE(config.bank); 35071ebb335SRajeshwari Birje 35171ebb335SRajeshwari Birje smc_bc_conf = SROMC_BC_TACS(config.timing[FDT_SROM_TACS]) | 35271ebb335SRajeshwari Birje SROMC_BC_TCOS(config.timing[FDT_SROM_TCOS]) | 35371ebb335SRajeshwari Birje SROMC_BC_TACC(config.timing[FDT_SROM_TACC]) | 35471ebb335SRajeshwari Birje SROMC_BC_TCOH(config.timing[FDT_SROM_TCOH]) | 35571ebb335SRajeshwari Birje SROMC_BC_TAH(config.timing[FDT_SROM_TAH]) | 35671ebb335SRajeshwari Birje SROMC_BC_TACP(config.timing[FDT_SROM_TACP]) | 35771ebb335SRajeshwari Birje SROMC_BC_PMC(config.timing[FDT_SROM_PMC]); 35871ebb335SRajeshwari Birje 35971ebb335SRajeshwari Birje /* Select and configure the SROMC bank */ 36071ebb335SRajeshwari Birje exynos_pinmux_config(PERIPH_ID_SROMC, config.bank); 36171ebb335SRajeshwari Birje s5p_config_sromc(config.bank, smc_bw_conf, smc_bc_conf); 36271ebb335SRajeshwari Birje return smc911x_initialize(0, base_addr); 36371ebb335SRajeshwari Birje #endif 36471ebb335SRajeshwari Birje return 0; 36571ebb335SRajeshwari Birje } 36671ebb335SRajeshwari Birje 36771ebb335SRajeshwari Birje #ifdef CONFIG_GENERIC_MMC 36871ebb335SRajeshwari Birje int board_mmc_init(bd_t *bis) 36971ebb335SRajeshwari Birje { 37071ebb335SRajeshwari Birje int ret; 37171ebb335SRajeshwari Birje 37271ebb335SRajeshwari Birje /* dwmmc initializattion for available channels */ 37371ebb335SRajeshwari Birje ret = exynos_dwmmc_init(gd->fdt_blob); 37471ebb335SRajeshwari Birje if (ret) 37571ebb335SRajeshwari Birje debug("dwmmc init failed\n"); 37671ebb335SRajeshwari Birje 37771ebb335SRajeshwari Birje return ret; 37871ebb335SRajeshwari Birje } 37971ebb335SRajeshwari Birje #endif 38071ebb335SRajeshwari Birje #endif 38171ebb335SRajeshwari Birje 38271ebb335SRajeshwari Birje #ifdef CONFIG_BOARD_LATE_INIT 38371ebb335SRajeshwari Birje int board_late_init(void) 38471ebb335SRajeshwari Birje { 38571ebb335SRajeshwari Birje stdio_print_current_devices(); 38671ebb335SRajeshwari Birje 38771ebb335SRajeshwari Birje if (local.cros_ec_err) { 38871ebb335SRajeshwari Birje /* Force console on */ 38971ebb335SRajeshwari Birje gd->flags &= ~GD_FLG_SILENT; 39071ebb335SRajeshwari Birje 39171ebb335SRajeshwari Birje printf("cros-ec communications failure %d\n", 39271ebb335SRajeshwari Birje local.cros_ec_err); 39371ebb335SRajeshwari Birje puts("\nPlease reset with Power+Refresh\n\n"); 39471ebb335SRajeshwari Birje panic("Cannot init cros-ec device"); 39571ebb335SRajeshwari Birje return -1; 39671ebb335SRajeshwari Birje } 39771ebb335SRajeshwari Birje return 0; 39871ebb335SRajeshwari Birje } 39971ebb335SRajeshwari Birje #endif 40071ebb335SRajeshwari Birje 40171ebb335SRajeshwari Birje int arch_early_init_r(void) 40271ebb335SRajeshwari Birje { 40371ebb335SRajeshwari Birje #ifdef CONFIG_CROS_EC 40471ebb335SRajeshwari Birje if (board_init_cros_ec_devices(gd->fdt_blob)) { 40571ebb335SRajeshwari Birje printf("%s: Failed to init EC\n", __func__); 40671ebb335SRajeshwari Birje return 0; 40771ebb335SRajeshwari Birje } 40871ebb335SRajeshwari Birje #endif 40971ebb335SRajeshwari Birje 41071ebb335SRajeshwari Birje return 0; 41171ebb335SRajeshwari Birje } 412