link.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * Copyright (C) 2014 Google, Inc
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <cros_ec.h>
  8. #include <asm/gpio.h>
  9. #include <asm/io.h>
  10. #include <asm/pci.h>
  11. #include <asm/arch/pch.h>
  12. int arch_early_init_r(void)
  13. {
  14. if (cros_ec_board_init())
  15. return -1;
  16. return 0;
  17. }
  18. static const struct pch_gpio_set1 pch_gpio_set1_mode = {
  19. .gpio0 = GPIO_MODE_GPIO, /* NMI_DBG# */
  20. .gpio3 = GPIO_MODE_GPIO, /* ALS_INT# */
  21. .gpio5 = GPIO_MODE_GPIO, /* SIM_DET */
  22. .gpio7 = GPIO_MODE_GPIO, /* EC_SCI# */
  23. .gpio8 = GPIO_MODE_GPIO, /* EC_SMI# */
  24. .gpio9 = GPIO_MODE_GPIO, /* RECOVERY# */
  25. .gpio10 = GPIO_MODE_GPIO, /* SPD vector D3 */
  26. .gpio11 = GPIO_MODE_GPIO, /* smbalert#, let's keep it initialized */
  27. .gpio12 = GPIO_MODE_GPIO, /* TP_INT# */
  28. .gpio14 = GPIO_MODE_GPIO, /* Touch_INT_L */
  29. .gpio15 = GPIO_MODE_GPIO, /* EC_LID_OUT# (EC_WAKE#) */
  30. .gpio21 = GPIO_MODE_GPIO, /* EC_IN_RW */
  31. .gpio24 = GPIO_MODE_GPIO, /* DDR3L_EN */
  32. .gpio28 = GPIO_MODE_GPIO, /* SLP_ME_CSW_DEV# */
  33. };
  34. static const struct pch_gpio_set1 pch_gpio_set1_direction = {
  35. .gpio0 = GPIO_DIR_INPUT,
  36. .gpio3 = GPIO_DIR_INPUT,
  37. .gpio5 = GPIO_DIR_INPUT,
  38. .gpio7 = GPIO_DIR_INPUT,
  39. .gpio8 = GPIO_DIR_INPUT,
  40. .gpio9 = GPIO_DIR_INPUT,
  41. .gpio10 = GPIO_DIR_INPUT,
  42. .gpio11 = GPIO_DIR_INPUT,
  43. .gpio12 = GPIO_DIR_INPUT,
  44. .gpio14 = GPIO_DIR_INPUT,
  45. .gpio15 = GPIO_DIR_INPUT,
  46. .gpio21 = GPIO_DIR_INPUT,
  47. .gpio24 = GPIO_DIR_OUTPUT,
  48. .gpio28 = GPIO_DIR_INPUT,
  49. };
  50. static const struct pch_gpio_set1 pch_gpio_set1_level = {
  51. .gpio1 = GPIO_LEVEL_HIGH,
  52. .gpio6 = GPIO_LEVEL_HIGH,
  53. .gpio24 = GPIO_LEVEL_LOW,
  54. };
  55. static const struct pch_gpio_set1 pch_gpio_set1_invert = {
  56. .gpio7 = GPIO_INVERT,
  57. .gpio8 = GPIO_INVERT,
  58. .gpio12 = GPIO_INVERT,
  59. .gpio14 = GPIO_INVERT,
  60. .gpio15 = GPIO_INVERT,
  61. };
  62. static const struct pch_gpio_set2 pch_gpio_set2_mode = {
  63. .gpio36 = GPIO_MODE_GPIO, /* W_DISABLE_L */
  64. .gpio41 = GPIO_MODE_GPIO, /* SPD vector D0 */
  65. .gpio42 = GPIO_MODE_GPIO, /* SPD vector D1 */
  66. .gpio43 = GPIO_MODE_GPIO, /* SPD vector D2 */
  67. .gpio57 = GPIO_MODE_GPIO, /* PCH_SPI_WP_D */
  68. .gpio60 = GPIO_MODE_GPIO, /* DRAMRST_CNTRL_PCH */
  69. };
  70. static const struct pch_gpio_set2 pch_gpio_set2_direction = {
  71. .gpio36 = GPIO_DIR_OUTPUT,
  72. .gpio41 = GPIO_DIR_INPUT,
  73. .gpio42 = GPIO_DIR_INPUT,
  74. .gpio43 = GPIO_DIR_INPUT,
  75. .gpio57 = GPIO_DIR_INPUT,
  76. .gpio60 = GPIO_DIR_OUTPUT,
  77. };
  78. static const struct pch_gpio_set2 pch_gpio_set2_level = {
  79. .gpio36 = GPIO_LEVEL_HIGH,
  80. .gpio60 = GPIO_LEVEL_HIGH,
  81. };
  82. static const struct pch_gpio_set3 pch_gpio_set3_mode = {
  83. };
  84. static const struct pch_gpio_set3 pch_gpio_set3_direction = {
  85. };
  86. static const struct pch_gpio_set3 pch_gpio_set3_level = {
  87. };
  88. static const struct pch_gpio_map link_gpio_map = {
  89. .set1 = {
  90. .mode = &pch_gpio_set1_mode,
  91. .direction = &pch_gpio_set1_direction,
  92. .level = &pch_gpio_set1_level,
  93. .invert = &pch_gpio_set1_invert,
  94. },
  95. .set2 = {
  96. .mode = &pch_gpio_set2_mode,
  97. .direction = &pch_gpio_set2_direction,
  98. .level = &pch_gpio_set2_level,
  99. },
  100. .set3 = {
  101. .mode = &pch_gpio_set3_mode,
  102. .direction = &pch_gpio_set3_direction,
  103. .level = &pch_gpio_set3_level,
  104. },
  105. };
  106. int board_early_init_f(void)
  107. {
  108. ich_gpio_set_gpio_map(&link_gpio_map);
  109. return 0;
  110. }
  111. void setup_pch_gpios(u32 gpiobase, const struct pch_gpio_map *gpio)
  112. {
  113. /* GPIO Set 1 */
  114. if (gpio->set1.level)
  115. outl(*((u32 *)gpio->set1.level), gpiobase + GP_LVL);
  116. if (gpio->set1.mode)
  117. outl(*((u32 *)gpio->set1.mode), gpiobase + GPIO_USE_SEL);
  118. if (gpio->set1.direction)
  119. outl(*((u32 *)gpio->set1.direction), gpiobase + GP_IO_SEL);
  120. if (gpio->set1.reset)
  121. outl(*((u32 *)gpio->set1.reset), gpiobase + GP_RST_SEL1);
  122. if (gpio->set1.invert)
  123. outl(*((u32 *)gpio->set1.invert), gpiobase + GPI_INV);
  124. if (gpio->set1.blink)
  125. outl(*((u32 *)gpio->set1.blink), gpiobase + GPO_BLINK);
  126. /* GPIO Set 2 */
  127. if (gpio->set2.level)
  128. outl(*((u32 *)gpio->set2.level), gpiobase + GP_LVL2);
  129. if (gpio->set2.mode)
  130. outl(*((u32 *)gpio->set2.mode), gpiobase + GPIO_USE_SEL2);
  131. if (gpio->set2.direction)
  132. outl(*((u32 *)gpio->set2.direction), gpiobase + GP_IO_SEL2);
  133. if (gpio->set2.reset)
  134. outl(*((u32 *)gpio->set2.reset), gpiobase + GP_RST_SEL2);
  135. /* GPIO Set 3 */
  136. if (gpio->set3.level)
  137. outl(*((u32 *)gpio->set3.level), gpiobase + GP_LVL3);
  138. if (gpio->set3.mode)
  139. outl(*((u32 *)gpio->set3.mode), gpiobase + GPIO_USE_SEL3);
  140. if (gpio->set3.direction)
  141. outl(*((u32 *)gpio->set3.direction), gpiobase + GP_IO_SEL3);
  142. if (gpio->set3.reset)
  143. outl(*((u32 *)gpio->set3.reset), gpiobase + GP_RST_SEL3);
  144. }