147173483SFabio Estevam /* 247173483SFabio Estevam * Copyright (C) 2016 NXP Semiconductors 347173483SFabio Estevam * Author: Fabio Estevam <fabio.estevam@nxp.com> 447173483SFabio Estevam * 547173483SFabio Estevam * SPDX-License-Identifier: GPL-2.0+ 647173483SFabio Estevam */ 747173483SFabio Estevam 847173483SFabio Estevam #include <asm/arch/clock.h> 947173483SFabio Estevam #include <asm/arch/imx-regs.h> 1047173483SFabio Estevam #include <asm/arch/mx7-pins.h> 1147173483SFabio Estevam #include <asm/arch/sys_proto.h> 1247173483SFabio Estevam #include <asm/gpio.h> 1347173483SFabio Estevam #include <asm/imx-common/iomux-v3.h> 147d301a59SVanessa Maegima #include <asm/imx-common/mxc_i2c.h> 1547173483SFabio Estevam #include <asm/io.h> 1647173483SFabio Estevam #include <common.h> 1747173483SFabio Estevam #include <fsl_esdhc.h> 187d301a59SVanessa Maegima #include <i2c.h> 1947173483SFabio Estevam #include <mmc.h> 2047173483SFabio Estevam #include <asm/arch/crm_regs.h> 2147173483SFabio Estevam #include <usb.h> 227d301a59SVanessa Maegima #include <power/pmic.h> 237d301a59SVanessa Maegima #include <power/pfuze3000_pmic.h> 247d301a59SVanessa Maegima #include "../freescale/common/pfuze.h" 2547173483SFabio Estevam 2647173483SFabio Estevam DECLARE_GLOBAL_DATA_PTR; 2747173483SFabio Estevam 2847173483SFabio Estevam #define UART_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUS_PU100KOHM | \ 2947173483SFabio Estevam PAD_CTL_HYS) 3047173483SFabio Estevam #define USDHC_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \ 3147173483SFabio Estevam PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM) 3247173483SFabio Estevam 337d301a59SVanessa Maegima #define I2C_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \ 347d301a59SVanessa Maegima PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU100KOHM) 357d301a59SVanessa Maegima 367d301a59SVanessa Maegima #ifdef CONFIG_SYS_I2C_MXC 377d301a59SVanessa Maegima #define PC MUX_PAD_CTRL(I2C_PAD_CTRL) 387d301a59SVanessa Maegima /* I2C1 for PMIC */ 397d301a59SVanessa Maegima static struct i2c_pads_info i2c_pad_info1 = { 407d301a59SVanessa Maegima .scl = { 417d301a59SVanessa Maegima .i2c_mode = MX7D_PAD_I2C1_SCL__I2C1_SCL | PC, 427d301a59SVanessa Maegima .gpio_mode = MX7D_PAD_I2C1_SCL__GPIO4_IO8 | PC, 437d301a59SVanessa Maegima .gp = IMX_GPIO_NR(4, 8), 447d301a59SVanessa Maegima }, 457d301a59SVanessa Maegima .sda = { 467d301a59SVanessa Maegima .i2c_mode = MX7D_PAD_I2C1_SDA__I2C1_SDA | PC, 477d301a59SVanessa Maegima .gpio_mode = MX7D_PAD_I2C1_SDA__GPIO4_IO9 | PC, 487d301a59SVanessa Maegima .gp = IMX_GPIO_NR(4, 9), 497d301a59SVanessa Maegima }, 507d301a59SVanessa Maegima }; 517d301a59SVanessa Maegima #endif 527d301a59SVanessa Maegima 5347173483SFabio Estevam int dram_init(void) 5447173483SFabio Estevam { 5547173483SFabio Estevam gd->ram_size = PHYS_SDRAM_SIZE; 5647173483SFabio Estevam 5747173483SFabio Estevam return 0; 5847173483SFabio Estevam } 5947173483SFabio Estevam 600a35cc93SMarco Franchi static iomux_v3_cfg_t const wdog_pads[] = { 610a35cc93SMarco Franchi MX7D_PAD_GPIO1_IO00__WDOG1_WDOG_B | MUX_PAD_CTRL(NO_PAD_CTRL), 620a35cc93SMarco Franchi }; 630a35cc93SMarco Franchi 6447173483SFabio Estevam static iomux_v3_cfg_t const uart1_pads[] = { 6547173483SFabio Estevam MX7D_PAD_UART1_TX_DATA__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL), 6647173483SFabio Estevam MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL), 6747173483SFabio Estevam }; 6847173483SFabio Estevam 6947173483SFabio Estevam static iomux_v3_cfg_t const usdhc3_pads[] = { 7047173483SFabio Estevam MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7147173483SFabio Estevam MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7247173483SFabio Estevam MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7347173483SFabio Estevam MX7D_PAD_SD3_DATA1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7447173483SFabio Estevam MX7D_PAD_SD3_DATA2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7547173483SFabio Estevam MX7D_PAD_SD3_DATA3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7647173483SFabio Estevam MX7D_PAD_SD3_DATA4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7747173483SFabio Estevam MX7D_PAD_SD3_DATA5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7847173483SFabio Estevam MX7D_PAD_SD3_DATA6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 7947173483SFabio Estevam MX7D_PAD_SD3_DATA7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), 8047173483SFabio Estevam MX7D_PAD_SD3_RESET_B__SD3_RESET_B | MUX_PAD_CTRL(USDHC_PAD_CTRL), 8147173483SFabio Estevam }; 8247173483SFabio Estevam 8347173483SFabio Estevam static void setup_iomux_uart(void) 8447173483SFabio Estevam { 8547173483SFabio Estevam imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads)); 8647173483SFabio Estevam }; 8747173483SFabio Estevam 8847173483SFabio Estevam static struct fsl_esdhc_cfg usdhc_cfg[1] = { 8947173483SFabio Estevam {USDHC3_BASE_ADDR}, 9047173483SFabio Estevam }; 9147173483SFabio Estevam 9247173483SFabio Estevam int board_mmc_getcd(struct mmc *mmc) 9347173483SFabio Estevam { 9447173483SFabio Estevam /* Assume uSDHC3 emmc is always present */ 9547173483SFabio Estevam return 1; 9647173483SFabio Estevam } 9747173483SFabio Estevam 9847173483SFabio Estevam int board_mmc_init(bd_t *bis) 9947173483SFabio Estevam { 10047173483SFabio Estevam imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads)); 10147173483SFabio Estevam usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); 10247173483SFabio Estevam 10347173483SFabio Estevam return fsl_esdhc_initialize(bis, &usdhc_cfg[0]); 10447173483SFabio Estevam } 10547173483SFabio Estevam 10647173483SFabio Estevam int board_early_init_f(void) 10747173483SFabio Estevam { 10847173483SFabio Estevam setup_iomux_uart(); 10947173483SFabio Estevam 11047173483SFabio Estevam return 0; 11147173483SFabio Estevam } 11247173483SFabio Estevam 1137d301a59SVanessa Maegima #ifdef CONFIG_POWER 1147d301a59SVanessa Maegima #define I2C_PMIC 0 1157d301a59SVanessa Maegima static struct pmic *pfuze; 1167d301a59SVanessa Maegima int power_init_board(void) 1177d301a59SVanessa Maegima { 1187d301a59SVanessa Maegima int ret; 1197d301a59SVanessa Maegima unsigned int reg, rev_id; 1207d301a59SVanessa Maegima 1217d301a59SVanessa Maegima ret = power_pfuze3000_init(I2C_PMIC); 1227d301a59SVanessa Maegima if (ret) 1237d301a59SVanessa Maegima return ret; 1247d301a59SVanessa Maegima 1257d301a59SVanessa Maegima pfuze = pmic_get("PFUZE3000"); 1267d301a59SVanessa Maegima ret = pmic_probe(pfuze); 1277d301a59SVanessa Maegima if (ret) 1287d301a59SVanessa Maegima return ret; 1297d301a59SVanessa Maegima 1307d301a59SVanessa Maegima pmic_reg_read(pfuze, PFUZE3000_DEVICEID, ®); 1317d301a59SVanessa Maegima pmic_reg_read(pfuze, PFUZE3000_REVID, &rev_id); 1327d301a59SVanessa Maegima printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x\n", reg, rev_id); 1337d301a59SVanessa Maegima 1347d301a59SVanessa Maegima /* disable Low Power Mode during standby mode */ 1357d301a59SVanessa Maegima pmic_reg_write(pfuze, PFUZE3000_LDOGCTL, 0x1); 1367d301a59SVanessa Maegima 1377d301a59SVanessa Maegima return 0; 1387d301a59SVanessa Maegima } 1397d301a59SVanessa Maegima #endif 1407d301a59SVanessa Maegima 14147173483SFabio Estevam int board_init(void) 14247173483SFabio Estevam { 14347173483SFabio Estevam /* address of boot parameters */ 14447173483SFabio Estevam gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; 14547173483SFabio Estevam 1467d301a59SVanessa Maegima #ifdef CONFIG_SYS_I2C_MXC 1477d301a59SVanessa Maegima setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1); 1487d301a59SVanessa Maegima #endif 1497d301a59SVanessa Maegima 15047173483SFabio Estevam return 0; 15147173483SFabio Estevam } 15247173483SFabio Estevam 15347173483SFabio Estevam int checkboard(void) 15447173483SFabio Estevam { 155*d4ee5043SFabio Estevam char *mode; 156*d4ee5043SFabio Estevam 157*d4ee5043SFabio Estevam if (IS_ENABLED(CONFIG_ARMV7_BOOT_SEC_DEFAULT)) 158*d4ee5043SFabio Estevam mode = "secure"; 159*d4ee5043SFabio Estevam else 160*d4ee5043SFabio Estevam mode = "non-secure"; 161*d4ee5043SFabio Estevam 162*d4ee5043SFabio Estevam printf("Board: WARP7 in %s mode\n", mode); 16347173483SFabio Estevam 16447173483SFabio Estevam return 0; 16547173483SFabio Estevam } 16647173483SFabio Estevam 16747173483SFabio Estevam int board_usb_phy_mode(int port) 16847173483SFabio Estevam { 16947173483SFabio Estevam return USB_INIT_DEVICE; 17047173483SFabio Estevam } 1710a35cc93SMarco Franchi 1720a35cc93SMarco Franchi int board_late_init(void) 1730a35cc93SMarco Franchi { 1740a35cc93SMarco Franchi struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR; 1750a35cc93SMarco Franchi 1760a35cc93SMarco Franchi imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads)); 1770a35cc93SMarco Franchi 1780a35cc93SMarco Franchi set_wdog_reset(wdog); 1790a35cc93SMarco Franchi 1800a35cc93SMarco Franchi /* 1810a35cc93SMarco Franchi * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4), 1820a35cc93SMarco Franchi * since we use PMIC_PWRON to reset the board. 1830a35cc93SMarco Franchi */ 1840a35cc93SMarco Franchi clrsetbits_le16(&wdog->wcr, 0, 0x10); 1850a35cc93SMarco Franchi 1860a35cc93SMarco Franchi return 0; 1870a35cc93SMarco Franchi } 188