1*d0dd7397SPeng Fan // SPDX-License-Identifier: GPL-2.0+ 2*d0dd7397SPeng Fan /* 3*d0dd7397SPeng Fan * Copyright 2018 NXP 4*d0dd7397SPeng Fan */ 5*d0dd7397SPeng Fan 6*d0dd7397SPeng Fan #include <common.h> 7*d0dd7397SPeng Fan #include <errno.h> 8*d0dd7397SPeng Fan #include <linux/libfdt.h> 9*d0dd7397SPeng Fan #include <environment.h> 10*d0dd7397SPeng Fan #include <fsl_esdhc.h> 11*d0dd7397SPeng Fan #include <asm/io.h> 12*d0dd7397SPeng Fan #include <asm/gpio.h> 13*d0dd7397SPeng Fan #include <asm/arch/clock.h> 14*d0dd7397SPeng Fan #include <asm/arch/sci/sci.h> 15*d0dd7397SPeng Fan #include <asm/arch/imx8-pins.h> 16*d0dd7397SPeng Fan #include <asm/arch/iomux.h> 17*d0dd7397SPeng Fan #include <asm/arch/sys_proto.h> 18*d0dd7397SPeng Fan 19*d0dd7397SPeng Fan DECLARE_GLOBAL_DATA_PTR; 20*d0dd7397SPeng Fan 21*d0dd7397SPeng Fan #define GPIO_PAD_CTRL ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | \ 22*d0dd7397SPeng Fan (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \ 23*d0dd7397SPeng Fan (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \ 24*d0dd7397SPeng Fan (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT)) 25*d0dd7397SPeng Fan 26*d0dd7397SPeng Fan #define UART_PAD_CTRL ((SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \ 27*d0dd7397SPeng Fan (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \ 28*d0dd7397SPeng Fan (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | \ 29*d0dd7397SPeng Fan (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT)) 30*d0dd7397SPeng Fan 31*d0dd7397SPeng Fan static iomux_cfg_t uart0_pads[] = { 32*d0dd7397SPeng Fan SC_P_UART0_RX | MUX_PAD_CTRL(UART_PAD_CTRL), 33*d0dd7397SPeng Fan SC_P_UART0_TX | MUX_PAD_CTRL(UART_PAD_CTRL), 34*d0dd7397SPeng Fan }; 35*d0dd7397SPeng Fan 36*d0dd7397SPeng Fan static void setup_iomux_uart(void) 37*d0dd7397SPeng Fan { 38*d0dd7397SPeng Fan imx8_iomux_setup_multiple_pads(uart0_pads, ARRAY_SIZE(uart0_pads)); 39*d0dd7397SPeng Fan } 40*d0dd7397SPeng Fan 41*d0dd7397SPeng Fan int board_early_init_f(void) 42*d0dd7397SPeng Fan { 43*d0dd7397SPeng Fan int ret; 44*d0dd7397SPeng Fan /* Set UART0 clock root to 80 MHz */ 45*d0dd7397SPeng Fan sc_pm_clock_rate_t rate = 80000000; 46*d0dd7397SPeng Fan 47*d0dd7397SPeng Fan /* Power up UART0 */ 48*d0dd7397SPeng Fan ret = sc_pm_set_resource_power_mode(-1, SC_R_UART_0, SC_PM_PW_MODE_ON); 49*d0dd7397SPeng Fan if (ret) 50*d0dd7397SPeng Fan return ret; 51*d0dd7397SPeng Fan 52*d0dd7397SPeng Fan ret = sc_pm_set_clock_rate(-1, SC_R_UART_0, 2, &rate); 53*d0dd7397SPeng Fan if (ret) 54*d0dd7397SPeng Fan return ret; 55*d0dd7397SPeng Fan 56*d0dd7397SPeng Fan /* Enable UART0 clock root */ 57*d0dd7397SPeng Fan ret = sc_pm_clock_enable(-1, SC_R_UART_0, 2, true, false); 58*d0dd7397SPeng Fan if (ret) 59*d0dd7397SPeng Fan return ret; 60*d0dd7397SPeng Fan 61*d0dd7397SPeng Fan setup_iomux_uart(); 62*d0dd7397SPeng Fan 63*d0dd7397SPeng Fan return 0; 64*d0dd7397SPeng Fan } 65*d0dd7397SPeng Fan 66*d0dd7397SPeng Fan #if IS_ENABLED(CONFIG_DM_GPIO) 67*d0dd7397SPeng Fan static void board_gpio_init(void) 68*d0dd7397SPeng Fan { 69*d0dd7397SPeng Fan struct gpio_desc desc; 70*d0dd7397SPeng Fan int ret; 71*d0dd7397SPeng Fan 72*d0dd7397SPeng Fan ret = dm_gpio_lookup_name("gpio@1a_3", &desc); 73*d0dd7397SPeng Fan if (ret) 74*d0dd7397SPeng Fan return; 75*d0dd7397SPeng Fan 76*d0dd7397SPeng Fan ret = dm_gpio_request(&desc, "bb_per_rst_b"); 77*d0dd7397SPeng Fan if (ret) 78*d0dd7397SPeng Fan return; 79*d0dd7397SPeng Fan 80*d0dd7397SPeng Fan dm_gpio_set_dir_flags(&desc, GPIOD_IS_OUT); 81*d0dd7397SPeng Fan dm_gpio_set_value(&desc, 0); 82*d0dd7397SPeng Fan udelay(50); 83*d0dd7397SPeng Fan dm_gpio_set_value(&desc, 1); 84*d0dd7397SPeng Fan } 85*d0dd7397SPeng Fan #else 86*d0dd7397SPeng Fan static inline void board_gpio_init(void) {} 87*d0dd7397SPeng Fan #endif 88*d0dd7397SPeng Fan 89*d0dd7397SPeng Fan #if IS_ENABLED(CONFIG_FEC_MXC) 90*d0dd7397SPeng Fan #include <miiphy.h> 91*d0dd7397SPeng Fan 92*d0dd7397SPeng Fan int board_phy_config(struct phy_device *phydev) 93*d0dd7397SPeng Fan { 94*d0dd7397SPeng Fan phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f); 95*d0dd7397SPeng Fan phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x8); 96*d0dd7397SPeng Fan 97*d0dd7397SPeng Fan phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05); 98*d0dd7397SPeng Fan phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100); 99*d0dd7397SPeng Fan 100*d0dd7397SPeng Fan if (phydev->drv->config) 101*d0dd7397SPeng Fan phydev->drv->config(phydev); 102*d0dd7397SPeng Fan 103*d0dd7397SPeng Fan return 0; 104*d0dd7397SPeng Fan } 105*d0dd7397SPeng Fan #endif 106*d0dd7397SPeng Fan 107*d0dd7397SPeng Fan void build_info(void) 108*d0dd7397SPeng Fan { 109*d0dd7397SPeng Fan u32 sc_build = 0, sc_commit = 0; 110*d0dd7397SPeng Fan 111*d0dd7397SPeng Fan /* Get SCFW build and commit id */ 112*d0dd7397SPeng Fan sc_misc_build_info(-1, &sc_build, &sc_commit); 113*d0dd7397SPeng Fan if (!sc_build) { 114*d0dd7397SPeng Fan printf("SCFW does not support build info\n"); 115*d0dd7397SPeng Fan sc_commit = 0; /* Display 0 when the build info is not supported*/ 116*d0dd7397SPeng Fan } 117*d0dd7397SPeng Fan printf("Build: SCFW %x\n", sc_commit); 118*d0dd7397SPeng Fan } 119*d0dd7397SPeng Fan 120*d0dd7397SPeng Fan int checkboard(void) 121*d0dd7397SPeng Fan { 122*d0dd7397SPeng Fan puts("Board: iMX8QXP MEK\n"); 123*d0dd7397SPeng Fan 124*d0dd7397SPeng Fan build_info(); 125*d0dd7397SPeng Fan print_bootinfo(); 126*d0dd7397SPeng Fan 127*d0dd7397SPeng Fan return 0; 128*d0dd7397SPeng Fan } 129*d0dd7397SPeng Fan 130*d0dd7397SPeng Fan int board_init(void) 131*d0dd7397SPeng Fan { 132*d0dd7397SPeng Fan board_gpio_init(); 133*d0dd7397SPeng Fan 134*d0dd7397SPeng Fan return 0; 135*d0dd7397SPeng Fan } 136*d0dd7397SPeng Fan 137*d0dd7397SPeng Fan void detail_board_ddr_info(void) 138*d0dd7397SPeng Fan { 139*d0dd7397SPeng Fan puts("\nDDR "); 140*d0dd7397SPeng Fan } 141*d0dd7397SPeng Fan 142*d0dd7397SPeng Fan /* 143*d0dd7397SPeng Fan * Board specific reset that is system reset. 144*d0dd7397SPeng Fan */ 145*d0dd7397SPeng Fan void reset_cpu(ulong addr) 146*d0dd7397SPeng Fan { 147*d0dd7397SPeng Fan /* TODO */ 148*d0dd7397SPeng Fan } 149*d0dd7397SPeng Fan 150*d0dd7397SPeng Fan #ifdef CONFIG_OF_BOARD_SETUP 151*d0dd7397SPeng Fan int ft_board_setup(void *blob, bd_t *bd) 152*d0dd7397SPeng Fan { 153*d0dd7397SPeng Fan return 0; 154*d0dd7397SPeng Fan } 155*d0dd7397SPeng Fan #endif 156*d0dd7397SPeng Fan 157*d0dd7397SPeng Fan int board_mmc_get_env_dev(int devno) 158*d0dd7397SPeng Fan { 159*d0dd7397SPeng Fan return devno; 160*d0dd7397SPeng Fan } 161*d0dd7397SPeng Fan 162*d0dd7397SPeng Fan int board_late_init(void) 163*d0dd7397SPeng Fan { 164*d0dd7397SPeng Fan #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 165*d0dd7397SPeng Fan env_set("board_name", "MEK"); 166*d0dd7397SPeng Fan env_set("board_rev", "iMX8QXP"); 167*d0dd7397SPeng Fan #endif 168*d0dd7397SPeng Fan 169*d0dd7397SPeng Fan return 0; 170*d0dd7397SPeng Fan } 171