1 // SPDX-License-Identifier: GPL-2.0
3 * mlx90635.c - Melexis MLX90635 contactless IR temperature sensor
5 * Copyright (c) 2023 Melexis <cmo@melexis.com>
7 * Driver for the Melexis MLX90635 I2C 16-bit IR thermopile sensor
9 #include <linux/bitfield.h>
10 #include <linux/delay.h>
11 #include <linux/device.h>
12 #include <linux/err.h>
13 #include <linux/gpio/consumer.h>
14 #include <linux/i2c.h>
15 #include <linux/iopoll.h>
16 #include <linux/jiffies.h>
17 #include <linux/kernel.h>
18 #include <linux/limits.h>
19 #include <linux/mod_devicetable.h>
20 #include <linux/module.h>
21 #include <linux/math64.h>
22 #include <linux/pm_runtime.h>
23 #include <linux/regmap.h>
24 #include <linux/regulator/consumer.h>
26 #include <linux/iio/iio.h>
28 /* Memory sections addresses */
29 #define MLX90635_ADDR_RAM 0x0000 /* Start address of ram */
30 #define MLX90635_ADDR_EEPROM 0x0018 /* Start address of user eeprom */
32 /* EEPROM addresses - used at startup */
33 #define MLX90635_EE_I2C_CFG 0x0018 /* I2C address register initial value */
34 #define MLX90635_EE_CTRL1 0x001A /* Control register1 initial value */
35 #define MLX90635_EE_CTRL2 0x001C /* Control register2 initial value */
37 #define MLX90635_EE_Ha 0x001E /* Ha customer calib value reg 16bit */
38 #define MLX90635_EE_Hb 0x0020 /* Hb customer calib value reg 16bit */
39 #define MLX90635_EE_Fa 0x0026 /* Fa calibration register 32bit */
40 #define MLX90635_EE_FASCALE 0x002A /* Scaling coefficient for Fa register 16bit */
41 #define MLX90635_EE_Ga 0x002C /* Ga calibration register 16bit */
42 #define MLX90635_EE_Fb 0x002E /* Fb calibration register 16bit */
43 #define MLX90635_EE_Ea 0x0030 /* Ea calibration register 32bit */
44 #define MLX90635_EE_Eb 0x0034 /* Eb calibration register 32bit */
45 #define MLX90635_EE_P_G 0x0038 /* P_G calibration register 16bit */
46 #define MLX90635_EE_P_O 0x003A /* P_O calibration register 16bit */
47 #define MLX90635_EE_Aa 0x003C /* Aa calibration register 16bit */
48 #define MLX90635_EE_VERSION 0x003E /* Version bits 4:7 and 12:15 */
49 #define MLX90635_EE_Gb 0x0040 /* Gb calibration register 16bit */
51 /* Device status register - volatile */
52 #define MLX90635_REG_STATUS 0x0000
53 #define MLX90635_STAT_BUSY BIT(6) /* Device busy indicator */
54 #define MLX90635_STAT_BRST BIT(5) /* Brown out reset indicator */
55 #define MLX90635_STAT_CYCLE_POS GENMASK(4, 2) /* Data position */
56 #define MLX90635_STAT_END_CONV BIT(1) /* End of conversion indicator */
57 #define MLX90635_STAT_DATA_RDY BIT(0) /* Data ready indicator */
59 /* EEPROM control register address - volatile */
60 #define MLX90635_REG_EE 0x000C
61 #define MLX90635_EE_ACTIVE BIT(4) /* Power-on EEPROM */
62 #define MLX90635_EE_BUSY_MASK BIT(15)
64 #define MLX90635_REG_CMD 0x0010 /* Command register address */
66 /* Control register1 address - volatile */
67 #define MLX90635_REG_CTRL1 0x0014
68 #define MLX90635_CTRL1_REFRESH_RATE_MASK GENMASK(2, 0)
69 #define MLX90635_CTRL1_RES_CTRL_MASK GENMASK(4, 3)
70 #define MLX90635_CTRL1_TABLE_MASK BIT(15) /* Table select */
72 /* Control register2 address - volatile */
73 #define MLX90635_REG_CTRL2 0x0016
74 #define MLX90635_CTRL2_BURST_CNT_MASK GENMASK(10, 6) /* Burst count */
75 #define MLX90635_CTRL2_MODE_MASK GENMASK(12, 11) /* Power mode */
76 #define MLX90635_CTRL2_SOB_MASK BIT(15)
78 /* PowerModes statuses */
79 #define MLX90635_PWR_STATUS_HALT 0
80 #define MLX90635_PWR_STATUS_SLEEP_STEP 1
81 #define MLX90635_PWR_STATUS_STEP 2
82 #define MLX90635_PWR_STATUS_CONTINUOUS 3
84 /* Measurement data addresses */
85 #define MLX90635_RESULT_1 0x0002
86 #define MLX90635_RESULT_2 0x0004
87 #define MLX90635_RESULT_3 0x0006
88 #define MLX90635_RESULT_4 0x0008
89 #define MLX90635_RESULT_5 0x000A
92 #define MLX90635_TIMING_RST_MIN 200 /* Minimum time after addressed reset command */
93 #define MLX90635_TIMING_RST_MAX 250 /* Maximum time after addressed reset command */
94 #define MLX90635_TIMING_POLLING 10000 /* Time between bit polling*/
95 #define MLX90635_TIMING_EE_ACTIVE_MIN 100 /* Minimum time after activating the EEPROM for read */
96 #define MLX90635_TIMING_EE_ACTIVE_MAX 150 /* Maximum time after activating the EEPROM for read */
99 #define MLX90635_ID_DSPv1 0x01 /* EEPROM DSP version */
100 #define MLX90635_RESET_CMD 0x0006 /* Reset sensor (address or global) */
101 #define MLX90635_MAX_MEAS_NUM 31 /* Maximum number of measurements in list */
102 #define MLX90635_PTAT_DIV 12 /* Used to divide the PTAT value in pre-processing */
103 #define MLX90635_IR_DIV 24 /* Used to divide the IR value in pre-processing */
104 #define MLX90635_SLEEP_DELAY_MS 6000 /* Autosleep delay */
105 #define MLX90635_MEAS_MAX_TIME 2000 /* Max measurement time in ms for the lowest refresh rate */
106 #define MLX90635_READ_RETRIES 100 /* Number of read retries before quitting with timeout error */
107 #define MLX90635_VERSION_MASK (GENMASK(15, 12) | GENMASK(7, 4))
108 #define MLX90635_DSP_VERSION(reg) (((reg & GENMASK(14, 12)) >> 9) | ((reg & GENMASK(6, 4)) >> 4))
109 #define MLX90635_DSP_FIXED BIT(15)
113 * struct mlx90635_data - private data for the MLX90635 device
114 * @client: I2C client of the device
115 * @lock: Internal mutex because multiple reads are needed for single triggered
116 * measurement to ensure data consistency
117 * @regmap: Regmap of the device registers
118 * @regmap_ee: Regmap of the device EEPROM which can be cached
119 * @emissivity: Object emissivity from 0 to 1000 where 1000 = 1
120 * @regulator: Regulator of the device
121 * @powerstatus: Current POWER status of the device
122 * @interaction_ts: Timestamp of the last temperature read that is used
123 * for power management in jiffies
125 struct mlx90635_data
{
126 struct i2c_client
*client
;
128 struct regmap
*regmap
;
129 struct regmap
*regmap_ee
;
131 struct regulator
*regulator
;
133 unsigned long interaction_ts
;
136 static const struct regmap_range mlx90635_volatile_reg_range
[] = {
137 regmap_reg_range(MLX90635_REG_STATUS
, MLX90635_REG_STATUS
),
138 regmap_reg_range(MLX90635_RESULT_1
, MLX90635_RESULT_5
),
139 regmap_reg_range(MLX90635_REG_EE
, MLX90635_REG_EE
),
140 regmap_reg_range(MLX90635_REG_CMD
, MLX90635_REG_CMD
),
141 regmap_reg_range(MLX90635_REG_CTRL1
, MLX90635_REG_CTRL2
),
144 static const struct regmap_access_table mlx90635_volatile_regs_tbl
= {
145 .yes_ranges
= mlx90635_volatile_reg_range
,
146 .n_yes_ranges
= ARRAY_SIZE(mlx90635_volatile_reg_range
),
149 static const struct regmap_range mlx90635_read_reg_range
[] = {
150 regmap_reg_range(MLX90635_REG_STATUS
, MLX90635_REG_STATUS
),
151 regmap_reg_range(MLX90635_RESULT_1
, MLX90635_RESULT_5
),
152 regmap_reg_range(MLX90635_REG_EE
, MLX90635_REG_EE
),
153 regmap_reg_range(MLX90635_REG_CMD
, MLX90635_REG_CMD
),
154 regmap_reg_range(MLX90635_REG_CTRL1
, MLX90635_REG_CTRL2
),
157 static const struct regmap_access_table mlx90635_readable_regs_tbl
= {
158 .yes_ranges
= mlx90635_read_reg_range
,
159 .n_yes_ranges
= ARRAY_SIZE(mlx90635_read_reg_range
),
162 static const struct regmap_range mlx90635_no_write_reg_range
[] = {
163 regmap_reg_range(MLX90635_RESULT_1
, MLX90635_RESULT_5
),
166 static const struct regmap_access_table mlx90635_writeable_regs_tbl
= {
167 .no_ranges
= mlx90635_no_write_reg_range
,
168 .n_no_ranges
= ARRAY_SIZE(mlx90635_no_write_reg_range
),
171 static const struct regmap_config mlx90635_regmap
= {
172 .name
= "mlx90635-registers",
177 .volatile_table
= &mlx90635_volatile_regs_tbl
,
178 .rd_table
= &mlx90635_readable_regs_tbl
,
179 .wr_table
= &mlx90635_writeable_regs_tbl
,
181 .use_single_read
= true,
182 .use_single_write
= true,
183 .can_multi_write
= false,
184 .reg_format_endian
= REGMAP_ENDIAN_BIG
,
185 .val_format_endian
= REGMAP_ENDIAN_BIG
,
186 .cache_type
= REGCACHE_RBTREE
,
189 static const struct regmap_range mlx90635_read_ee_range
[] = {
190 regmap_reg_range(MLX90635_EE_I2C_CFG
, MLX90635_EE_CTRL2
),
191 regmap_reg_range(MLX90635_EE_Ha
, MLX90635_EE_Gb
),
194 static const struct regmap_access_table mlx90635_readable_ees_tbl
= {
195 .yes_ranges
= mlx90635_read_ee_range
,
196 .n_yes_ranges
= ARRAY_SIZE(mlx90635_read_ee_range
),
199 static const struct regmap_range mlx90635_no_write_ee_range
[] = {
200 regmap_reg_range(MLX90635_ADDR_EEPROM
, MLX90635_EE_Gb
),
203 static const struct regmap_access_table mlx90635_writeable_ees_tbl
= {
204 .no_ranges
= mlx90635_no_write_ee_range
,
205 .n_no_ranges
= ARRAY_SIZE(mlx90635_no_write_ee_range
),
208 static const struct regmap_config mlx90635_regmap_ee
= {
209 .name
= "mlx90635-eeprom",
214 .volatile_table
= NULL
,
215 .rd_table
= &mlx90635_readable_ees_tbl
,
216 .wr_table
= &mlx90635_writeable_ees_tbl
,
218 .use_single_read
= true,
219 .use_single_write
= true,
220 .can_multi_write
= false,
221 .reg_format_endian
= REGMAP_ENDIAN_BIG
,
222 .val_format_endian
= REGMAP_ENDIAN_BIG
,
223 .cache_type
= REGCACHE_RBTREE
,
227 * mlx90635_reset_delay() - Give the mlx90635 some time to reset properly
228 * If this is not done, the following I2C command(s) will not be accepted.
230 static void mlx90635_reset_delay(void)
232 usleep_range(MLX90635_TIMING_RST_MIN
, MLX90635_TIMING_RST_MAX
);
235 static int mlx90635_pwr_sleep_step(struct mlx90635_data
*data
)
239 if (data
->powerstatus
== MLX90635_PWR_STATUS_SLEEP_STEP
)
242 ret
= regmap_write_bits(data
->regmap
, MLX90635_REG_CTRL2
, MLX90635_CTRL2_MODE_MASK
,
243 FIELD_PREP(MLX90635_CTRL2_MODE_MASK
, MLX90635_PWR_STATUS_SLEEP_STEP
));
247 data
->powerstatus
= MLX90635_PWR_STATUS_SLEEP_STEP
;
251 static int mlx90635_pwr_continuous(struct mlx90635_data
*data
)
255 if (data
->powerstatus
== MLX90635_PWR_STATUS_CONTINUOUS
)
258 ret
= regmap_write_bits(data
->regmap
, MLX90635_REG_CTRL2
, MLX90635_CTRL2_MODE_MASK
,
259 FIELD_PREP(MLX90635_CTRL2_MODE_MASK
, MLX90635_PWR_STATUS_CONTINUOUS
));
263 data
->powerstatus
= MLX90635_PWR_STATUS_CONTINUOUS
;
267 static int mlx90635_read_ee_register(struct regmap
*regmap
, u16 reg_lsb
,
274 ret
= regmap_read(regmap
, reg_lsb
+ 2, &read
);
280 ret
= regmap_read(regmap
, reg_lsb
, &read
);
284 *reg_value
= (read
<< 16) | (value
& 0xffff);
289 static int mlx90635_read_ee_ambient(struct regmap
*regmap
, s16
*PG
, s16
*PO
, s16
*Gb
)
291 unsigned int read_tmp
;
294 ret
= regmap_read(regmap
, MLX90635_EE_P_O
, &read_tmp
);
299 ret
= regmap_read(regmap
, MLX90635_EE_P_G
, &read_tmp
);
304 ret
= regmap_read(regmap
, MLX90635_EE_Gb
, &read_tmp
);
312 static int mlx90635_read_ee_object(struct regmap
*regmap
, u32
*Ea
, u32
*Eb
, u32
*Fa
, s16
*Fb
,
313 s16
*Ga
, s16
*Gb
, s16
*Ha
, s16
*Hb
, u16
*Fa_scale
)
315 unsigned int read_tmp
;
318 ret
= mlx90635_read_ee_register(regmap
, MLX90635_EE_Ea
, Ea
);
322 ret
= mlx90635_read_ee_register(regmap
, MLX90635_EE_Eb
, Eb
);
326 ret
= mlx90635_read_ee_register(regmap
, MLX90635_EE_Fa
, Fa
);
330 ret
= regmap_read(regmap
, MLX90635_EE_Ha
, &read_tmp
);
335 ret
= regmap_read(regmap
, MLX90635_EE_Hb
, &read_tmp
);
340 ret
= regmap_read(regmap
, MLX90635_EE_Ga
, &read_tmp
);
345 ret
= regmap_read(regmap
, MLX90635_EE_Gb
, &read_tmp
);
350 ret
= regmap_read(regmap
, MLX90635_EE_Fb
, &read_tmp
);
355 ret
= regmap_read(regmap
, MLX90635_EE_FASCALE
, &read_tmp
);
358 *Fa_scale
= (u16
)read_tmp
;
363 static int mlx90635_calculate_dataset_ready_time(struct mlx90635_data
*data
, int *refresh_time
)
368 ret
= regmap_read(data
->regmap
, MLX90635_REG_CTRL1
, ®
);
372 *refresh_time
= 2 * (MLX90635_MEAS_MAX_TIME
>> FIELD_GET(MLX90635_CTRL1_REFRESH_RATE_MASK
, reg
)) + 80;
377 static int mlx90635_perform_measurement_burst(struct mlx90635_data
*data
)
379 unsigned int reg_status
;
383 ret
= regmap_write_bits(data
->regmap
, MLX90635_REG_STATUS
,
384 MLX90635_STAT_END_CONV
, MLX90635_STAT_END_CONV
);
388 ret
= mlx90635_calculate_dataset_ready_time(data
, &refresh_time
);
392 ret
= regmap_write_bits(data
->regmap
, MLX90635_REG_CTRL2
,
393 FIELD_PREP(MLX90635_CTRL2_SOB_MASK
, 1),
394 FIELD_PREP(MLX90635_CTRL2_SOB_MASK
, 1));
398 msleep(refresh_time
); /* Wait minimum time for dataset to be ready */
400 ret
= regmap_read_poll_timeout(data
->regmap
, MLX90635_REG_STATUS
, reg_status
,
401 (!(reg_status
& MLX90635_STAT_END_CONV
)) == 0,
402 MLX90635_TIMING_POLLING
, MLX90635_READ_RETRIES
* 10000);
404 dev_err(&data
->client
->dev
, "data not ready");
411 static int mlx90635_read_ambient_raw(struct regmap
*regmap
,
412 s16
*ambient_new_raw
, s16
*ambient_old_raw
)
414 unsigned int read_tmp
;
417 ret
= regmap_read(regmap
, MLX90635_RESULT_2
, &read_tmp
);
420 *ambient_new_raw
= (s16
)read_tmp
;
422 ret
= regmap_read(regmap
, MLX90635_RESULT_3
, &read_tmp
);
425 *ambient_old_raw
= (s16
)read_tmp
;
430 static int mlx90635_read_object_raw(struct regmap
*regmap
, s16
*object_raw
)
432 unsigned int read_tmp
;
436 ret
= regmap_read(regmap
, MLX90635_RESULT_1
, &read_tmp
);
440 read
= (s16
)read_tmp
;
442 ret
= regmap_read(regmap
, MLX90635_RESULT_4
, &read_tmp
);
445 *object_raw
= (read
- (s16
)read_tmp
) / 2;
450 static int mlx90635_read_all_channel(struct mlx90635_data
*data
,
451 s16
*ambient_new_raw
, s16
*ambient_old_raw
,
456 mutex_lock(&data
->lock
);
457 if (data
->powerstatus
== MLX90635_PWR_STATUS_SLEEP_STEP
) {
458 /* Trigger measurement in Sleep Step mode */
459 ret
= mlx90635_perform_measurement_burst(data
);
464 ret
= mlx90635_read_ambient_raw(data
->regmap
, ambient_new_raw
,
469 ret
= mlx90635_read_object_raw(data
->regmap
, object_raw
);
471 mutex_unlock(&data
->lock
);
475 static s64
mlx90635_preprocess_temp_amb(s16 ambient_new_raw
,
476 s16 ambient_old_raw
, s16 Gb
)
480 kGb
= ((s64
)Gb
* 1000LL) >> 10ULL;
481 VR_Ta
= (s64
)ambient_old_raw
* 1000000LL +
482 kGb
* div64_s64(((s64
)ambient_new_raw
* 1000LL),
483 (MLX90635_PTAT_DIV
));
485 div64_s64(((s64
)ambient_new_raw
* 1000000000000LL),
486 (MLX90635_PTAT_DIV
)), VR_Ta
);
487 return div64_s64(tmp
<< 19ULL, 1000LL);
490 static s64
mlx90635_preprocess_temp_obj(s16 object_raw
,
492 s16 ambient_old_raw
, s16 Gb
)
496 kGb
= ((s64
)Gb
* 1000LL) >> 10ULL;
497 VR_IR
= (s64
)ambient_old_raw
* 1000000LL +
498 kGb
* (div64_s64((s64
)ambient_new_raw
* 1000LL,
501 div64_s64((s64
)(object_raw
* 1000000LL),
502 MLX90635_IR_DIV
) * 1000000LL,
504 return div64_s64((tmp
<< 19ULL), 1000LL);
507 static s32
mlx90635_calc_temp_ambient(s16 ambient_new_raw
, s16 ambient_old_raw
,
508 u16 P_G
, u16 P_O
, s16 Gb
)
512 AMB
= mlx90635_preprocess_temp_amb(ambient_new_raw
, ambient_old_raw
,
514 kPG
= ((s64
)P_G
* 1000000LL) >> 9ULL;
515 kPO
= AMB
- (((s64
)P_O
* 1000LL) >> 1ULL);
517 return 30 * 1000LL + div64_s64(kPO
* 1000000LL, kPG
);
520 static s32
mlx90635_calc_temp_object_iteration(s32 prev_object_temp
, s64 object
,
521 s64 TAdut
, s64 TAdut4
, s16 Ga
,
522 u32 Fa
, u16 Fa_scale
, s16 Fb
,
523 s16 Ha
, s16 Hb
, u16 emissivity
)
525 s64 calcedGa
, calcedGb
, calcedFa
, Alpha_corr
;
526 s64 Ha_customer
, Hb_customer
;
528 Ha_customer
= ((s64
)Ha
* 1000000LL) >> 14ULL;
529 Hb_customer
= ((s64
)Hb
* 100) >> 10ULL;
531 calcedGa
= ((s64
)((s64
)Ga
* (prev_object_temp
- 35 * 1000LL)
533 calcedGb
= ((s64
)(Fb
* (TAdut
- 30 * 1000000LL))) >> 24LL;
535 Alpha_corr
= ((s64
)((s64
)Fa
* Ha_customer
* 10000LL) >> Fa_scale
);
536 Alpha_corr
*= ((s64
)(1 * 1000000LL + calcedGa
+ calcedGb
));
538 Alpha_corr
= div64_s64(Alpha_corr
, 1000LL);
539 Alpha_corr
*= emissivity
;
540 Alpha_corr
= div64_s64(Alpha_corr
, 100LL);
541 calcedFa
= div64_s64((s64
)object
* 100000000000LL, Alpha_corr
);
543 return (int_sqrt64(int_sqrt64(calcedFa
* 100000000LL + TAdut4
))
544 - 27315 - Hb_customer
) * 10;
547 static s64
mlx90635_calc_ta4(s64 TAdut
, s64 scale
)
549 return (div64_s64(TAdut
, scale
) + 27315) *
550 (div64_s64(TAdut
, scale
) + 27315) *
551 (div64_s64(TAdut
, scale
) + 27315) *
552 (div64_s64(TAdut
, scale
) + 27315);
555 static s32
mlx90635_calc_temp_object(s64 object
, s64 ambient
, u32 Ea
, u32 Eb
,
556 s16 Ga
, u32 Fa
, u16 Fa_scale
, s16 Fb
, s16 Ha
, s16 Hb
,
559 s64 kTA
, kTA0
, TAdut
, TAdut4
;
563 kTA
= (Ea
* 1000LL) >> 16LL;
564 kTA0
= (Eb
* 1000LL) >> 8LL;
565 TAdut
= div64_s64(((ambient
- kTA0
) * 1000000LL), kTA
) + 30 * 1000000LL;
566 TAdut4
= mlx90635_calc_ta4(TAdut
, 10000LL);
568 /* Iterations of calculation as described in datasheet */
569 for (i
= 0; i
< 5; ++i
) {
570 temp
= mlx90635_calc_temp_object_iteration(temp
, object
, TAdut
, TAdut4
,
571 Ga
, Fa
, Fa_scale
, Fb
, Ha
, Hb
,
577 static int mlx90635_calc_object(struct mlx90635_data
*data
, int *val
)
579 s16 ambient_new_raw
, ambient_old_raw
, object_raw
;
580 s16 Fb
, Ga
, Gb
, Ha
, Hb
;
586 ret
= mlx90635_read_ee_object(data
->regmap_ee
, &Ea
, &Eb
, &Fa
, &Fb
, &Ga
, &Gb
, &Ha
, &Hb
, &Fa_scale
);
590 ret
= mlx90635_read_all_channel(data
,
591 &ambient_new_raw
, &ambient_old_raw
,
596 ambient
= mlx90635_preprocess_temp_amb(ambient_new_raw
,
597 ambient_old_raw
, Gb
);
598 object
= mlx90635_preprocess_temp_obj(object_raw
,
600 ambient_old_raw
, Gb
);
602 *val
= mlx90635_calc_temp_object(object
, ambient
, Ea
, Eb
, Ga
, Fa
, Fa_scale
, Fb
,
603 Ha
, Hb
, data
->emissivity
);
607 static int mlx90635_calc_ambient(struct mlx90635_data
*data
, int *val
)
609 s16 ambient_new_raw
, ambient_old_raw
;
613 ret
= mlx90635_read_ee_ambient(data
->regmap_ee
, &PG
, &PO
, &Gb
);
617 mutex_lock(&data
->lock
);
618 if (data
->powerstatus
== MLX90635_PWR_STATUS_SLEEP_STEP
) {
619 ret
= mlx90635_perform_measurement_burst(data
);
621 goto read_ambient_unlock
;
624 ret
= mlx90635_read_ambient_raw(data
->regmap
, &ambient_new_raw
,
627 mutex_unlock(&data
->lock
);
631 *val
= mlx90635_calc_temp_ambient(ambient_new_raw
, ambient_old_raw
,
636 static int mlx90635_get_refresh_rate(struct mlx90635_data
*data
,
637 unsigned int *refresh_rate
)
642 ret
= regmap_read(data
->regmap
, MLX90635_REG_CTRL1
, ®
);
646 *refresh_rate
= FIELD_GET(MLX90635_CTRL1_REFRESH_RATE_MASK
, reg
);
651 static const struct {
654 } mlx90635_freqs
[] = {
666 * mlx90635_pm_interaction_wakeup() - Measure time between user interactions to change powermode
667 * @data: pointer to mlx90635_data object containing interaction_ts information
669 * Switch to continuous mode when interaction is faster than MLX90635_MEAS_MAX_TIME. Update the
670 * interaction_ts for each function call with the jiffies to enable measurement between function
671 * calls. Initial value of the interaction_ts needs to be set before this function call.
673 static int mlx90635_pm_interaction_wakeup(struct mlx90635_data
*data
)
679 if (time_in_range(now
, data
->interaction_ts
,
680 data
->interaction_ts
+
681 msecs_to_jiffies(MLX90635_MEAS_MAX_TIME
+ 100))) {
682 ret
= mlx90635_pwr_continuous(data
);
687 data
->interaction_ts
= now
;
692 static int mlx90635_read_raw(struct iio_dev
*indio_dev
,
693 struct iio_chan_spec
const *channel
, int *val
,
694 int *val2
, long mask
)
696 struct mlx90635_data
*data
= iio_priv(indio_dev
);
700 pm_runtime_get_sync(&data
->client
->dev
);
701 ret
= mlx90635_pm_interaction_wakeup(data
);
703 goto mlx90635_read_raw_pm
;
706 case IIO_CHAN_INFO_PROCESSED
:
707 switch (channel
->channel2
) {
708 case IIO_MOD_TEMP_AMBIENT
:
709 ret
= mlx90635_calc_ambient(data
, val
);
711 goto mlx90635_read_raw_pm
;
715 case IIO_MOD_TEMP_OBJECT
:
716 ret
= mlx90635_calc_object(data
, val
);
718 goto mlx90635_read_raw_pm
;
727 case IIO_CHAN_INFO_CALIBEMISSIVITY
:
728 if (data
->emissivity
== 1000) {
733 *val2
= data
->emissivity
* 1000;
735 ret
= IIO_VAL_INT_PLUS_MICRO
;
737 case IIO_CHAN_INFO_SAMP_FREQ
:
738 ret
= mlx90635_get_refresh_rate(data
, &cr
);
740 goto mlx90635_read_raw_pm
;
742 *val
= mlx90635_freqs
[cr
].val
;
743 *val2
= mlx90635_freqs
[cr
].val2
;
744 ret
= IIO_VAL_INT_PLUS_MICRO
;
751 mlx90635_read_raw_pm
:
752 pm_runtime_mark_last_busy(&data
->client
->dev
);
753 pm_runtime_put_autosuspend(&data
->client
->dev
);
757 static int mlx90635_write_raw(struct iio_dev
*indio_dev
,
758 struct iio_chan_spec
const *channel
, int val
,
761 struct mlx90635_data
*data
= iio_priv(indio_dev
);
766 case IIO_CHAN_INFO_CALIBEMISSIVITY
:
767 /* Confirm we are within 0 and 1.0 */
768 if (val
< 0 || val2
< 0 || val
> 1 ||
769 (val
== 1 && val2
!= 0))
771 data
->emissivity
= val
* 1000 + val2
/ 1000;
773 case IIO_CHAN_INFO_SAMP_FREQ
:
774 for (i
= 0; i
< ARRAY_SIZE(mlx90635_freqs
); i
++) {
775 if (val
== mlx90635_freqs
[i
].val
&&
776 val2
== mlx90635_freqs
[i
].val2
)
779 if (i
== ARRAY_SIZE(mlx90635_freqs
))
782 ret
= regmap_write_bits(data
->regmap
, MLX90635_REG_CTRL1
,
783 MLX90635_CTRL1_REFRESH_RATE_MASK
, i
);
791 static int mlx90635_read_avail(struct iio_dev
*indio_dev
,
792 struct iio_chan_spec
const *chan
,
793 const int **vals
, int *type
, int *length
,
797 case IIO_CHAN_INFO_SAMP_FREQ
:
798 *vals
= (int *)mlx90635_freqs
;
799 *type
= IIO_VAL_INT_PLUS_MICRO
;
800 *length
= 2 * ARRAY_SIZE(mlx90635_freqs
);
801 return IIO_AVAIL_LIST
;
807 static const struct iio_chan_spec mlx90635_channels
[] = {
811 .channel2
= IIO_MOD_TEMP_AMBIENT
,
812 .info_mask_separate
= BIT(IIO_CHAN_INFO_PROCESSED
),
813 .info_mask_shared_by_all
= BIT(IIO_CHAN_INFO_SAMP_FREQ
),
814 .info_mask_shared_by_all_available
= BIT(IIO_CHAN_INFO_SAMP_FREQ
),
819 .channel2
= IIO_MOD_TEMP_OBJECT
,
820 .info_mask_separate
= BIT(IIO_CHAN_INFO_PROCESSED
) |
821 BIT(IIO_CHAN_INFO_CALIBEMISSIVITY
),
822 .info_mask_shared_by_all
= BIT(IIO_CHAN_INFO_SAMP_FREQ
),
823 .info_mask_shared_by_all_available
= BIT(IIO_CHAN_INFO_SAMP_FREQ
),
827 static const struct iio_info mlx90635_info
= {
828 .read_raw
= mlx90635_read_raw
,
829 .write_raw
= mlx90635_write_raw
,
830 .read_avail
= mlx90635_read_avail
,
833 static void mlx90635_sleep(void *_data
)
835 struct mlx90635_data
*data
= _data
;
837 mlx90635_pwr_sleep_step(data
);
840 static int mlx90635_suspend(struct mlx90635_data
*data
)
842 return mlx90635_pwr_sleep_step(data
);
845 static int mlx90635_wakeup(struct mlx90635_data
*data
)
847 s16 Fb
, Ga
, Gb
, Ha
, Hb
, PG
, PO
;
848 unsigned int dsp_version
;
853 regcache_cache_bypass(data
->regmap_ee
, false);
854 regcache_cache_only(data
->regmap_ee
, false);
855 regcache_cache_only(data
->regmap
, false);
857 ret
= mlx90635_pwr_continuous(data
);
859 dev_err(&data
->client
->dev
, "Switch to continuous mode failed\n");
862 ret
= regmap_write_bits(data
->regmap
, MLX90635_REG_EE
,
863 MLX90635_EE_ACTIVE
, MLX90635_EE_ACTIVE
);
865 dev_err(&data
->client
->dev
, "Powering EEPROM failed\n");
868 usleep_range(MLX90635_TIMING_EE_ACTIVE_MIN
, MLX90635_TIMING_EE_ACTIVE_MAX
);
870 regcache_mark_dirty(data
->regmap_ee
);
872 ret
= regcache_sync(data
->regmap_ee
);
874 dev_err(&data
->client
->dev
,
875 "Failed to sync cache: %d\n", ret
);
879 ret
= mlx90635_read_ee_ambient(data
->regmap_ee
, &PG
, &PO
, &Gb
);
881 dev_err(&data
->client
->dev
,
882 "Failed to read to cache Ambient coefficients EEPROM region: %d\n", ret
);
886 ret
= mlx90635_read_ee_object(data
->regmap_ee
, &Ea
, &Eb
, &Fa
, &Fb
, &Ga
, &Gb
, &Ha
, &Hb
, &Fa_scale
);
888 dev_err(&data
->client
->dev
,
889 "Failed to read to cache Object coefficients EEPROM region: %d\n", ret
);
893 ret
= regmap_read(data
->regmap_ee
, MLX90635_EE_VERSION
, &dsp_version
);
895 dev_err(&data
->client
->dev
,
896 "Failed to read to cache of EEPROM version: %d\n", ret
);
900 regcache_cache_only(data
->regmap_ee
, true);
905 static void mlx90635_disable_regulator(void *_data
)
907 struct mlx90635_data
*data
= _data
;
910 ret
= regulator_disable(data
->regulator
);
912 dev_err(regmap_get_device(data
->regmap
),
913 "Failed to disable power regulator: %d\n", ret
);
916 static int mlx90635_enable_regulator(struct mlx90635_data
*data
)
920 ret
= regulator_enable(data
->regulator
);
922 dev_err(regmap_get_device(data
->regmap
), "Failed to enable power regulator!\n");
926 mlx90635_reset_delay();
931 static int mlx90635_probe(struct i2c_client
*client
)
933 struct mlx90635_data
*mlx90635
;
934 struct iio_dev
*indio_dev
;
935 unsigned int dsp_version
;
936 struct regmap
*regmap
;
937 struct regmap
*regmap_ee
;
940 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*mlx90635
));
942 return dev_err_probe(&client
->dev
, -ENOMEM
, "failed to allocate device\n");
944 regmap
= devm_regmap_init_i2c(client
, &mlx90635_regmap
);
946 return dev_err_probe(&client
->dev
, PTR_ERR(regmap
),
947 "failed to allocate regmap\n");
949 regmap_ee
= devm_regmap_init_i2c(client
, &mlx90635_regmap_ee
);
950 if (IS_ERR(regmap_ee
))
951 return dev_err_probe(&client
->dev
, PTR_ERR(regmap_ee
),
952 "failed to allocate EEPROM regmap\n");
954 mlx90635
= iio_priv(indio_dev
);
955 i2c_set_clientdata(client
, indio_dev
);
956 mlx90635
->client
= client
;
957 mlx90635
->regmap
= regmap
;
958 mlx90635
->regmap_ee
= regmap_ee
;
959 mlx90635
->powerstatus
= MLX90635_PWR_STATUS_SLEEP_STEP
;
961 mutex_init(&mlx90635
->lock
);
962 indio_dev
->name
= "mlx90635";
963 indio_dev
->modes
= INDIO_DIRECT_MODE
;
964 indio_dev
->info
= &mlx90635_info
;
965 indio_dev
->channels
= mlx90635_channels
;
966 indio_dev
->num_channels
= ARRAY_SIZE(mlx90635_channels
);
968 mlx90635
->regulator
= devm_regulator_get(&client
->dev
, "vdd");
969 if (IS_ERR(mlx90635
->regulator
))
970 return dev_err_probe(&client
->dev
, PTR_ERR(mlx90635
->regulator
),
971 "failed to get vdd regulator");
973 ret
= mlx90635_enable_regulator(mlx90635
);
977 ret
= devm_add_action_or_reset(&client
->dev
, mlx90635_disable_regulator
,
980 return dev_err_probe(&client
->dev
, ret
,
981 "failed to setup regulator cleanup action\n");
983 ret
= mlx90635_wakeup(mlx90635
);
985 return dev_err_probe(&client
->dev
, ret
, "wakeup failed\n");
987 ret
= devm_add_action_or_reset(&client
->dev
, mlx90635_sleep
, mlx90635
);
989 return dev_err_probe(&client
->dev
, ret
,
990 "failed to setup low power cleanup\n");
992 ret
= regmap_read(mlx90635
->regmap_ee
, MLX90635_EE_VERSION
, &dsp_version
);
994 return dev_err_probe(&client
->dev
, ret
, "read of version failed\n");
996 dsp_version
= dsp_version
& MLX90635_VERSION_MASK
;
998 if (FIELD_GET(MLX90635_DSP_FIXED
, dsp_version
)) {
999 if (MLX90635_DSP_VERSION(dsp_version
) == MLX90635_ID_DSPv1
) {
1000 dev_dbg(&client
->dev
,
1001 "Detected DSP v1 calibration %x\n", dsp_version
);
1003 dev_dbg(&client
->dev
,
1004 "Detected Unknown EEPROM calibration %lx\n",
1005 MLX90635_DSP_VERSION(dsp_version
));
1008 return dev_err_probe(&client
->dev
, -EPROTONOSUPPORT
,
1009 "Wrong fixed top bit %x (expected 0x8X0X)\n",
1013 mlx90635
->emissivity
= 1000;
1014 mlx90635
->interaction_ts
= jiffies
; /* Set initial value */
1016 pm_runtime_get_noresume(&client
->dev
);
1017 pm_runtime_set_active(&client
->dev
);
1019 ret
= devm_pm_runtime_enable(&client
->dev
);
1021 return dev_err_probe(&client
->dev
, ret
,
1022 "failed to enable powermanagement\n");
1024 pm_runtime_set_autosuspend_delay(&client
->dev
, MLX90635_SLEEP_DELAY_MS
);
1025 pm_runtime_use_autosuspend(&client
->dev
);
1026 pm_runtime_put_autosuspend(&client
->dev
);
1028 return devm_iio_device_register(&client
->dev
, indio_dev
);
1031 static const struct i2c_device_id mlx90635_id
[] = {
1035 MODULE_DEVICE_TABLE(i2c
, mlx90635_id
);
1037 static const struct of_device_id mlx90635_of_match
[] = {
1038 { .compatible
= "melexis,mlx90635" },
1041 MODULE_DEVICE_TABLE(of
, mlx90635_of_match
);
1043 static int mlx90635_pm_suspend(struct device
*dev
)
1045 struct mlx90635_data
*data
= iio_priv(dev_get_drvdata(dev
));
1048 ret
= mlx90635_suspend(data
);
1052 ret
= regulator_disable(data
->regulator
);
1054 dev_err(regmap_get_device(data
->regmap
),
1055 "Failed to disable power regulator: %d\n", ret
);
1060 static int mlx90635_pm_resume(struct device
*dev
)
1062 struct mlx90635_data
*data
= iio_priv(dev_get_drvdata(dev
));
1065 ret
= mlx90635_enable_regulator(data
);
1069 return mlx90635_wakeup(data
);
1072 static int mlx90635_pm_runtime_suspend(struct device
*dev
)
1074 struct mlx90635_data
*data
= iio_priv(dev_get_drvdata(dev
));
1076 return mlx90635_pwr_sleep_step(data
);
1079 static const struct dev_pm_ops mlx90635_pm_ops
= {
1080 SYSTEM_SLEEP_PM_OPS(mlx90635_pm_suspend
, mlx90635_pm_resume
)
1081 RUNTIME_PM_OPS(mlx90635_pm_runtime_suspend
, NULL
, NULL
)
1084 static struct i2c_driver mlx90635_driver
= {
1087 .of_match_table
= mlx90635_of_match
,
1088 .pm
= pm_ptr(&mlx90635_pm_ops
),
1090 .probe
= mlx90635_probe
,
1091 .id_table
= mlx90635_id
,
1093 module_i2c_driver(mlx90635_driver
);
1095 MODULE_AUTHOR("Crt Mori <cmo@melexis.com>");
1096 MODULE_DESCRIPTION("Melexis MLX90635 contactless Infra Red temperature sensor driver");
1097 MODULE_LICENSE("GPL");