hte-tegra194.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2021-2022 NVIDIA Corporation
  4. *
  5. * Author: Dipen Patel <dipenp@nvidia.com>
  6. */
  7. #include <linux/err.h>
  8. #include <linux/io.h>
  9. #include <linux/module.h>
  10. #include <linux/slab.h>
  11. #include <linux/stat.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/of.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/hte.h>
  16. #include <linux/uaccess.h>
  17. #include <linux/gpio/driver.h>
  18. #include <linux/gpio/consumer.h>
  19. #define HTE_SUSPEND 0
  20. /* HTE source clock TSC is 31.25MHz */
  21. #define HTE_TS_CLK_RATE_HZ 31250000ULL
  22. #define HTE_CLK_RATE_NS 32
  23. #define HTE_TS_NS_SHIFT __builtin_ctz(HTE_CLK_RATE_NS)
  24. #define NV_AON_SLICE_INVALID -1
  25. #define NV_LINES_IN_SLICE 32
  26. /* AON HTE line map For slice 1 */
  27. #define NV_AON_HTE_SLICE1_IRQ_GPIO_28 12
  28. #define NV_AON_HTE_SLICE1_IRQ_GPIO_29 13
  29. /* AON HTE line map For slice 2 */
  30. #define NV_AON_HTE_SLICE2_IRQ_GPIO_0 0
  31. #define NV_AON_HTE_SLICE2_IRQ_GPIO_1 1
  32. #define NV_AON_HTE_SLICE2_IRQ_GPIO_2 2
  33. #define NV_AON_HTE_SLICE2_IRQ_GPIO_3 3
  34. #define NV_AON_HTE_SLICE2_IRQ_GPIO_4 4
  35. #define NV_AON_HTE_SLICE2_IRQ_GPIO_5 5
  36. #define NV_AON_HTE_SLICE2_IRQ_GPIO_6 6
  37. #define NV_AON_HTE_SLICE2_IRQ_GPIO_7 7
  38. #define NV_AON_HTE_SLICE2_IRQ_GPIO_8 8
  39. #define NV_AON_HTE_SLICE2_IRQ_GPIO_9 9
  40. #define NV_AON_HTE_SLICE2_IRQ_GPIO_10 10
  41. #define NV_AON_HTE_SLICE2_IRQ_GPIO_11 11
  42. #define NV_AON_HTE_SLICE2_IRQ_GPIO_12 12
  43. #define NV_AON_HTE_SLICE2_IRQ_GPIO_13 13
  44. #define NV_AON_HTE_SLICE2_IRQ_GPIO_14 14
  45. #define NV_AON_HTE_SLICE2_IRQ_GPIO_15 15
  46. #define NV_AON_HTE_SLICE2_IRQ_GPIO_16 16
  47. #define NV_AON_HTE_SLICE2_IRQ_GPIO_17 17
  48. #define NV_AON_HTE_SLICE2_IRQ_GPIO_18 18
  49. #define NV_AON_HTE_SLICE2_IRQ_GPIO_19 19
  50. #define NV_AON_HTE_SLICE2_IRQ_GPIO_20 20
  51. #define NV_AON_HTE_SLICE2_IRQ_GPIO_21 21
  52. #define NV_AON_HTE_SLICE2_IRQ_GPIO_22 22
  53. #define NV_AON_HTE_SLICE2_IRQ_GPIO_23 23
  54. #define NV_AON_HTE_SLICE2_IRQ_GPIO_24 24
  55. #define NV_AON_HTE_SLICE2_IRQ_GPIO_25 25
  56. #define NV_AON_HTE_SLICE2_IRQ_GPIO_26 26
  57. #define NV_AON_HTE_SLICE2_IRQ_GPIO_27 27
  58. #define NV_AON_HTE_SLICE2_IRQ_GPIO_28 28
  59. #define NV_AON_HTE_SLICE2_IRQ_GPIO_29 29
  60. #define NV_AON_HTE_SLICE2_IRQ_GPIO_30 30
  61. #define NV_AON_HTE_SLICE2_IRQ_GPIO_31 31
  62. #define HTE_TECTRL 0x0
  63. #define HTE_TETSCH 0x4
  64. #define HTE_TETSCL 0x8
  65. #define HTE_TESRC 0xC
  66. #define HTE_TECCV 0x10
  67. #define HTE_TEPCV 0x14
  68. #define HTE_TECMD 0x1C
  69. #define HTE_TESTATUS 0x20
  70. #define HTE_SLICE0_TETEN 0x40
  71. #define HTE_SLICE1_TETEN 0x60
  72. #define HTE_SLICE_SIZE (HTE_SLICE1_TETEN - HTE_SLICE0_TETEN)
  73. #define HTE_TECTRL_ENABLE_ENABLE 0x1
  74. #define HTE_TECTRL_OCCU_SHIFT 0x8
  75. #define HTE_TECTRL_INTR_SHIFT 0x1
  76. #define HTE_TECTRL_INTR_ENABLE 0x1
  77. #define HTE_TESRC_SLICE_SHIFT 16
  78. #define HTE_TESRC_SLICE_DEFAULT_MASK 0xFF
  79. #define HTE_TECMD_CMD_POP 0x1
  80. #define HTE_TESTATUS_OCCUPANCY_SHIFT 8
  81. #define HTE_TESTATUS_OCCUPANCY_MASK 0xFF
  82. enum tegra_hte_type {
  83. HTE_TEGRA_TYPE_GPIO = 1U << 0,
  84. HTE_TEGRA_TYPE_LIC = 1U << 1,
  85. };
  86. struct hte_slices {
  87. u32 r_val;
  88. unsigned long flags;
  89. /* to prevent lines mapped to same slice updating its register */
  90. spinlock_t s_lock;
  91. };
  92. struct tegra_hte_line_mapped {
  93. int slice;
  94. u32 bit_index;
  95. };
  96. struct tegra_hte_line_data {
  97. unsigned long flags;
  98. void *data;
  99. };
  100. struct tegra_hte_data {
  101. enum tegra_hte_type type;
  102. u32 slices;
  103. u32 map_sz;
  104. u32 sec_map_sz;
  105. const struct tegra_hte_line_mapped *map;
  106. const struct tegra_hte_line_mapped *sec_map;
  107. };
  108. struct tegra_hte_soc {
  109. int hte_irq;
  110. u32 itr_thrshld;
  111. u32 conf_rval;
  112. struct hte_slices *sl;
  113. const struct tegra_hte_data *prov_data;
  114. struct tegra_hte_line_data *line_data;
  115. struct hte_chip *chip;
  116. struct gpio_device *gdev;
  117. void __iomem *regs;
  118. };
  119. static const struct tegra_hte_line_mapped tegra194_aon_gpio_map[] = {
  120. /* gpio, slice, bit_index */
  121. /* AA port */
  122. [0] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_11},
  123. [1] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_10},
  124. [2] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_9},
  125. [3] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_8},
  126. [4] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_7},
  127. [5] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_6},
  128. [6] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_5},
  129. [7] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_4},
  130. /* BB port */
  131. [8] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_3},
  132. [9] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_2},
  133. [10] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_1},
  134. [11] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_0},
  135. /* CC port */
  136. [12] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_22},
  137. [13] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_21},
  138. [14] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_20},
  139. [15] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_19},
  140. [16] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_18},
  141. [17] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_17},
  142. [18] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_16},
  143. [19] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_15},
  144. /* DD port */
  145. [20] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_14},
  146. [21] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_13},
  147. [22] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_12},
  148. /* EE port */
  149. [23] = {1, NV_AON_HTE_SLICE1_IRQ_GPIO_29},
  150. [24] = {1, NV_AON_HTE_SLICE1_IRQ_GPIO_28},
  151. [25] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_27},
  152. [26] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_26},
  153. [27] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_25},
  154. [28] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_24},
  155. [29] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_23},
  156. };
  157. static const struct tegra_hte_line_mapped tegra194_aon_gpio_sec_map[] = {
  158. /* gpio, slice, bit_index */
  159. /* AA port */
  160. [0] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_11},
  161. [1] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_10},
  162. [2] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_9},
  163. [3] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_8},
  164. [4] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_7},
  165. [5] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_6},
  166. [6] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_5},
  167. [7] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_4},
  168. /* BB port */
  169. [8] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_3},
  170. [9] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_2},
  171. [10] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_1},
  172. [11] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_0},
  173. [12] = {NV_AON_SLICE_INVALID, 0},
  174. [13] = {NV_AON_SLICE_INVALID, 0},
  175. [14] = {NV_AON_SLICE_INVALID, 0},
  176. [15] = {NV_AON_SLICE_INVALID, 0},
  177. /* CC port */
  178. [16] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_22},
  179. [17] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_21},
  180. [18] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_20},
  181. [19] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_19},
  182. [20] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_18},
  183. [21] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_17},
  184. [22] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_16},
  185. [23] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_15},
  186. /* DD port */
  187. [24] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_14},
  188. [25] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_13},
  189. [26] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_12},
  190. [27] = {NV_AON_SLICE_INVALID, 0},
  191. [28] = {NV_AON_SLICE_INVALID, 0},
  192. [29] = {NV_AON_SLICE_INVALID, 0},
  193. [30] = {NV_AON_SLICE_INVALID, 0},
  194. [31] = {NV_AON_SLICE_INVALID, 0},
  195. /* EE port */
  196. [32] = {1, NV_AON_HTE_SLICE1_IRQ_GPIO_29},
  197. [33] = {1, NV_AON_HTE_SLICE1_IRQ_GPIO_28},
  198. [34] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_27},
  199. [35] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_26},
  200. [36] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_25},
  201. [37] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_24},
  202. [38] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_23},
  203. [39] = {NV_AON_SLICE_INVALID, 0},
  204. };
  205. static const struct tegra_hte_line_mapped tegra234_aon_gpio_map[] = {
  206. /* gpio, slice, bit_index */
  207. /* AA port */
  208. [0] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_11},
  209. [1] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_10},
  210. [2] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_9},
  211. [3] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_8},
  212. [4] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_7},
  213. [5] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_6},
  214. [6] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_5},
  215. [7] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_4},
  216. /* BB port */
  217. [8] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_3},
  218. [9] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_2},
  219. [10] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_1},
  220. [11] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_0},
  221. /* CC port */
  222. [12] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_22},
  223. [13] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_21},
  224. [14] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_20},
  225. [15] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_19},
  226. [16] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_18},
  227. [17] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_17},
  228. [18] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_16},
  229. [19] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_15},
  230. /* DD port */
  231. [20] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_14},
  232. [21] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_13},
  233. [22] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_12},
  234. /* EE port */
  235. [23] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_31},
  236. [24] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_30},
  237. [25] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_29},
  238. [26] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_28},
  239. [27] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_27},
  240. [28] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_26},
  241. [29] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_25},
  242. [30] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_24},
  243. /* GG port */
  244. [31] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_23},
  245. };
  246. static const struct tegra_hte_line_mapped tegra234_aon_gpio_sec_map[] = {
  247. /* gpio, slice, bit_index */
  248. /* AA port */
  249. [0] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_11},
  250. [1] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_10},
  251. [2] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_9},
  252. [3] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_8},
  253. [4] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_7},
  254. [5] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_6},
  255. [6] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_5},
  256. [7] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_4},
  257. /* BB port */
  258. [8] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_3},
  259. [9] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_2},
  260. [10] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_1},
  261. [11] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_0},
  262. [12] = {NV_AON_SLICE_INVALID, 0},
  263. [13] = {NV_AON_SLICE_INVALID, 0},
  264. [14] = {NV_AON_SLICE_INVALID, 0},
  265. [15] = {NV_AON_SLICE_INVALID, 0},
  266. /* CC port */
  267. [16] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_22},
  268. [17] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_21},
  269. [18] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_20},
  270. [19] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_19},
  271. [20] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_18},
  272. [21] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_17},
  273. [22] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_16},
  274. [23] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_15},
  275. /* DD port */
  276. [24] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_14},
  277. [25] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_13},
  278. [26] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_12},
  279. [27] = {NV_AON_SLICE_INVALID, 0},
  280. [28] = {NV_AON_SLICE_INVALID, 0},
  281. [29] = {NV_AON_SLICE_INVALID, 0},
  282. [30] = {NV_AON_SLICE_INVALID, 0},
  283. [31] = {NV_AON_SLICE_INVALID, 0},
  284. /* EE port */
  285. [32] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_31},
  286. [33] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_30},
  287. [34] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_29},
  288. [35] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_28},
  289. [36] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_27},
  290. [37] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_26},
  291. [38] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_25},
  292. [39] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_24},
  293. /* GG port */
  294. [40] = {2, NV_AON_HTE_SLICE2_IRQ_GPIO_23},
  295. };
  296. static const struct tegra_hte_data t194_aon_hte = {
  297. .map_sz = ARRAY_SIZE(tegra194_aon_gpio_map),
  298. .map = tegra194_aon_gpio_map,
  299. .sec_map_sz = ARRAY_SIZE(tegra194_aon_gpio_sec_map),
  300. .sec_map = tegra194_aon_gpio_sec_map,
  301. .type = HTE_TEGRA_TYPE_GPIO,
  302. .slices = 3,
  303. };
  304. static const struct tegra_hte_data t234_aon_hte = {
  305. .map_sz = ARRAY_SIZE(tegra234_aon_gpio_map),
  306. .map = tegra234_aon_gpio_map,
  307. .sec_map_sz = ARRAY_SIZE(tegra234_aon_gpio_sec_map),
  308. .sec_map = tegra234_aon_gpio_sec_map,
  309. .type = HTE_TEGRA_TYPE_GPIO,
  310. .slices = 3,
  311. };
  312. static const struct tegra_hte_data t194_lic_hte = {
  313. .map_sz = 0,
  314. .map = NULL,
  315. .type = HTE_TEGRA_TYPE_LIC,
  316. .slices = 11,
  317. };
  318. static const struct tegra_hte_data t234_lic_hte = {
  319. .map_sz = 0,
  320. .map = NULL,
  321. .type = HTE_TEGRA_TYPE_LIC,
  322. .slices = 17,
  323. };
  324. static inline u32 tegra_hte_readl(struct tegra_hte_soc *hte, u32 reg)
  325. {
  326. return readl(hte->regs + reg);
  327. }
  328. static inline void tegra_hte_writel(struct tegra_hte_soc *hte, u32 reg,
  329. u32 val)
  330. {
  331. writel(val, hte->regs + reg);
  332. }
  333. static int tegra_hte_map_to_line_id(u32 eid,
  334. const struct tegra_hte_line_mapped *m,
  335. u32 map_sz, u32 *mapped)
  336. {
  337. if (m) {
  338. if (eid >= map_sz)
  339. return -EINVAL;
  340. if (m[eid].slice == NV_AON_SLICE_INVALID)
  341. return -EINVAL;
  342. *mapped = (m[eid].slice << 5) + m[eid].bit_index;
  343. } else {
  344. *mapped = eid;
  345. }
  346. return 0;
  347. }
  348. static int tegra_hte_line_xlate(struct hte_chip *gc,
  349. const struct of_phandle_args *args,
  350. struct hte_ts_desc *desc, u32 *xlated_id)
  351. {
  352. int ret = 0;
  353. u32 line_id;
  354. struct tegra_hte_soc *gs;
  355. const struct tegra_hte_line_mapped *map = NULL;
  356. u32 map_sz = 0;
  357. if (!gc || !desc || !xlated_id)
  358. return -EINVAL;
  359. if (args) {
  360. if (gc->of_hte_n_cells < 1)
  361. return -EINVAL;
  362. if (args->args_count != gc->of_hte_n_cells)
  363. return -EINVAL;
  364. desc->attr.line_id = args->args[0];
  365. }
  366. gs = gc->data;
  367. if (!gs || !gs->prov_data)
  368. return -EINVAL;
  369. /*
  370. * GPIO consumers can access GPIOs in two ways:
  371. *
  372. * 1) Using the global GPIO numberspace.
  373. *
  374. * This is the old, now DEPRECATED method and should not be used in
  375. * new code. TODO: Check if tegra is even concerned by this.
  376. *
  377. * 2) Using GPIO descriptors that can be assigned to consumer devices
  378. * using device-tree, ACPI or lookup tables.
  379. *
  380. * The code below addresses both the consumer use cases and maps into
  381. * HTE/GTE namespace.
  382. */
  383. if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO && !args) {
  384. line_id = desc->attr.line_id - gpio_device_get_base(gs->gdev);
  385. map = gs->prov_data->map;
  386. map_sz = gs->prov_data->map_sz;
  387. } else if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO && args) {
  388. line_id = desc->attr.line_id;
  389. map = gs->prov_data->sec_map;
  390. map_sz = gs->prov_data->sec_map_sz;
  391. } else {
  392. line_id = desc->attr.line_id;
  393. }
  394. ret = tegra_hte_map_to_line_id(line_id, map, map_sz, xlated_id);
  395. if (ret < 0) {
  396. dev_err(gc->dev, "line_id:%u mapping failed\n",
  397. desc->attr.line_id);
  398. return ret;
  399. }
  400. if (*xlated_id > gc->nlines)
  401. return -EINVAL;
  402. dev_dbg(gc->dev, "requested id:%u, xlated id:%u\n",
  403. desc->attr.line_id, *xlated_id);
  404. return 0;
  405. }
  406. static int tegra_hte_line_xlate_plat(struct hte_chip *gc,
  407. struct hte_ts_desc *desc, u32 *xlated_id)
  408. {
  409. return tegra_hte_line_xlate(gc, NULL, desc, xlated_id);
  410. }
  411. static int tegra_hte_en_dis_common(struct hte_chip *chip, u32 line_id, bool en)
  412. {
  413. u32 slice, sl_bit_shift, line_bit, val, reg;
  414. struct tegra_hte_soc *gs;
  415. sl_bit_shift = __builtin_ctz(HTE_SLICE_SIZE);
  416. if (!chip)
  417. return -EINVAL;
  418. gs = chip->data;
  419. if (line_id > chip->nlines) {
  420. dev_err(chip->dev,
  421. "line id: %u is not supported by this controller\n",
  422. line_id);
  423. return -EINVAL;
  424. }
  425. slice = line_id >> sl_bit_shift;
  426. line_bit = line_id & (HTE_SLICE_SIZE - 1);
  427. reg = (slice << sl_bit_shift) + HTE_SLICE0_TETEN;
  428. spin_lock(&gs->sl[slice].s_lock);
  429. if (test_bit(HTE_SUSPEND, &gs->sl[slice].flags)) {
  430. spin_unlock(&gs->sl[slice].s_lock);
  431. dev_dbg(chip->dev, "device suspended");
  432. return -EBUSY;
  433. }
  434. val = tegra_hte_readl(gs, reg);
  435. if (en)
  436. val = val | (1 << line_bit);
  437. else
  438. val = val & (~(1 << line_bit));
  439. tegra_hte_writel(gs, reg, val);
  440. spin_unlock(&gs->sl[slice].s_lock);
  441. dev_dbg(chip->dev, "line: %u, slice %u, line_bit %u, reg:0x%x\n",
  442. line_id, slice, line_bit, reg);
  443. return 0;
  444. }
  445. static int tegra_hte_enable(struct hte_chip *chip, u32 line_id)
  446. {
  447. if (!chip)
  448. return -EINVAL;
  449. return tegra_hte_en_dis_common(chip, line_id, true);
  450. }
  451. static int tegra_hte_disable(struct hte_chip *chip, u32 line_id)
  452. {
  453. if (!chip)
  454. return -EINVAL;
  455. return tegra_hte_en_dis_common(chip, line_id, false);
  456. }
  457. static int tegra_hte_request(struct hte_chip *chip, struct hte_ts_desc *desc,
  458. u32 line_id)
  459. {
  460. int ret;
  461. struct tegra_hte_soc *gs;
  462. struct hte_line_attr *attr;
  463. if (!chip || !chip->data || !desc)
  464. return -EINVAL;
  465. gs = chip->data;
  466. attr = &desc->attr;
  467. if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO) {
  468. if (!attr->line_data)
  469. return -EINVAL;
  470. ret = gpiod_enable_hw_timestamp_ns(attr->line_data,
  471. attr->edge_flags);
  472. if (ret)
  473. return ret;
  474. gs->line_data[line_id].data = attr->line_data;
  475. gs->line_data[line_id].flags = attr->edge_flags;
  476. }
  477. return tegra_hte_en_dis_common(chip, line_id, true);
  478. }
  479. static int tegra_hte_release(struct hte_chip *chip, struct hte_ts_desc *desc,
  480. u32 line_id)
  481. {
  482. struct tegra_hte_soc *gs;
  483. struct hte_line_attr *attr;
  484. int ret;
  485. if (!chip || !chip->data || !desc)
  486. return -EINVAL;
  487. gs = chip->data;
  488. attr = &desc->attr;
  489. if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO) {
  490. ret = gpiod_disable_hw_timestamp_ns(attr->line_data,
  491. gs->line_data[line_id].flags);
  492. if (ret)
  493. return ret;
  494. gs->line_data[line_id].data = NULL;
  495. gs->line_data[line_id].flags = 0;
  496. }
  497. return tegra_hte_en_dis_common(chip, line_id, false);
  498. }
  499. static int tegra_hte_clk_src_info(struct hte_chip *chip,
  500. struct hte_clk_info *ci)
  501. {
  502. (void)chip;
  503. if (!ci)
  504. return -EINVAL;
  505. ci->hz = HTE_TS_CLK_RATE_HZ;
  506. ci->type = CLOCK_MONOTONIC;
  507. return 0;
  508. }
  509. static int tegra_hte_get_level(struct tegra_hte_soc *gs, u32 line_id)
  510. {
  511. struct gpio_desc *desc;
  512. if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO) {
  513. desc = gs->line_data[line_id].data;
  514. if (desc)
  515. return gpiod_get_raw_value(desc);
  516. }
  517. return -1;
  518. }
  519. static void tegra_hte_read_fifo(struct tegra_hte_soc *gs)
  520. {
  521. u32 tsh, tsl, src, pv, cv, acv, slice, bit_index, line_id;
  522. u64 tsc;
  523. struct hte_ts_data el;
  524. while ((tegra_hte_readl(gs, HTE_TESTATUS) >>
  525. HTE_TESTATUS_OCCUPANCY_SHIFT) &
  526. HTE_TESTATUS_OCCUPANCY_MASK) {
  527. tsh = tegra_hte_readl(gs, HTE_TETSCH);
  528. tsl = tegra_hte_readl(gs, HTE_TETSCL);
  529. tsc = (((u64)tsh << 32) | tsl);
  530. src = tegra_hte_readl(gs, HTE_TESRC);
  531. slice = (src >> HTE_TESRC_SLICE_SHIFT) &
  532. HTE_TESRC_SLICE_DEFAULT_MASK;
  533. pv = tegra_hte_readl(gs, HTE_TEPCV);
  534. cv = tegra_hte_readl(gs, HTE_TECCV);
  535. acv = pv ^ cv;
  536. while (acv) {
  537. bit_index = __builtin_ctz(acv);
  538. line_id = bit_index + (slice << 5);
  539. el.tsc = tsc << HTE_TS_NS_SHIFT;
  540. el.raw_level = tegra_hte_get_level(gs, line_id);
  541. hte_push_ts_ns(gs->chip, line_id, &el);
  542. acv &= ~BIT(bit_index);
  543. }
  544. tegra_hte_writel(gs, HTE_TECMD, HTE_TECMD_CMD_POP);
  545. }
  546. }
  547. static irqreturn_t tegra_hte_isr(int irq, void *dev_id)
  548. {
  549. struct tegra_hte_soc *gs = dev_id;
  550. (void)irq;
  551. tegra_hte_read_fifo(gs);
  552. return IRQ_HANDLED;
  553. }
  554. static bool tegra_hte_match_from_linedata(const struct hte_chip *chip,
  555. const struct hte_ts_desc *hdesc)
  556. {
  557. struct tegra_hte_soc *hte_dev = chip->data;
  558. if (!hte_dev || (hte_dev->prov_data->type != HTE_TEGRA_TYPE_GPIO))
  559. return false;
  560. return hte_dev->gdev == gpiod_to_gpio_device(hdesc->attr.line_data);
  561. }
  562. static const struct of_device_id tegra_hte_of_match[] = {
  563. { .compatible = "nvidia,tegra194-gte-lic", .data = &t194_lic_hte},
  564. { .compatible = "nvidia,tegra194-gte-aon", .data = &t194_aon_hte},
  565. { .compatible = "nvidia,tegra234-gte-lic", .data = &t234_lic_hte},
  566. { .compatible = "nvidia,tegra234-gte-aon", .data = &t234_aon_hte},
  567. { }
  568. };
  569. MODULE_DEVICE_TABLE(of, tegra_hte_of_match);
  570. static const struct hte_ops g_ops = {
  571. .request = tegra_hte_request,
  572. .release = tegra_hte_release,
  573. .enable = tegra_hte_enable,
  574. .disable = tegra_hte_disable,
  575. .get_clk_src_info = tegra_hte_clk_src_info,
  576. };
  577. static void tegra_gte_disable(void *data)
  578. {
  579. struct platform_device *pdev = data;
  580. struct tegra_hte_soc *gs = dev_get_drvdata(&pdev->dev);
  581. tegra_hte_writel(gs, HTE_TECTRL, 0);
  582. }
  583. static void tegra_hte_put_gpio_device(void *data)
  584. {
  585. struct gpio_device *gdev = data;
  586. gpio_device_put(gdev);
  587. }
  588. static int tegra_hte_probe(struct platform_device *pdev)
  589. {
  590. int ret;
  591. u32 i, slices, val = 0;
  592. u32 nlines;
  593. struct device *dev;
  594. struct tegra_hte_soc *hte_dev;
  595. struct hte_chip *gc;
  596. struct device_node *gpio_ctrl;
  597. dev = &pdev->dev;
  598. hte_dev = devm_kzalloc(dev, sizeof(*hte_dev), GFP_KERNEL);
  599. if (!hte_dev)
  600. return -ENOMEM;
  601. gc = devm_kzalloc(dev, sizeof(*gc), GFP_KERNEL);
  602. if (!gc)
  603. return -ENOMEM;
  604. dev_set_drvdata(&pdev->dev, hte_dev);
  605. hte_dev->prov_data = of_device_get_match_data(&pdev->dev);
  606. ret = of_property_read_u32(dev->of_node, "nvidia,slices", &slices);
  607. if (ret != 0)
  608. slices = hte_dev->prov_data->slices;
  609. dev_dbg(dev, "slices:%d\n", slices);
  610. nlines = slices << 5;
  611. hte_dev->regs = devm_platform_ioremap_resource(pdev, 0);
  612. if (IS_ERR(hte_dev->regs))
  613. return PTR_ERR(hte_dev->regs);
  614. ret = of_property_read_u32(dev->of_node, "nvidia,int-threshold",
  615. &hte_dev->itr_thrshld);
  616. if (ret != 0)
  617. hte_dev->itr_thrshld = 1;
  618. hte_dev->sl = devm_kcalloc(dev, slices, sizeof(*hte_dev->sl),
  619. GFP_KERNEL);
  620. if (!hte_dev->sl)
  621. return -ENOMEM;
  622. ret = platform_get_irq(pdev, 0);
  623. if (ret < 0)
  624. return ret;
  625. hte_dev->hte_irq = ret;
  626. ret = devm_request_irq(dev, hte_dev->hte_irq, tegra_hte_isr, 0,
  627. dev_name(dev), hte_dev);
  628. if (ret < 0) {
  629. dev_err(dev, "request irq failed.\n");
  630. return ret;
  631. }
  632. gc->nlines = nlines;
  633. gc->ops = &g_ops;
  634. gc->dev = dev;
  635. gc->data = hte_dev;
  636. gc->xlate_of = tegra_hte_line_xlate;
  637. gc->xlate_plat = tegra_hte_line_xlate_plat;
  638. gc->of_hte_n_cells = 1;
  639. if (hte_dev->prov_data &&
  640. hte_dev->prov_data->type == HTE_TEGRA_TYPE_GPIO) {
  641. hte_dev->line_data = devm_kcalloc(dev, nlines,
  642. sizeof(*hte_dev->line_data),
  643. GFP_KERNEL);
  644. if (!hte_dev->line_data)
  645. return -ENOMEM;
  646. gc->match_from_linedata = tegra_hte_match_from_linedata;
  647. if (of_device_is_compatible(dev->of_node,
  648. "nvidia,tegra194-gte-aon")) {
  649. hte_dev->gdev =
  650. gpio_device_find_by_label("tegra194-gpio-aon");
  651. } else {
  652. gpio_ctrl = of_parse_phandle(dev->of_node,
  653. "nvidia,gpio-controller",
  654. 0);
  655. if (!gpio_ctrl) {
  656. dev_err(dev,
  657. "gpio controller node not found\n");
  658. return -ENODEV;
  659. }
  660. hte_dev->gdev =
  661. gpio_device_find_by_fwnode(of_fwnode_handle(gpio_ctrl));
  662. of_node_put(gpio_ctrl);
  663. }
  664. if (!hte_dev->gdev)
  665. return dev_err_probe(dev, -EPROBE_DEFER,
  666. "wait for gpio controller\n");
  667. ret = devm_add_action_or_reset(dev, tegra_hte_put_gpio_device,
  668. hte_dev->gdev);
  669. if (ret)
  670. return ret;
  671. }
  672. hte_dev->chip = gc;
  673. ret = devm_hte_register_chip(hte_dev->chip);
  674. if (ret) {
  675. dev_err(gc->dev, "hte chip register failed");
  676. return ret;
  677. }
  678. for (i = 0; i < slices; i++) {
  679. hte_dev->sl[i].flags = 0;
  680. spin_lock_init(&hte_dev->sl[i].s_lock);
  681. }
  682. val = HTE_TECTRL_ENABLE_ENABLE |
  683. (HTE_TECTRL_INTR_ENABLE << HTE_TECTRL_INTR_SHIFT) |
  684. (hte_dev->itr_thrshld << HTE_TECTRL_OCCU_SHIFT);
  685. tegra_hte_writel(hte_dev, HTE_TECTRL, val);
  686. ret = devm_add_action_or_reset(&pdev->dev, tegra_gte_disable, pdev);
  687. if (ret)
  688. return ret;
  689. dev_dbg(gc->dev, "lines: %d, slices:%d", gc->nlines, slices);
  690. return 0;
  691. }
  692. static int tegra_hte_resume_early(struct device *dev)
  693. {
  694. u32 i;
  695. struct tegra_hte_soc *gs = dev_get_drvdata(dev);
  696. u32 slices = gs->chip->nlines / NV_LINES_IN_SLICE;
  697. u32 sl_bit_shift = __builtin_ctz(HTE_SLICE_SIZE);
  698. tegra_hte_writel(gs, HTE_TECTRL, gs->conf_rval);
  699. for (i = 0; i < slices; i++) {
  700. spin_lock(&gs->sl[i].s_lock);
  701. tegra_hte_writel(gs,
  702. ((i << sl_bit_shift) + HTE_SLICE0_TETEN),
  703. gs->sl[i].r_val);
  704. clear_bit(HTE_SUSPEND, &gs->sl[i].flags);
  705. spin_unlock(&gs->sl[i].s_lock);
  706. }
  707. return 0;
  708. }
  709. static int tegra_hte_suspend_late(struct device *dev)
  710. {
  711. u32 i;
  712. struct tegra_hte_soc *gs = dev_get_drvdata(dev);
  713. u32 slices = gs->chip->nlines / NV_LINES_IN_SLICE;
  714. u32 sl_bit_shift = __builtin_ctz(HTE_SLICE_SIZE);
  715. gs->conf_rval = tegra_hte_readl(gs, HTE_TECTRL);
  716. for (i = 0; i < slices; i++) {
  717. spin_lock(&gs->sl[i].s_lock);
  718. gs->sl[i].r_val = tegra_hte_readl(gs,
  719. ((i << sl_bit_shift) + HTE_SLICE0_TETEN));
  720. set_bit(HTE_SUSPEND, &gs->sl[i].flags);
  721. spin_unlock(&gs->sl[i].s_lock);
  722. }
  723. return 0;
  724. }
  725. static const struct dev_pm_ops tegra_hte_pm = {
  726. LATE_SYSTEM_SLEEP_PM_OPS(tegra_hte_suspend_late, tegra_hte_resume_early)
  727. };
  728. static struct platform_driver tegra_hte_driver = {
  729. .probe = tegra_hte_probe,
  730. .driver = {
  731. .name = "tegra_hte",
  732. .pm = pm_sleep_ptr(&tegra_hte_pm),
  733. .of_match_table = tegra_hte_of_match,
  734. },
  735. };
  736. module_platform_driver(tegra_hte_driver);
  737. MODULE_AUTHOR("Dipen Patel <dipenp@nvidia.com>");
  738. MODULE_DESCRIPTION("NVIDIA Tegra HTE (Hardware Timestamping Engine) driver");
  739. MODULE_LICENSE("GPL");