183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 2e57c6e5bSMarcel Ziswiler /* 3e57c6e5bSMarcel Ziswiler * Copyright (C) 2012 Lucas Stach 4e57c6e5bSMarcel Ziswiler */ 5e57c6e5bSMarcel Ziswiler 6e57c6e5bSMarcel Ziswiler #include <common.h> 7e57c6e5bSMarcel Ziswiler #include <asm/arch/clock.h> 8e57c6e5bSMarcel Ziswiler #include <asm/arch/funcmux.h> 9e57c6e5bSMarcel Ziswiler #include <asm/arch/pinmux.h> 10a5825625SMarcel Ziswiler #include <asm/arch-tegra/ap.h> 11e57c6e5bSMarcel Ziswiler #include <asm/arch-tegra/board.h> 12a5825625SMarcel Ziswiler #include <asm/arch-tegra/tegra.h> 13e57c6e5bSMarcel Ziswiler #include <asm/gpio.h> 14a5825625SMarcel Ziswiler #include <asm/io.h> 1510ef82d3SMarcel Ziswiler #include <i2c.h> 16b891d010SMarcel Ziswiler #include <nand.h> 1737fa4125SStefan Agner #include "../common/tdx-common.h" 18b891d010SMarcel Ziswiler 19b891d010SMarcel Ziswiler DECLARE_GLOBAL_DATA_PTR; 2010ef82d3SMarcel Ziswiler 2110ef82d3SMarcel Ziswiler #define PMU_I2C_ADDRESS 0x34 2210ef82d3SMarcel Ziswiler #define MAX_I2C_RETRY 3 2310ef82d3SMarcel Ziswiler #define PMU_SUPPLYENE 0x14 2410ef82d3SMarcel Ziswiler #define PMU_SUPPLYENE_SYSINEN (1<<5) 2510ef82d3SMarcel Ziswiler #define PMU_SUPPLYENE_EXITSLREQ (1<<1) 26a5825625SMarcel Ziswiler 27a5825625SMarcel Ziswiler int arch_misc_init(void) 28a5825625SMarcel Ziswiler { 2910ef82d3SMarcel Ziswiler /* Disable PMIC sleep mode on low supply voltage */ 3010ef82d3SMarcel Ziswiler struct udevice *dev; 3110ef82d3SMarcel Ziswiler u8 addr, data[1]; 3210ef82d3SMarcel Ziswiler int err; 3310ef82d3SMarcel Ziswiler 3410ef82d3SMarcel Ziswiler err = i2c_get_chip_for_busnum(0, PMU_I2C_ADDRESS, 1, &dev); 3510ef82d3SMarcel Ziswiler if (err) { 3610ef82d3SMarcel Ziswiler debug("%s: Cannot find PMIC I2C chip\n", __func__); 3710ef82d3SMarcel Ziswiler return err; 3810ef82d3SMarcel Ziswiler } 3910ef82d3SMarcel Ziswiler 4010ef82d3SMarcel Ziswiler addr = PMU_SUPPLYENE; 4110ef82d3SMarcel Ziswiler 4210ef82d3SMarcel Ziswiler err = dm_i2c_read(dev, addr, data, 1); 4310ef82d3SMarcel Ziswiler if (err) { 4410ef82d3SMarcel Ziswiler debug("failed to get PMU_SUPPLYENE\n"); 4510ef82d3SMarcel Ziswiler return err; 4610ef82d3SMarcel Ziswiler } 4710ef82d3SMarcel Ziswiler 4810ef82d3SMarcel Ziswiler data[0] &= ~PMU_SUPPLYENE_SYSINEN; 4910ef82d3SMarcel Ziswiler data[0] |= PMU_SUPPLYENE_EXITSLREQ; 5010ef82d3SMarcel Ziswiler 5110ef82d3SMarcel Ziswiler err = dm_i2c_write(dev, addr, data, 1); 5210ef82d3SMarcel Ziswiler if (err) { 5310ef82d3SMarcel Ziswiler debug("failed to set PMU_SUPPLYENE\n"); 5410ef82d3SMarcel Ziswiler return err; 5510ef82d3SMarcel Ziswiler } 5610ef82d3SMarcel Ziswiler 57b7b20670SMarcel Ziswiler /* make sure SODIMM pin 87 nRESET_OUT is released properly */ 58b7b20670SMarcel Ziswiler pinmux_set_func(PMUX_PINGRP_ATA, PMUX_FUNC_GMI); 59b7b20670SMarcel Ziswiler 60a5825625SMarcel Ziswiler if (readl(NV_PA_BASE_SRAM + NVBOOTINFOTABLE_BOOTTYPE) == 61a5825625SMarcel Ziswiler NVBOOTTYPE_RECOVERY) 62a5825625SMarcel Ziswiler printf("USB recovery mode\n"); 63a5825625SMarcel Ziswiler 64a5825625SMarcel Ziswiler return 0; 65a5825625SMarcel Ziswiler } 66e57c6e5bSMarcel Ziswiler 67b891d010SMarcel Ziswiler int checkboard(void) 68b891d010SMarcel Ziswiler { 69b891d010SMarcel Ziswiler printf("Model: Toradex Colibri T20 %dMB V%s\n", 70b891d010SMarcel Ziswiler (gd->ram_size == 0x10000000) ? 256 : 512, 71bf264cd0SGrygorii Strashko (get_nand_dev_by_index(0)->erasesize >> 10 == 512) ? 72b891d010SMarcel Ziswiler ((gd->ram_size == 0x10000000) ? "1.1B" : "1.1C") : "1.2A"); 73b891d010SMarcel Ziswiler 74b891d010SMarcel Ziswiler return 0; 75b891d010SMarcel Ziswiler } 76b891d010SMarcel Ziswiler 7737fa4125SStefan Agner #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) 7837fa4125SStefan Agner int ft_board_setup(void *blob, bd_t *bd) 7937fa4125SStefan Agner { 8037fa4125SStefan Agner return ft_common_board_setup(blob, bd); 8137fa4125SStefan Agner } 8237fa4125SStefan Agner #endif 8337fa4125SStefan Agner 841d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_SDHCI_TEGRA 85e57c6e5bSMarcel Ziswiler /* 86e57c6e5bSMarcel Ziswiler * Routine: pin_mux_mmc 87e57c6e5bSMarcel Ziswiler * Description: setup the pin muxes/tristate values for the SDMMC(s) 88e57c6e5bSMarcel Ziswiler */ 89e57c6e5bSMarcel Ziswiler void pin_mux_mmc(void) 90e57c6e5bSMarcel Ziswiler { 91e57c6e5bSMarcel Ziswiler funcmux_select(PERIPH_ID_SDMMC4, FUNCMUX_SDMMC4_ATB_GMA_4_BIT); 92e57c6e5bSMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_GMB); 93e57c6e5bSMarcel Ziswiler } 94e57c6e5bSMarcel Ziswiler #endif 95e57c6e5bSMarcel Ziswiler 96e57c6e5bSMarcel Ziswiler #ifdef CONFIG_TEGRA_NAND 97e57c6e5bSMarcel Ziswiler void pin_mux_nand(void) 98e57c6e5bSMarcel Ziswiler { 99e57c6e5bSMarcel Ziswiler funcmux_select(PERIPH_ID_NDFLASH, FUNCMUX_NDFLASH_KBC_8_BIT); 10076a30fedSMarcel Ziswiler 10176a30fedSMarcel Ziswiler /* 10276a30fedSMarcel Ziswiler * configure pingroup ATC to something unrelated to 10376a30fedSMarcel Ziswiler * avoid ATC overriding KBC 10476a30fedSMarcel Ziswiler */ 10576a30fedSMarcel Ziswiler pinmux_set_func(PMUX_PINGRP_ATC, PMUX_FUNC_GMI); 106e57c6e5bSMarcel Ziswiler } 107e57c6e5bSMarcel Ziswiler #endif 108e57c6e5bSMarcel Ziswiler 109e57c6e5bSMarcel Ziswiler #ifdef CONFIG_USB_EHCI_TEGRA 110e57c6e5bSMarcel Ziswiler void pin_mux_usb(void) 111e57c6e5bSMarcel Ziswiler { 112e57c6e5bSMarcel Ziswiler /* module internal USB bus to connect ethernet chipset */ 113e57c6e5bSMarcel Ziswiler funcmux_select(PERIPH_ID_USB2, FUNCMUX_USB2_ULPI); 114e57c6e5bSMarcel Ziswiler 115e57c6e5bSMarcel Ziswiler /* ULPI reference clock output */ 116e57c6e5bSMarcel Ziswiler pinmux_set_func(PMUX_PINGRP_CDEV2, PMUX_FUNC_PLLP_OUT4); 117e57c6e5bSMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_CDEV2); 118e57c6e5bSMarcel Ziswiler 119e57c6e5bSMarcel Ziswiler /* PHY reset GPIO */ 120e57c6e5bSMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_UAC); 121e57c6e5bSMarcel Ziswiler 122e57c6e5bSMarcel Ziswiler /* VBus GPIO */ 123e57c6e5bSMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_DTE); 124e57c6e5bSMarcel Ziswiler 12500a5270bSMarcel Ziswiler /* Reset ASIX using LAN_RESET */ 12601a97a11SStephen Warren gpio_request(TEGRA_GPIO(V, 4), "LAN_RESET"); 12701a97a11SStephen Warren gpio_direction_output(TEGRA_GPIO(V, 4), 0); 12800a5270bSMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_GPV); 12900a5270bSMarcel Ziswiler udelay(5); 13001a97a11SStephen Warren gpio_set_value(TEGRA_GPIO(V, 4), 1); 13100a5270bSMarcel Ziswiler 13200a5270bSMarcel Ziswiler /* USBH_PEN: USB 1 aka Tegra USB port 3 VBus */ 133e57c6e5bSMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_SPIG); 134e57c6e5bSMarcel Ziswiler } 135e57c6e5bSMarcel Ziswiler #endif 136b2ea19b5SMarcel Ziswiler 137d2f90650SSimon Glass #ifdef CONFIG_VIDEO_TEGRA20 138b2ea19b5SMarcel Ziswiler /* 139b2ea19b5SMarcel Ziswiler * Routine: pin_mux_display 140b2ea19b5SMarcel Ziswiler * Description: setup the pin muxes/tristate values for the LCD interface) 141b2ea19b5SMarcel Ziswiler */ 142b2ea19b5SMarcel Ziswiler void pin_mux_display(void) 143b2ea19b5SMarcel Ziswiler { 144b2ea19b5SMarcel Ziswiler /* 145b2ea19b5SMarcel Ziswiler * Manually untristate BL_ON (PT4 - SODIMM 71) as specified through 146b2ea19b5SMarcel Ziswiler * device-tree 147b2ea19b5SMarcel Ziswiler */ 148b2ea19b5SMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_DTA); 149b2ea19b5SMarcel Ziswiler 150b2ea19b5SMarcel Ziswiler pinmux_set_func(PMUX_PINGRP_SDC, PMUX_FUNC_PWM); 151b2ea19b5SMarcel Ziswiler pinmux_tristate_disable(PMUX_PINGRP_SDC); 152b2ea19b5SMarcel Ziswiler } 153*a3c90217SGerard Salvatella 154*a3c90217SGerard Salvatella /* 155*a3c90217SGerard Salvatella * Backlight off before OS handover 156*a3c90217SGerard Salvatella */ 157*a3c90217SGerard Salvatella void board_preboot_os(void) 158*a3c90217SGerard Salvatella { 159*a3c90217SGerard Salvatella gpio_request(TEGRA_GPIO(T, 4), "BL_ON"); 160*a3c90217SGerard Salvatella gpio_direction_output(TEGRA_GPIO(T, 4), 0); 161*a3c90217SGerard Salvatella } 162b2ea19b5SMarcel Ziswiler #endif 163