mlx90632.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * mlx90632.c - Melexis MLX90632 contactless IR temperature sensor
  4. *
  5. * Copyright (c) 2017 Melexis <[email protected]>
  6. *
  7. * Driver for the Melexis MLX90632 I2C 16-bit IR thermopile sensor
  8. */
  9. #include <linux/delay.h>
  10. #include <linux/err.h>
  11. #include <linux/gpio/consumer.h>
  12. #include <linux/i2c.h>
  13. #include <linux/iopoll.h>
  14. #include <linux/kernel.h>
  15. #include <linux/limits.h>
  16. #include <linux/mod_devicetable.h>
  17. #include <linux/module.h>
  18. #include <linux/math64.h>
  19. #include <linux/pm_runtime.h>
  20. #include <linux/regmap.h>
  21. #include <linux/regulator/consumer.h>
  22. #include <linux/iio/iio.h>
  23. #include <linux/iio/sysfs.h>
  24. /* Memory sections addresses */
  25. #define MLX90632_ADDR_RAM 0x4000 /* Start address of ram */
  26. #define MLX90632_ADDR_EEPROM 0x2480 /* Start address of user eeprom */
  27. /* EEPROM addresses - used at startup */
  28. #define MLX90632_EE_CTRL 0x24d4 /* Control register initial value */
  29. #define MLX90632_EE_I2C_ADDR 0x24d5 /* I2C address register initial value */
  30. #define MLX90632_EE_VERSION 0x240b /* EEPROM version reg address */
  31. #define MLX90632_EE_P_R 0x240c /* P_R calibration register 32bit */
  32. #define MLX90632_EE_P_G 0x240e /* P_G calibration register 32bit */
  33. #define MLX90632_EE_P_T 0x2410 /* P_T calibration register 32bit */
  34. #define MLX90632_EE_P_O 0x2412 /* P_O calibration register 32bit */
  35. #define MLX90632_EE_Aa 0x2414 /* Aa calibration register 32bit */
  36. #define MLX90632_EE_Ab 0x2416 /* Ab calibration register 32bit */
  37. #define MLX90632_EE_Ba 0x2418 /* Ba calibration register 32bit */
  38. #define MLX90632_EE_Bb 0x241a /* Bb calibration register 32bit */
  39. #define MLX90632_EE_Ca 0x241c /* Ca calibration register 32bit */
  40. #define MLX90632_EE_Cb 0x241e /* Cb calibration register 32bit */
  41. #define MLX90632_EE_Da 0x2420 /* Da calibration register 32bit */
  42. #define MLX90632_EE_Db 0x2422 /* Db calibration register 32bit */
  43. #define MLX90632_EE_Ea 0x2424 /* Ea calibration register 32bit */
  44. #define MLX90632_EE_Eb 0x2426 /* Eb calibration register 32bit */
  45. #define MLX90632_EE_Fa 0x2428 /* Fa calibration register 32bit */
  46. #define MLX90632_EE_Fb 0x242a /* Fb calibration register 32bit */
  47. #define MLX90632_EE_Ga 0x242c /* Ga calibration register 32bit */
  48. #define MLX90632_EE_Gb 0x242e /* Gb calibration register 16bit */
  49. #define MLX90632_EE_Ka 0x242f /* Ka calibration register 16bit */
  50. #define MLX90632_EE_Ha 0x2481 /* Ha customer calib value reg 16bit */
  51. #define MLX90632_EE_Hb 0x2482 /* Hb customer calib value reg 16bit */
  52. /* Register addresses - volatile */
  53. #define MLX90632_REG_I2C_ADDR 0x3000 /* Chip I2C address register */
  54. /* Control register address - volatile */
  55. #define MLX90632_REG_CONTROL 0x3001 /* Control Register address */
  56. #define MLX90632_CFG_PWR_MASK GENMASK(2, 1) /* PowerMode Mask */
  57. #define MLX90632_CFG_MTYP_MASK GENMASK(8, 4) /* Meas select Mask */
  58. /* PowerModes statuses */
  59. #define MLX90632_PWR_STATUS(ctrl_val) (ctrl_val << 1)
  60. #define MLX90632_PWR_STATUS_HALT MLX90632_PWR_STATUS(0) /* hold */
  61. #define MLX90632_PWR_STATUS_SLEEP_STEP MLX90632_PWR_STATUS(1) /* sleep step*/
  62. #define MLX90632_PWR_STATUS_STEP MLX90632_PWR_STATUS(2) /* step */
  63. #define MLX90632_PWR_STATUS_CONTINUOUS MLX90632_PWR_STATUS(3) /* continuous*/
  64. /* Measurement types */
  65. #define MLX90632_MTYP_MEDICAL 0
  66. #define MLX90632_MTYP_EXTENDED 17
  67. /* Measurement type select*/
  68. #define MLX90632_MTYP_STATUS(ctrl_val) (ctrl_val << 4)
  69. #define MLX90632_MTYP_STATUS_MEDICAL MLX90632_MTYP_STATUS(MLX90632_MTYP_MEDICAL)
  70. #define MLX90632_MTYP_STATUS_EXTENDED MLX90632_MTYP_STATUS(MLX90632_MTYP_EXTENDED)
  71. /* I2C command register - volatile */
  72. #define MLX90632_REG_I2C_CMD 0x3005 /* I2C command Register address */
  73. /* Device status register - volatile */
  74. #define MLX90632_REG_STATUS 0x3fff /* Device status register */
  75. #define MLX90632_STAT_BUSY BIT(10) /* Device busy indicator */
  76. #define MLX90632_STAT_EE_BUSY BIT(9) /* EEPROM busy indicator */
  77. #define MLX90632_STAT_BRST BIT(8) /* Brown out reset indicator */
  78. #define MLX90632_STAT_CYCLE_POS GENMASK(6, 2) /* Data position */
  79. #define MLX90632_STAT_DATA_RDY BIT(0) /* Data ready indicator */
  80. /* RAM_MEAS address-es for each channel */
  81. #define MLX90632_RAM_1(meas_num) (MLX90632_ADDR_RAM + 3 * meas_num)
  82. #define MLX90632_RAM_2(meas_num) (MLX90632_ADDR_RAM + 3 * meas_num + 1)
  83. #define MLX90632_RAM_3(meas_num) (MLX90632_ADDR_RAM + 3 * meas_num + 2)
  84. /* Name important RAM_MEAS channels */
  85. #define MLX90632_RAM_DSP5_EXTENDED_AMBIENT_1 MLX90632_RAM_3(17)
  86. #define MLX90632_RAM_DSP5_EXTENDED_AMBIENT_2 MLX90632_RAM_3(18)
  87. #define MLX90632_RAM_DSP5_EXTENDED_OBJECT_1 MLX90632_RAM_1(17)
  88. #define MLX90632_RAM_DSP5_EXTENDED_OBJECT_2 MLX90632_RAM_2(17)
  89. #define MLX90632_RAM_DSP5_EXTENDED_OBJECT_3 MLX90632_RAM_1(18)
  90. #define MLX90632_RAM_DSP5_EXTENDED_OBJECT_4 MLX90632_RAM_2(18)
  91. #define MLX90632_RAM_DSP5_EXTENDED_OBJECT_5 MLX90632_RAM_1(19)
  92. #define MLX90632_RAM_DSP5_EXTENDED_OBJECT_6 MLX90632_RAM_2(19)
  93. /* Magic constants */
  94. #define MLX90632_ID_MEDICAL 0x0105 /* EEPROM DSPv5 Medical device id */
  95. #define MLX90632_ID_CONSUMER 0x0205 /* EEPROM DSPv5 Consumer device id */
  96. #define MLX90632_ID_EXTENDED 0x0505 /* EEPROM DSPv5 Extended range device id */
  97. #define MLX90632_ID_MASK GENMASK(14, 0) /* DSP version and device ID in EE_VERSION */
  98. #define MLX90632_DSP_VERSION 5 /* DSP version */
  99. #define MLX90632_DSP_MASK GENMASK(7, 0) /* DSP version in EE_VERSION */
  100. #define MLX90632_RESET_CMD 0x0006 /* Reset sensor (address or global) */
  101. #define MLX90632_REF_12 12LL /* ResCtrlRef value of Ch 1 or Ch 2 */
  102. #define MLX90632_REF_3 12LL /* ResCtrlRef value of Channel 3 */
  103. #define MLX90632_MAX_MEAS_NUM 31 /* Maximum measurements in list */
  104. #define MLX90632_SLEEP_DELAY_MS 3000 /* Autosleep delay */
  105. #define MLX90632_EXTENDED_LIMIT 27000 /* Extended mode raw value limit */
  106. /**
  107. * struct mlx90632_data - private data for the MLX90632 device
  108. * @client: I2C client of the device
  109. * @lock: Internal mutex for multiple reads for single measurement
  110. * @regmap: Regmap of the device
  111. * @emissivity: Object emissivity from 0 to 1000 where 1000 = 1.
  112. * @mtyp: Measurement type physical sensor configuration for extended range
  113. * calculations
  114. * @object_ambient_temperature: Ambient temperature at object (might differ of
  115. * the ambient temperature of sensor.
  116. * @regulator: Regulator of the device
  117. */
  118. struct mlx90632_data {
  119. struct i2c_client *client;
  120. struct mutex lock;
  121. struct regmap *regmap;
  122. u16 emissivity;
  123. u8 mtyp;
  124. u32 object_ambient_temperature;
  125. struct regulator *regulator;
  126. };
  127. static const struct regmap_range mlx90632_volatile_reg_range[] = {
  128. regmap_reg_range(MLX90632_REG_I2C_ADDR, MLX90632_REG_CONTROL),
  129. regmap_reg_range(MLX90632_REG_I2C_CMD, MLX90632_REG_I2C_CMD),
  130. regmap_reg_range(MLX90632_REG_STATUS, MLX90632_REG_STATUS),
  131. regmap_reg_range(MLX90632_RAM_1(0),
  132. MLX90632_RAM_3(MLX90632_MAX_MEAS_NUM)),
  133. };
  134. static const struct regmap_access_table mlx90632_volatile_regs_tbl = {
  135. .yes_ranges = mlx90632_volatile_reg_range,
  136. .n_yes_ranges = ARRAY_SIZE(mlx90632_volatile_reg_range),
  137. };
  138. static const struct regmap_range mlx90632_read_reg_range[] = {
  139. regmap_reg_range(MLX90632_EE_VERSION, MLX90632_EE_Ka),
  140. regmap_reg_range(MLX90632_EE_CTRL, MLX90632_EE_I2C_ADDR),
  141. regmap_reg_range(MLX90632_EE_Ha, MLX90632_EE_Hb),
  142. regmap_reg_range(MLX90632_REG_I2C_ADDR, MLX90632_REG_CONTROL),
  143. regmap_reg_range(MLX90632_REG_I2C_CMD, MLX90632_REG_I2C_CMD),
  144. regmap_reg_range(MLX90632_REG_STATUS, MLX90632_REG_STATUS),
  145. regmap_reg_range(MLX90632_RAM_1(0),
  146. MLX90632_RAM_3(MLX90632_MAX_MEAS_NUM)),
  147. };
  148. static const struct regmap_access_table mlx90632_readable_regs_tbl = {
  149. .yes_ranges = mlx90632_read_reg_range,
  150. .n_yes_ranges = ARRAY_SIZE(mlx90632_read_reg_range),
  151. };
  152. static const struct regmap_range mlx90632_no_write_reg_range[] = {
  153. regmap_reg_range(MLX90632_EE_VERSION, MLX90632_EE_Ka),
  154. regmap_reg_range(MLX90632_RAM_1(0),
  155. MLX90632_RAM_3(MLX90632_MAX_MEAS_NUM)),
  156. };
  157. static const struct regmap_access_table mlx90632_writeable_regs_tbl = {
  158. .no_ranges = mlx90632_no_write_reg_range,
  159. .n_no_ranges = ARRAY_SIZE(mlx90632_no_write_reg_range),
  160. };
  161. static const struct regmap_config mlx90632_regmap = {
  162. .reg_bits = 16,
  163. .val_bits = 16,
  164. .volatile_table = &mlx90632_volatile_regs_tbl,
  165. .rd_table = &mlx90632_readable_regs_tbl,
  166. .wr_table = &mlx90632_writeable_regs_tbl,
  167. .use_single_read = true,
  168. .use_single_write = true,
  169. .reg_format_endian = REGMAP_ENDIAN_BIG,
  170. .val_format_endian = REGMAP_ENDIAN_BIG,
  171. .cache_type = REGCACHE_RBTREE,
  172. };
  173. static s32 mlx90632_pwr_set_sleep_step(struct regmap *regmap)
  174. {
  175. return regmap_update_bits(regmap, MLX90632_REG_CONTROL,
  176. MLX90632_CFG_PWR_MASK,
  177. MLX90632_PWR_STATUS_SLEEP_STEP);
  178. }
  179. static s32 mlx90632_pwr_continuous(struct regmap *regmap)
  180. {
  181. return regmap_update_bits(regmap, MLX90632_REG_CONTROL,
  182. MLX90632_CFG_PWR_MASK,
  183. MLX90632_PWR_STATUS_CONTINUOUS);
  184. }
  185. /**
  186. * mlx90632_reset_delay() - Give the mlx90632 some time to reset properly
  187. * If this is not done, the following I2C command(s) will not be accepted.
  188. */
  189. static void mlx90632_reset_delay(void)
  190. {
  191. usleep_range(150, 200);
  192. }
  193. /**
  194. * mlx90632_perform_measurement() - Trigger and retrieve current measurement cycle
  195. * @data: pointer to mlx90632_data object containing regmap information
  196. *
  197. * Perform a measurement and return latest measurement cycle position reported
  198. * by sensor. This is a blocking function for 500ms, as that is default sensor
  199. * refresh rate.
  200. */
  201. static int mlx90632_perform_measurement(struct mlx90632_data *data)
  202. {
  203. unsigned int reg_status;
  204. int ret;
  205. ret = regmap_update_bits(data->regmap, MLX90632_REG_STATUS,
  206. MLX90632_STAT_DATA_RDY, 0);
  207. if (ret < 0)
  208. return ret;
  209. ret = regmap_read_poll_timeout(data->regmap, MLX90632_REG_STATUS, reg_status,
  210. !(reg_status & MLX90632_STAT_DATA_RDY), 10000,
  211. 100 * 10000);
  212. if (ret < 0) {
  213. dev_err(&data->client->dev, "data not ready");
  214. return -ETIMEDOUT;
  215. }
  216. return (reg_status & MLX90632_STAT_CYCLE_POS) >> 2;
  217. }
  218. static int mlx90632_set_meas_type(struct regmap *regmap, u8 type)
  219. {
  220. int ret;
  221. if ((type != MLX90632_MTYP_MEDICAL) && (type != MLX90632_MTYP_EXTENDED))
  222. return -EINVAL;
  223. ret = regmap_write(regmap, MLX90632_REG_I2C_CMD, MLX90632_RESET_CMD);
  224. if (ret < 0)
  225. return ret;
  226. mlx90632_reset_delay();
  227. ret = regmap_write_bits(regmap, MLX90632_REG_CONTROL,
  228. (MLX90632_CFG_MTYP_MASK | MLX90632_CFG_PWR_MASK),
  229. (MLX90632_MTYP_STATUS(type) | MLX90632_PWR_STATUS_HALT));
  230. if (ret < 0)
  231. return ret;
  232. return mlx90632_pwr_continuous(regmap);
  233. }
  234. static int mlx90632_channel_new_select(int perform_ret, uint8_t *channel_new,
  235. uint8_t *channel_old)
  236. {
  237. switch (perform_ret) {
  238. case 1:
  239. *channel_new = 1;
  240. *channel_old = 2;
  241. break;
  242. case 2:
  243. *channel_new = 2;
  244. *channel_old = 1;
  245. break;
  246. default:
  247. return -EINVAL;
  248. }
  249. return 0;
  250. }
  251. static int mlx90632_read_ambient_raw(struct regmap *regmap,
  252. s16 *ambient_new_raw, s16 *ambient_old_raw)
  253. {
  254. int ret;
  255. unsigned int read_tmp;
  256. ret = regmap_read(regmap, MLX90632_RAM_3(1), &read_tmp);
  257. if (ret < 0)
  258. return ret;
  259. *ambient_new_raw = (s16)read_tmp;
  260. ret = regmap_read(regmap, MLX90632_RAM_3(2), &read_tmp);
  261. if (ret < 0)
  262. return ret;
  263. *ambient_old_raw = (s16)read_tmp;
  264. return ret;
  265. }
  266. static int mlx90632_read_object_raw(struct regmap *regmap,
  267. int perform_measurement_ret,
  268. s16 *object_new_raw, s16 *object_old_raw)
  269. {
  270. int ret;
  271. unsigned int read_tmp;
  272. s16 read;
  273. u8 channel = 0;
  274. u8 channel_old = 0;
  275. ret = mlx90632_channel_new_select(perform_measurement_ret, &channel,
  276. &channel_old);
  277. if (ret != 0)
  278. return ret;
  279. ret = regmap_read(regmap, MLX90632_RAM_2(channel), &read_tmp);
  280. if (ret < 0)
  281. return ret;
  282. read = (s16)read_tmp;
  283. ret = regmap_read(regmap, MLX90632_RAM_1(channel), &read_tmp);
  284. if (ret < 0)
  285. return ret;
  286. *object_new_raw = (read + (s16)read_tmp) / 2;
  287. ret = regmap_read(regmap, MLX90632_RAM_2(channel_old), &read_tmp);
  288. if (ret < 0)
  289. return ret;
  290. read = (s16)read_tmp;
  291. ret = regmap_read(regmap, MLX90632_RAM_1(channel_old), &read_tmp);
  292. if (ret < 0)
  293. return ret;
  294. *object_old_raw = (read + (s16)read_tmp) / 2;
  295. return ret;
  296. }
  297. static int mlx90632_read_all_channel(struct mlx90632_data *data,
  298. s16 *ambient_new_raw, s16 *ambient_old_raw,
  299. s16 *object_new_raw, s16 *object_old_raw)
  300. {
  301. s32 ret, measurement;
  302. mutex_lock(&data->lock);
  303. measurement = mlx90632_perform_measurement(data);
  304. if (measurement < 0) {
  305. ret = measurement;
  306. goto read_unlock;
  307. }
  308. ret = mlx90632_read_ambient_raw(data->regmap, ambient_new_raw,
  309. ambient_old_raw);
  310. if (ret < 0)
  311. goto read_unlock;
  312. ret = mlx90632_read_object_raw(data->regmap, measurement,
  313. object_new_raw, object_old_raw);
  314. read_unlock:
  315. mutex_unlock(&data->lock);
  316. return ret;
  317. }
  318. static int mlx90632_read_ambient_raw_extended(struct regmap *regmap,
  319. s16 *ambient_new_raw, s16 *ambient_old_raw)
  320. {
  321. unsigned int read_tmp;
  322. int ret;
  323. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_AMBIENT_1, &read_tmp);
  324. if (ret < 0)
  325. return ret;
  326. *ambient_new_raw = (s16)read_tmp;
  327. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_AMBIENT_2, &read_tmp);
  328. if (ret < 0)
  329. return ret;
  330. *ambient_old_raw = (s16)read_tmp;
  331. return 0;
  332. }
  333. static int mlx90632_read_object_raw_extended(struct regmap *regmap, s16 *object_new_raw)
  334. {
  335. unsigned int read_tmp;
  336. s32 read;
  337. int ret;
  338. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_OBJECT_1, &read_tmp);
  339. if (ret < 0)
  340. return ret;
  341. read = (s16)read_tmp;
  342. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_OBJECT_2, &read_tmp);
  343. if (ret < 0)
  344. return ret;
  345. read = read - (s16)read_tmp;
  346. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_OBJECT_3, &read_tmp);
  347. if (ret < 0)
  348. return ret;
  349. read = read - (s16)read_tmp;
  350. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_OBJECT_4, &read_tmp);
  351. if (ret < 0)
  352. return ret;
  353. read = (read + (s16)read_tmp) / 2;
  354. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_OBJECT_5, &read_tmp);
  355. if (ret < 0)
  356. return ret;
  357. read = read + (s16)read_tmp;
  358. ret = regmap_read(regmap, MLX90632_RAM_DSP5_EXTENDED_OBJECT_6, &read_tmp);
  359. if (ret < 0)
  360. return ret;
  361. read = read + (s16)read_tmp;
  362. if (read > S16_MAX || read < S16_MIN)
  363. return -ERANGE;
  364. *object_new_raw = read;
  365. return 0;
  366. }
  367. static int mlx90632_read_all_channel_extended(struct mlx90632_data *data, s16 *object_new_raw,
  368. s16 *ambient_new_raw, s16 *ambient_old_raw)
  369. {
  370. s32 ret, meas;
  371. mutex_lock(&data->lock);
  372. ret = mlx90632_set_meas_type(data->regmap, MLX90632_MTYP_EXTENDED);
  373. if (ret < 0)
  374. goto read_unlock;
  375. ret = read_poll_timeout(mlx90632_perform_measurement, meas, meas == 19,
  376. 50000, 800000, false, data);
  377. if (ret != 0)
  378. goto read_unlock;
  379. ret = mlx90632_read_object_raw_extended(data->regmap, object_new_raw);
  380. if (ret < 0)
  381. goto read_unlock;
  382. ret = mlx90632_read_ambient_raw_extended(data->regmap, ambient_new_raw, ambient_old_raw);
  383. read_unlock:
  384. (void) mlx90632_set_meas_type(data->regmap, MLX90632_MTYP_MEDICAL);
  385. mutex_unlock(&data->lock);
  386. return ret;
  387. }
  388. static int mlx90632_read_ee_register(struct regmap *regmap, u16 reg_lsb,
  389. s32 *reg_value)
  390. {
  391. s32 ret;
  392. unsigned int read;
  393. u32 value;
  394. ret = regmap_read(regmap, reg_lsb, &read);
  395. if (ret < 0)
  396. return ret;
  397. value = read;
  398. ret = regmap_read(regmap, reg_lsb + 1, &read);
  399. if (ret < 0)
  400. return ret;
  401. *reg_value = (read << 16) | (value & 0xffff);
  402. return 0;
  403. }
  404. static s64 mlx90632_preprocess_temp_amb(s16 ambient_new_raw,
  405. s16 ambient_old_raw, s16 Gb)
  406. {
  407. s64 VR_Ta, kGb, tmp;
  408. kGb = ((s64)Gb * 1000LL) >> 10ULL;
  409. VR_Ta = (s64)ambient_old_raw * 1000000LL +
  410. kGb * div64_s64(((s64)ambient_new_raw * 1000LL),
  411. (MLX90632_REF_3));
  412. tmp = div64_s64(
  413. div64_s64(((s64)ambient_new_raw * 1000000000000LL),
  414. (MLX90632_REF_3)), VR_Ta);
  415. return div64_s64(tmp << 19ULL, 1000LL);
  416. }
  417. static s64 mlx90632_preprocess_temp_obj(s16 object_new_raw, s16 object_old_raw,
  418. s16 ambient_new_raw,
  419. s16 ambient_old_raw, s16 Ka)
  420. {
  421. s64 VR_IR, kKa, tmp;
  422. kKa = ((s64)Ka * 1000LL) >> 10ULL;
  423. VR_IR = (s64)ambient_old_raw * 1000000LL +
  424. kKa * div64_s64(((s64)ambient_new_raw * 1000LL),
  425. (MLX90632_REF_3));
  426. tmp = div64_s64(
  427. div64_s64(((s64)((object_new_raw + object_old_raw) / 2)
  428. * 1000000000000LL), (MLX90632_REF_12)),
  429. VR_IR);
  430. return div64_s64((tmp << 19ULL), 1000LL);
  431. }
  432. static s64 mlx90632_preprocess_temp_obj_extended(s16 object_new_raw, s16 ambient_new_raw,
  433. s16 ambient_old_raw, s16 Ka)
  434. {
  435. s64 VR_IR, kKa, tmp;
  436. kKa = ((s64)Ka * 1000LL) >> 10ULL;
  437. VR_IR = (s64)ambient_old_raw * 1000000LL +
  438. kKa * div64_s64((s64)ambient_new_raw * 1000LL,
  439. MLX90632_REF_3);
  440. tmp = div64_s64(
  441. div64_s64((s64) object_new_raw * 1000000000000LL, MLX90632_REF_12),
  442. VR_IR);
  443. return div64_s64(tmp << 19ULL, 1000LL);
  444. }
  445. static s32 mlx90632_calc_temp_ambient(s16 ambient_new_raw, s16 ambient_old_raw,
  446. s32 P_T, s32 P_R, s32 P_G, s32 P_O, s16 Gb)
  447. {
  448. s64 Asub, Bsub, Ablock, Bblock, Cblock, AMB, sum;
  449. AMB = mlx90632_preprocess_temp_amb(ambient_new_raw, ambient_old_raw,
  450. Gb);
  451. Asub = ((s64)P_T * 10000000000LL) >> 44ULL;
  452. Bsub = AMB - (((s64)P_R * 1000LL) >> 8ULL);
  453. Ablock = Asub * (Bsub * Bsub);
  454. Bblock = (div64_s64(Bsub * 10000000LL, P_G)) << 20ULL;
  455. Cblock = ((s64)P_O * 10000000000LL) >> 8ULL;
  456. sum = div64_s64(Ablock, 1000000LL) + Bblock + Cblock;
  457. return div64_s64(sum, 10000000LL);
  458. }
  459. static s32 mlx90632_calc_temp_object_iteration(s32 prev_object_temp, s64 object,
  460. s64 TAdut, s64 TAdut4, s32 Fa, s32 Fb,
  461. s32 Ga, s16 Ha, s16 Hb,
  462. u16 emissivity)
  463. {
  464. s64 calcedKsTO, calcedKsTA, ir_Alpha, Alpha_corr;
  465. s64 Ha_customer, Hb_customer;
  466. Ha_customer = ((s64)Ha * 1000000LL) >> 14ULL;
  467. Hb_customer = ((s64)Hb * 100) >> 10ULL;
  468. calcedKsTO = ((s64)((s64)Ga * (prev_object_temp - 25 * 1000LL)
  469. * 1000LL)) >> 36LL;
  470. calcedKsTA = ((s64)(Fb * (TAdut - 25 * 1000000LL))) >> 36LL;
  471. Alpha_corr = div64_s64((((s64)(Fa * 10000000000LL) >> 46LL)
  472. * Ha_customer), 1000LL);
  473. Alpha_corr *= ((s64)(1 * 1000000LL + calcedKsTO + calcedKsTA));
  474. Alpha_corr = emissivity * div64_s64(Alpha_corr, 100000LL);
  475. Alpha_corr = div64_s64(Alpha_corr, 1000LL);
  476. ir_Alpha = div64_s64((s64)object * 10000000LL, Alpha_corr);
  477. return (int_sqrt64(int_sqrt64(ir_Alpha * 1000000000000LL + TAdut4))
  478. - 27315 - Hb_customer) * 10;
  479. }
  480. static s64 mlx90632_calc_ta4(s64 TAdut, s64 scale)
  481. {
  482. return (div64_s64(TAdut, scale) + 27315) *
  483. (div64_s64(TAdut, scale) + 27315) *
  484. (div64_s64(TAdut, scale) + 27315) *
  485. (div64_s64(TAdut, scale) + 27315);
  486. }
  487. static s32 mlx90632_calc_temp_object(s64 object, s64 ambient, s32 Ea, s32 Eb,
  488. s32 Fa, s32 Fb, s32 Ga, s16 Ha, s16 Hb,
  489. u16 tmp_emi)
  490. {
  491. s64 kTA, kTA0, TAdut, TAdut4;
  492. s64 temp = 25000;
  493. s8 i;
  494. kTA = (Ea * 1000LL) >> 16LL;
  495. kTA0 = (Eb * 1000LL) >> 8LL;
  496. TAdut = div64_s64(((ambient - kTA0) * 1000000LL), kTA) + 25 * 1000000LL;
  497. TAdut4 = mlx90632_calc_ta4(TAdut, 10000LL);
  498. /* Iterations of calculation as described in datasheet */
  499. for (i = 0; i < 5; ++i) {
  500. temp = mlx90632_calc_temp_object_iteration(temp, object, TAdut, TAdut4,
  501. Fa, Fb, Ga, Ha, Hb,
  502. tmp_emi);
  503. }
  504. return temp;
  505. }
  506. static s32 mlx90632_calc_temp_object_extended(s64 object, s64 ambient, s64 reflected,
  507. s32 Ea, s32 Eb, s32 Fa, s32 Fb, s32 Ga,
  508. s16 Ha, s16 Hb, u16 tmp_emi)
  509. {
  510. s64 kTA, kTA0, TAdut, TAdut4, Tr4, TaTr4;
  511. s64 temp = 25000;
  512. s8 i;
  513. kTA = (Ea * 1000LL) >> 16LL;
  514. kTA0 = (Eb * 1000LL) >> 8LL;
  515. TAdut = div64_s64((ambient - kTA0) * 1000000LL, kTA) + 25 * 1000000LL;
  516. Tr4 = mlx90632_calc_ta4(reflected, 10);
  517. TAdut4 = mlx90632_calc_ta4(TAdut, 10000LL);
  518. TaTr4 = Tr4 - div64_s64(Tr4 - TAdut4, tmp_emi) * 1000;
  519. /* Iterations of calculation as described in datasheet */
  520. for (i = 0; i < 5; ++i) {
  521. temp = mlx90632_calc_temp_object_iteration(temp, object, TAdut, TaTr4,
  522. Fa / 2, Fb, Ga, Ha, Hb,
  523. tmp_emi);
  524. }
  525. return temp;
  526. }
  527. static int mlx90632_calc_object_dsp105(struct mlx90632_data *data, int *val)
  528. {
  529. s32 ret;
  530. s32 Ea, Eb, Fa, Fb, Ga;
  531. unsigned int read_tmp;
  532. s16 Ha, Hb, Gb, Ka;
  533. s16 ambient_new_raw, ambient_old_raw, object_new_raw, object_old_raw;
  534. s64 object, ambient;
  535. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_Ea, &Ea);
  536. if (ret < 0)
  537. return ret;
  538. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_Eb, &Eb);
  539. if (ret < 0)
  540. return ret;
  541. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_Fa, &Fa);
  542. if (ret < 0)
  543. return ret;
  544. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_Fb, &Fb);
  545. if (ret < 0)
  546. return ret;
  547. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_Ga, &Ga);
  548. if (ret < 0)
  549. return ret;
  550. ret = regmap_read(data->regmap, MLX90632_EE_Ha, &read_tmp);
  551. if (ret < 0)
  552. return ret;
  553. Ha = (s16)read_tmp;
  554. ret = regmap_read(data->regmap, MLX90632_EE_Hb, &read_tmp);
  555. if (ret < 0)
  556. return ret;
  557. Hb = (s16)read_tmp;
  558. ret = regmap_read(data->regmap, MLX90632_EE_Gb, &read_tmp);
  559. if (ret < 0)
  560. return ret;
  561. Gb = (s16)read_tmp;
  562. ret = regmap_read(data->regmap, MLX90632_EE_Ka, &read_tmp);
  563. if (ret < 0)
  564. return ret;
  565. Ka = (s16)read_tmp;
  566. ret = mlx90632_read_all_channel(data,
  567. &ambient_new_raw, &ambient_old_raw,
  568. &object_new_raw, &object_old_raw);
  569. if (ret < 0)
  570. return ret;
  571. if (object_new_raw > MLX90632_EXTENDED_LIMIT &&
  572. data->mtyp == MLX90632_MTYP_EXTENDED) {
  573. ret = mlx90632_read_all_channel_extended(data, &object_new_raw,
  574. &ambient_new_raw, &ambient_old_raw);
  575. if (ret < 0)
  576. return ret;
  577. /* Use extended mode calculations */
  578. ambient = mlx90632_preprocess_temp_amb(ambient_new_raw,
  579. ambient_old_raw, Gb);
  580. object = mlx90632_preprocess_temp_obj_extended(object_new_raw,
  581. ambient_new_raw,
  582. ambient_old_raw, Ka);
  583. *val = mlx90632_calc_temp_object_extended(object, ambient,
  584. data->object_ambient_temperature,
  585. Ea, Eb, Fa, Fb, Ga,
  586. Ha, Hb, data->emissivity);
  587. return 0;
  588. }
  589. ambient = mlx90632_preprocess_temp_amb(ambient_new_raw,
  590. ambient_old_raw, Gb);
  591. object = mlx90632_preprocess_temp_obj(object_new_raw,
  592. object_old_raw,
  593. ambient_new_raw,
  594. ambient_old_raw, Ka);
  595. *val = mlx90632_calc_temp_object(object, ambient, Ea, Eb, Fa, Fb, Ga,
  596. Ha, Hb, data->emissivity);
  597. return 0;
  598. }
  599. static int mlx90632_calc_ambient_dsp105(struct mlx90632_data *data, int *val)
  600. {
  601. s32 ret;
  602. unsigned int read_tmp;
  603. s32 PT, PR, PG, PO;
  604. s16 Gb;
  605. s16 ambient_new_raw, ambient_old_raw;
  606. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_P_R, &PR);
  607. if (ret < 0)
  608. return ret;
  609. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_P_G, &PG);
  610. if (ret < 0)
  611. return ret;
  612. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_P_T, &PT);
  613. if (ret < 0)
  614. return ret;
  615. ret = mlx90632_read_ee_register(data->regmap, MLX90632_EE_P_O, &PO);
  616. if (ret < 0)
  617. return ret;
  618. ret = regmap_read(data->regmap, MLX90632_EE_Gb, &read_tmp);
  619. if (ret < 0)
  620. return ret;
  621. Gb = (s16)read_tmp;
  622. ret = mlx90632_read_ambient_raw(data->regmap, &ambient_new_raw,
  623. &ambient_old_raw);
  624. if (ret < 0)
  625. return ret;
  626. *val = mlx90632_calc_temp_ambient(ambient_new_raw, ambient_old_raw,
  627. PT, PR, PG, PO, Gb);
  628. return ret;
  629. }
  630. static int mlx90632_read_raw(struct iio_dev *indio_dev,
  631. struct iio_chan_spec const *channel, int *val,
  632. int *val2, long mask)
  633. {
  634. struct mlx90632_data *data = iio_priv(indio_dev);
  635. int ret;
  636. switch (mask) {
  637. case IIO_CHAN_INFO_PROCESSED:
  638. switch (channel->channel2) {
  639. case IIO_MOD_TEMP_AMBIENT:
  640. ret = mlx90632_calc_ambient_dsp105(data, val);
  641. if (ret < 0)
  642. return ret;
  643. return IIO_VAL_INT;
  644. case IIO_MOD_TEMP_OBJECT:
  645. ret = mlx90632_calc_object_dsp105(data, val);
  646. if (ret < 0)
  647. return ret;
  648. return IIO_VAL_INT;
  649. default:
  650. return -EINVAL;
  651. }
  652. case IIO_CHAN_INFO_CALIBEMISSIVITY:
  653. if (data->emissivity == 1000) {
  654. *val = 1;
  655. *val2 = 0;
  656. } else {
  657. *val = 0;
  658. *val2 = data->emissivity * 1000;
  659. }
  660. return IIO_VAL_INT_PLUS_MICRO;
  661. case IIO_CHAN_INFO_CALIBAMBIENT:
  662. *val = data->object_ambient_temperature;
  663. return IIO_VAL_INT;
  664. default:
  665. return -EINVAL;
  666. }
  667. }
  668. static int mlx90632_write_raw(struct iio_dev *indio_dev,
  669. struct iio_chan_spec const *channel, int val,
  670. int val2, long mask)
  671. {
  672. struct mlx90632_data *data = iio_priv(indio_dev);
  673. switch (mask) {
  674. case IIO_CHAN_INFO_CALIBEMISSIVITY:
  675. /* Confirm we are within 0 and 1.0 */
  676. if (val < 0 || val2 < 0 || val > 1 ||
  677. (val == 1 && val2 != 0))
  678. return -EINVAL;
  679. data->emissivity = val * 1000 + val2 / 1000;
  680. return 0;
  681. case IIO_CHAN_INFO_CALIBAMBIENT:
  682. data->object_ambient_temperature = val;
  683. return 0;
  684. default:
  685. return -EINVAL;
  686. }
  687. }
  688. static const struct iio_chan_spec mlx90632_channels[] = {
  689. {
  690. .type = IIO_TEMP,
  691. .modified = 1,
  692. .channel2 = IIO_MOD_TEMP_AMBIENT,
  693. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
  694. },
  695. {
  696. .type = IIO_TEMP,
  697. .modified = 1,
  698. .channel2 = IIO_MOD_TEMP_OBJECT,
  699. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
  700. BIT(IIO_CHAN_INFO_CALIBEMISSIVITY) | BIT(IIO_CHAN_INFO_CALIBAMBIENT),
  701. },
  702. };
  703. static const struct iio_info mlx90632_info = {
  704. .read_raw = mlx90632_read_raw,
  705. .write_raw = mlx90632_write_raw,
  706. };
  707. static int mlx90632_sleep(struct mlx90632_data *data)
  708. {
  709. regcache_mark_dirty(data->regmap);
  710. dev_dbg(&data->client->dev, "Requesting sleep");
  711. return mlx90632_pwr_set_sleep_step(data->regmap);
  712. }
  713. static int mlx90632_wakeup(struct mlx90632_data *data)
  714. {
  715. int ret;
  716. ret = regcache_sync(data->regmap);
  717. if (ret < 0) {
  718. dev_err(&data->client->dev,
  719. "Failed to sync regmap registers: %d\n", ret);
  720. return ret;
  721. }
  722. dev_dbg(&data->client->dev, "Requesting wake-up\n");
  723. return mlx90632_pwr_continuous(data->regmap);
  724. }
  725. static void mlx90632_disable_regulator(void *_data)
  726. {
  727. struct mlx90632_data *data = _data;
  728. int ret;
  729. ret = regulator_disable(data->regulator);
  730. if (ret < 0)
  731. dev_err(regmap_get_device(data->regmap),
  732. "Failed to disable power regulator: %d\n", ret);
  733. }
  734. static int mlx90632_enable_regulator(struct mlx90632_data *data)
  735. {
  736. int ret;
  737. ret = regulator_enable(data->regulator);
  738. if (ret < 0) {
  739. dev_err(regmap_get_device(data->regmap), "Failed to enable power regulator!\n");
  740. return ret;
  741. }
  742. mlx90632_reset_delay();
  743. return ret;
  744. }
  745. static int mlx90632_probe(struct i2c_client *client,
  746. const struct i2c_device_id *id)
  747. {
  748. struct iio_dev *indio_dev;
  749. struct mlx90632_data *mlx90632;
  750. struct regmap *regmap;
  751. int ret;
  752. unsigned int read;
  753. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*mlx90632));
  754. if (!indio_dev) {
  755. dev_err(&client->dev, "Failed to allocate device\n");
  756. return -ENOMEM;
  757. }
  758. regmap = devm_regmap_init_i2c(client, &mlx90632_regmap);
  759. if (IS_ERR(regmap)) {
  760. ret = PTR_ERR(regmap);
  761. dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
  762. return ret;
  763. }
  764. mlx90632 = iio_priv(indio_dev);
  765. i2c_set_clientdata(client, indio_dev);
  766. mlx90632->client = client;
  767. mlx90632->regmap = regmap;
  768. mlx90632->mtyp = MLX90632_MTYP_MEDICAL;
  769. mutex_init(&mlx90632->lock);
  770. indio_dev->name = id->name;
  771. indio_dev->modes = INDIO_DIRECT_MODE;
  772. indio_dev->info = &mlx90632_info;
  773. indio_dev->channels = mlx90632_channels;
  774. indio_dev->num_channels = ARRAY_SIZE(mlx90632_channels);
  775. mlx90632->regulator = devm_regulator_get(&client->dev, "vdd");
  776. if (IS_ERR(mlx90632->regulator))
  777. return dev_err_probe(&client->dev, PTR_ERR(mlx90632->regulator),
  778. "failed to get vdd regulator");
  779. ret = mlx90632_enable_regulator(mlx90632);
  780. if (ret < 0)
  781. return ret;
  782. ret = devm_add_action_or_reset(&client->dev, mlx90632_disable_regulator,
  783. mlx90632);
  784. if (ret < 0) {
  785. dev_err(&client->dev, "Failed to setup regulator cleanup action %d\n",
  786. ret);
  787. return ret;
  788. }
  789. ret = mlx90632_wakeup(mlx90632);
  790. if (ret < 0) {
  791. dev_err(&client->dev, "Wakeup failed: %d\n", ret);
  792. return ret;
  793. }
  794. ret = regmap_read(mlx90632->regmap, MLX90632_EE_VERSION, &read);
  795. if (ret < 0) {
  796. dev_err(&client->dev, "read of version failed: %d\n", ret);
  797. return ret;
  798. }
  799. read = read & MLX90632_ID_MASK;
  800. if (read == MLX90632_ID_MEDICAL) {
  801. dev_dbg(&client->dev,
  802. "Detected Medical EEPROM calibration %x\n", read);
  803. } else if (read == MLX90632_ID_CONSUMER) {
  804. dev_dbg(&client->dev,
  805. "Detected Consumer EEPROM calibration %x\n", read);
  806. } else if (read == MLX90632_ID_EXTENDED) {
  807. dev_dbg(&client->dev,
  808. "Detected Extended range EEPROM calibration %x\n", read);
  809. mlx90632->mtyp = MLX90632_MTYP_EXTENDED;
  810. } else if ((read & MLX90632_DSP_MASK) == MLX90632_DSP_VERSION) {
  811. dev_dbg(&client->dev,
  812. "Detected Unknown EEPROM calibration %x\n", read);
  813. } else {
  814. dev_err(&client->dev,
  815. "Wrong DSP version %x (expected %x)\n",
  816. read, MLX90632_DSP_VERSION);
  817. return -EPROTONOSUPPORT;
  818. }
  819. mlx90632->emissivity = 1000;
  820. mlx90632->object_ambient_temperature = 25000; /* 25 degrees milliCelsius */
  821. pm_runtime_disable(&client->dev);
  822. ret = pm_runtime_set_active(&client->dev);
  823. if (ret < 0) {
  824. mlx90632_sleep(mlx90632);
  825. return ret;
  826. }
  827. pm_runtime_enable(&client->dev);
  828. pm_runtime_set_autosuspend_delay(&client->dev, MLX90632_SLEEP_DELAY_MS);
  829. pm_runtime_use_autosuspend(&client->dev);
  830. return iio_device_register(indio_dev);
  831. }
  832. static void mlx90632_remove(struct i2c_client *client)
  833. {
  834. struct iio_dev *indio_dev = i2c_get_clientdata(client);
  835. struct mlx90632_data *data = iio_priv(indio_dev);
  836. iio_device_unregister(indio_dev);
  837. pm_runtime_disable(&client->dev);
  838. pm_runtime_set_suspended(&client->dev);
  839. pm_runtime_put_noidle(&client->dev);
  840. mlx90632_sleep(data);
  841. }
  842. static const struct i2c_device_id mlx90632_id[] = {
  843. { "mlx90632", 0 },
  844. { }
  845. };
  846. MODULE_DEVICE_TABLE(i2c, mlx90632_id);
  847. static const struct of_device_id mlx90632_of_match[] = {
  848. { .compatible = "melexis,mlx90632" },
  849. { }
  850. };
  851. MODULE_DEVICE_TABLE(of, mlx90632_of_match);
  852. static int __maybe_unused mlx90632_pm_suspend(struct device *dev)
  853. {
  854. struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
  855. struct mlx90632_data *data = iio_priv(indio_dev);
  856. return mlx90632_sleep(data);
  857. }
  858. static int __maybe_unused mlx90632_pm_resume(struct device *dev)
  859. {
  860. struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
  861. struct mlx90632_data *data = iio_priv(indio_dev);
  862. return mlx90632_wakeup(data);
  863. }
  864. static UNIVERSAL_DEV_PM_OPS(mlx90632_pm_ops, mlx90632_pm_suspend,
  865. mlx90632_pm_resume, NULL);
  866. static struct i2c_driver mlx90632_driver = {
  867. .driver = {
  868. .name = "mlx90632",
  869. .of_match_table = mlx90632_of_match,
  870. .pm = &mlx90632_pm_ops,
  871. },
  872. .probe = mlx90632_probe,
  873. .remove = mlx90632_remove,
  874. .id_table = mlx90632_id,
  875. };
  876. module_i2c_driver(mlx90632_driver);
  877. MODULE_AUTHOR("Crt Mori <[email protected]>");
  878. MODULE_DESCRIPTION("Melexis MLX90632 contactless Infra Red temperature sensor driver");
  879. MODULE_LICENSE("GPL v2");