stm_thermal.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) STMicroelectronics 2018 - All Rights Reserved
  4. * Author: David Hernandez Sanchez <david.hernandezsanchez@st.com> for
  5. * STMicroelectronics.
  6. */
  7. #include <linux/clk.h>
  8. #include <linux/clk-provider.h>
  9. #include <linux/delay.h>
  10. #include <linux/err.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/io.h>
  13. #include <linux/iopoll.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/of_address.h>
  17. #include <linux/of_device.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/thermal.h>
  20. #include "../thermal_core.h"
  21. #include "../thermal_hwmon.h"
  22. /* DTS register offsets */
  23. #define DTS_CFGR1_OFFSET 0x0
  24. #define DTS_T0VALR1_OFFSET 0x8
  25. #define DTS_RAMPVALR_OFFSET 0X10
  26. #define DTS_ITR1_OFFSET 0x14
  27. #define DTS_DR_OFFSET 0x1C
  28. #define DTS_SR_OFFSET 0x20
  29. #define DTS_ITENR_OFFSET 0x24
  30. #define DTS_CIFR_OFFSET 0x28
  31. /* DTS_CFGR1 register mask definitions */
  32. #define HSREF_CLK_DIV_MASK GENMASK(30, 24)
  33. #define TS1_SMP_TIME_MASK GENMASK(19, 16)
  34. #define TS1_INTRIG_SEL_MASK GENMASK(11, 8)
  35. /* DTS_T0VALR1 register mask definitions */
  36. #define TS1_T0_MASK GENMASK(17, 16)
  37. #define TS1_FMT0_MASK GENMASK(15, 0)
  38. /* DTS_RAMPVALR register mask definitions */
  39. #define TS1_RAMP_COEFF_MASK GENMASK(15, 0)
  40. /* DTS_ITR1 register mask definitions */
  41. #define TS1_HITTHD_MASK GENMASK(31, 16)
  42. #define TS1_LITTHD_MASK GENMASK(15, 0)
  43. /* DTS_DR register mask definitions */
  44. #define TS1_MFREQ_MASK GENMASK(15, 0)
  45. /* Less significant bit position definitions */
  46. #define TS1_T0_POS 16
  47. #define TS1_SMP_TIME_POS 16
  48. #define TS1_HITTHD_POS 16
  49. #define HSREF_CLK_DIV_POS 24
  50. /* DTS_CFGR1 bit definitions */
  51. #define TS1_EN BIT(0)
  52. #define TS1_START BIT(4)
  53. #define REFCLK_SEL BIT(20)
  54. #define REFCLK_LSE REFCLK_SEL
  55. #define Q_MEAS_OPT BIT(21)
  56. #define CALIBRATION_CONTROL Q_MEAS_OPT
  57. /* DTS_SR bit definitions */
  58. #define TS_RDY BIT(15)
  59. /* Bit definitions below are common for DTS_SR, DTS_ITENR and DTS_CIFR */
  60. #define HIGH_THRESHOLD BIT(2)
  61. #define LOW_THRESHOLD BIT(1)
  62. /* Constants */
  63. #define ADJUST 100
  64. #define ONE_MHZ 1000000
  65. #define POLL_TIMEOUT 5000
  66. #define STARTUP_TIME 40
  67. #define TS1_T0_VAL0 30
  68. #define TS1_T0_VAL1 130
  69. #define NO_HW_TRIG 0
  70. /* The Thermal Framework expects millidegrees */
  71. #define mcelsius(temp) ((temp) * 1000)
  72. /* The Sensor expects oC degrees */
  73. #define celsius(temp) ((temp) / 1000)
  74. struct stm_thermal_sensor {
  75. struct device *dev;
  76. struct thermal_zone_device *th_dev;
  77. enum thermal_device_mode mode;
  78. struct clk *clk;
  79. int high_temp;
  80. int low_temp;
  81. int temp_critical;
  82. int temp_passive;
  83. unsigned int low_temp_enabled;
  84. int num_trips;
  85. int irq;
  86. unsigned int irq_enabled;
  87. void __iomem *base;
  88. int t0, fmt0, ramp_coeff;
  89. };
  90. static irqreturn_t stm_thermal_alarm_irq(int irq, void *sdata)
  91. {
  92. struct stm_thermal_sensor *sensor = sdata;
  93. disable_irq_nosync(irq);
  94. sensor->irq_enabled = false;
  95. return IRQ_WAKE_THREAD;
  96. }
  97. static irqreturn_t stm_thermal_alarm_irq_thread(int irq, void *sdata)
  98. {
  99. u32 value;
  100. struct stm_thermal_sensor *sensor = sdata;
  101. /* read IT reason in SR and clear flags */
  102. value = readl_relaxed(sensor->base + DTS_SR_OFFSET);
  103. if ((value & LOW_THRESHOLD) == LOW_THRESHOLD)
  104. writel_relaxed(LOW_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);
  105. if ((value & HIGH_THRESHOLD) == HIGH_THRESHOLD)
  106. writel_relaxed(HIGH_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);
  107. thermal_zone_device_update(sensor->th_dev, THERMAL_EVENT_UNSPECIFIED);
  108. return IRQ_HANDLED;
  109. }
  110. static int stm_sensor_power_on(struct stm_thermal_sensor *sensor)
  111. {
  112. int ret;
  113. u32 value;
  114. /* Enable sensor */
  115. value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
  116. value |= TS1_EN;
  117. writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
  118. /*
  119. * The DTS block can be enabled by setting TSx_EN bit in
  120. * DTS_CFGRx register. It requires a startup time of
  121. * 40μs. Use 5 ms as arbitrary timeout.
  122. */
  123. ret = readl_poll_timeout(sensor->base + DTS_SR_OFFSET,
  124. value, (value & TS_RDY),
  125. STARTUP_TIME, POLL_TIMEOUT);
  126. if (ret)
  127. return ret;
  128. /* Start continuous measuring */
  129. value = readl_relaxed(sensor->base +
  130. DTS_CFGR1_OFFSET);
  131. value |= TS1_START;
  132. writel_relaxed(value, sensor->base +
  133. DTS_CFGR1_OFFSET);
  134. return 0;
  135. }
  136. static int stm_sensor_power_off(struct stm_thermal_sensor *sensor)
  137. {
  138. u32 value;
  139. /* Stop measuring */
  140. value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
  141. value &= ~TS1_START;
  142. writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
  143. /* Ensure stop is taken into account */
  144. usleep_range(STARTUP_TIME, POLL_TIMEOUT);
  145. /* Disable sensor */
  146. value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
  147. value &= ~TS1_EN;
  148. writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
  149. /* Ensure disable is taken into account */
  150. return readl_poll_timeout(sensor->base + DTS_SR_OFFSET, value,
  151. !(value & TS_RDY),
  152. STARTUP_TIME, POLL_TIMEOUT);
  153. }
  154. static int stm_thermal_calibration(struct stm_thermal_sensor *sensor)
  155. {
  156. u32 value, clk_freq;
  157. u32 prescaler;
  158. /* Figure out prescaler value for PCLK during calibration */
  159. clk_freq = clk_get_rate(sensor->clk);
  160. if (!clk_freq)
  161. return -EINVAL;
  162. prescaler = 0;
  163. clk_freq /= ONE_MHZ;
  164. if (clk_freq) {
  165. while (prescaler <= clk_freq)
  166. prescaler++;
  167. }
  168. value = readl_relaxed(sensor->base + DTS_CFGR1_OFFSET);
  169. /* Clear prescaler */
  170. value &= ~HSREF_CLK_DIV_MASK;
  171. /* Set prescaler. pclk_freq/prescaler < 1MHz */
  172. value |= (prescaler << HSREF_CLK_DIV_POS);
  173. /* Select PCLK as reference clock */
  174. value &= ~REFCLK_SEL;
  175. /* Set maximal sampling time for better precision */
  176. value |= TS1_SMP_TIME_MASK;
  177. /* Measure with calibration */
  178. value &= ~CALIBRATION_CONTROL;
  179. /* select trigger */
  180. value &= ~TS1_INTRIG_SEL_MASK;
  181. value |= NO_HW_TRIG;
  182. writel_relaxed(value, sensor->base + DTS_CFGR1_OFFSET);
  183. return 0;
  184. }
  185. /* Fill in DTS structure with factory sensor values */
  186. static int stm_thermal_read_factory_settings(struct stm_thermal_sensor *sensor)
  187. {
  188. /* Retrieve engineering calibration temperature */
  189. sensor->t0 = readl_relaxed(sensor->base + DTS_T0VALR1_OFFSET) &
  190. TS1_T0_MASK;
  191. if (!sensor->t0)
  192. sensor->t0 = TS1_T0_VAL0;
  193. else
  194. sensor->t0 = TS1_T0_VAL1;
  195. /* Retrieve fmt0 and put it on Hz */
  196. sensor->fmt0 = ADJUST * (readl_relaxed(sensor->base +
  197. DTS_T0VALR1_OFFSET) & TS1_FMT0_MASK);
  198. /* Retrieve ramp coefficient */
  199. sensor->ramp_coeff = readl_relaxed(sensor->base + DTS_RAMPVALR_OFFSET) &
  200. TS1_RAMP_COEFF_MASK;
  201. if (!sensor->fmt0 || !sensor->ramp_coeff) {
  202. dev_err(sensor->dev, "%s: wrong setting\n", __func__);
  203. return -EINVAL;
  204. }
  205. dev_dbg(sensor->dev, "%s: T0 = %doC, FMT0 = %dHz, RAMP_COEFF = %dHz/oC",
  206. __func__, sensor->t0, sensor->fmt0, sensor->ramp_coeff);
  207. return 0;
  208. }
  209. static int stm_thermal_calculate_threshold(struct stm_thermal_sensor *sensor,
  210. int temp, u32 *th)
  211. {
  212. int freqM;
  213. u32 sampling_time;
  214. /* Retrieve the number of periods to sample */
  215. sampling_time = (readl_relaxed(sensor->base + DTS_CFGR1_OFFSET) &
  216. TS1_SMP_TIME_MASK) >> TS1_SMP_TIME_POS;
  217. /* Figure out the CLK_PTAT frequency for a given temperature */
  218. freqM = ((temp - sensor->t0) * sensor->ramp_coeff)
  219. + sensor->fmt0;
  220. dev_dbg(sensor->dev, "%s: freqM for threshold = %d Hz",
  221. __func__, freqM);
  222. /* Figure out the threshold sample number */
  223. *th = clk_get_rate(sensor->clk);
  224. if (!*th)
  225. return -EINVAL;
  226. *th = *th / freqM;
  227. *th *= sampling_time;
  228. return 0;
  229. }
  230. static int stm_thermal_set_threshold(struct stm_thermal_sensor *sensor)
  231. {
  232. u32 value, th;
  233. int ret;
  234. value = readl_relaxed(sensor->base + DTS_ITR1_OFFSET);
  235. /* Erase threshold content */
  236. value &= ~(TS1_LITTHD_MASK | TS1_HITTHD_MASK);
  237. /* Retrieve the sample threshold number th for a given temperature */
  238. ret = stm_thermal_calculate_threshold(sensor, sensor->high_temp, &th);
  239. if (ret)
  240. return ret;
  241. value |= th & TS1_LITTHD_MASK;
  242. if (sensor->low_temp_enabled) {
  243. /* Retrieve the sample threshold */
  244. ret = stm_thermal_calculate_threshold(sensor, sensor->low_temp,
  245. &th);
  246. if (ret)
  247. return ret;
  248. value |= (TS1_HITTHD_MASK & (th << TS1_HITTHD_POS));
  249. }
  250. /* Write value on the Low interrupt threshold */
  251. writel_relaxed(value, sensor->base + DTS_ITR1_OFFSET);
  252. return 0;
  253. }
  254. /* Disable temperature interrupt */
  255. static int stm_disable_irq(struct stm_thermal_sensor *sensor)
  256. {
  257. u32 value;
  258. /* Disable IT generation for low and high thresholds */
  259. value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET);
  260. writel_relaxed(value & ~(LOW_THRESHOLD | HIGH_THRESHOLD),
  261. sensor->base + DTS_ITENR_OFFSET);
  262. dev_dbg(sensor->dev, "%s: IT disabled on sensor side", __func__);
  263. return 0;
  264. }
  265. /* Enable temperature interrupt */
  266. static int stm_enable_irq(struct stm_thermal_sensor *sensor)
  267. {
  268. u32 value;
  269. /*
  270. * Code below enables High temperature threshold using a low threshold
  271. * sampling value
  272. */
  273. /* Make sure LOW_THRESHOLD IT is clear before enabling */
  274. writel_relaxed(LOW_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);
  275. /* Enable IT generation for low threshold */
  276. value = readl_relaxed(sensor->base + DTS_ITENR_OFFSET);
  277. value |= LOW_THRESHOLD;
  278. /* Enable the low temperature threshold if needed */
  279. if (sensor->low_temp_enabled) {
  280. /* Make sure HIGH_THRESHOLD IT is clear before enabling */
  281. writel_relaxed(HIGH_THRESHOLD, sensor->base + DTS_CIFR_OFFSET);
  282. /* Enable IT generation for high threshold */
  283. value |= HIGH_THRESHOLD;
  284. }
  285. /* Enable thresholds */
  286. writel_relaxed(value, sensor->base + DTS_ITENR_OFFSET);
  287. dev_dbg(sensor->dev, "%s: IT enabled on sensor side", __func__);
  288. return 0;
  289. }
  290. static int stm_thermal_update_threshold(struct stm_thermal_sensor *sensor)
  291. {
  292. int ret;
  293. sensor->mode = THERMAL_DEVICE_DISABLED;
  294. ret = stm_sensor_power_off(sensor);
  295. if (ret)
  296. return ret;
  297. ret = stm_disable_irq(sensor);
  298. if (ret)
  299. return ret;
  300. ret = stm_thermal_set_threshold(sensor);
  301. if (ret)
  302. return ret;
  303. ret = stm_enable_irq(sensor);
  304. if (ret)
  305. return ret;
  306. ret = stm_sensor_power_on(sensor);
  307. if (ret)
  308. return ret;
  309. sensor->mode = THERMAL_DEVICE_ENABLED;
  310. return 0;
  311. }
  312. /* Callback to get temperature from HW */
  313. static int stm_thermal_get_temp(void *data, int *temp)
  314. {
  315. struct stm_thermal_sensor *sensor = data;
  316. u32 sampling_time;
  317. int freqM, ret;
  318. if (sensor->mode != THERMAL_DEVICE_ENABLED)
  319. return -EAGAIN;
  320. /* Retrieve the number of samples */
  321. ret = readl_poll_timeout(sensor->base + DTS_DR_OFFSET, freqM,
  322. (freqM & TS1_MFREQ_MASK), STARTUP_TIME,
  323. POLL_TIMEOUT);
  324. if (ret)
  325. return ret;
  326. if (!freqM)
  327. return -ENODATA;
  328. /* Retrieve the number of periods sampled */
  329. sampling_time = (readl_relaxed(sensor->base + DTS_CFGR1_OFFSET) &
  330. TS1_SMP_TIME_MASK) >> TS1_SMP_TIME_POS;
  331. /* Figure out the number of samples per period */
  332. freqM /= sampling_time;
  333. /* Figure out the CLK_PTAT frequency */
  334. freqM = clk_get_rate(sensor->clk) / freqM;
  335. if (!freqM)
  336. return -EINVAL;
  337. dev_dbg(sensor->dev, "%s: freqM=%d\n", __func__, freqM);
  338. /* Figure out the temperature in mili celsius */
  339. *temp = mcelsius(sensor->t0 + ((freqM - sensor->fmt0) /
  340. sensor->ramp_coeff));
  341. dev_dbg(sensor->dev, "%s: temperature = %d millicelsius",
  342. __func__, *temp);
  343. /* Update thresholds */
  344. if (sensor->num_trips > 1) {
  345. /* Update alarm threshold value to next higher trip point */
  346. if (sensor->high_temp == sensor->temp_passive &&
  347. celsius(*temp) >= sensor->temp_passive) {
  348. sensor->high_temp = sensor->temp_critical;
  349. sensor->low_temp = sensor->temp_passive;
  350. sensor->low_temp_enabled = true;
  351. ret = stm_thermal_update_threshold(sensor);
  352. if (ret)
  353. return ret;
  354. }
  355. if (sensor->high_temp == sensor->temp_critical &&
  356. celsius(*temp) < sensor->temp_passive) {
  357. sensor->high_temp = sensor->temp_passive;
  358. sensor->low_temp_enabled = false;
  359. ret = stm_thermal_update_threshold(sensor);
  360. if (ret)
  361. return ret;
  362. }
  363. /*
  364. * Re-enable alarm IRQ if temperature below critical
  365. * temperature
  366. */
  367. if (!sensor->irq_enabled &&
  368. (celsius(*temp) < sensor->temp_critical)) {
  369. sensor->irq_enabled = true;
  370. enable_irq(sensor->irq);
  371. }
  372. }
  373. return 0;
  374. }
  375. /* Registers DTS irq to be visible by GIC */
  376. static int stm_register_irq(struct stm_thermal_sensor *sensor)
  377. {
  378. struct device *dev = sensor->dev;
  379. struct platform_device *pdev = to_platform_device(dev);
  380. int ret;
  381. sensor->irq = platform_get_irq(pdev, 0);
  382. if (sensor->irq < 0) {
  383. dev_err(dev, "%s: Unable to find IRQ\n", __func__);
  384. return sensor->irq;
  385. }
  386. ret = devm_request_threaded_irq(dev, sensor->irq,
  387. stm_thermal_alarm_irq,
  388. stm_thermal_alarm_irq_thread,
  389. IRQF_ONESHOT,
  390. dev->driver->name, sensor);
  391. if (ret) {
  392. dev_err(dev, "%s: Failed to register IRQ %d\n", __func__,
  393. sensor->irq);
  394. return ret;
  395. }
  396. sensor->irq_enabled = true;
  397. dev_dbg(dev, "%s: thermal IRQ registered", __func__);
  398. return 0;
  399. }
  400. static int stm_thermal_sensor_off(struct stm_thermal_sensor *sensor)
  401. {
  402. int ret;
  403. ret = stm_sensor_power_off(sensor);
  404. if (ret)
  405. return ret;
  406. clk_disable_unprepare(sensor->clk);
  407. return 0;
  408. }
  409. static int stm_thermal_prepare(struct stm_thermal_sensor *sensor)
  410. {
  411. int ret;
  412. struct device *dev = sensor->dev;
  413. ret = clk_prepare_enable(sensor->clk);
  414. if (ret)
  415. return ret;
  416. ret = stm_thermal_read_factory_settings(sensor);
  417. if (ret)
  418. goto thermal_unprepare;
  419. ret = stm_thermal_calibration(sensor);
  420. if (ret)
  421. goto thermal_unprepare;
  422. /* Set threshold(s) for IRQ */
  423. ret = stm_thermal_set_threshold(sensor);
  424. if (ret)
  425. goto thermal_unprepare;
  426. ret = stm_enable_irq(sensor);
  427. if (ret)
  428. goto thermal_unprepare;
  429. ret = stm_sensor_power_on(sensor);
  430. if (ret) {
  431. dev_err(dev, "%s: failed to power on sensor\n", __func__);
  432. goto irq_disable;
  433. }
  434. return 0;
  435. irq_disable:
  436. stm_disable_irq(sensor);
  437. thermal_unprepare:
  438. clk_disable_unprepare(sensor->clk);
  439. return ret;
  440. }
  441. #ifdef CONFIG_PM_SLEEP
  442. static int stm_thermal_suspend(struct device *dev)
  443. {
  444. int ret;
  445. struct platform_device *pdev = to_platform_device(dev);
  446. struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev);
  447. ret = stm_thermal_sensor_off(sensor);
  448. if (ret)
  449. return ret;
  450. sensor->mode = THERMAL_DEVICE_DISABLED;
  451. return 0;
  452. }
  453. static int stm_thermal_resume(struct device *dev)
  454. {
  455. int ret;
  456. struct platform_device *pdev = to_platform_device(dev);
  457. struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev);
  458. ret = stm_thermal_prepare(sensor);
  459. if (ret)
  460. return ret;
  461. sensor->mode = THERMAL_DEVICE_ENABLED;
  462. return 0;
  463. }
  464. #endif /* CONFIG_PM_SLEEP */
  465. SIMPLE_DEV_PM_OPS(stm_thermal_pm_ops, stm_thermal_suspend, stm_thermal_resume);
  466. static const struct thermal_zone_of_device_ops stm_tz_ops = {
  467. .get_temp = stm_thermal_get_temp,
  468. };
  469. static const struct of_device_id stm_thermal_of_match[] = {
  470. { .compatible = "st,stm32-thermal"},
  471. { /* sentinel */ }
  472. };
  473. MODULE_DEVICE_TABLE(of, stm_thermal_of_match);
  474. static int stm_thermal_probe(struct platform_device *pdev)
  475. {
  476. struct stm_thermal_sensor *sensor;
  477. struct resource *res;
  478. const struct thermal_trip *trip;
  479. void __iomem *base;
  480. int ret, i;
  481. if (!pdev->dev.of_node) {
  482. dev_err(&pdev->dev, "%s: device tree node not found\n",
  483. __func__);
  484. return -EINVAL;
  485. }
  486. sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL);
  487. if (!sensor)
  488. return -ENOMEM;
  489. platform_set_drvdata(pdev, sensor);
  490. sensor->dev = &pdev->dev;
  491. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  492. base = devm_ioremap_resource(&pdev->dev, res);
  493. if (IS_ERR(base))
  494. return PTR_ERR(base);
  495. /* Populate sensor */
  496. sensor->base = base;
  497. sensor->clk = devm_clk_get(&pdev->dev, "pclk");
  498. if (IS_ERR(sensor->clk)) {
  499. dev_err(&pdev->dev, "%s: failed to fetch PCLK clock\n",
  500. __func__);
  501. return PTR_ERR(sensor->clk);
  502. }
  503. /* Register IRQ into GIC */
  504. ret = stm_register_irq(sensor);
  505. if (ret)
  506. return ret;
  507. sensor->th_dev = devm_thermal_zone_of_sensor_register(&pdev->dev, 0,
  508. sensor,
  509. &stm_tz_ops);
  510. if (IS_ERR(sensor->th_dev)) {
  511. dev_err(&pdev->dev, "%s: thermal zone sensor registering KO\n",
  512. __func__);
  513. ret = PTR_ERR(sensor->th_dev);
  514. return ret;
  515. }
  516. if (!sensor->th_dev->ops->get_crit_temp) {
  517. /* Critical point must be provided */
  518. ret = -EINVAL;
  519. goto err_tz;
  520. }
  521. ret = sensor->th_dev->ops->get_crit_temp(sensor->th_dev,
  522. &sensor->temp_critical);
  523. if (ret) {
  524. dev_err(&pdev->dev,
  525. "Not able to read critical_temp: %d\n", ret);
  526. goto err_tz;
  527. }
  528. sensor->temp_critical = celsius(sensor->temp_critical);
  529. /* Set thresholds for IRQ */
  530. sensor->high_temp = sensor->temp_critical;
  531. trip = of_thermal_get_trip_points(sensor->th_dev);
  532. sensor->num_trips = of_thermal_get_ntrips(sensor->th_dev);
  533. /* Find out passive temperature if it exists */
  534. for (i = (sensor->num_trips - 1); i >= 0; i--) {
  535. if (trip[i].type == THERMAL_TRIP_PASSIVE) {
  536. sensor->temp_passive = celsius(trip[i].temperature);
  537. /* Update high temperature threshold */
  538. sensor->high_temp = sensor->temp_passive;
  539. }
  540. }
  541. /*
  542. * Ensure low_temp_enabled flag is disabled.
  543. * By disabling low_temp_enabled, low threshold IT will not be
  544. * configured neither enabled because it is not needed as high
  545. * threshold is set on the lowest temperature trip point after
  546. * probe.
  547. */
  548. sensor->low_temp_enabled = false;
  549. /* Configure and enable HW sensor */
  550. ret = stm_thermal_prepare(sensor);
  551. if (ret) {
  552. dev_err(&pdev->dev,
  553. "Not able to enable sensor: %d\n", ret);
  554. goto err_tz;
  555. }
  556. /*
  557. * Thermal_zone doesn't enable hwmon as default,
  558. * enable it here
  559. */
  560. sensor->th_dev->tzp->no_hwmon = false;
  561. ret = thermal_add_hwmon_sysfs(sensor->th_dev);
  562. if (ret)
  563. goto err_tz;
  564. sensor->mode = THERMAL_DEVICE_ENABLED;
  565. dev_info(&pdev->dev, "%s: Driver initialized successfully\n",
  566. __func__);
  567. return 0;
  568. err_tz:
  569. thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev);
  570. return ret;
  571. }
  572. static int stm_thermal_remove(struct platform_device *pdev)
  573. {
  574. struct stm_thermal_sensor *sensor = platform_get_drvdata(pdev);
  575. stm_thermal_sensor_off(sensor);
  576. thermal_remove_hwmon_sysfs(sensor->th_dev);
  577. thermal_zone_of_sensor_unregister(&pdev->dev, sensor->th_dev);
  578. return 0;
  579. }
  580. static struct platform_driver stm_thermal_driver = {
  581. .driver = {
  582. .name = "stm_thermal",
  583. .pm = &stm_thermal_pm_ops,
  584. .of_match_table = stm_thermal_of_match,
  585. },
  586. .probe = stm_thermal_probe,
  587. .remove = stm_thermal_remove,
  588. };
  589. module_platform_driver(stm_thermal_driver);
  590. MODULE_DESCRIPTION("STMicroelectronics STM32 Thermal Sensor Driver");
  591. MODULE_AUTHOR("David Hernandez Sanchez <david.hernandezsanchez@st.com>");
  592. MODULE_LICENSE("GPL v2");
  593. MODULE_ALIAS("platform:stm_thermal");