gpio.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. *
  6. * From coreboot src/soc/intel/braswell/include/soc/gpio.h
  7. */
  8. #ifndef _BRASWELL_GPIO_H_
  9. #define _BRASWELL_GPIO_H_
  10. #include <asm/arch/iomap.h>
  11. enum mode_list {
  12. M0,
  13. M1,
  14. M2,
  15. M3,
  16. M4,
  17. M5,
  18. M6,
  19. M7,
  20. M8,
  21. M9,
  22. M10,
  23. M11,
  24. M12,
  25. M13,
  26. };
  27. enum int_select {
  28. L0,
  29. L1,
  30. L2,
  31. L3,
  32. L4,
  33. L5,
  34. L6,
  35. L7,
  36. L8,
  37. L9,
  38. L10,
  39. L11,
  40. L12,
  41. L13,
  42. L14,
  43. L15,
  44. };
  45. enum gpio_en {
  46. NATIVE = 0xff,
  47. GPIO = 0, /* Native, no need to set PAD_VALUE */
  48. GPO = 1, /* GPO, output only in PAD_VALUE */
  49. GPI = 2, /* GPI, input only in PAD_VALUE */
  50. HI_Z = 3,
  51. NA_GPO = 0,
  52. };
  53. enum gpio_state {
  54. LOW,
  55. HIGH,
  56. };
  57. enum en_dis {
  58. DISABLE, /* Disable */
  59. ENABLE, /* Enable */
  60. };
  61. enum int_type {
  62. INT_DIS,
  63. TRIG_EDGE_LOW,
  64. TRIG_EDGE_HIGH,
  65. TRIG_EDGE_BOTH,
  66. TRIG_LEVEL,
  67. };
  68. enum mask {
  69. MASKABLE,
  70. NON_MASKABLE,
  71. };
  72. enum glitch_cfg {
  73. GLITCH_DISABLE,
  74. EN_EDGE_DETECT,
  75. EN_RX_DATA,
  76. EN_EDGE_RX_DATA,
  77. };
  78. enum inv_rx_tx {
  79. NO_INVERSION = 0,
  80. INV_RX_ENABLE = 1,
  81. INV_TX_ENABLE = 2,
  82. INV_RX_TX_ENABLE = 3,
  83. INV_RX_DATA = 4,
  84. INV_TX_DATA = 8,
  85. };
  86. enum voltage {
  87. VOLT_3_3, /* Working on 3.3 Volts */
  88. VOLT_1_8, /* Working on 1.8 Volts */
  89. };
  90. enum hs_mode {
  91. DISABLE_HS, /* Disable high speed mode */
  92. ENABLE_HS, /* Enable high speed mode */
  93. };
  94. enum odt_up_dn {
  95. PULL_UP, /* On Die Termination Up */
  96. PULL_DOWN, /* On Die Termination Down */
  97. };
  98. enum odt_en {
  99. DISABLE_OD, /* On Die Termination Disable */
  100. ENABLE_OD, /* On Die Termination Enable */
  101. };
  102. enum pull_type {
  103. P_NONE = 0, /* Pull None */
  104. P_20K_L = 1, /* Pull Down 20K */
  105. P_5K_L = 2, /* Pull Down 5K */
  106. P_1K_L = 4, /* Pull Down 1K */
  107. P_20K_H = 9, /* Pull Up 20K */
  108. P_5K_H = 10, /* Pull Up 5K */
  109. P_1K_H = 12 /* Pull Up 1K */
  110. };
  111. enum bit {
  112. ONE_BIT = 1,
  113. TWO_BIT = 3,
  114. THREE_BIT = 7,
  115. FOUR_BIT = 15,
  116. FIVE_BIT = 31,
  117. SIX_BIT = 63,
  118. SEVEN_BIT = 127,
  119. EIGHT_BIT = 255
  120. };
  121. enum gpe_config {
  122. GPE,
  123. SMI,
  124. SCI,
  125. };
  126. enum community {
  127. SOUTHWEST = 0x0000,
  128. NORTH = 0x8000,
  129. EAST = 0x10000,
  130. SOUTHEAST = 0x18000,
  131. VIRTUAL = 0x20000,
  132. };
  133. #define NA 0xff
  134. #define TERMINATOR 0xffffffff
  135. #define GPIO_FAMILY_CONF(family_name, park_mode, hysctl, vp18_mode, hs_mode, \
  136. odt_up_dn, odt_en, curr_src_str, rcomp, family_no, community_offset) { \
  137. .confg = ((((park_mode) != NA) ? park_mode << 26 : 0) | \
  138. (((hysctl) != NA) ? hysctl << 24 : 0) | \
  139. (((vp18_mode) != NA) ? vp18_mode << 21 : 0) | \
  140. (((hs_mode) != NA) ? hs_mode << 19 : 0) | \
  141. (((odt_up_dn) != NA) ? odt_up_dn << 18 : 0) | \
  142. (((odt_en) != NA) ? odt_en << 17 : 0) | \
  143. (curr_src_str)), \
  144. .confg_changes = ((((park_mode) != NA) ? ONE_BIT << 26 : 0) | \
  145. (((hysctl) != NA) ? TWO_BIT << 24 : 0) | \
  146. (((vp18_mode) != NA) ? ONE_BIT << 21 : 0) | \
  147. (((hs_mode) != NA) ? ONE_BIT << 19 : 0) | \
  148. (((odt_up_dn) != NA) ? ONE_BIT << 18 : 0) | \
  149. (((odt_en) != NA) ? ONE_BIT << 17 : 0) | \
  150. (THREE_BIT)), \
  151. .misc = ((rcomp == ENABLE) ? 1 : 0) , \
  152. .mmio_addr = (community_offset == TERMINATOR) ? TERMINATOR : \
  153. ((family_no != NA) ? (IO_BASE_ADDRESS + community_offset +\
  154. (0x80 * family_no) + 0x1080) : 0) , \
  155. .name = 0 \
  156. }
  157. #define GPIO_PAD_CONF(pad_name, mode_select, mode, gpio_config, gpio_state, \
  158. gpio_light_mode, int_type, int_sel, term, open_drain, current_source,\
  159. int_mask, glitch, inv_rx_tx, wake_mask, wake_mask_bit, gpe, \
  160. mmio_offset, community_offset) { \
  161. .confg0 = ((((int_sel) != NA) ? (int_sel << 28) : 0) | \
  162. (((glitch) != NA) ? (glitch << 26) : 0) | \
  163. (((term) != NA) ? (term << 20) : 0) | \
  164. (((mode_select) == GPIO) ? ((mode << 16) | (1 << 15)) : \
  165. ((mode << 16))) | \
  166. (((gpio_config) != NA) ? (gpio_config << 8) : 0) | \
  167. (((gpio_light_mode) != NA) ? (gpio_light_mode << 7) : 0) | \
  168. (((gpio_state) == HIGH) ? 2 : 0)), \
  169. .confg0_changes = ((((int_sel) != NA) ? (FOUR_BIT << 28) : 0) | \
  170. (((glitch) != NA) ? (TWO_BIT << 26) : 0) | \
  171. (((term) != NA) ? (FOUR_BIT << 20) : 0) | \
  172. (FIVE_BIT << 15) | \
  173. (((gpio_config) != NA) ? (THREE_BIT << 8) : 0) | \
  174. (((gpio_light_mode) != NA) ? (ONE_BIT << 7) : 0) | \
  175. (((gpio_state) != NA) ? ONE_BIT << 1 : 0)), \
  176. .confg1 = ((((current_source) != NA) ? (current_source << 27) : 0) | \
  177. (((inv_rx_tx) != NA) ? inv_rx_tx << 4 : 0) | \
  178. (((open_drain) != NA) ? open_drain << 3 : 0) | \
  179. (((int_type) != NA) ? int_type : 0)), \
  180. .confg1_changes = ((((current_source) != NA) ? (ONE_BIT << 27) : 0) | \
  181. (((inv_rx_tx) != NA) ? FOUR_BIT << 4 : 0) | \
  182. (((open_drain) != NA) ? ONE_BIT << 3 : 0) | \
  183. (((int_type) != NA) ? THREE_BIT : 0)), \
  184. .community = community_offset, \
  185. .mmio_addr = (community_offset == TERMINATOR) ? TERMINATOR : \
  186. ((mmio_offset != NA) ? (IO_BASE_ADDRESS + \
  187. community_offset + mmio_offset) : 0), \
  188. .name = 0, \
  189. .misc = ((((gpe) != NA) ? (gpe << 0) : 0) | \
  190. (((wake_mask) != NA) ? (wake_mask << 2) : 0) | \
  191. (((int_mask) != NA) ? (int_mask << 3) : 0)) | \
  192. (((wake_mask_bit) != NA) ? (wake_mask_bit << 4) : (NA << 4)) \
  193. }
  194. #endif /* _BRASWELL_GPIO_H_ */