1 // SPDX-License-Identifier: GPL-2.0
3 * max31827.c - Support for Maxim Low-Power Switch
5 * Copyright (c) 2023 Daniel Matyas <daniel.matyas@analog.com>
8 #include <linux/bitfield.h>
9 #include <linux/bitops.h>
10 #include <linux/delay.h>
11 #include <linux/hwmon.h>
12 #include <linux/i2c.h>
13 #include <linux/mutex.h>
14 #include <linux/regmap.h>
15 #include <linux/regulator/consumer.h>
17 #define MAX31827_T_REG 0x0
18 #define MAX31827_CONFIGURATION_REG 0x2
19 #define MAX31827_TH_REG 0x4
20 #define MAX31827_TL_REG 0x6
21 #define MAX31827_TH_HYST_REG 0x8
22 #define MAX31827_TL_HYST_REG 0xA
24 #define MAX31827_CONFIGURATION_1SHOT_MASK BIT(0)
25 #define MAX31827_CONFIGURATION_CNV_RATE_MASK GENMASK(3, 1)
26 #define MAX31827_CONFIGURATION_U_TEMP_STAT_MASK BIT(14)
27 #define MAX31827_CONFIGURATION_O_TEMP_STAT_MASK BIT(15)
29 #define MAX31827_12_BIT_CNV_TIME 140
31 #define MAX31827_16_BIT_TO_M_DGR(x) (sign_extend32(x, 15) * 1000 / 16)
32 #define MAX31827_M_DGR_TO_16_BIT(x) (((x) << 4) / 1000)
33 #define MAX31827_DEVICE_ENABLE(x) ((x) ? 0xA : 0x0)
36 MAX31827_CNV_1_DIV_64_HZ = 1,
37 MAX31827_CNV_1_DIV_32_HZ,
38 MAX31827_CNV_1_DIV_16_HZ,
39 MAX31827_CNV_1_DIV_4_HZ,
45 static const u16 max31827_conversions[] = {
46 [MAX31827_CNV_1_DIV_64_HZ] = 64000,
47 [MAX31827_CNV_1_DIV_32_HZ] = 32000,
48 [MAX31827_CNV_1_DIV_16_HZ] = 16000,
49 [MAX31827_CNV_1_DIV_4_HZ] = 4000,
50 [MAX31827_CNV_1_HZ] = 1000,
51 [MAX31827_CNV_4_HZ] = 250,
52 [MAX31827_CNV_8_HZ] = 125,
55 struct max31827_state {
57 * Prevent simultaneous access to the i2c client.
60 struct regmap *regmap;
64 static const struct regmap_config max31827_regmap = {
70 static int shutdown_write(struct max31827_state *st, unsigned int reg,
74 unsigned int cnv_rate;
78 * Before the Temperature Threshold Alarm and Alarm Hysteresis Threshold
79 * register values are changed over I2C, the part must be in shutdown
82 * Mutex is used to ensure, that some other process doesn't change the
83 * configuration register.
85 mutex_lock(&st->lock);
88 ret = regmap_write(st->regmap, reg, val);
92 ret = regmap_read(st->regmap, MAX31827_CONFIGURATION_REG, &cfg);
96 cnv_rate = MAX31827_CONFIGURATION_CNV_RATE_MASK & cfg;
97 cfg = cfg & ~(MAX31827_CONFIGURATION_1SHOT_MASK |
98 MAX31827_CONFIGURATION_CNV_RATE_MASK);
99 ret = regmap_write(st->regmap, MAX31827_CONFIGURATION_REG, cfg);
103 ret = regmap_write(st->regmap, reg, val);
107 ret = regmap_update_bits(st->regmap, MAX31827_CONFIGURATION_REG,
108 MAX31827_CONFIGURATION_CNV_RATE_MASK,
112 mutex_unlock(&st->lock);
116 static int write_alarm_val(struct max31827_state *st, unsigned int reg,
119 val = MAX31827_M_DGR_TO_16_BIT(val);
121 return shutdown_write(st, reg, val);
124 static umode_t max31827_is_visible(const void *state,
125 enum hwmon_sensor_types type, u32 attr,
128 if (type == hwmon_temp) {
130 case hwmon_temp_enable:
133 case hwmon_temp_max_hyst:
134 case hwmon_temp_min_hyst:
136 case hwmon_temp_input:
137 case hwmon_temp_min_alarm:
138 case hwmon_temp_max_alarm:
143 } else if (type == hwmon_chip) {
144 if (attr == hwmon_chip_update_interval)
151 static int max31827_read(struct device *dev, enum hwmon_sensor_types type,
152 u32 attr, int channel, long *val)
154 struct max31827_state *st = dev_get_drvdata(dev);
161 case hwmon_temp_enable:
162 ret = regmap_read(st->regmap,
163 MAX31827_CONFIGURATION_REG, &uval);
167 uval = FIELD_GET(MAX31827_CONFIGURATION_1SHOT_MASK |
168 MAX31827_CONFIGURATION_CNV_RATE_MASK,
173 case hwmon_temp_input:
174 mutex_lock(&st->lock);
178 * This operation requires mutex protection,
179 * because the chip configuration should not
180 * be changed during the conversion process.
183 ret = regmap_update_bits(st->regmap,
184 MAX31827_CONFIGURATION_REG,
185 MAX31827_CONFIGURATION_1SHOT_MASK,
188 mutex_unlock(&st->lock);
192 msleep(MAX31827_12_BIT_CNV_TIME);
194 ret = regmap_read(st->regmap, MAX31827_T_REG, &uval);
196 mutex_unlock(&st->lock);
201 *val = MAX31827_16_BIT_TO_M_DGR(uval);
205 ret = regmap_read(st->regmap, MAX31827_TH_REG, &uval);
209 *val = MAX31827_16_BIT_TO_M_DGR(uval);
211 case hwmon_temp_max_hyst:
212 ret = regmap_read(st->regmap, MAX31827_TH_HYST_REG,
217 *val = MAX31827_16_BIT_TO_M_DGR(uval);
219 case hwmon_temp_max_alarm:
220 ret = regmap_read(st->regmap,
221 MAX31827_CONFIGURATION_REG, &uval);
225 *val = FIELD_GET(MAX31827_CONFIGURATION_O_TEMP_STAT_MASK,
229 ret = regmap_read(st->regmap, MAX31827_TL_REG, &uval);
233 *val = MAX31827_16_BIT_TO_M_DGR(uval);
235 case hwmon_temp_min_hyst:
236 ret = regmap_read(st->regmap, MAX31827_TL_HYST_REG,
241 *val = MAX31827_16_BIT_TO_M_DGR(uval);
243 case hwmon_temp_min_alarm:
244 ret = regmap_read(st->regmap,
245 MAX31827_CONFIGURATION_REG, &uval);
249 *val = FIELD_GET(MAX31827_CONFIGURATION_U_TEMP_STAT_MASK,
260 if (attr == hwmon_chip_update_interval) {
261 ret = regmap_read(st->regmap,
262 MAX31827_CONFIGURATION_REG, &uval);
266 uval = FIELD_GET(MAX31827_CONFIGURATION_CNV_RATE_MASK,
268 *val = max31827_conversions[uval];
280 static int max31827_write(struct device *dev, enum hwmon_sensor_types type,
281 u32 attr, int channel, long val)
283 struct max31827_state *st = dev_get_drvdata(dev);
290 case hwmon_temp_enable:
294 mutex_lock(&st->lock);
296 * The chip should not be enabled while a conversion is
297 * performed. Neither should the chip be enabled when
298 * the alarm values are changed.
303 ret = regmap_update_bits(st->regmap,
304 MAX31827_CONFIGURATION_REG,
305 MAX31827_CONFIGURATION_1SHOT_MASK |
306 MAX31827_CONFIGURATION_CNV_RATE_MASK,
307 MAX31827_DEVICE_ENABLE(val));
309 mutex_unlock(&st->lock);
314 return write_alarm_val(st, MAX31827_TH_REG, val);
316 case hwmon_temp_max_hyst:
317 return write_alarm_val(st, MAX31827_TH_HYST_REG, val);
320 return write_alarm_val(st, MAX31827_TL_REG, val);
322 case hwmon_temp_min_hyst:
323 return write_alarm_val(st, MAX31827_TL_HYST_REG, val);
330 if (attr == hwmon_chip_update_interval) {
335 * Convert the desired conversion rate into register
336 * bits. res is already initialized with 1.
338 * This was inspired by lm73 driver.
340 while (res < ARRAY_SIZE(max31827_conversions) &&
341 val < max31827_conversions[res])
344 if (res == ARRAY_SIZE(max31827_conversions) ||
345 val != max31827_conversions[res])
348 res = FIELD_PREP(MAX31827_CONFIGURATION_CNV_RATE_MASK,
351 return regmap_update_bits(st->regmap,
352 MAX31827_CONFIGURATION_REG,
353 MAX31827_CONFIGURATION_CNV_RATE_MASK,
365 static int max31827_init_client(struct max31827_state *st)
369 return regmap_update_bits(st->regmap, MAX31827_CONFIGURATION_REG,
370 MAX31827_CONFIGURATION_1SHOT_MASK |
371 MAX31827_CONFIGURATION_CNV_RATE_MASK,
372 MAX31827_DEVICE_ENABLE(1));
375 static const struct hwmon_channel_info *max31827_info[] = {
376 HWMON_CHANNEL_INFO(temp, HWMON_T_ENABLE | HWMON_T_INPUT | HWMON_T_MIN |
377 HWMON_T_MIN_HYST | HWMON_T_MIN_ALARM |
378 HWMON_T_MAX | HWMON_T_MAX_HYST |
380 HWMON_CHANNEL_INFO(chip, HWMON_C_UPDATE_INTERVAL),
384 static const struct hwmon_ops max31827_hwmon_ops = {
385 .is_visible = max31827_is_visible,
386 .read = max31827_read,
387 .write = max31827_write,
390 static const struct hwmon_chip_info max31827_chip_info = {
391 .ops = &max31827_hwmon_ops,
392 .info = max31827_info,
395 static int max31827_probe(struct i2c_client *client)
397 struct device *dev = &client->dev;
398 struct device *hwmon_dev;
399 struct max31827_state *st;
402 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA))
405 st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
409 mutex_init(&st->lock);
411 st->regmap = devm_regmap_init_i2c(client, &max31827_regmap);
412 if (IS_ERR(st->regmap))
413 return dev_err_probe(dev, PTR_ERR(st->regmap),
414 "Failed to allocate regmap.\n");
416 err = devm_regulator_get_enable(dev, "vref");
418 return dev_err_probe(dev, err, "failed to enable regulator\n");
420 err = max31827_init_client(st);
424 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, st,
428 return PTR_ERR_OR_ZERO(hwmon_dev);
431 static const struct i2c_device_id max31827_i2c_ids[] = {
435 MODULE_DEVICE_TABLE(i2c, max31827_i2c_ids);
437 static const struct of_device_id max31827_of_match[] = {
438 { .compatible = "adi,max31827" },
441 MODULE_DEVICE_TABLE(of, max31827_of_match);
443 static struct i2c_driver max31827_driver = {
444 .class = I2C_CLASS_HWMON,
447 .of_match_table = max31827_of_match,
449 .probe = max31827_probe,
450 .id_table = max31827_i2c_ids,
452 module_i2c_driver(max31827_driver);
454 MODULE_AUTHOR("Daniel Matyas <daniel.matyas@analog.com>");
455 MODULE_DESCRIPTION("Maxim MAX31827 low-power temperature switch driver");
456 MODULE_LICENSE("GPL");