colibri_t20.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2012 Lucas Stach
  4. */
  5. #include <common.h>
  6. #include <asm/arch/clock.h>
  7. #include <asm/arch/funcmux.h>
  8. #include <asm/arch/pinmux.h>
  9. #include <asm/arch-tegra/ap.h>
  10. #include <asm/arch-tegra/board.h>
  11. #include <asm/arch-tegra/tegra.h>
  12. #include <asm/gpio.h>
  13. #include <asm/io.h>
  14. #include <i2c.h>
  15. #include <nand.h>
  16. #include "../common/tdx-common.h"
  17. DECLARE_GLOBAL_DATA_PTR;
  18. #define PMU_I2C_ADDRESS 0x34
  19. #define MAX_I2C_RETRY 3
  20. #define PMU_SUPPLYENE 0x14
  21. #define PMU_SUPPLYENE_SYSINEN (1<<5)
  22. #define PMU_SUPPLYENE_EXITSLREQ (1<<1)
  23. int arch_misc_init(void)
  24. {
  25. /* Disable PMIC sleep mode on low supply voltage */
  26. struct udevice *dev;
  27. u8 addr, data[1];
  28. int err;
  29. err = i2c_get_chip_for_busnum(0, PMU_I2C_ADDRESS, 1, &dev);
  30. if (err) {
  31. debug("%s: Cannot find PMIC I2C chip\n", __func__);
  32. return err;
  33. }
  34. addr = PMU_SUPPLYENE;
  35. err = dm_i2c_read(dev, addr, data, 1);
  36. if (err) {
  37. debug("failed to get PMU_SUPPLYENE\n");
  38. return err;
  39. }
  40. data[0] &= ~PMU_SUPPLYENE_SYSINEN;
  41. data[0] |= PMU_SUPPLYENE_EXITSLREQ;
  42. err = dm_i2c_write(dev, addr, data, 1);
  43. if (err) {
  44. debug("failed to set PMU_SUPPLYENE\n");
  45. return err;
  46. }
  47. /* make sure SODIMM pin 87 nRESET_OUT is released properly */
  48. pinmux_set_func(PMUX_PINGRP_ATA, PMUX_FUNC_GMI);
  49. if (readl(NV_PA_BASE_SRAM + NVBOOTINFOTABLE_BOOTTYPE) ==
  50. NVBOOTTYPE_RECOVERY)
  51. printf("USB recovery mode\n");
  52. return 0;
  53. }
  54. int checkboard(void)
  55. {
  56. printf("Model: Toradex Colibri T20 %dMB V%s\n",
  57. (gd->ram_size == 0x10000000) ? 256 : 512,
  58. (get_nand_dev_by_index(0)->erasesize >> 10 == 512) ?
  59. ((gd->ram_size == 0x10000000) ? "1.1B" : "1.1C") : "1.2A");
  60. return 0;
  61. }
  62. #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
  63. int ft_board_setup(void *blob, bd_t *bd)
  64. {
  65. return ft_common_board_setup(blob, bd);
  66. }
  67. #endif
  68. #ifdef CONFIG_MMC_SDHCI_TEGRA
  69. /*
  70. * Routine: pin_mux_mmc
  71. * Description: setup the pin muxes/tristate values for the SDMMC(s)
  72. */
  73. void pin_mux_mmc(void)
  74. {
  75. funcmux_select(PERIPH_ID_SDMMC4, FUNCMUX_SDMMC4_ATB_GMA_4_BIT);
  76. pinmux_tristate_disable(PMUX_PINGRP_GMB);
  77. }
  78. #endif
  79. #ifdef CONFIG_TEGRA_NAND
  80. void pin_mux_nand(void)
  81. {
  82. funcmux_select(PERIPH_ID_NDFLASH, FUNCMUX_NDFLASH_KBC_8_BIT);
  83. /*
  84. * configure pingroup ATC to something unrelated to
  85. * avoid ATC overriding KBC
  86. */
  87. pinmux_set_func(PMUX_PINGRP_ATC, PMUX_FUNC_GMI);
  88. }
  89. #endif
  90. #ifdef CONFIG_USB_EHCI_TEGRA
  91. void pin_mux_usb(void)
  92. {
  93. /* module internal USB bus to connect ethernet chipset */
  94. funcmux_select(PERIPH_ID_USB2, FUNCMUX_USB2_ULPI);
  95. /* ULPI reference clock output */
  96. pinmux_set_func(PMUX_PINGRP_CDEV2, PMUX_FUNC_PLLP_OUT4);
  97. pinmux_tristate_disable(PMUX_PINGRP_CDEV2);
  98. /* PHY reset GPIO */
  99. pinmux_tristate_disable(PMUX_PINGRP_UAC);
  100. /* VBus GPIO */
  101. pinmux_tristate_disable(PMUX_PINGRP_DTE);
  102. /* Reset ASIX using LAN_RESET */
  103. gpio_request(TEGRA_GPIO(V, 4), "LAN_RESET");
  104. gpio_direction_output(TEGRA_GPIO(V, 4), 0);
  105. pinmux_tristate_disable(PMUX_PINGRP_GPV);
  106. udelay(5);
  107. gpio_set_value(TEGRA_GPIO(V, 4), 1);
  108. /* USBH_PEN: USB 1 aka Tegra USB port 3 VBus */
  109. pinmux_tristate_disable(PMUX_PINGRP_SPIG);
  110. }
  111. #endif
  112. #ifdef CONFIG_VIDEO_TEGRA20
  113. /*
  114. * Routine: pin_mux_display
  115. * Description: setup the pin muxes/tristate values for the LCD interface)
  116. */
  117. void pin_mux_display(void)
  118. {
  119. /*
  120. * Manually untristate BL_ON (PT4 - SODIMM 71) as specified through
  121. * device-tree
  122. */
  123. pinmux_tristate_disable(PMUX_PINGRP_DTA);
  124. pinmux_set_func(PMUX_PINGRP_SDC, PMUX_FUNC_PWM);
  125. pinmux_tristate_disable(PMUX_PINGRP_SDC);
  126. }
  127. #endif