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> 16903fd795SSimon Glass #include <asm/gpio.h> 1771ebb335SRajeshwari Birje #include <asm/arch/board.h> 1871ebb335SRajeshwari Birje #include <asm/arch/cpu.h> 1971ebb335SRajeshwari Birje #include <asm/arch/dwmmc.h> 2071ebb335SRajeshwari Birje #include <asm/arch/mmc.h> 2171ebb335SRajeshwari Birje #include <asm/arch/pinmux.h> 2271ebb335SRajeshwari Birje #include <asm/arch/power.h> 23f0017175SAjay Kumar #include <asm/arch/system.h> 2471ebb335SRajeshwari Birje #include <asm/arch/sromc.h> 25431a1c56SPiotr Wilczek #include <lcd.h> 26622e5feeSPrzemyslaw Marczak #include <i2c.h> 2728f393cdSLukasz Majewski #include <usb.h> 28*302a7d00SJoonyoung Shim #include <dwc3-uboot.h> 29*302a7d00SJoonyoung Shim #include <samsung/misc.h> 3071ebb335SRajeshwari Birje 3171ebb335SRajeshwari Birje DECLARE_GLOBAL_DATA_PTR; 3271ebb335SRajeshwari Birje 33e7e60c13SJeroen Hofstee __weak int exynos_early_init_f(void) 348e5e1e6aSPiotr Wilczek { 358e5e1e6aSPiotr Wilczek return 0; 368e5e1e6aSPiotr Wilczek } 378e5e1e6aSPiotr Wilczek 38e7e60c13SJeroen Hofstee __weak int exynos_power_init(void) 398e5e1e6aSPiotr Wilczek { 408e5e1e6aSPiotr Wilczek return 0; 418e5e1e6aSPiotr Wilczek } 428e5e1e6aSPiotr Wilczek 4371ebb335SRajeshwari Birje #if defined CONFIG_EXYNOS_TMU 4471ebb335SRajeshwari Birje /* Boot Time Thermal Analysis for SoC temperature threshold breach */ 4571ebb335SRajeshwari Birje static void boot_temp_check(void) 4671ebb335SRajeshwari Birje { 4771ebb335SRajeshwari Birje int temp; 4871ebb335SRajeshwari Birje 4971ebb335SRajeshwari Birje switch (tmu_monitor(&temp)) { 5071ebb335SRajeshwari Birje case TMU_STATUS_NORMAL: 5171ebb335SRajeshwari Birje break; 5271ebb335SRajeshwari Birje case TMU_STATUS_TRIPPED: 5371ebb335SRajeshwari Birje /* 5471ebb335SRajeshwari Birje * Status TRIPPED ans WARNING means corresponding threshold 5571ebb335SRajeshwari Birje * breach 5671ebb335SRajeshwari Birje */ 5771ebb335SRajeshwari Birje puts("EXYNOS_TMU: TRIPPING! Device power going down ...\n"); 5871ebb335SRajeshwari Birje set_ps_hold_ctrl(); 5971ebb335SRajeshwari Birje hang(); 6071ebb335SRajeshwari Birje break; 6171ebb335SRajeshwari Birje case TMU_STATUS_WARNING: 6271ebb335SRajeshwari Birje puts("EXYNOS_TMU: WARNING! Temperature very high\n"); 6371ebb335SRajeshwari Birje break; 6471ebb335SRajeshwari Birje case TMU_STATUS_INIT: 6571ebb335SRajeshwari Birje /* 6671ebb335SRajeshwari Birje * TMU_STATUS_INIT means something is wrong with temperature 6771ebb335SRajeshwari Birje * sensing and TMU status was changed back from NORMAL to INIT. 6871ebb335SRajeshwari Birje */ 6971ebb335SRajeshwari Birje puts("EXYNOS_TMU: WARNING! Temperature sensing not done\n"); 7071ebb335SRajeshwari Birje break; 7171ebb335SRajeshwari Birje default: 7271ebb335SRajeshwari Birje debug("EXYNOS_TMU: Unknown TMU state\n"); 7371ebb335SRajeshwari Birje } 7471ebb335SRajeshwari Birje } 7571ebb335SRajeshwari Birje #endif 7671ebb335SRajeshwari Birje 7771ebb335SRajeshwari Birje int board_init(void) 7871ebb335SRajeshwari Birje { 7971ebb335SRajeshwari Birje gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); 8071ebb335SRajeshwari Birje #if defined CONFIG_EXYNOS_TMU 8171ebb335SRajeshwari Birje if (tmu_init(gd->fdt_blob) != TMU_STATUS_NORMAL) { 8271ebb335SRajeshwari Birje debug("%s: Failed to init TMU\n", __func__); 8371ebb335SRajeshwari Birje return -1; 8471ebb335SRajeshwari Birje } 8571ebb335SRajeshwari Birje boot_temp_check(); 8671ebb335SRajeshwari Birje #endif 87a0643e22SPrzemyslaw Marczak #ifdef CONFIG_TZSW_RESERVED_DRAM_SIZE 88a0643e22SPrzemyslaw Marczak /* The last few MB of memory can be reserved for secure firmware */ 89a0643e22SPrzemyslaw Marczak ulong size = CONFIG_TZSW_RESERVED_DRAM_SIZE; 9071ebb335SRajeshwari Birje 91a0643e22SPrzemyslaw Marczak gd->ram_size -= size; 92a0643e22SPrzemyslaw Marczak gd->bd->bi_dram[CONFIG_NR_DRAM_BANKS - 1].size -= size; 93a0643e22SPrzemyslaw Marczak #endif 9471ebb335SRajeshwari Birje return exynos_init(); 9571ebb335SRajeshwari Birje } 9671ebb335SRajeshwari Birje 9771ebb335SRajeshwari Birje int dram_init(void) 9871ebb335SRajeshwari Birje { 99c8b71a35SŁukasz Majewski unsigned int i; 10071ebb335SRajeshwari Birje u32 addr; 10171ebb335SRajeshwari Birje 10271ebb335SRajeshwari Birje for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 10371ebb335SRajeshwari Birje addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); 10471ebb335SRajeshwari Birje gd->ram_size += get_ram_size((long *)addr, SDRAM_BANK_SIZE); 10571ebb335SRajeshwari Birje } 10671ebb335SRajeshwari Birje return 0; 10771ebb335SRajeshwari Birje } 10871ebb335SRajeshwari Birje 10971ebb335SRajeshwari Birje void dram_init_banksize(void) 11071ebb335SRajeshwari Birje { 111c8b71a35SŁukasz Majewski unsigned int i; 11271ebb335SRajeshwari Birje u32 addr, size; 11371ebb335SRajeshwari Birje 11471ebb335SRajeshwari Birje for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 11571ebb335SRajeshwari Birje addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); 11671ebb335SRajeshwari Birje size = get_ram_size((long *)addr, SDRAM_BANK_SIZE); 11771ebb335SRajeshwari Birje 11871ebb335SRajeshwari Birje gd->bd->bi_dram[i].start = addr; 11971ebb335SRajeshwari Birje gd->bd->bi_dram[i].size = size; 12071ebb335SRajeshwari Birje } 12171ebb335SRajeshwari Birje } 12271ebb335SRajeshwari Birje 12371ebb335SRajeshwari Birje static int board_uart_init(void) 12471ebb335SRajeshwari Birje { 12571ebb335SRajeshwari Birje int err, uart_id, ret = 0; 12671ebb335SRajeshwari Birje 12771ebb335SRajeshwari Birje for (uart_id = PERIPH_ID_UART0; uart_id <= PERIPH_ID_UART3; uart_id++) { 12871ebb335SRajeshwari Birje err = exynos_pinmux_config(uart_id, PINMUX_FLAG_NONE); 12971ebb335SRajeshwari Birje if (err) { 13071ebb335SRajeshwari Birje debug("UART%d not configured\n", 13171ebb335SRajeshwari Birje (uart_id - PERIPH_ID_UART0)); 13271ebb335SRajeshwari Birje ret |= err; 13371ebb335SRajeshwari Birje } 13471ebb335SRajeshwari Birje } 13571ebb335SRajeshwari Birje return ret; 13671ebb335SRajeshwari Birje } 13771ebb335SRajeshwari Birje 13871ebb335SRajeshwari Birje #ifdef CONFIG_BOARD_EARLY_INIT_F 13971ebb335SRajeshwari Birje int board_early_init_f(void) 14071ebb335SRajeshwari Birje { 14171ebb335SRajeshwari Birje int err; 142d50c41efSPrzemyslaw Marczak #ifdef CONFIG_BOARD_TYPES 143d50c41efSPrzemyslaw Marczak set_board_type(); 144d50c41efSPrzemyslaw Marczak #endif 14571ebb335SRajeshwari Birje err = board_uart_init(); 14671ebb335SRajeshwari Birje if (err) { 14771ebb335SRajeshwari Birje debug("UART init failed\n"); 14871ebb335SRajeshwari Birje return err; 14971ebb335SRajeshwari Birje } 15071ebb335SRajeshwari Birje 15171ebb335SRajeshwari Birje #ifdef CONFIG_SYS_I2C_INIT_BOARD 15271ebb335SRajeshwari Birje board_i2c_init(gd->fdt_blob); 15371ebb335SRajeshwari Birje #endif 154f0017175SAjay Kumar 155f0017175SAjay Kumar #if defined(CONFIG_OF_CONTROL) && defined(CONFIG_EXYNOS_FB) 156f0017175SAjay Kumar /* 157f0017175SAjay Kumar * board_init_f(arch/arm/lib/board.c) calls lcd_setmem() which needs 158f0017175SAjay Kumar * panel_info.vl_col, panel_info.vl_row and panel_info.vl_bpix, to reserve 159f0017175SAjay Kumar * FB memory at a very early stage. So, we need to fill panel_info.vl_col, 160f0017175SAjay Kumar * panel_info.vl_row and panel_info.vl_bpix before lcd_setmem() is called. 161f0017175SAjay Kumar */ 162f0017175SAjay Kumar err = exynos_lcd_early_init(gd->fdt_blob); 163f0017175SAjay Kumar if (err) { 164f0017175SAjay Kumar debug("LCD early init failed\n"); 165f0017175SAjay Kumar return err; 166f0017175SAjay Kumar } 167f0017175SAjay Kumar #endif 168f0017175SAjay Kumar 1698e5e1e6aSPiotr Wilczek return exynos_early_init_f(); 17071ebb335SRajeshwari Birje } 17171ebb335SRajeshwari Birje #endif 17271ebb335SRajeshwari Birje 173622e5feeSPrzemyslaw Marczak #if defined(CONFIG_POWER) || defined(CONFIG_DM_PMIC) 17471ebb335SRajeshwari Birje int power_init_board(void) 17571ebb335SRajeshwari Birje { 17671ebb335SRajeshwari Birje set_ps_hold_ctrl(); 17771ebb335SRajeshwari Birje 1788e5e1e6aSPiotr Wilczek return exynos_power_init(); 17971ebb335SRajeshwari Birje } 18071ebb335SRajeshwari Birje #endif 18171ebb335SRajeshwari Birje 18271ebb335SRajeshwari Birje #ifdef CONFIG_OF_CONTROL 183431a1c56SPiotr Wilczek #ifdef CONFIG_SMC911X 18471ebb335SRajeshwari Birje static int decode_sromc(const void *blob, struct fdt_sromc *config) 18571ebb335SRajeshwari Birje { 18671ebb335SRajeshwari Birje int err; 18771ebb335SRajeshwari Birje int node; 18871ebb335SRajeshwari Birje 18971ebb335SRajeshwari Birje node = fdtdec_next_compatible(blob, 0, COMPAT_SAMSUNG_EXYNOS5_SROMC); 19071ebb335SRajeshwari Birje if (node < 0) { 19171ebb335SRajeshwari Birje debug("Could not find SROMC node\n"); 19271ebb335SRajeshwari Birje return node; 19371ebb335SRajeshwari Birje } 19471ebb335SRajeshwari Birje 19571ebb335SRajeshwari Birje config->bank = fdtdec_get_int(blob, node, "bank", 0); 19671ebb335SRajeshwari Birje config->width = fdtdec_get_int(blob, node, "width", 2); 19771ebb335SRajeshwari Birje 19871ebb335SRajeshwari Birje err = fdtdec_get_int_array(blob, node, "srom-timing", config->timing, 19971ebb335SRajeshwari Birje FDT_SROM_TIMING_COUNT); 20071ebb335SRajeshwari Birje if (err < 0) { 20171ebb335SRajeshwari Birje debug("Could not decode SROMC configuration Error: %s\n", 20271ebb335SRajeshwari Birje fdt_strerror(err)); 20371ebb335SRajeshwari Birje return -FDT_ERR_NOTFOUND; 20471ebb335SRajeshwari Birje } 20571ebb335SRajeshwari Birje return 0; 20671ebb335SRajeshwari Birje } 207431a1c56SPiotr Wilczek #endif 20871ebb335SRajeshwari Birje 20971ebb335SRajeshwari Birje int board_eth_init(bd_t *bis) 21071ebb335SRajeshwari Birje { 21171ebb335SRajeshwari Birje #ifdef CONFIG_SMC911X 21271ebb335SRajeshwari Birje u32 smc_bw_conf, smc_bc_conf; 21371ebb335SRajeshwari Birje struct fdt_sromc config; 21471ebb335SRajeshwari Birje fdt_addr_t base_addr; 21571ebb335SRajeshwari Birje int node; 21671ebb335SRajeshwari Birje 21771ebb335SRajeshwari Birje node = decode_sromc(gd->fdt_blob, &config); 21871ebb335SRajeshwari Birje if (node < 0) { 21971ebb335SRajeshwari Birje debug("%s: Could not find sromc configuration\n", __func__); 22071ebb335SRajeshwari Birje return 0; 22171ebb335SRajeshwari Birje } 22271ebb335SRajeshwari Birje node = fdtdec_next_compatible(gd->fdt_blob, node, COMPAT_SMSC_LAN9215); 22371ebb335SRajeshwari Birje if (node < 0) { 22471ebb335SRajeshwari Birje debug("%s: Could not find lan9215 configuration\n", __func__); 22571ebb335SRajeshwari Birje return 0; 22671ebb335SRajeshwari Birje } 22771ebb335SRajeshwari Birje 22871ebb335SRajeshwari Birje /* We now have a node, so any problems from now on are errors */ 22971ebb335SRajeshwari Birje base_addr = fdtdec_get_addr(gd->fdt_blob, node, "reg"); 23071ebb335SRajeshwari Birje if (base_addr == FDT_ADDR_T_NONE) { 23171ebb335SRajeshwari Birje debug("%s: Could not find lan9215 address\n", __func__); 23271ebb335SRajeshwari Birje return -1; 23371ebb335SRajeshwari Birje } 23471ebb335SRajeshwari Birje 23571ebb335SRajeshwari Birje /* Ethernet needs data bus width of 16 bits */ 23671ebb335SRajeshwari Birje if (config.width != 2) { 23771ebb335SRajeshwari Birje debug("%s: Unsupported bus width %d\n", __func__, 23871ebb335SRajeshwari Birje config.width); 23971ebb335SRajeshwari Birje return -1; 24071ebb335SRajeshwari Birje } 24171ebb335SRajeshwari Birje smc_bw_conf = SROMC_DATA16_WIDTH(config.bank) 24271ebb335SRajeshwari Birje | SROMC_BYTE_ENABLE(config.bank); 24371ebb335SRajeshwari Birje 24471ebb335SRajeshwari Birje smc_bc_conf = SROMC_BC_TACS(config.timing[FDT_SROM_TACS]) | 24571ebb335SRajeshwari Birje SROMC_BC_TCOS(config.timing[FDT_SROM_TCOS]) | 24671ebb335SRajeshwari Birje SROMC_BC_TACC(config.timing[FDT_SROM_TACC]) | 24771ebb335SRajeshwari Birje SROMC_BC_TCOH(config.timing[FDT_SROM_TCOH]) | 24871ebb335SRajeshwari Birje SROMC_BC_TAH(config.timing[FDT_SROM_TAH]) | 24971ebb335SRajeshwari Birje SROMC_BC_TACP(config.timing[FDT_SROM_TACP]) | 25071ebb335SRajeshwari Birje SROMC_BC_PMC(config.timing[FDT_SROM_PMC]); 25171ebb335SRajeshwari Birje 25271ebb335SRajeshwari Birje /* Select and configure the SROMC bank */ 25371ebb335SRajeshwari Birje exynos_pinmux_config(PERIPH_ID_SROMC, config.bank); 25471ebb335SRajeshwari Birje s5p_config_sromc(config.bank, smc_bw_conf, smc_bc_conf); 25571ebb335SRajeshwari Birje return smc911x_initialize(0, base_addr); 25671ebb335SRajeshwari Birje #endif 25771ebb335SRajeshwari Birje return 0; 25871ebb335SRajeshwari Birje } 25971ebb335SRajeshwari Birje 26071ebb335SRajeshwari Birje #ifdef CONFIG_GENERIC_MMC 26133a4fcf6SPrzemyslaw Marczak static int init_mmc(void) 26233a4fcf6SPrzemyslaw Marczak { 26333a4fcf6SPrzemyslaw Marczak #ifdef CONFIG_SDHCI 26433a4fcf6SPrzemyslaw Marczak return exynos_mmc_init(gd->fdt_blob); 26533a4fcf6SPrzemyslaw Marczak #else 26633a4fcf6SPrzemyslaw Marczak return 0; 26733a4fcf6SPrzemyslaw Marczak #endif 26833a4fcf6SPrzemyslaw Marczak } 26933a4fcf6SPrzemyslaw Marczak 27033a4fcf6SPrzemyslaw Marczak static int init_dwmmc(void) 27133a4fcf6SPrzemyslaw Marczak { 27233a4fcf6SPrzemyslaw Marczak #ifdef CONFIG_DWMMC 27333a4fcf6SPrzemyslaw Marczak return exynos_dwmmc_init(gd->fdt_blob); 27433a4fcf6SPrzemyslaw Marczak #else 27533a4fcf6SPrzemyslaw Marczak return 0; 27633a4fcf6SPrzemyslaw Marczak #endif 27733a4fcf6SPrzemyslaw Marczak } 27833a4fcf6SPrzemyslaw Marczak 27971ebb335SRajeshwari Birje int board_mmc_init(bd_t *bis) 28071ebb335SRajeshwari Birje { 28171ebb335SRajeshwari Birje int ret; 28271ebb335SRajeshwari Birje 28333a4fcf6SPrzemyslaw Marczak if (get_boot_mode() == BOOT_MODE_SD) { 28433a4fcf6SPrzemyslaw Marczak ret = init_mmc(); 28533a4fcf6SPrzemyslaw Marczak ret |= init_dwmmc(); 28633a4fcf6SPrzemyslaw Marczak } else { 28733a4fcf6SPrzemyslaw Marczak ret = init_dwmmc(); 28833a4fcf6SPrzemyslaw Marczak ret |= init_mmc(); 28933a4fcf6SPrzemyslaw Marczak } 29033a4fcf6SPrzemyslaw Marczak 29158209dfaSJaehoon Chung if (ret) 29258209dfaSJaehoon Chung debug("mmc init failed\n"); 29333a4fcf6SPrzemyslaw Marczak 29471ebb335SRajeshwari Birje return ret; 29571ebb335SRajeshwari Birje } 29671ebb335SRajeshwari Birje #endif 2974c1dd998SPiotr Wilczek 2984c1dd998SPiotr Wilczek #ifdef CONFIG_DISPLAY_BOARDINFO 2994c1dd998SPiotr Wilczek int checkboard(void) 3004c1dd998SPiotr Wilczek { 301d50c41efSPrzemyslaw Marczak const char *board_info; 3024c1dd998SPiotr Wilczek 303d50c41efSPrzemyslaw Marczak board_info = fdt_getprop(gd->fdt_blob, 0, "model", NULL); 304d50c41efSPrzemyslaw Marczak printf("Board: %s\n", board_info ? board_info : "unknown"); 305d50c41efSPrzemyslaw Marczak #ifdef CONFIG_BOARD_TYPES 306d50c41efSPrzemyslaw Marczak board_info = get_board_type(); 3074c1dd998SPiotr Wilczek 308d50c41efSPrzemyslaw Marczak printf("Model: %s\n", board_info ? board_info : "unknown"); 309d50c41efSPrzemyslaw Marczak #endif 3104c1dd998SPiotr Wilczek return 0; 3114c1dd998SPiotr Wilczek } 31271ebb335SRajeshwari Birje #endif 3134c1dd998SPiotr Wilczek #endif /* CONFIG_OF_CONTROL */ 31471ebb335SRajeshwari Birje 31571ebb335SRajeshwari Birje #ifdef CONFIG_BOARD_LATE_INIT 31671ebb335SRajeshwari Birje int board_late_init(void) 31771ebb335SRajeshwari Birje { 31871ebb335SRajeshwari Birje stdio_print_current_devices(); 31971ebb335SRajeshwari Birje 32041364f0fSVadim Bendebury if (cros_ec_get_error()) { 32171ebb335SRajeshwari Birje /* Force console on */ 32271ebb335SRajeshwari Birje gd->flags &= ~GD_FLG_SILENT; 32371ebb335SRajeshwari Birje 32471ebb335SRajeshwari Birje printf("cros-ec communications failure %d\n", 32541364f0fSVadim Bendebury cros_ec_get_error()); 32671ebb335SRajeshwari Birje puts("\nPlease reset with Power+Refresh\n\n"); 32771ebb335SRajeshwari Birje panic("Cannot init cros-ec device"); 32871ebb335SRajeshwari Birje return -1; 32971ebb335SRajeshwari Birje } 33071ebb335SRajeshwari Birje return 0; 33171ebb335SRajeshwari Birje } 33271ebb335SRajeshwari Birje #endif 33371ebb335SRajeshwari Birje 334431a1c56SPiotr Wilczek #ifdef CONFIG_MISC_INIT_R 335431a1c56SPiotr Wilczek int misc_init_r(void) 336431a1c56SPiotr Wilczek { 337431a1c56SPiotr Wilczek #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 338431a1c56SPiotr Wilczek set_board_info(); 339431a1c56SPiotr Wilczek #endif 340431a1c56SPiotr Wilczek #ifdef CONFIG_LCD_MENU 341431a1c56SPiotr Wilczek keys_init(); 342431a1c56SPiotr Wilczek check_boot_mode(); 343431a1c56SPiotr Wilczek #endif 344431a1c56SPiotr Wilczek #ifdef CONFIG_CMD_BMP 345431a1c56SPiotr Wilczek if (panel_info.logo_on) 346431a1c56SPiotr Wilczek draw_logo(); 347431a1c56SPiotr Wilczek #endif 348431a1c56SPiotr Wilczek return 0; 349431a1c56SPiotr Wilczek } 350431a1c56SPiotr Wilczek #endif 351aa8e00faSJoonyoung Shim 352aa8e00faSJoonyoung Shim void reset_misc(void) 353aa8e00faSJoonyoung Shim { 354aa8e00faSJoonyoung Shim struct gpio_desc gpio = {}; 355aa8e00faSJoonyoung Shim int node; 356aa8e00faSJoonyoung Shim 357aa8e00faSJoonyoung Shim node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, 358aa8e00faSJoonyoung Shim "samsung,emmc-reset"); 359aa8e00faSJoonyoung Shim if (node < 0) 360aa8e00faSJoonyoung Shim return; 361aa8e00faSJoonyoung Shim 362aa8e00faSJoonyoung Shim gpio_request_by_name_nodev(gd->fdt_blob, node, "reset-gpio", 0, &gpio, 363aa8e00faSJoonyoung Shim GPIOD_IS_OUT); 364aa8e00faSJoonyoung Shim 365aa8e00faSJoonyoung Shim if (dm_gpio_is_valid(&gpio)) { 366aa8e00faSJoonyoung Shim /* 367aa8e00faSJoonyoung Shim * Reset eMMC 368aa8e00faSJoonyoung Shim * 369aa8e00faSJoonyoung Shim * FIXME: Need to optimize delay time. Minimum 1usec pulse is 370aa8e00faSJoonyoung Shim * required by 'JEDEC Standard No.84-A441' (eMMC) 371aa8e00faSJoonyoung Shim * document but real delay time is expected to greater 372aa8e00faSJoonyoung Shim * than 1usec. 373aa8e00faSJoonyoung Shim */ 374aa8e00faSJoonyoung Shim dm_gpio_set_value(&gpio, 0); 375aa8e00faSJoonyoung Shim mdelay(10); 376aa8e00faSJoonyoung Shim dm_gpio_set_value(&gpio, 1); 377aa8e00faSJoonyoung Shim } 378aa8e00faSJoonyoung Shim } 37928f393cdSLukasz Majewski 38028f393cdSLukasz Majewski int board_usb_cleanup(int index, enum usb_init_type init) 38128f393cdSLukasz Majewski { 382*302a7d00SJoonyoung Shim #ifdef CONFIG_USB_DWC3 383*302a7d00SJoonyoung Shim dwc3_uboot_exit(index); 384*302a7d00SJoonyoung Shim #endif 38528f393cdSLukasz Majewski return 0; 38628f393cdSLukasz Majewski } 387