tsens.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2015, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2019, 2020, Linaro Ltd.
  5. */
  6. #include <linux/debugfs.h>
  7. #include <linux/err.h>
  8. #include <linux/io.h>
  9. #include <linux/module.h>
  10. #include <linux/nvmem-consumer.h>
  11. #include <linux/of.h>
  12. #include <linux/of_address.h>
  13. #include <linux/of_platform.h>
  14. #include <linux/mfd/syscon.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/pm.h>
  17. #include <linux/regmap.h>
  18. #include <linux/slab.h>
  19. #include <linux/suspend.h>
  20. #include <linux/thermal.h>
  21. #include "../thermal_hwmon.h"
  22. #include "tsens.h"
  23. /**
  24. * struct tsens_irq_data - IRQ status and temperature violations
  25. * @up_viol: upper threshold violated
  26. * @up_thresh: upper threshold temperature value
  27. * @up_irq_mask: mask register for upper threshold irqs
  28. * @up_irq_clear: clear register for uppper threshold irqs
  29. * @low_viol: lower threshold violated
  30. * @low_thresh: lower threshold temperature value
  31. * @low_irq_mask: mask register for lower threshold irqs
  32. * @low_irq_clear: clear register for lower threshold irqs
  33. * @crit_viol: critical threshold violated
  34. * @crit_thresh: critical threshold temperature value
  35. * @crit_irq_mask: mask register for critical threshold irqs
  36. * @crit_irq_clear: clear register for critical threshold irqs
  37. *
  38. * Structure containing data about temperature threshold settings and
  39. * irq status if they were violated.
  40. */
  41. struct tsens_irq_data {
  42. u32 up_viol;
  43. int up_thresh;
  44. u32 up_irq_mask;
  45. u32 up_irq_clear;
  46. u32 low_viol;
  47. int low_thresh;
  48. u32 low_irq_mask;
  49. u32 low_irq_clear;
  50. u32 crit_viol;
  51. u32 crit_thresh;
  52. u32 crit_irq_mask;
  53. u32 crit_irq_clear;
  54. };
  55. char *qfprom_read(struct device *dev, const char *cname)
  56. {
  57. struct nvmem_cell *cell;
  58. ssize_t data;
  59. char *ret;
  60. cell = nvmem_cell_get(dev, cname);
  61. if (IS_ERR(cell))
  62. return ERR_CAST(cell);
  63. ret = nvmem_cell_read(cell, &data);
  64. nvmem_cell_put(cell);
  65. return ret;
  66. }
  67. int tsens_read_calibration(struct tsens_priv *priv, int shift, u32 *p1, u32 *p2, bool backup)
  68. {
  69. u32 mode;
  70. u32 base1, base2;
  71. char name[] = "sXX_pY_backup"; /* s10_p1_backup */
  72. int i, ret;
  73. if (priv->num_sensors > MAX_SENSORS)
  74. return -EINVAL;
  75. ret = snprintf(name, sizeof(name), "mode%s", backup ? "_backup" : "");
  76. if (ret < 0)
  77. return ret;
  78. ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &mode);
  79. if (ret == -ENOENT)
  80. dev_warn(priv->dev, "Please migrate to separate nvmem cells for calibration data\n");
  81. if (ret < 0)
  82. return ret;
  83. dev_dbg(priv->dev, "calibration mode is %d\n", mode);
  84. ret = snprintf(name, sizeof(name), "base1%s", backup ? "_backup" : "");
  85. if (ret < 0)
  86. return ret;
  87. ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &base1);
  88. if (ret < 0)
  89. return ret;
  90. ret = snprintf(name, sizeof(name), "base2%s", backup ? "_backup" : "");
  91. if (ret < 0)
  92. return ret;
  93. ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &base2);
  94. if (ret < 0)
  95. return ret;
  96. for (i = 0; i < priv->num_sensors; i++) {
  97. ret = snprintf(name, sizeof(name), "s%d_p1%s", priv->sensor[i].hw_id,
  98. backup ? "_backup" : "");
  99. if (ret < 0)
  100. return ret;
  101. ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &p1[i]);
  102. if (ret)
  103. return ret;
  104. ret = snprintf(name, sizeof(name), "s%d_p2%s", priv->sensor[i].hw_id,
  105. backup ? "_backup" : "");
  106. if (ret < 0)
  107. return ret;
  108. ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &p2[i]);
  109. if (ret)
  110. return ret;
  111. }
  112. switch (mode) {
  113. case ONE_PT_CALIB:
  114. for (i = 0; i < priv->num_sensors; i++)
  115. p1[i] = p1[i] + (base1 << shift);
  116. break;
  117. case TWO_PT_CALIB:
  118. case TWO_PT_CALIB_NO_OFFSET:
  119. for (i = 0; i < priv->num_sensors; i++)
  120. p2[i] = (p2[i] + base2) << shift;
  121. fallthrough;
  122. case ONE_PT_CALIB2:
  123. case ONE_PT_CALIB2_NO_OFFSET:
  124. for (i = 0; i < priv->num_sensors; i++)
  125. p1[i] = (p1[i] + base1) << shift;
  126. break;
  127. default:
  128. dev_dbg(priv->dev, "calibrationless mode\n");
  129. for (i = 0; i < priv->num_sensors; i++) {
  130. p1[i] = 500;
  131. p2[i] = 780;
  132. }
  133. }
  134. /* Apply calibration offset workaround except for _NO_OFFSET modes */
  135. switch (mode) {
  136. case TWO_PT_CALIB:
  137. for (i = 0; i < priv->num_sensors; i++)
  138. p2[i] += priv->sensor[i].p2_calib_offset;
  139. fallthrough;
  140. case ONE_PT_CALIB2:
  141. for (i = 0; i < priv->num_sensors; i++)
  142. p1[i] += priv->sensor[i].p1_calib_offset;
  143. break;
  144. }
  145. return mode;
  146. }
  147. int tsens_calibrate_nvmem(struct tsens_priv *priv, int shift)
  148. {
  149. u32 p1[MAX_SENSORS], p2[MAX_SENSORS];
  150. int mode;
  151. mode = tsens_read_calibration(priv, shift, p1, p2, false);
  152. if (mode < 0)
  153. return mode;
  154. compute_intercept_slope(priv, p1, p2, mode);
  155. return 0;
  156. }
  157. int tsens_calibrate_common(struct tsens_priv *priv)
  158. {
  159. return tsens_calibrate_nvmem(priv, 2);
  160. }
  161. static u32 tsens_read_cell(const struct tsens_single_value *cell, u8 len, u32 *data0, u32 *data1)
  162. {
  163. u32 val;
  164. u32 *data = cell->blob ? data1 : data0;
  165. if (cell->shift + len <= 32) {
  166. val = data[cell->idx] >> cell->shift;
  167. } else {
  168. u8 part = 32 - cell->shift;
  169. val = data[cell->idx] >> cell->shift;
  170. val |= data[cell->idx + 1] << part;
  171. }
  172. return val & ((1 << len) - 1);
  173. }
  174. int tsens_read_calibration_legacy(struct tsens_priv *priv,
  175. const struct tsens_legacy_calibration_format *format,
  176. u32 *p1, u32 *p2,
  177. u32 *cdata0, u32 *cdata1)
  178. {
  179. u32 mode, invalid;
  180. u32 base1, base2;
  181. int i;
  182. mode = tsens_read_cell(&format->mode, 2, cdata0, cdata1);
  183. invalid = tsens_read_cell(&format->invalid, 1, cdata0, cdata1);
  184. if (invalid)
  185. mode = NO_PT_CALIB;
  186. dev_dbg(priv->dev, "calibration mode is %d\n", mode);
  187. base1 = tsens_read_cell(&format->base[0], format->base_len, cdata0, cdata1);
  188. base2 = tsens_read_cell(&format->base[1], format->base_len, cdata0, cdata1);
  189. for (i = 0; i < priv->num_sensors; i++) {
  190. p1[i] = tsens_read_cell(&format->sp[i][0], format->sp_len, cdata0, cdata1);
  191. p2[i] = tsens_read_cell(&format->sp[i][1], format->sp_len, cdata0, cdata1);
  192. }
  193. switch (mode) {
  194. case ONE_PT_CALIB:
  195. for (i = 0; i < priv->num_sensors; i++)
  196. p1[i] = p1[i] + (base1 << format->base_shift);
  197. break;
  198. case TWO_PT_CALIB:
  199. for (i = 0; i < priv->num_sensors; i++)
  200. p2[i] = (p2[i] + base2) << format->base_shift;
  201. fallthrough;
  202. case ONE_PT_CALIB2:
  203. for (i = 0; i < priv->num_sensors; i++)
  204. p1[i] = (p1[i] + base1) << format->base_shift;
  205. break;
  206. default:
  207. dev_dbg(priv->dev, "calibrationless mode\n");
  208. for (i = 0; i < priv->num_sensors; i++) {
  209. p1[i] = 500;
  210. p2[i] = 780;
  211. }
  212. }
  213. return mode;
  214. }
  215. /*
  216. * Use this function on devices where slope and offset calculations
  217. * depend on calibration data read from qfprom. On others the slope
  218. * and offset values are derived from tz->tzp->slope and tz->tzp->offset
  219. * resp.
  220. */
  221. void compute_intercept_slope(struct tsens_priv *priv, u32 *p1,
  222. u32 *p2, u32 mode)
  223. {
  224. int i;
  225. int num, den;
  226. for (i = 0; i < priv->num_sensors; i++) {
  227. dev_dbg(priv->dev,
  228. "%s: sensor%d - data_point1:%#x data_point2:%#x\n",
  229. __func__, i, p1[i], p2 ? p2[i] : 0);
  230. if (!priv->sensor[i].slope)
  231. priv->sensor[i].slope = SLOPE_DEFAULT;
  232. if (mode == TWO_PT_CALIB || mode == TWO_PT_CALIB_NO_OFFSET) {
  233. /*
  234. * slope (m) = adc_code2 - adc_code1 (y2 - y1)/
  235. * temp_120_degc - temp_30_degc (x2 - x1)
  236. */
  237. num = p2[i] - p1[i];
  238. num *= SLOPE_FACTOR;
  239. den = CAL_DEGC_PT2 - CAL_DEGC_PT1;
  240. priv->sensor[i].slope = num / den;
  241. }
  242. priv->sensor[i].offset = (p1[i] * SLOPE_FACTOR) -
  243. (CAL_DEGC_PT1 *
  244. priv->sensor[i].slope);
  245. dev_dbg(priv->dev, "%s: offset:%d\n", __func__,
  246. priv->sensor[i].offset);
  247. }
  248. }
  249. static inline u32 degc_to_code(int degc, const struct tsens_sensor *s)
  250. {
  251. u64 code = div_u64(((u64)degc * s->slope + s->offset), SLOPE_FACTOR);
  252. pr_debug("%s: raw_code: 0x%llx, degc:%d\n", __func__, code, degc);
  253. return clamp_val(code, THRESHOLD_MIN_ADC_CODE, THRESHOLD_MAX_ADC_CODE);
  254. }
  255. static inline int code_to_degc(u32 adc_code, const struct tsens_sensor *s)
  256. {
  257. int degc, num, den;
  258. num = (adc_code * SLOPE_FACTOR) - s->offset;
  259. den = s->slope;
  260. if (num > 0)
  261. degc = num + (den / 2);
  262. else if (num < 0)
  263. degc = num - (den / 2);
  264. else
  265. degc = num;
  266. degc /= den;
  267. return degc;
  268. }
  269. /**
  270. * tsens_hw_to_mC - Return sign-extended temperature in mCelsius.
  271. * @s: Pointer to sensor struct
  272. * @field: Index into regmap_field array pointing to temperature data
  273. *
  274. * This function handles temperature returned in ADC code or deciCelsius
  275. * depending on IP version.
  276. *
  277. * Return: Temperature in milliCelsius on success, a negative errno will
  278. * be returned in error cases
  279. */
  280. static int tsens_hw_to_mC(const struct tsens_sensor *s, int field)
  281. {
  282. struct tsens_priv *priv = s->priv;
  283. u32 resolution;
  284. u32 temp = 0;
  285. int ret;
  286. resolution = priv->fields[LAST_TEMP_0].msb -
  287. priv->fields[LAST_TEMP_0].lsb;
  288. ret = regmap_field_read(priv->rf[field], &temp);
  289. if (ret)
  290. return ret;
  291. /* Convert temperature from ADC code to milliCelsius */
  292. if (priv->feat->adc)
  293. return code_to_degc(temp, s) * 1000;
  294. /* deciCelsius -> milliCelsius along with sign extension */
  295. return sign_extend32(temp, resolution) * 100;
  296. }
  297. /**
  298. * tsens_mC_to_hw - Convert temperature to hardware register value
  299. * @s: Pointer to sensor struct
  300. * @temp: temperature in milliCelsius to be programmed to hardware
  301. *
  302. * This function outputs the value to be written to hardware in ADC code
  303. * or deciCelsius depending on IP version.
  304. *
  305. * Return: ADC code or temperature in deciCelsius.
  306. */
  307. static int tsens_mC_to_hw(const struct tsens_sensor *s, int temp)
  308. {
  309. struct tsens_priv *priv = s->priv;
  310. /* milliC to adc code */
  311. if (priv->feat->adc)
  312. return degc_to_code(temp / 1000, s);
  313. /* milliC to deciC */
  314. return temp / 100;
  315. }
  316. static inline enum tsens_ver tsens_version(struct tsens_priv *priv)
  317. {
  318. return priv->feat->ver_major;
  319. }
  320. static void tsens_set_interrupt_v1(struct tsens_priv *priv, u32 hw_id,
  321. enum tsens_irq_type irq_type, bool enable)
  322. {
  323. u32 index = 0;
  324. switch (irq_type) {
  325. case UPPER:
  326. index = UP_INT_CLEAR_0 + hw_id;
  327. break;
  328. case LOWER:
  329. index = LOW_INT_CLEAR_0 + hw_id;
  330. break;
  331. case CRITICAL:
  332. /* No critical interrupts before v2 */
  333. return;
  334. }
  335. regmap_field_write(priv->rf[index], enable ? 0 : 1);
  336. }
  337. static void tsens_set_interrupt_v2(struct tsens_priv *priv, u32 hw_id,
  338. enum tsens_irq_type irq_type, bool enable)
  339. {
  340. u32 index_mask = 0, index_clear = 0;
  341. /*
  342. * To enable the interrupt flag for a sensor:
  343. * - clear the mask bit
  344. * To disable the interrupt flag for a sensor:
  345. * - Mask further interrupts for this sensor
  346. * - Write 1 followed by 0 to clear the interrupt
  347. */
  348. switch (irq_type) {
  349. case UPPER:
  350. index_mask = UP_INT_MASK_0 + hw_id;
  351. index_clear = UP_INT_CLEAR_0 + hw_id;
  352. break;
  353. case LOWER:
  354. index_mask = LOW_INT_MASK_0 + hw_id;
  355. index_clear = LOW_INT_CLEAR_0 + hw_id;
  356. break;
  357. case CRITICAL:
  358. index_mask = CRIT_INT_MASK_0 + hw_id;
  359. index_clear = CRIT_INT_CLEAR_0 + hw_id;
  360. break;
  361. }
  362. if (enable) {
  363. regmap_field_write(priv->rf[index_mask], 0);
  364. } else {
  365. regmap_field_write(priv->rf[index_mask], 1);
  366. regmap_field_write(priv->rf[index_clear], 1);
  367. regmap_field_write(priv->rf[index_clear], 0);
  368. }
  369. }
  370. /**
  371. * tsens_set_interrupt - Set state of an interrupt
  372. * @priv: Pointer to tsens controller private data
  373. * @hw_id: Hardware ID aka. sensor number
  374. * @irq_type: irq_type from enum tsens_irq_type
  375. * @enable: false = disable, true = enable
  376. *
  377. * Call IP-specific function to set state of an interrupt
  378. *
  379. * Return: void
  380. */
  381. static void tsens_set_interrupt(struct tsens_priv *priv, u32 hw_id,
  382. enum tsens_irq_type irq_type, bool enable)
  383. {
  384. dev_dbg(priv->dev, "[%u] %s: %s -> %s\n", hw_id, __func__,
  385. irq_type ? ((irq_type == 1) ? "UP" : "CRITICAL") : "LOW",
  386. enable ? "en" : "dis");
  387. if (tsens_version(priv) >= VER_2_X)
  388. tsens_set_interrupt_v2(priv, hw_id, irq_type, enable);
  389. else
  390. tsens_set_interrupt_v1(priv, hw_id, irq_type, enable);
  391. }
  392. /**
  393. * tsens_threshold_violated - Check if a sensor temperature violated a preset threshold
  394. * @priv: Pointer to tsens controller private data
  395. * @hw_id: Hardware ID aka. sensor number
  396. * @d: Pointer to irq state data
  397. *
  398. * Return: 0 if threshold was not violated, 1 if it was violated and negative
  399. * errno in case of errors
  400. */
  401. static int tsens_threshold_violated(struct tsens_priv *priv, u32 hw_id,
  402. struct tsens_irq_data *d)
  403. {
  404. int ret;
  405. ret = regmap_field_read(priv->rf[UPPER_STATUS_0 + hw_id], &d->up_viol);
  406. if (ret)
  407. return ret;
  408. ret = regmap_field_read(priv->rf[LOWER_STATUS_0 + hw_id], &d->low_viol);
  409. if (ret)
  410. return ret;
  411. if (priv->feat->crit_int) {
  412. ret = regmap_field_read(priv->rf[CRITICAL_STATUS_0 + hw_id],
  413. &d->crit_viol);
  414. if (ret)
  415. return ret;
  416. }
  417. if (d->up_viol || d->low_viol || d->crit_viol)
  418. return 1;
  419. return 0;
  420. }
  421. static int tsens_read_irq_state(struct tsens_priv *priv, u32 hw_id,
  422. const struct tsens_sensor *s,
  423. struct tsens_irq_data *d)
  424. {
  425. int ret;
  426. ret = regmap_field_read(priv->rf[UP_INT_CLEAR_0 + hw_id], &d->up_irq_clear);
  427. if (ret)
  428. return ret;
  429. ret = regmap_field_read(priv->rf[LOW_INT_CLEAR_0 + hw_id], &d->low_irq_clear);
  430. if (ret)
  431. return ret;
  432. if (tsens_version(priv) >= VER_2_X) {
  433. ret = regmap_field_read(priv->rf[UP_INT_MASK_0 + hw_id], &d->up_irq_mask);
  434. if (ret)
  435. return ret;
  436. ret = regmap_field_read(priv->rf[LOW_INT_MASK_0 + hw_id], &d->low_irq_mask);
  437. if (ret)
  438. return ret;
  439. ret = regmap_field_read(priv->rf[CRIT_INT_CLEAR_0 + hw_id],
  440. &d->crit_irq_clear);
  441. if (ret)
  442. return ret;
  443. ret = regmap_field_read(priv->rf[CRIT_INT_MASK_0 + hw_id],
  444. &d->crit_irq_mask);
  445. if (ret)
  446. return ret;
  447. d->crit_thresh = tsens_hw_to_mC(s, CRIT_THRESH_0 + hw_id);
  448. } else {
  449. /* No mask register on older TSENS */
  450. d->up_irq_mask = 0;
  451. d->low_irq_mask = 0;
  452. d->crit_irq_clear = 0;
  453. d->crit_irq_mask = 0;
  454. d->crit_thresh = 0;
  455. }
  456. d->up_thresh = tsens_hw_to_mC(s, UP_THRESH_0 + hw_id);
  457. d->low_thresh = tsens_hw_to_mC(s, LOW_THRESH_0 + hw_id);
  458. dev_dbg(priv->dev, "[%u] %s%s: status(%u|%u|%u) | clr(%u|%u|%u) | mask(%u|%u|%u)\n",
  459. hw_id, __func__,
  460. (d->up_viol || d->low_viol || d->crit_viol) ? "(V)" : "",
  461. d->low_viol, d->up_viol, d->crit_viol,
  462. d->low_irq_clear, d->up_irq_clear, d->crit_irq_clear,
  463. d->low_irq_mask, d->up_irq_mask, d->crit_irq_mask);
  464. dev_dbg(priv->dev, "[%u] %s%s: thresh: (%d:%d:%d)\n", hw_id, __func__,
  465. (d->up_viol || d->low_viol || d->crit_viol) ? "(V)" : "",
  466. d->low_thresh, d->up_thresh, d->crit_thresh);
  467. return 0;
  468. }
  469. static inline u32 masked_irq(u32 hw_id, u32 mask, enum tsens_ver ver)
  470. {
  471. if (ver >= VER_2_X)
  472. return mask & (1 << hw_id);
  473. /* v1, v0.1 don't have a irq mask register */
  474. return 0;
  475. }
  476. /**
  477. * tsens_critical_irq_thread() - Threaded handler for critical interrupts
  478. * @irq: irq number
  479. * @data: tsens controller private data
  480. *
  481. * Check FSM watchdog bark status and clear if needed.
  482. * Check all sensors to find ones that violated their critical threshold limits.
  483. * Clear and then re-enable the interrupt.
  484. *
  485. * The level-triggered interrupt might deassert if the temperature returned to
  486. * within the threshold limits by the time the handler got scheduled. We
  487. * consider the irq to have been handled in that case.
  488. *
  489. * Return: IRQ_HANDLED
  490. */
  491. static irqreturn_t tsens_critical_irq_thread(int irq, void *data)
  492. {
  493. struct tsens_priv *priv = data;
  494. struct tsens_irq_data d;
  495. int temp, ret, i;
  496. u32 wdog_status, wdog_count;
  497. if (priv->feat->has_watchdog) {
  498. ret = regmap_field_read(priv->rf[WDOG_BARK_STATUS],
  499. &wdog_status);
  500. if (ret)
  501. return ret;
  502. if (wdog_status) {
  503. /* Clear WDOG interrupt */
  504. regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 1);
  505. regmap_field_write(priv->rf[WDOG_BARK_CLEAR], 0);
  506. ret = regmap_field_read(priv->rf[WDOG_BARK_COUNT],
  507. &wdog_count);
  508. if (ret)
  509. return ret;
  510. if (wdog_count)
  511. dev_dbg(priv->dev, "%s: watchdog count: %d\n",
  512. __func__, wdog_count);
  513. /* Fall through to handle critical interrupts if any */
  514. }
  515. }
  516. for (i = 0; i < priv->num_sensors; i++) {
  517. const struct tsens_sensor *s = &priv->sensor[i];
  518. u32 hw_id = s->hw_id;
  519. if (!s->tzd)
  520. continue;
  521. if (!tsens_threshold_violated(priv, hw_id, &d))
  522. continue;
  523. ret = get_temp_tsens_valid(s, &temp);
  524. if (ret) {
  525. dev_err(priv->dev, "[%u] %s: error reading sensor\n",
  526. hw_id, __func__);
  527. continue;
  528. }
  529. tsens_read_irq_state(priv, hw_id, s, &d);
  530. if (d.crit_viol &&
  531. !masked_irq(hw_id, d.crit_irq_mask, tsens_version(priv))) {
  532. /* Mask critical interrupts, unused on Linux */
  533. tsens_set_interrupt(priv, hw_id, CRITICAL, false);
  534. }
  535. }
  536. return IRQ_HANDLED;
  537. }
  538. /**
  539. * tsens_irq_thread - Threaded interrupt handler for uplow interrupts
  540. * @irq: irq number
  541. * @data: tsens controller private data
  542. *
  543. * Check all sensors to find ones that violated their threshold limits. If the
  544. * temperature is still outside the limits, call thermal_zone_device_update() to
  545. * update the thresholds, else re-enable the interrupts.
  546. *
  547. * The level-triggered interrupt might deassert if the temperature returned to
  548. * within the threshold limits by the time the handler got scheduled. We
  549. * consider the irq to have been handled in that case.
  550. *
  551. * Return: IRQ_HANDLED
  552. */
  553. static irqreturn_t tsens_irq_thread(int irq, void *data)
  554. {
  555. struct tsens_priv *priv = data;
  556. struct tsens_irq_data d;
  557. int i;
  558. for (i = 0; i < priv->num_sensors; i++) {
  559. const struct tsens_sensor *s = &priv->sensor[i];
  560. u32 hw_id = s->hw_id;
  561. if (!s->tzd)
  562. continue;
  563. if (!tsens_threshold_violated(priv, hw_id, &d))
  564. continue;
  565. thermal_zone_device_update(s->tzd, THERMAL_EVENT_UNSPECIFIED);
  566. if (tsens_version(priv) < VER_0_1) {
  567. /* Constraint: There is only 1 interrupt control register for all
  568. * 11 temperature sensor. So monitoring more than 1 sensor based
  569. * on interrupts will yield inconsistent result. To overcome this
  570. * issue we will monitor only sensor 0 which is the master sensor.
  571. */
  572. break;
  573. }
  574. }
  575. return IRQ_HANDLED;
  576. }
  577. /**
  578. * tsens_combined_irq_thread() - Threaded interrupt handler for combined interrupts
  579. * @irq: irq number
  580. * @data: tsens controller private data
  581. *
  582. * Handle the combined interrupt as if it were 2 separate interrupts, so call the
  583. * critical handler first and then the up/low one.
  584. *
  585. * Return: IRQ_HANDLED
  586. */
  587. static irqreturn_t tsens_combined_irq_thread(int irq, void *data)
  588. {
  589. irqreturn_t ret;
  590. ret = tsens_critical_irq_thread(irq, data);
  591. if (ret != IRQ_HANDLED)
  592. return ret;
  593. return tsens_irq_thread(irq, data);
  594. }
  595. static int tsens_set_trips(struct thermal_zone_device *tz, int low, int high)
  596. {
  597. struct tsens_sensor *s = thermal_zone_device_priv(tz);
  598. struct tsens_priv *priv = s->priv;
  599. struct device *dev = priv->dev;
  600. struct tsens_irq_data d;
  601. unsigned long flags;
  602. int high_val, low_val, cl_high, cl_low;
  603. u32 hw_id = s->hw_id;
  604. if (tsens_version(priv) < VER_0_1) {
  605. /* Pre v0.1 IP had a single register for each type of interrupt
  606. * and thresholds
  607. */
  608. hw_id = 0;
  609. }
  610. dev_dbg(dev, "[%u] %s: proposed thresholds: (%d:%d)\n",
  611. hw_id, __func__, low, high);
  612. cl_high = clamp_val(high, priv->feat->trip_min_temp, priv->feat->trip_max_temp);
  613. cl_low = clamp_val(low, priv->feat->trip_min_temp, priv->feat->trip_max_temp);
  614. high_val = tsens_mC_to_hw(s, cl_high);
  615. low_val = tsens_mC_to_hw(s, cl_low);
  616. spin_lock_irqsave(&priv->ul_lock, flags);
  617. tsens_read_irq_state(priv, hw_id, s, &d);
  618. /* Write the new thresholds and clear the status */
  619. regmap_field_write(priv->rf[LOW_THRESH_0 + hw_id], low_val);
  620. regmap_field_write(priv->rf[UP_THRESH_0 + hw_id], high_val);
  621. tsens_set_interrupt(priv, hw_id, LOWER, true);
  622. tsens_set_interrupt(priv, hw_id, UPPER, true);
  623. spin_unlock_irqrestore(&priv->ul_lock, flags);
  624. dev_dbg(dev, "[%u] %s: (%d:%d)->(%d:%d)\n",
  625. hw_id, __func__, d.low_thresh, d.up_thresh, cl_low, cl_high);
  626. return 0;
  627. }
  628. static int tsens_enable_irq(struct tsens_priv *priv)
  629. {
  630. int ret;
  631. int val = tsens_version(priv) >= VER_2_X ? 7 : 1;
  632. ret = regmap_field_write(priv->rf[INT_EN], val);
  633. if (ret < 0)
  634. dev_err(priv->dev, "%s: failed to enable interrupts\n",
  635. __func__);
  636. return ret;
  637. }
  638. static void tsens_disable_irq(struct tsens_priv *priv)
  639. {
  640. regmap_field_write(priv->rf[INT_EN], 0);
  641. }
  642. int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
  643. {
  644. struct tsens_priv *priv = s->priv;
  645. int hw_id = s->hw_id;
  646. u32 temp_idx = LAST_TEMP_0 + hw_id;
  647. u32 valid_idx = VALID_0 + hw_id;
  648. u32 valid;
  649. int ret;
  650. /* VER_0 doesn't have VALID bit */
  651. if (tsens_version(priv) == VER_0)
  652. goto get_temp;
  653. /* Valid bit is 0 for 6 AHB clock cycles.
  654. * At 19.2MHz, 1 AHB clock is ~60ns.
  655. * We should enter this loop very, very rarely.
  656. * Wait 1 us since it's the min of poll_timeout macro.
  657. * Old value was 400 ns.
  658. */
  659. ret = regmap_field_read_poll_timeout(priv->rf[valid_idx], valid,
  660. valid, 1, 20 * USEC_PER_MSEC);
  661. if (ret)
  662. return ret;
  663. get_temp:
  664. /* Valid bit is set, OK to read the temperature */
  665. *temp = tsens_hw_to_mC(s, temp_idx);
  666. return 0;
  667. }
  668. int get_temp_common(const struct tsens_sensor *s, int *temp)
  669. {
  670. struct tsens_priv *priv = s->priv;
  671. int hw_id = s->hw_id;
  672. int last_temp = 0, ret, trdy;
  673. unsigned long timeout;
  674. timeout = jiffies + usecs_to_jiffies(TIMEOUT_US);
  675. do {
  676. if (tsens_version(priv) == VER_0) {
  677. ret = regmap_field_read(priv->rf[TRDY], &trdy);
  678. if (ret)
  679. return ret;
  680. if (!trdy)
  681. continue;
  682. }
  683. ret = regmap_field_read(priv->rf[LAST_TEMP_0 + hw_id], &last_temp);
  684. if (ret)
  685. return ret;
  686. *temp = code_to_degc(last_temp, s) * 1000;
  687. return 0;
  688. } while (time_before(jiffies, timeout));
  689. return -ETIMEDOUT;
  690. }
  691. #ifdef CONFIG_DEBUG_FS
  692. static int dbg_sensors_show(struct seq_file *s, void *data)
  693. {
  694. struct platform_device *pdev = s->private;
  695. struct tsens_priv *priv = platform_get_drvdata(pdev);
  696. int i;
  697. seq_printf(s, "max: %2d\nnum: %2d\n\n",
  698. priv->feat->max_sensors, priv->num_sensors);
  699. seq_puts(s, " id slope offset\n--------------------------\n");
  700. for (i = 0; i < priv->num_sensors; i++) {
  701. seq_printf(s, "%8d %8d %8d\n", priv->sensor[i].hw_id,
  702. priv->sensor[i].slope, priv->sensor[i].offset);
  703. }
  704. return 0;
  705. }
  706. static int dbg_version_show(struct seq_file *s, void *data)
  707. {
  708. struct platform_device *pdev = s->private;
  709. struct tsens_priv *priv = platform_get_drvdata(pdev);
  710. u32 maj_ver, min_ver, step_ver;
  711. int ret;
  712. if (tsens_version(priv) > VER_0_1) {
  713. ret = regmap_field_read(priv->rf[VER_MAJOR], &maj_ver);
  714. if (ret)
  715. return ret;
  716. ret = regmap_field_read(priv->rf[VER_MINOR], &min_ver);
  717. if (ret)
  718. return ret;
  719. ret = regmap_field_read(priv->rf[VER_STEP], &step_ver);
  720. if (ret)
  721. return ret;
  722. seq_printf(s, "%d.%d.%d\n", maj_ver, min_ver, step_ver);
  723. } else {
  724. seq_printf(s, "0.%d.0\n", priv->feat->ver_major);
  725. }
  726. return 0;
  727. }
  728. DEFINE_SHOW_ATTRIBUTE(dbg_version);
  729. DEFINE_SHOW_ATTRIBUTE(dbg_sensors);
  730. static void tsens_debug_init(struct platform_device *pdev)
  731. {
  732. struct tsens_priv *priv = platform_get_drvdata(pdev);
  733. priv->debug_root = debugfs_lookup("tsens", NULL);
  734. if (!priv->debug_root)
  735. priv->debug_root = debugfs_create_dir("tsens", NULL);
  736. /* A directory for each instance of the TSENS IP */
  737. priv->debug = debugfs_create_dir(dev_name(&pdev->dev), priv->debug_root);
  738. debugfs_create_file("version", 0444, priv->debug, pdev, &dbg_version_fops);
  739. debugfs_create_file("sensors", 0444, priv->debug, pdev, &dbg_sensors_fops);
  740. }
  741. #else
  742. static inline void tsens_debug_init(struct platform_device *pdev) {}
  743. #endif
  744. static const struct regmap_config tsens_config = {
  745. .name = "tm",
  746. .reg_bits = 32,
  747. .val_bits = 32,
  748. .reg_stride = 4,
  749. };
  750. static const struct regmap_config tsens_srot_config = {
  751. .name = "srot",
  752. .reg_bits = 32,
  753. .val_bits = 32,
  754. .reg_stride = 4,
  755. };
  756. int __init init_common(struct tsens_priv *priv)
  757. {
  758. void __iomem *tm_base, *srot_base;
  759. struct device *dev = priv->dev;
  760. u32 ver_minor;
  761. struct resource *res;
  762. u32 enabled;
  763. int ret, i, j;
  764. struct platform_device *op = of_find_device_by_node(priv->dev->of_node);
  765. if (!op)
  766. return -EINVAL;
  767. if (op->num_resources > 1) {
  768. /* DT with separate SROT and TM address space */
  769. priv->tm_offset = 0;
  770. res = platform_get_resource(op, IORESOURCE_MEM, 1);
  771. srot_base = devm_ioremap_resource(dev, res);
  772. if (IS_ERR(srot_base)) {
  773. ret = PTR_ERR(srot_base);
  774. goto err_put_device;
  775. }
  776. priv->srot_map = devm_regmap_init_mmio(dev, srot_base,
  777. &tsens_srot_config);
  778. if (IS_ERR(priv->srot_map)) {
  779. ret = PTR_ERR(priv->srot_map);
  780. goto err_put_device;
  781. }
  782. } else {
  783. /* old DTs where SROT and TM were in a contiguous 2K block */
  784. priv->tm_offset = 0x1000;
  785. }
  786. if (tsens_version(priv) >= VER_0_1) {
  787. res = platform_get_resource(op, IORESOURCE_MEM, 0);
  788. tm_base = devm_ioremap_resource(dev, res);
  789. if (IS_ERR(tm_base)) {
  790. ret = PTR_ERR(tm_base);
  791. goto err_put_device;
  792. }
  793. priv->tm_map = devm_regmap_init_mmio(dev, tm_base, &tsens_config);
  794. } else { /* VER_0 share the same gcc regs using a syscon */
  795. struct device *parent = priv->dev->parent;
  796. if (parent)
  797. priv->tm_map = syscon_node_to_regmap(parent->of_node);
  798. }
  799. if (IS_ERR_OR_NULL(priv->tm_map)) {
  800. if (!priv->tm_map)
  801. ret = -ENODEV;
  802. else
  803. ret = PTR_ERR(priv->tm_map);
  804. goto err_put_device;
  805. }
  806. /* VER_0 have only tm_map */
  807. if (!priv->srot_map)
  808. priv->srot_map = priv->tm_map;
  809. if (tsens_version(priv) > VER_0_1) {
  810. for (i = VER_MAJOR; i <= VER_STEP; i++) {
  811. priv->rf[i] = devm_regmap_field_alloc(dev, priv->srot_map,
  812. priv->fields[i]);
  813. if (IS_ERR(priv->rf[i])) {
  814. ret = PTR_ERR(priv->rf[i]);
  815. goto err_put_device;
  816. }
  817. }
  818. ret = regmap_field_read(priv->rf[VER_MINOR], &ver_minor);
  819. if (ret)
  820. goto err_put_device;
  821. }
  822. priv->rf[TSENS_EN] = devm_regmap_field_alloc(dev, priv->srot_map,
  823. priv->fields[TSENS_EN]);
  824. if (IS_ERR(priv->rf[TSENS_EN])) {
  825. ret = PTR_ERR(priv->rf[TSENS_EN]);
  826. goto err_put_device;
  827. }
  828. /* in VER_0 TSENS need to be explicitly enabled */
  829. if (tsens_version(priv) == VER_0)
  830. regmap_field_write(priv->rf[TSENS_EN], 1);
  831. ret = regmap_field_read(priv->rf[TSENS_EN], &enabled);
  832. if (ret)
  833. goto err_put_device;
  834. if (!enabled) {
  835. switch (tsens_version(priv)) {
  836. case VER_1_X_NO_RPM:
  837. case VER_2_X_NO_RPM:
  838. break;
  839. default:
  840. dev_err(dev, "%s: device not enabled\n", __func__);
  841. ret = -ENODEV;
  842. goto err_put_device;
  843. }
  844. }
  845. priv->rf[SENSOR_EN] = devm_regmap_field_alloc(dev, priv->srot_map,
  846. priv->fields[SENSOR_EN]);
  847. if (IS_ERR(priv->rf[SENSOR_EN])) {
  848. ret = PTR_ERR(priv->rf[SENSOR_EN]);
  849. goto err_put_device;
  850. }
  851. priv->rf[INT_EN] = devm_regmap_field_alloc(dev, priv->tm_map,
  852. priv->fields[INT_EN]);
  853. if (IS_ERR(priv->rf[INT_EN])) {
  854. ret = PTR_ERR(priv->rf[INT_EN]);
  855. goto err_put_device;
  856. }
  857. priv->rf[TSENS_SW_RST] =
  858. devm_regmap_field_alloc(dev, priv->srot_map, priv->fields[TSENS_SW_RST]);
  859. if (IS_ERR(priv->rf[TSENS_SW_RST])) {
  860. ret = PTR_ERR(priv->rf[TSENS_SW_RST]);
  861. goto err_put_device;
  862. }
  863. priv->rf[TRDY] = devm_regmap_field_alloc(dev, priv->tm_map, priv->fields[TRDY]);
  864. if (IS_ERR(priv->rf[TRDY])) {
  865. ret = PTR_ERR(priv->rf[TRDY]);
  866. goto err_put_device;
  867. }
  868. /* This loop might need changes if enum regfield_ids is reordered */
  869. for (j = LAST_TEMP_0; j <= UP_THRESH_15; j += 16) {
  870. for (i = 0; i < priv->feat->max_sensors; i++) {
  871. int idx = j + i;
  872. priv->rf[idx] = devm_regmap_field_alloc(dev,
  873. priv->tm_map,
  874. priv->fields[idx]);
  875. if (IS_ERR(priv->rf[idx])) {
  876. ret = PTR_ERR(priv->rf[idx]);
  877. goto err_put_device;
  878. }
  879. }
  880. }
  881. if (priv->feat->crit_int || tsens_version(priv) < VER_0_1) {
  882. /* Loop might need changes if enum regfield_ids is reordered */
  883. for (j = CRITICAL_STATUS_0; j <= CRIT_THRESH_15; j += 16) {
  884. for (i = 0; i < priv->feat->max_sensors; i++) {
  885. int idx = j + i;
  886. priv->rf[idx] =
  887. devm_regmap_field_alloc(dev,
  888. priv->tm_map,
  889. priv->fields[idx]);
  890. if (IS_ERR(priv->rf[idx])) {
  891. ret = PTR_ERR(priv->rf[idx]);
  892. goto err_put_device;
  893. }
  894. }
  895. }
  896. }
  897. if (tsens_version(priv) >= VER_2_X && ver_minor > 2) {
  898. /* Watchdog is present only on v2.3+ */
  899. priv->feat->has_watchdog = 1;
  900. for (i = WDOG_BARK_STATUS; i <= CC_MON_MASK; i++) {
  901. priv->rf[i] = devm_regmap_field_alloc(dev, priv->tm_map,
  902. priv->fields[i]);
  903. if (IS_ERR(priv->rf[i])) {
  904. ret = PTR_ERR(priv->rf[i]);
  905. goto err_put_device;
  906. }
  907. }
  908. /*
  909. * Watchdog is already enabled, unmask the bark.
  910. * Disable cycle completion monitoring
  911. */
  912. regmap_field_write(priv->rf[WDOG_BARK_MASK], 0);
  913. regmap_field_write(priv->rf[CC_MON_MASK], 1);
  914. }
  915. spin_lock_init(&priv->ul_lock);
  916. /* VER_0 interrupt doesn't need to be enabled */
  917. if (tsens_version(priv) >= VER_0_1)
  918. tsens_enable_irq(priv);
  919. err_put_device:
  920. put_device(&op->dev);
  921. return ret;
  922. }
  923. static int tsens_get_temp(struct thermal_zone_device *tz, int *temp)
  924. {
  925. struct tsens_sensor *s = thermal_zone_device_priv(tz);
  926. struct tsens_priv *priv = s->priv;
  927. return priv->ops->get_temp(s, temp);
  928. }
  929. static int __maybe_unused tsens_suspend(struct device *dev)
  930. {
  931. struct tsens_priv *priv = dev_get_drvdata(dev);
  932. if (priv->ops && priv->ops->suspend)
  933. return priv->ops->suspend(priv);
  934. return 0;
  935. }
  936. static int __maybe_unused tsens_resume(struct device *dev)
  937. {
  938. struct tsens_priv *priv = dev_get_drvdata(dev);
  939. if (priv->ops && priv->ops->resume)
  940. return priv->ops->resume(priv);
  941. return 0;
  942. }
  943. static SIMPLE_DEV_PM_OPS(tsens_pm_ops, tsens_suspend, tsens_resume);
  944. static const struct of_device_id tsens_table[] = {
  945. {
  946. .compatible = "qcom,ipq5018-tsens",
  947. .data = &data_ipq5018,
  948. }, {
  949. .compatible = "qcom,ipq5332-tsens",
  950. .data = &data_ipq5332,
  951. }, {
  952. .compatible = "qcom,ipq5424-tsens",
  953. .data = &data_ipq5424,
  954. }, {
  955. .compatible = "qcom,ipq8064-tsens",
  956. .data = &data_8960,
  957. }, {
  958. .compatible = "qcom,ipq8074-tsens",
  959. .data = &data_ipq8074,
  960. }, {
  961. .compatible = "qcom,mdm9607-tsens",
  962. .data = &data_9607,
  963. }, {
  964. .compatible = "qcom,msm8226-tsens",
  965. .data = &data_8226,
  966. }, {
  967. .compatible = "qcom,msm8909-tsens",
  968. .data = &data_8909,
  969. }, {
  970. .compatible = "qcom,msm8916-tsens",
  971. .data = &data_8916,
  972. }, {
  973. .compatible = "qcom,msm8937-tsens",
  974. .data = &data_8937,
  975. }, {
  976. .compatible = "qcom,msm8939-tsens",
  977. .data = &data_8939,
  978. }, {
  979. .compatible = "qcom,msm8956-tsens",
  980. .data = &data_8956,
  981. }, {
  982. .compatible = "qcom,msm8960-tsens",
  983. .data = &data_8960,
  984. }, {
  985. .compatible = "qcom,msm8974-tsens",
  986. .data = &data_8974,
  987. }, {
  988. .compatible = "qcom,msm8976-tsens",
  989. .data = &data_8976,
  990. }, {
  991. .compatible = "qcom,msm8996-tsens",
  992. .data = &data_8996,
  993. }, {
  994. .compatible = "qcom,tsens-v1",
  995. .data = &data_tsens_v1,
  996. }, {
  997. .compatible = "qcom,tsens-v2",
  998. .data = &data_tsens_v2,
  999. },
  1000. {}
  1001. };
  1002. MODULE_DEVICE_TABLE(of, tsens_table);
  1003. static const struct thermal_zone_device_ops tsens_of_ops = {
  1004. .get_temp = tsens_get_temp,
  1005. .set_trips = tsens_set_trips,
  1006. };
  1007. static int tsens_register_irq(struct tsens_priv *priv, char *irqname,
  1008. irq_handler_t thread_fn)
  1009. {
  1010. struct platform_device *pdev;
  1011. int ret, irq;
  1012. pdev = of_find_device_by_node(priv->dev->of_node);
  1013. if (!pdev)
  1014. return -ENODEV;
  1015. irq = platform_get_irq_byname(pdev, irqname);
  1016. if (irq < 0) {
  1017. ret = irq;
  1018. /* For old DTs with no IRQ defined */
  1019. if (irq == -ENXIO)
  1020. ret = 0;
  1021. } else {
  1022. /* VER_0 interrupt is TRIGGER_RISING, VER_0_1 and up is ONESHOT */
  1023. if (tsens_version(priv) == VER_0)
  1024. ret = devm_request_threaded_irq(&pdev->dev, irq,
  1025. thread_fn, NULL,
  1026. IRQF_TRIGGER_RISING,
  1027. dev_name(&pdev->dev),
  1028. priv);
  1029. else
  1030. ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
  1031. thread_fn, IRQF_ONESHOT,
  1032. dev_name(&pdev->dev),
  1033. priv);
  1034. if (ret)
  1035. dev_err(&pdev->dev, "%s: failed to get irq\n",
  1036. __func__);
  1037. else
  1038. enable_irq_wake(irq);
  1039. }
  1040. put_device(&pdev->dev);
  1041. return ret;
  1042. }
  1043. #ifdef CONFIG_SUSPEND
  1044. static int tsens_reinit(struct tsens_priv *priv)
  1045. {
  1046. if (tsens_version(priv) >= VER_2_X) {
  1047. /*
  1048. * Re-enable the watchdog, unmask the bark.
  1049. * Disable cycle completion monitoring
  1050. */
  1051. if (priv->feat->has_watchdog) {
  1052. regmap_field_write(priv->rf[WDOG_BARK_MASK], 0);
  1053. regmap_field_write(priv->rf[CC_MON_MASK], 1);
  1054. }
  1055. /* Re-enable interrupts */
  1056. tsens_enable_irq(priv);
  1057. }
  1058. return 0;
  1059. }
  1060. int tsens_resume_common(struct tsens_priv *priv)
  1061. {
  1062. if (pm_suspend_target_state == PM_SUSPEND_MEM)
  1063. tsens_reinit(priv);
  1064. return 0;
  1065. }
  1066. #endif /* !CONFIG_SUSPEND */
  1067. static int tsens_register(struct tsens_priv *priv)
  1068. {
  1069. int i, ret;
  1070. struct thermal_zone_device *tzd;
  1071. for (i = 0; i < priv->num_sensors; i++) {
  1072. priv->sensor[i].priv = priv;
  1073. tzd = devm_thermal_of_zone_register(priv->dev, priv->sensor[i].hw_id,
  1074. &priv->sensor[i],
  1075. &tsens_of_ops);
  1076. if (IS_ERR(tzd))
  1077. continue;
  1078. priv->sensor[i].tzd = tzd;
  1079. if (priv->ops->enable)
  1080. priv->ops->enable(priv, i);
  1081. devm_thermal_add_hwmon_sysfs(priv->dev, tzd);
  1082. }
  1083. /* VER_0 require to set MIN and MAX THRESH
  1084. * These 2 regs are set using the:
  1085. * - CRIT_THRESH_0 for MAX THRESH hardcoded to 120°C
  1086. * - CRIT_THRESH_1 for MIN THRESH hardcoded to 0°C
  1087. */
  1088. if (tsens_version(priv) < VER_0_1) {
  1089. regmap_field_write(priv->rf[CRIT_THRESH_0],
  1090. tsens_mC_to_hw(priv->sensor, 120000));
  1091. regmap_field_write(priv->rf[CRIT_THRESH_1],
  1092. tsens_mC_to_hw(priv->sensor, 0));
  1093. }
  1094. if (priv->feat->combo_int) {
  1095. ret = tsens_register_irq(priv, "combined",
  1096. tsens_combined_irq_thread);
  1097. } else {
  1098. ret = tsens_register_irq(priv, "uplow", tsens_irq_thread);
  1099. if (ret < 0)
  1100. return ret;
  1101. if (priv->feat->crit_int)
  1102. ret = tsens_register_irq(priv, "critical",
  1103. tsens_critical_irq_thread);
  1104. }
  1105. return ret;
  1106. }
  1107. static int tsens_probe(struct platform_device *pdev)
  1108. {
  1109. int ret, i;
  1110. struct device *dev;
  1111. struct device_node *np;
  1112. struct tsens_priv *priv;
  1113. const struct tsens_plat_data *data;
  1114. const struct of_device_id *id;
  1115. u32 num_sensors;
  1116. if (pdev->dev.of_node)
  1117. dev = &pdev->dev;
  1118. else
  1119. dev = pdev->dev.parent;
  1120. np = dev->of_node;
  1121. id = of_match_node(tsens_table, np);
  1122. if (id)
  1123. data = id->data;
  1124. else
  1125. data = &data_8960;
  1126. num_sensors = data->num_sensors;
  1127. if (np)
  1128. of_property_read_u32(np, "#qcom,sensors", &num_sensors);
  1129. if (num_sensors <= 0) {
  1130. dev_err(dev, "%s: invalid number of sensors\n", __func__);
  1131. return -EINVAL;
  1132. }
  1133. priv = devm_kzalloc(dev,
  1134. struct_size(priv, sensor, num_sensors),
  1135. GFP_KERNEL);
  1136. if (!priv)
  1137. return -ENOMEM;
  1138. priv->dev = dev;
  1139. priv->num_sensors = num_sensors;
  1140. priv->ops = data->ops;
  1141. for (i = 0; i < priv->num_sensors; i++) {
  1142. if (data->hw_ids)
  1143. priv->sensor[i].hw_id = data->hw_ids[i];
  1144. else
  1145. priv->sensor[i].hw_id = i;
  1146. }
  1147. priv->feat = data->feat;
  1148. priv->fields = data->fields;
  1149. platform_set_drvdata(pdev, priv);
  1150. if (!priv->ops || !priv->ops->init || !priv->ops->get_temp)
  1151. return -EINVAL;
  1152. ret = priv->ops->init(priv);
  1153. if (ret < 0) {
  1154. dev_err(dev, "%s: init failed\n", __func__);
  1155. return ret;
  1156. }
  1157. if (priv->ops->calibrate) {
  1158. ret = priv->ops->calibrate(priv);
  1159. if (ret < 0)
  1160. return dev_err_probe(dev, ret, "%s: calibration failed\n",
  1161. __func__);
  1162. }
  1163. ret = tsens_register(priv);
  1164. if (!ret)
  1165. tsens_debug_init(pdev);
  1166. return ret;
  1167. }
  1168. static void tsens_remove(struct platform_device *pdev)
  1169. {
  1170. struct tsens_priv *priv = platform_get_drvdata(pdev);
  1171. debugfs_remove_recursive(priv->debug_root);
  1172. tsens_disable_irq(priv);
  1173. if (priv->ops->disable)
  1174. priv->ops->disable(priv);
  1175. }
  1176. static struct platform_driver tsens_driver = {
  1177. .probe = tsens_probe,
  1178. .remove = tsens_remove,
  1179. .driver = {
  1180. .name = "qcom-tsens",
  1181. .pm = &tsens_pm_ops,
  1182. .of_match_table = tsens_table,
  1183. },
  1184. };
  1185. module_platform_driver(tsens_driver);
  1186. MODULE_LICENSE("GPL v2");
  1187. MODULE_DESCRIPTION("QCOM Temperature Sensor driver");
  1188. MODULE_ALIAS("platform:qcom-tsens");