hte-tegra194.c 18 KB

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