hwinit.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. *
  4. * Common functions for OMAP4 based boards
  5. *
  6. * (C) Copyright 2010
  7. * Texas Instruments, <www.ti.com>
  8. *
  9. * Author :
  10. * Aneesh V <aneesh@ti.com>
  11. * Steve Sakoman <steve@sakoman.com>
  12. */
  13. #include <common.h>
  14. #include <palmas.h>
  15. #include <asm/armv7.h>
  16. #include <asm/arch/cpu.h>
  17. #include <asm/arch/sys_proto.h>
  18. #include <linux/sizes.h>
  19. #include <asm/emif.h>
  20. #include <asm/arch/gpio.h>
  21. #include <asm/omap_common.h>
  22. u32 *const omap_si_rev = (u32 *)OMAP_SRAM_SCRATCH_OMAP_REV;
  23. static const struct gpio_bank gpio_bank_44xx[6] = {
  24. { (void *)OMAP44XX_GPIO1_BASE },
  25. { (void *)OMAP44XX_GPIO2_BASE },
  26. { (void *)OMAP44XX_GPIO3_BASE },
  27. { (void *)OMAP44XX_GPIO4_BASE },
  28. { (void *)OMAP44XX_GPIO5_BASE },
  29. { (void *)OMAP44XX_GPIO6_BASE },
  30. };
  31. const struct gpio_bank *const omap_gpio_bank = gpio_bank_44xx;
  32. #ifdef CONFIG_SPL_BUILD
  33. /*
  34. * Some tuning of IOs for optimal power and performance
  35. */
  36. void do_io_settings(void)
  37. {
  38. u32 lpddr2io;
  39. u32 omap4_rev = omap_revision();
  40. if (omap4_rev == OMAP4430_ES1_0)
  41. lpddr2io = CONTROL_LPDDR2IO_SLEW_125PS_DRV8_PULL_DOWN;
  42. else if (omap4_rev == OMAP4430_ES2_0)
  43. lpddr2io = CONTROL_LPDDR2IO_SLEW_325PS_DRV8_GATE_KEEPER;
  44. else
  45. lpddr2io = CONTROL_LPDDR2IO_SLEW_315PS_DRV12_PULL_DOWN;
  46. /* EMIF1 */
  47. writel(lpddr2io, (*ctrl)->control_lpddr2io1_0);
  48. writel(lpddr2io, (*ctrl)->control_lpddr2io1_1);
  49. /* No pull for GR10 as per hw team's recommendation */
  50. writel(lpddr2io & ~LPDDR2IO_GR10_WD_MASK,
  51. (*ctrl)->control_lpddr2io1_2);
  52. writel(CONTROL_LPDDR2IO_3_VAL, (*ctrl)->control_lpddr2io1_3);
  53. /* EMIF2 */
  54. writel(lpddr2io, (*ctrl)->control_lpddr2io2_0);
  55. writel(lpddr2io, (*ctrl)->control_lpddr2io2_1);
  56. /* No pull for GR10 as per hw team's recommendation */
  57. writel(lpddr2io & ~LPDDR2IO_GR10_WD_MASK,
  58. (*ctrl)->control_lpddr2io2_2);
  59. writel(CONTROL_LPDDR2IO_3_VAL, (*ctrl)->control_lpddr2io2_3);
  60. /*
  61. * Some of these settings (TRIM values) come from eFuse and are
  62. * in turn programmed in the eFuse at manufacturing time after
  63. * calibration of the device. Do the software over-ride only if
  64. * the device is not correctly trimmed
  65. */
  66. if (!(readl((*ctrl)->control_std_fuse_opp_bgap) & 0xFFFF)) {
  67. writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
  68. (*ctrl)->control_ldosram_iva_voltage_ctrl);
  69. writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
  70. (*ctrl)->control_ldosram_mpu_voltage_ctrl);
  71. writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
  72. (*ctrl)->control_ldosram_core_voltage_ctrl);
  73. }
  74. /*
  75. * Over-ride the register
  76. * i. unconditionally for all 4430
  77. * ii. only if un-trimmed for 4460
  78. */
  79. if (!readl((*ctrl)->control_efuse_1))
  80. writel(CONTROL_EFUSE_1_OVERRIDE, (*ctrl)->control_efuse_1);
  81. if ((omap4_rev < OMAP4460_ES1_0) || !readl((*ctrl)->control_efuse_2))
  82. writel(CONTROL_EFUSE_2_OVERRIDE, (*ctrl)->control_efuse_2);
  83. }
  84. #endif /* CONFIG_SPL_BUILD */
  85. /* dummy fuction for omap4 */
  86. void config_data_eye_leveling_samples(u32 emif_base)
  87. {
  88. }
  89. void init_omap_revision(void)
  90. {
  91. /*
  92. * For some of the ES2/ES1 boards ID_CODE is not reliable:
  93. * Also, ES1 and ES2 have different ARM revisions
  94. * So use ARM revision for identification
  95. */
  96. unsigned int arm_rev = cortex_rev();
  97. switch (arm_rev) {
  98. case MIDR_CORTEX_A9_R0P1:
  99. *omap_si_rev = OMAP4430_ES1_0;
  100. break;
  101. case MIDR_CORTEX_A9_R1P2:
  102. switch (readl(CONTROL_ID_CODE)) {
  103. case OMAP4_CONTROL_ID_CODE_ES2_0:
  104. *omap_si_rev = OMAP4430_ES2_0;
  105. break;
  106. case OMAP4_CONTROL_ID_CODE_ES2_1:
  107. *omap_si_rev = OMAP4430_ES2_1;
  108. break;
  109. case OMAP4_CONTROL_ID_CODE_ES2_2:
  110. *omap_si_rev = OMAP4430_ES2_2;
  111. break;
  112. default:
  113. *omap_si_rev = OMAP4430_ES2_0;
  114. break;
  115. }
  116. break;
  117. case MIDR_CORTEX_A9_R1P3:
  118. *omap_si_rev = OMAP4430_ES2_3;
  119. break;
  120. case MIDR_CORTEX_A9_R2P10:
  121. switch (readl(CONTROL_ID_CODE)) {
  122. case OMAP4470_CONTROL_ID_CODE_ES1_0:
  123. *omap_si_rev = OMAP4470_ES1_0;
  124. break;
  125. case OMAP4460_CONTROL_ID_CODE_ES1_1:
  126. *omap_si_rev = OMAP4460_ES1_1;
  127. break;
  128. case OMAP4460_CONTROL_ID_CODE_ES1_0:
  129. default:
  130. *omap_si_rev = OMAP4460_ES1_0;
  131. break;
  132. }
  133. break;
  134. default:
  135. *omap_si_rev = OMAP4430_SILICON_ID_INVALID;
  136. break;
  137. }
  138. }
  139. void omap_die_id(unsigned int *die_id)
  140. {
  141. die_id[0] = readl((*ctrl)->control_std_fuse_die_id_0);
  142. die_id[1] = readl((*ctrl)->control_std_fuse_die_id_1);
  143. die_id[2] = readl((*ctrl)->control_std_fuse_die_id_2);
  144. die_id[3] = readl((*ctrl)->control_std_fuse_die_id_3);
  145. }
  146. #ifndef CONFIG_SYS_L2CACHE_OFF
  147. void v7_outer_cache_enable(void)
  148. {
  149. omap_smc1(OMAP4_SERVICE_PL310_CONTROL_REG_SET, 1);
  150. }
  151. void v7_outer_cache_disable(void)
  152. {
  153. omap_smc1(OMAP4_SERVICE_PL310_CONTROL_REG_SET, 0);
  154. }
  155. #endif /* !CONFIG_SYS_L2CACHE_OFF */
  156. void vmmc_pbias_config(uint voltage)
  157. {
  158. u32 value = 0;
  159. value = readl((*ctrl)->control_pbiaslite);
  160. value &= ~(MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ);
  161. writel(value, (*ctrl)->control_pbiaslite);
  162. value = readl((*ctrl)->control_pbiaslite);
  163. value |= MMC1_PBIASLITE_VMODE | MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ;
  164. writel(value, (*ctrl)->control_pbiaslite);
  165. }