tsens2xxx.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2020, 2021 The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/module.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/slab.h>
  9. #include <linux/err.h>
  10. #include <linux/of.h>
  11. #include <linux/vmalloc.h>
  12. #include "tsens2xxx.h"
  13. #include <linux/qcom_scm.h>
  14. #include "../thermal_core.h"
  15. #define TSENS_TM_INT_EN(n) ((n) + 0x4)
  16. #define TSENS_TM_CRITICAL_INT_STATUS(n) ((n) + 0x14)
  17. #define TSENS_TM_CRITICAL_INT_CLEAR(n) ((n) + 0x18)
  18. #define TSENS_TM_CRITICAL_INT_MASK(n) ((n) + 0x1c)
  19. #define TSENS_TM_CRITICAL_WD_BARK BIT(31)
  20. #define TSENS_TM_CRITICAL_CYCLE_MONITOR BIT(30)
  21. #define TSENS_TM_CRITICAL_INT_EN BIT(2)
  22. #define TSENS_TM_UPPER_INT_EN BIT(1)
  23. #define TSENS_TM_LOWER_INT_EN BIT(0)
  24. #define TSENS_TM_UPPER_LOWER_INT_DISABLE 0xffffffff
  25. #define TSENS_TM_SN_UPPER_LOWER_THRESHOLD(n) ((n) + 0x20)
  26. #define TSENS_TM_SN_ADDR_OFFSET 0x4
  27. #define TSENS_TM_UPPER_THRESHOLD_SET(n) ((n) << 12)
  28. #define TSENS_TM_UPPER_THRESHOLD_VALUE_SHIFT(n) ((n) >> 12)
  29. #define TSENS_TM_LOWER_THRESHOLD_VALUE(n) ((n) & 0xfff)
  30. #define TSENS_TM_UPPER_THRESHOLD_VALUE(n) (((n) & 0xfff000) >> 12)
  31. #define TSENS_TM_UPPER_THRESHOLD_MASK 0xfff000
  32. #define TSENS_TM_LOWER_THRESHOLD_MASK 0xfff
  33. #define TSENS_TM_UPPER_THRESHOLD_SHIFT 12
  34. #define TSENS_TM_SN_CRITICAL_THRESHOLD(n) ((n) + 0x60)
  35. #define TSENS_STATUS_ADDR_OFFSET 2
  36. #define TSENS_TM_UPPER_INT_MASK(n) (((n) & 0xffff0000) >> 16)
  37. #define TSENS_TM_LOWER_INT_MASK(n) ((n) & 0xffff)
  38. #define TSENS_TM_UPPER_LOWER_INT_STATUS(n) ((n) + 0x8)
  39. #define TSENS_TM_UPPER_LOWER_INT_CLEAR(n) ((n) + 0xc)
  40. #define TSENS_TM_UPPER_LOWER_INT_MASK(n) ((n) + 0x10)
  41. #define TSENS_TM_UPPER_INT_SET(n) (1 << (n + 16))
  42. #define TSENS_TM_SN_CRITICAL_THRESHOLD_MASK 0xfff
  43. #define TSENS_TM_SN_STATUS_VALID_BIT BIT(21)
  44. #define TSENS_TM_SN_STATUS_CRITICAL_STATUS BIT(19)
  45. #define TSENS_TM_SN_STATUS_UPPER_STATUS BIT(18)
  46. #define TSENS_TM_SN_STATUS_LOWER_STATUS BIT(17)
  47. #define TSENS_TM_SN_LAST_TEMP_MASK 0xfff
  48. #define TSENS_TM_CODE_BIT_MASK 0xfff
  49. #define TSENS_TM_0C_THR_MASK 0xfff
  50. #define TSENS_TM_0C_THR_OFFSET 12
  51. #define TSENS_TM_CODE_SIGN_BIT 0x800
  52. #define TSENS_TM_SCALE_DECI_MILLIDEG 100
  53. #define TSENS_DEBUG_WDOG_TRIGGER_COUNT 5
  54. #define TSENS_TM_WATCHDOG_LOG(n) ((n) + 0x13c)
  55. #define TSENS_TM_WATCHDOG_LOG_v23(n) ((n) + 0x170)
  56. #define TSENS_EN BIT(0)
  57. #define TSENS_CTRL_SENSOR_EN_MASK(n) ((n >> 3) & 0xffff)
  58. #define TSENS_TM_TRDY(n) ((n) + 0xe4)
  59. #define TSENS_TM_TRDY_FIRST_ROUND_COMPLETE BIT(3)
  60. #define TSENS_TM_TRDY_FIRST_ROUND_COMPLETE_SHIFT 3
  61. #define TSENS_TM_0C_INT_STATUS(n) ((n) + 0xe0)
  62. #define TSENS_TM_0C_THRESHOLDS(n) ((n) + 0x1c)
  63. #define TSENS_MAX_READ_FAIL 50
  64. #define TSENS_INIT_ID 0x5
  65. #define TSENS_RECOVERY_LOOP_COUNT 5
  66. static void msm_tsens_convert_temp(int last_temp, int *temp)
  67. {
  68. int code_mask = ~TSENS_TM_CODE_BIT_MASK;
  69. if (last_temp & TSENS_TM_CODE_SIGN_BIT) {
  70. /* Sign extension for negative value */
  71. last_temp |= code_mask;
  72. }
  73. *temp = last_temp * TSENS_TM_SCALE_DECI_MILLIDEG;
  74. }
  75. static int __tsens2xxx_hw_init(struct tsens_device *tmdev)
  76. {
  77. void __iomem *srot_addr;
  78. void __iomem *sensor_int_mask_addr;
  79. unsigned int srot_val, crit_mask, crit_val;
  80. void __iomem *int_mask_addr;
  81. srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4);
  82. srot_val = readl_relaxed(srot_addr);
  83. if (!(srot_val & TSENS_EN)) {
  84. pr_err("TSENS device is not enabled\n");
  85. return -ENODEV;
  86. }
  87. if (tmdev->ctrl_data->cycle_monitor) {
  88. sensor_int_mask_addr =
  89. TSENS_TM_CRITICAL_INT_MASK(tmdev->tsens_tm_addr);
  90. crit_mask = readl_relaxed(sensor_int_mask_addr);
  91. crit_val = TSENS_TM_CRITICAL_CYCLE_MONITOR;
  92. if (tmdev->ctrl_data->cycle_compltn_monitor_mask)
  93. writel_relaxed((crit_mask | crit_val),
  94. (TSENS_TM_CRITICAL_INT_MASK
  95. (tmdev->tsens_tm_addr)));
  96. else
  97. writel_relaxed((crit_mask & ~crit_val),
  98. (TSENS_TM_CRITICAL_INT_MASK
  99. (tmdev->tsens_tm_addr)));
  100. /*Update critical cycle monitoring*/
  101. mb();
  102. }
  103. if (tmdev->ctrl_data->wd_bark) {
  104. sensor_int_mask_addr =
  105. TSENS_TM_CRITICAL_INT_MASK(tmdev->tsens_tm_addr);
  106. crit_mask = readl_relaxed(sensor_int_mask_addr);
  107. crit_val = TSENS_TM_CRITICAL_WD_BARK;
  108. if (tmdev->ctrl_data->wd_bark_mask)
  109. writel_relaxed((crit_mask | crit_val),
  110. (TSENS_TM_CRITICAL_INT_MASK
  111. (tmdev->tsens_tm_addr)));
  112. else
  113. writel_relaxed((crit_mask & ~crit_val),
  114. (TSENS_TM_CRITICAL_INT_MASK
  115. (tmdev->tsens_tm_addr)));
  116. /*Update watchdog monitoring*/
  117. mb();
  118. }
  119. int_mask_addr = TSENS_TM_UPPER_LOWER_INT_MASK(tmdev->tsens_tm_addr);
  120. writel_relaxed(TSENS_TM_UPPER_LOWER_INT_DISABLE, int_mask_addr);
  121. writel_relaxed(TSENS_TM_CRITICAL_INT_EN |
  122. TSENS_TM_UPPER_INT_EN | TSENS_TM_LOWER_INT_EN,
  123. TSENS_TM_INT_EN(tmdev->tsens_tm_addr));
  124. return 0;
  125. }
  126. static int tsens2xxx_get_temp(struct tsens_sensor *sensor, int *temp)
  127. {
  128. struct tsens_device *tmdev = NULL, *tmdev_itr;
  129. unsigned int code, ret;
  130. void __iomem *sensor_addr, *trdy;
  131. int rc = 0, last_temp = 0, last_temp2 = 0, last_temp3 = 0, count = 0;
  132. int tsens_ret;
  133. static atomic_t in_tsens_reinit;
  134. if (!sensor)
  135. return -EINVAL;
  136. tmdev = sensor->tmdev;
  137. sensor_addr = TSENS_TM_SN_STATUS(tmdev->tsens_tm_addr);
  138. trdy = TSENS_TM_TRDY(tmdev->tsens_tm_addr);
  139. if (sensor->cached_temp != INT_MIN) {
  140. *temp = sensor->cached_temp;
  141. goto dbg;
  142. }
  143. code = readl_relaxed(trdy);
  144. if (!((code & TSENS_TM_TRDY_FIRST_ROUND_COMPLETE) >>
  145. TSENS_TM_TRDY_FIRST_ROUND_COMPLETE_SHIFT)) {
  146. if (atomic_read(&in_tsens_reinit)) {
  147. pr_err("%s: tsens re-init is in progress\n", __func__);
  148. return -EAGAIN;
  149. }
  150. pr_err("%s: tsens device first round not complete0x%x\n",
  151. __func__, code);
  152. /* Wait for 2.5 ms for tsens controller to recover */
  153. do {
  154. udelay(500);
  155. code = readl_relaxed(trdy);
  156. if (code & TSENS_TM_TRDY_FIRST_ROUND_COMPLETE) {
  157. TSENS_DUMP(tmdev, "%s",
  158. "tsens controller recovered\n");
  159. goto sensor_read;
  160. }
  161. } while (++count < TSENS_RECOVERY_LOOP_COUNT);
  162. /*
  163. * TSENS controller did not recover,
  164. * proceed with SCM call to re-init it
  165. */
  166. if (tmdev->tsens_reinit_wa) {
  167. int scm_cnt = 0, reg_write_cnt = 0;
  168. if (atomic_read(&in_tsens_reinit)) {
  169. pr_err("%s: tsens re-init is in progress\n",
  170. __func__);
  171. return -EAGAIN;
  172. }
  173. atomic_set(&in_tsens_reinit, 1);
  174. if (tmdev->ops->dbg)
  175. tmdev->ops->dbg(tmdev, 0,
  176. TSENS_DBG_LOG_BUS_ID_DATA, NULL);
  177. while (1) {
  178. /*
  179. * Invoke scm call only if SW register write is
  180. * reflecting in controller. If not, wait for
  181. * 2 ms and then retry.
  182. */
  183. if (reg_write_cnt >= 100) {
  184. msleep(100);
  185. pr_err(
  186. "%s: Tsens write is failed. cnt:%d\n",
  187. __func__, reg_write_cnt);
  188. BUG();
  189. }
  190. writel_relaxed(BIT(2),
  191. TSENS_TM_INT_EN(tmdev->tsens_tm_addr));
  192. code = readl_relaxed(
  193. TSENS_TM_INT_EN(tmdev->tsens_tm_addr));
  194. if (!(code & BIT(2))) {
  195. udelay(2000);
  196. TSENS_DBG(tmdev, "%s cnt:%d\n",
  197. "Re-try TSENS write prior to scm",
  198. reg_write_cnt++);
  199. continue;
  200. }
  201. reg_write_cnt = 0;
  202. /* Make an scm call to re-init TSENS */
  203. TSENS_DBG(tmdev, "%s",
  204. "Calling TZ to re-init TSENS\n");
  205. ret = qcom_scm_tsens_reinit(&tsens_ret);
  206. TSENS_DBG(tmdev, "%s",
  207. "return from scm call\n");
  208. if (ret) {
  209. msleep(100);
  210. pr_err("%s: scm call failed, ret:%d\n",
  211. __func__, ret);
  212. BUG();
  213. }
  214. if (tsens_ret) {
  215. msleep(100);
  216. pr_err("%s: scm call failed to init tsens, ret:%d\n",
  217. __func__, tsens_ret);
  218. BUG();
  219. }
  220. scm_cnt++;
  221. rc = 0;
  222. list_for_each_entry(tmdev_itr,
  223. &tsens_device_list, list) {
  224. rc = __tsens2xxx_hw_init(tmdev_itr);
  225. if (rc) {
  226. pr_err(
  227. "%s: TSENS hw_init error\n",
  228. __func__);
  229. break;
  230. }
  231. }
  232. if (!rc)
  233. break;
  234. if (scm_cnt >= 100) {
  235. msleep(100);
  236. pr_err(
  237. "%s: Tsens is not up after %d scm\n",
  238. __func__, scm_cnt);
  239. BUG();
  240. }
  241. udelay(2000);
  242. TSENS_DBG(tmdev, "%s cnt:%d\n",
  243. "Re-try TSENS scm call", scm_cnt);
  244. }
  245. tmdev->tsens_reinit_cnt++;
  246. atomic_set(&in_tsens_reinit, 0);
  247. /* Notify thermal fwk */
  248. list_for_each_entry(tmdev_itr,
  249. &tsens_device_list, list) {
  250. queue_work(tmdev_itr->tsens_reinit_work,
  251. &tmdev_itr->therm_fwk_notify);
  252. }
  253. } else {
  254. pr_err("%s: tsens controller got reset\n", __func__);
  255. BUG();
  256. }
  257. return -EAGAIN;
  258. }
  259. sensor_read:
  260. tmdev->trdy_fail_ctr = 0;
  261. code = readl_relaxed(sensor_addr +
  262. (sensor->hw_id << TSENS_STATUS_ADDR_OFFSET));
  263. last_temp = code & TSENS_TM_SN_LAST_TEMP_MASK;
  264. if (code & TSENS_TM_SN_STATUS_VALID_BIT) {
  265. msm_tsens_convert_temp(last_temp, temp);
  266. goto dbg;
  267. }
  268. code = readl_relaxed(sensor_addr +
  269. (sensor->hw_id << TSENS_STATUS_ADDR_OFFSET));
  270. last_temp2 = code & TSENS_TM_SN_LAST_TEMP_MASK;
  271. if (code & TSENS_TM_SN_STATUS_VALID_BIT) {
  272. last_temp = last_temp2;
  273. msm_tsens_convert_temp(last_temp, temp);
  274. goto dbg;
  275. }
  276. code = readl_relaxed(sensor_addr +
  277. (sensor->hw_id <<
  278. TSENS_STATUS_ADDR_OFFSET));
  279. last_temp3 = code & TSENS_TM_SN_LAST_TEMP_MASK;
  280. if (code & TSENS_TM_SN_STATUS_VALID_BIT) {
  281. last_temp = last_temp3;
  282. msm_tsens_convert_temp(last_temp, temp);
  283. goto dbg;
  284. }
  285. if (last_temp == last_temp2)
  286. last_temp = last_temp2;
  287. else if (last_temp2 == last_temp3)
  288. last_temp = last_temp3;
  289. msm_tsens_convert_temp(last_temp, temp);
  290. dbg:
  291. if (tmdev->ops->dbg)
  292. tmdev->ops->dbg(tmdev, (u32) sensor->hw_id,
  293. TSENS_DBG_LOG_TEMP_READS, temp);
  294. return 0;
  295. }
  296. int tsens_2xxx_get_zeroc_status(struct tsens_sensor *sensor, int *status)
  297. {
  298. struct tsens_device *tmdev = NULL;
  299. void __iomem *addr;
  300. if (!sensor)
  301. return -EINVAL;
  302. tmdev = sensor->tmdev;
  303. addr = TSENS_TM_0C_INT_STATUS(tmdev->tsens_tm_addr);
  304. *status = readl_relaxed(addr);
  305. TSENS_DBG(tmdev, "ZeroC status: %d\n", *status);
  306. return 0;
  307. }
  308. static int tsens_tm_activate_trip_type(struct tsens_sensor *tm_sensor,
  309. int trip, enum thermal_device_mode mode)
  310. {
  311. struct tsens_device *tmdev = NULL;
  312. unsigned int reg_cntl, mask;
  313. int rc = 0;
  314. /* clear the interrupt and unmask */
  315. if (!tm_sensor || trip < 0)
  316. return -EINVAL;
  317. tmdev = tm_sensor->tmdev;
  318. if (!tmdev)
  319. return -EINVAL;
  320. mask = (tm_sensor->hw_id);
  321. switch (trip) {
  322. case THERMAL_TRIP_CRITICAL:
  323. tmdev->sensor[tm_sensor->hw_id].thr_state.crit_th_state = mode;
  324. reg_cntl = readl_relaxed(TSENS_TM_CRITICAL_INT_MASK
  325. (tmdev->tsens_tm_addr));
  326. if (mode == THERMAL_DEVICE_DISABLED)
  327. writel_relaxed(reg_cntl | (1 << mask),
  328. (TSENS_TM_CRITICAL_INT_MASK
  329. (tmdev->tsens_tm_addr)));
  330. else
  331. writel_relaxed(reg_cntl & ~(1 << mask),
  332. (TSENS_TM_CRITICAL_INT_MASK
  333. (tmdev->tsens_tm_addr)));
  334. break;
  335. case TSENS_TRIP_CONFIGURABLE_HI:
  336. tmdev->sensor[tm_sensor->hw_id].thr_state.high_th_state = mode;
  337. reg_cntl = readl_relaxed(TSENS_TM_UPPER_LOWER_INT_MASK
  338. (tmdev->tsens_tm_addr));
  339. if (mode == THERMAL_DEVICE_DISABLED)
  340. writel_relaxed(reg_cntl |
  341. (TSENS_TM_UPPER_INT_SET(mask)),
  342. (TSENS_TM_UPPER_LOWER_INT_MASK
  343. (tmdev->tsens_tm_addr)));
  344. else
  345. writel_relaxed(reg_cntl &
  346. ~(TSENS_TM_UPPER_INT_SET(mask)),
  347. (TSENS_TM_UPPER_LOWER_INT_MASK
  348. (tmdev->tsens_tm_addr)));
  349. break;
  350. case TSENS_TRIP_CONFIGURABLE_LOW:
  351. tmdev->sensor[tm_sensor->hw_id].thr_state.low_th_state = mode;
  352. reg_cntl = readl_relaxed(TSENS_TM_UPPER_LOWER_INT_MASK
  353. (tmdev->tsens_tm_addr));
  354. if (mode == THERMAL_DEVICE_DISABLED)
  355. writel_relaxed(reg_cntl | (1 << mask),
  356. (TSENS_TM_UPPER_LOWER_INT_MASK
  357. (tmdev->tsens_tm_addr)));
  358. else
  359. writel_relaxed(reg_cntl & ~(1 << mask),
  360. (TSENS_TM_UPPER_LOWER_INT_MASK
  361. (tmdev->tsens_tm_addr)));
  362. break;
  363. default:
  364. rc = -EINVAL;
  365. }
  366. /* Activate and enable the respective trip threshold setting */
  367. mb();
  368. return rc;
  369. }
  370. static int tsens2xxx_set_trip_temp(struct tsens_sensor *tm_sensor,
  371. int low_temp, int high_temp)
  372. {
  373. unsigned int reg_cntl;
  374. unsigned long flags;
  375. struct tsens_device *tmdev = NULL;
  376. int rc = 0;
  377. if (!tm_sensor)
  378. return -EINVAL;
  379. tmdev = tm_sensor->tmdev;
  380. if (!tmdev)
  381. return -EINVAL;
  382. pr_debug("%s: sensor:%d low_temp(mdegC):%d, high_temp(mdegC):%d\n",
  383. __func__, tm_sensor->hw_id, low_temp, high_temp);
  384. spin_lock_irqsave(&tmdev->tsens_upp_low_lock, flags);
  385. if (high_temp != INT_MAX) {
  386. tmdev->sensor[tm_sensor->hw_id].thr_state.high_temp = high_temp;
  387. reg_cntl = readl_relaxed((TSENS_TM_SN_UPPER_LOWER_THRESHOLD
  388. (tmdev->tsens_tm_addr)) +
  389. (tm_sensor->hw_id *
  390. TSENS_TM_SN_ADDR_OFFSET));
  391. high_temp /= TSENS_TM_SCALE_DECI_MILLIDEG;
  392. high_temp = TSENS_TM_UPPER_THRESHOLD_SET(high_temp);
  393. high_temp &= TSENS_TM_UPPER_THRESHOLD_MASK;
  394. reg_cntl &= ~TSENS_TM_UPPER_THRESHOLD_MASK;
  395. writel_relaxed(reg_cntl | high_temp,
  396. (TSENS_TM_SN_UPPER_LOWER_THRESHOLD
  397. (tmdev->tsens_tm_addr) +
  398. (tm_sensor->hw_id * TSENS_TM_SN_ADDR_OFFSET)));
  399. }
  400. if (low_temp != -INT_MAX) {
  401. tmdev->sensor[tm_sensor->hw_id].thr_state.low_temp = low_temp;
  402. reg_cntl = readl_relaxed((TSENS_TM_SN_UPPER_LOWER_THRESHOLD
  403. (tmdev->tsens_tm_addr)) +
  404. (tm_sensor->hw_id *
  405. TSENS_TM_SN_ADDR_OFFSET));
  406. low_temp /= TSENS_TM_SCALE_DECI_MILLIDEG;
  407. low_temp &= TSENS_TM_LOWER_THRESHOLD_MASK;
  408. reg_cntl &= ~TSENS_TM_LOWER_THRESHOLD_MASK;
  409. writel_relaxed(reg_cntl | low_temp,
  410. (TSENS_TM_SN_UPPER_LOWER_THRESHOLD
  411. (tmdev->tsens_tm_addr) +
  412. (tm_sensor->hw_id * TSENS_TM_SN_ADDR_OFFSET)));
  413. }
  414. /* Set trip temperature thresholds */
  415. mb();
  416. if (high_temp != INT_MAX) {
  417. rc = tsens_tm_activate_trip_type(tm_sensor,
  418. TSENS_TRIP_CONFIGURABLE_HI,
  419. THERMAL_DEVICE_ENABLED);
  420. if (rc) {
  421. pr_err("trip high enable error :%d\n", rc);
  422. goto fail;
  423. }
  424. } else {
  425. rc = tsens_tm_activate_trip_type(tm_sensor,
  426. TSENS_TRIP_CONFIGURABLE_HI,
  427. THERMAL_DEVICE_DISABLED);
  428. if (rc) {
  429. pr_err("trip high disable error :%d\n", rc);
  430. goto fail;
  431. }
  432. }
  433. if (low_temp != -INT_MAX) {
  434. rc = tsens_tm_activate_trip_type(tm_sensor,
  435. TSENS_TRIP_CONFIGURABLE_LOW,
  436. THERMAL_DEVICE_ENABLED);
  437. if (rc) {
  438. pr_err("trip low enable activation error :%d\n", rc);
  439. goto fail;
  440. }
  441. } else {
  442. rc = tsens_tm_activate_trip_type(tm_sensor,
  443. TSENS_TRIP_CONFIGURABLE_LOW,
  444. THERMAL_DEVICE_DISABLED);
  445. if (rc) {
  446. pr_err("trip low disable error :%d\n", rc);
  447. goto fail;
  448. }
  449. }
  450. fail:
  451. spin_unlock_irqrestore(&tmdev->tsens_upp_low_lock, flags);
  452. return rc;
  453. }
  454. static irqreturn_t tsens_tm_critical_irq_thread(int irq, void *data)
  455. {
  456. struct tsens_device *tm = data;
  457. unsigned int i, status, wd_log, wd_mask;
  458. unsigned long flags;
  459. void __iomem *sensor_status_addr, *sensor_int_mask_addr;
  460. void __iomem *sensor_critical_addr;
  461. void __iomem *wd_critical_addr, *wd_log_addr;
  462. sensor_status_addr = TSENS_TM_SN_STATUS(tm->tsens_tm_addr);
  463. sensor_int_mask_addr =
  464. TSENS_TM_CRITICAL_INT_MASK(tm->tsens_tm_addr);
  465. sensor_critical_addr =
  466. TSENS_TM_SN_CRITICAL_THRESHOLD(tm->tsens_tm_addr);
  467. wd_critical_addr =
  468. TSENS_TM_CRITICAL_INT_STATUS(tm->tsens_tm_addr);
  469. if (tm->ctrl_data->ver_major == 2 && tm->ctrl_data->ver_minor == 3)
  470. wd_log_addr = TSENS_TM_WATCHDOG_LOG_v23(tm->tsens_tm_addr);
  471. else
  472. wd_log_addr = TSENS_TM_WATCHDOG_LOG(tm->tsens_tm_addr);
  473. if (tm->ctrl_data->wd_bark) {
  474. wd_mask = readl_relaxed(wd_critical_addr);
  475. if (wd_mask & TSENS_TM_CRITICAL_WD_BARK) {
  476. /*
  477. * Clear watchdog interrupt and
  478. * increment global wd count
  479. */
  480. writel_relaxed(wd_mask | TSENS_TM_CRITICAL_WD_BARK,
  481. (TSENS_TM_CRITICAL_INT_CLEAR
  482. (tm->tsens_tm_addr)));
  483. writel_relaxed(wd_mask & ~(TSENS_TM_CRITICAL_WD_BARK),
  484. (TSENS_TM_CRITICAL_INT_CLEAR
  485. (tm->tsens_tm_addr)));
  486. wd_log = readl_relaxed(wd_log_addr);
  487. if (wd_log >= TSENS_DEBUG_WDOG_TRIGGER_COUNT) {
  488. pr_err("Watchdog count:%d\n", wd_log);
  489. if (tm->ops->dbg)
  490. tm->ops->dbg(tm, 0,
  491. TSENS_DBG_LOG_BUS_ID_DATA, NULL);
  492. BUG();
  493. }
  494. return IRQ_HANDLED;
  495. }
  496. }
  497. for (i = 0; i < TSENS_MAX_SENSORS; i++) {
  498. int int_mask, int_mask_val;
  499. u32 addr_offset;
  500. if (IS_ERR(tm->sensor[i].tzd))
  501. continue;
  502. spin_lock_irqsave(&tm->tsens_crit_lock, flags);
  503. addr_offset = tm->sensor[i].hw_id *
  504. TSENS_TM_SN_ADDR_OFFSET;
  505. status = readl_relaxed(sensor_status_addr + addr_offset);
  506. int_mask = readl_relaxed(sensor_int_mask_addr);
  507. if ((status & TSENS_TM_SN_STATUS_CRITICAL_STATUS) &&
  508. !(int_mask & (1 << tm->sensor[i].hw_id))) {
  509. int_mask = readl_relaxed(sensor_int_mask_addr);
  510. int_mask_val = (1 << tm->sensor[i].hw_id);
  511. /* Mask the corresponding interrupt for the sensors */
  512. writel_relaxed(int_mask | int_mask_val,
  513. TSENS_TM_CRITICAL_INT_MASK(
  514. tm->tsens_tm_addr));
  515. /* Clear the corresponding sensors interrupt */
  516. writel_relaxed(int_mask_val,
  517. TSENS_TM_CRITICAL_INT_CLEAR
  518. (tm->tsens_tm_addr));
  519. writel_relaxed(0,
  520. TSENS_TM_CRITICAL_INT_CLEAR(
  521. tm->tsens_tm_addr));
  522. tm->sensor[i].thr_state.crit_th_state =
  523. THERMAL_DEVICE_DISABLED;
  524. }
  525. spin_unlock_irqrestore(&tm->tsens_crit_lock, flags);
  526. }
  527. /* Mask critical interrupt */
  528. mb();
  529. return IRQ_HANDLED;
  530. }
  531. static irqreturn_t tsens_tm_irq_thread(int irq, void *data)
  532. {
  533. struct tsens_device *tm = data;
  534. unsigned int i, status, threshold, temp;
  535. unsigned long flags;
  536. void __iomem *sensor_status_addr;
  537. void __iomem *sensor_int_mask_addr;
  538. void __iomem *sensor_upper_lower_addr;
  539. u32 addr_offset = 0;
  540. sensor_status_addr = TSENS_TM_SN_STATUS(tm->tsens_tm_addr);
  541. sensor_int_mask_addr =
  542. TSENS_TM_UPPER_LOWER_INT_MASK(tm->tsens_tm_addr);
  543. sensor_upper_lower_addr =
  544. TSENS_TM_SN_UPPER_LOWER_THRESHOLD(tm->tsens_tm_addr);
  545. for (i = 0; i < TSENS_MAX_SENSORS; i++) {
  546. bool upper_thr = false, lower_thr = false;
  547. int int_mask, int_mask_val = 0, rc;
  548. if (IS_ERR(tm->sensor[i].tzd))
  549. continue;
  550. rc = tsens2xxx_get_temp(&tm->sensor[i], &temp);
  551. if (rc) {
  552. pr_debug("Error:%d reading temp sensor:%d\n", rc, i);
  553. continue;
  554. }
  555. spin_lock_irqsave(&tm->tsens_upp_low_lock, flags);
  556. addr_offset = tm->sensor[i].hw_id *
  557. TSENS_TM_SN_ADDR_OFFSET;
  558. status = readl_relaxed(sensor_status_addr + addr_offset);
  559. threshold = readl_relaxed(sensor_upper_lower_addr +
  560. addr_offset);
  561. int_mask = readl_relaxed(sensor_int_mask_addr);
  562. if ((status & TSENS_TM_SN_STATUS_UPPER_STATUS) &&
  563. !(int_mask &
  564. (1 << (tm->sensor[i].hw_id + 16)))) {
  565. int_mask = readl_relaxed(sensor_int_mask_addr);
  566. int_mask_val = TSENS_TM_UPPER_INT_SET(
  567. tm->sensor[i].hw_id);
  568. /* Mask the corresponding interrupt for the sensors */
  569. writel_relaxed(int_mask | int_mask_val,
  570. TSENS_TM_UPPER_LOWER_INT_MASK(
  571. tm->tsens_tm_addr));
  572. /* Clear the corresponding sensors interrupt */
  573. writel_relaxed(int_mask_val,
  574. TSENS_TM_UPPER_LOWER_INT_CLEAR(
  575. tm->tsens_tm_addr));
  576. writel_relaxed(0,
  577. TSENS_TM_UPPER_LOWER_INT_CLEAR(
  578. tm->tsens_tm_addr));
  579. if (TSENS_TM_UPPER_THRESHOLD_VALUE(threshold) >
  580. (temp/TSENS_TM_SCALE_DECI_MILLIDEG)) {
  581. pr_debug("Re-arm high threshold\n");
  582. rc = tsens_tm_activate_trip_type(
  583. &tm->sensor[i],
  584. TSENS_TRIP_CONFIGURABLE_HI,
  585. THERMAL_DEVICE_ENABLED);
  586. if (rc)
  587. pr_err("high rearm failed:%d\n", rc);
  588. } else {
  589. upper_thr = true;
  590. tm->sensor[i].thr_state.high_th_state =
  591. THERMAL_DEVICE_DISABLED;
  592. }
  593. }
  594. if ((status & TSENS_TM_SN_STATUS_LOWER_STATUS) &&
  595. !(int_mask &
  596. (1 << tm->sensor[i].hw_id))) {
  597. int_mask = readl_relaxed(sensor_int_mask_addr);
  598. int_mask_val = (1 << tm->sensor[i].hw_id);
  599. /* Mask the corresponding interrupt for the sensors */
  600. writel_relaxed(int_mask | int_mask_val,
  601. TSENS_TM_UPPER_LOWER_INT_MASK(
  602. tm->tsens_tm_addr));
  603. /* Clear the corresponding sensors interrupt */
  604. writel_relaxed(int_mask_val,
  605. TSENS_TM_UPPER_LOWER_INT_CLEAR(
  606. tm->tsens_tm_addr));
  607. writel_relaxed(0,
  608. TSENS_TM_UPPER_LOWER_INT_CLEAR(
  609. tm->tsens_tm_addr));
  610. if (TSENS_TM_LOWER_THRESHOLD_VALUE(threshold)
  611. < (temp/TSENS_TM_SCALE_DECI_MILLIDEG)) {
  612. pr_debug("Re-arm low threshold\n");
  613. rc = tsens_tm_activate_trip_type(
  614. &tm->sensor[i],
  615. TSENS_TRIP_CONFIGURABLE_LOW,
  616. THERMAL_DEVICE_ENABLED);
  617. if (rc)
  618. pr_err("low rearm failed:%d\n", rc);
  619. } else {
  620. lower_thr = true;
  621. tm->sensor[i].thr_state.low_th_state =
  622. THERMAL_DEVICE_DISABLED;
  623. }
  624. }
  625. spin_unlock_irqrestore(&tm->tsens_upp_low_lock, flags);
  626. if (upper_thr || lower_thr) {
  627. /* Use id for multiple controllers */
  628. tm->sensor[i].cached_temp = temp;
  629. pr_debug("sensor:%d trigger temp (%d degC)\n",
  630. tm->sensor[i].hw_id, temp);
  631. thermal_zone_device_update(tm->sensor[i].tzd,
  632. THERMAL_EVENT_UNSPECIFIED);
  633. }
  634. tm->sensor[i].cached_temp = INT_MIN;
  635. }
  636. /* Disable monitoring sensor trip threshold for triggered sensor */
  637. mb();
  638. if (tm->ops->dbg)
  639. tm->ops->dbg(tm, 0, TSENS_DBG_LOG_INTERRUPT_TIMESTAMP, NULL);
  640. return IRQ_HANDLED;
  641. }
  642. static irqreturn_t tsens_tm_zeroc_irq_thread(int irq, void *data)
  643. {
  644. struct tsens_device *tm = data;
  645. int status, thrs, set_thr, reset_thr;
  646. void __iomem *srot_addr, *addr;
  647. addr = TSENS_TM_0C_INT_STATUS(tm->tsens_tm_addr);
  648. status = readl_relaxed(addr);
  649. srot_addr = TSENS_CTRL_ADDR(tm->tsens_srot_addr);
  650. thrs = readl_relaxed(TSENS_TM_0C_THRESHOLDS(srot_addr));
  651. msm_tsens_convert_temp(thrs & TSENS_TM_0C_THR_MASK, &reset_thr);
  652. msm_tsens_convert_temp(((thrs >> TSENS_TM_0C_THR_OFFSET)
  653. & TSENS_TM_0C_THR_MASK), &set_thr);
  654. TSENS_DBG(tm, "Tsens ZeroC status: %d set_t:%d reset_t:%d\n",
  655. status, set_thr, reset_thr);
  656. thermal_zone_device_update(tm->zeroc.tzd,
  657. THERMAL_EVENT_UNSPECIFIED);
  658. return IRQ_HANDLED;
  659. }
  660. static int tsens2xxx_hw_sensor_en(struct tsens_device *tmdev,
  661. u32 sensor_id)
  662. {
  663. void __iomem *srot_addr;
  664. unsigned int srot_val, sensor_en;
  665. srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4);
  666. srot_val = readl_relaxed(srot_addr);
  667. srot_val = TSENS_CTRL_SENSOR_EN_MASK(srot_val);
  668. sensor_en = ((1 << sensor_id) & srot_val);
  669. return sensor_en;
  670. }
  671. static int tsens2xxx_hw_init(struct tsens_device *tmdev)
  672. {
  673. int rc = 0;
  674. rc = __tsens2xxx_hw_init(tmdev);
  675. if (rc)
  676. return rc;
  677. spin_lock_init(&tmdev->tsens_crit_lock);
  678. spin_lock_init(&tmdev->tsens_upp_low_lock);
  679. return 0;
  680. }
  681. static const struct tsens_irqs tsens2xxx_irqs[] = {
  682. { "tsens-upper-lower", tsens_tm_irq_thread},
  683. { "tsens-critical", tsens_tm_critical_irq_thread},
  684. { "tsens-0C", tsens_tm_zeroc_irq_thread},
  685. };
  686. static int tsens2xxx_tsens_suspend(struct tsens_device *tmdev)
  687. {
  688. int i, irq;
  689. struct platform_device *pdev;
  690. if (!tmdev)
  691. return -EINVAL;
  692. pdev = tmdev->pdev;
  693. for (i = 0; i < (ARRAY_SIZE(tsens2xxx_irqs) - 1); i++) {
  694. irq = platform_get_irq_byname(pdev, tsens2xxx_irqs[i].name);
  695. if (irq < 0) {
  696. dev_err(&pdev->dev, "failed to get irq %s\n",
  697. tsens2xxx_irqs[i].name);
  698. return irq;
  699. }
  700. disable_irq_nosync(irq);
  701. }
  702. /* Vote for zeroC Voltage restrictions before deep sleep entry */
  703. if (tmdev->zeroc.tzd)
  704. thermal_zone_device_update(tmdev->zeroc.tzd,
  705. THERMAL_EVENT_UNSPECIFIED);
  706. return 0;
  707. }
  708. static int tsens2xxx_tsens_resume(struct tsens_device *tmdev)
  709. {
  710. int rc, i, irq;
  711. struct platform_device *pdev;
  712. if (!tmdev)
  713. return -EINVAL;
  714. rc = tsens2xxx_hw_init(tmdev);
  715. if (rc) {
  716. pr_err("Error initializing TSENS controller\n");
  717. return rc;
  718. }
  719. pdev = tmdev->pdev;
  720. for (i = 0; i < (ARRAY_SIZE(tsens2xxx_irqs) - 1); i++) {
  721. irq = platform_get_irq_byname(pdev, tsens2xxx_irqs[i].name);
  722. if (irq < 0) {
  723. dev_err(&pdev->dev, "failed to get irq %s\n",
  724. tsens2xxx_irqs[i].name);
  725. return irq;
  726. }
  727. enable_irq(irq);
  728. enable_irq_wake(irq);
  729. }
  730. queue_work(tmdev->tsens_reinit_work,
  731. &tmdev->therm_fwk_notify);
  732. return 0;
  733. }
  734. static int tsens2xxx_register_interrupts(struct tsens_device *tmdev)
  735. {
  736. struct platform_device *pdev;
  737. int i, rc, irq_no;
  738. if (!tmdev)
  739. return -EINVAL;
  740. if (tmdev->zeroc_sensor_id != MIN_TEMP_DEF_OFFSET)
  741. irq_no = ARRAY_SIZE(tsens2xxx_irqs);
  742. else
  743. irq_no = ARRAY_SIZE(tsens2xxx_irqs) - 1;
  744. pdev = tmdev->pdev;
  745. for (i = 0; i < irq_no; i++) {
  746. int irq;
  747. irq = platform_get_irq_byname(pdev, tsens2xxx_irqs[i].name);
  748. if (irq < 0) {
  749. dev_err(&pdev->dev, "failed to get irq %s\n",
  750. tsens2xxx_irqs[i].name);
  751. return irq;
  752. }
  753. rc = devm_request_threaded_irq(&pdev->dev, irq, NULL,
  754. tsens2xxx_irqs[i].handler,
  755. IRQF_ONESHOT, tsens2xxx_irqs[i].name, tmdev);
  756. if (rc) {
  757. dev_err(&pdev->dev, "failed to get irq %s\n",
  758. tsens2xxx_irqs[i].name);
  759. return rc;
  760. }
  761. enable_irq_wake(irq);
  762. }
  763. return 0;
  764. }
  765. static const struct tsens_ops ops_tsens2xxx = {
  766. .hw_init = tsens2xxx_hw_init,
  767. .get_temp = tsens2xxx_get_temp,
  768. .set_trips = tsens2xxx_set_trip_temp,
  769. .interrupts_reg = tsens2xxx_register_interrupts,
  770. .dbg = tsens2xxx_dbg,
  771. .sensor_en = tsens2xxx_hw_sensor_en,
  772. .suspend = tsens2xxx_tsens_suspend,
  773. .resume = tsens2xxx_tsens_resume,
  774. };
  775. const struct tsens_data data_tsens2xxx = {
  776. .cycle_monitor = false,
  777. .cycle_compltn_monitor_mask = 1,
  778. .wd_bark = false,
  779. .wd_bark_mask = 1,
  780. .ops = &ops_tsens2xxx,
  781. };
  782. const struct tsens_data data_tsens23xx = {
  783. .cycle_monitor = true,
  784. .cycle_compltn_monitor_mask = 1,
  785. .wd_bark = true,
  786. .wd_bark_mask = 1,
  787. .ops = &ops_tsens2xxx,
  788. .ver_major = 2,
  789. .ver_minor = 3,
  790. };
  791. const struct tsens_data data_tsens24xx = {
  792. .cycle_monitor = true,
  793. .cycle_compltn_monitor_mask = 1,
  794. .wd_bark = true,
  795. /* Enable Watchdog monitoring by unmasking */
  796. .wd_bark_mask = 0,
  797. .ops = &ops_tsens2xxx,
  798. };
  799. const struct tsens_data data_tsens26xx = {
  800. .cycle_monitor = true,
  801. .cycle_compltn_monitor_mask = 1,
  802. .wd_bark = true,
  803. .wd_bark_mask = 0,
  804. .ops = &ops_tsens2xxx,
  805. .ver_major = 2,
  806. .ver_minor = 6,
  807. };