1 // SPDX-License-Identifier: GPL-2.0
3 * max31827.c - Support for Maxim Low-Power Switch
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>
16 #define MAX31827_T_REG 0x0
17 #define MAX31827_CONFIGURATION_REG 0x2
18 #define MAX31827_TH_REG 0x4
19 #define MAX31827_TL_REG 0x6
20 #define MAX31827_TH_HYST_REG 0x8
21 #define MAX31827_TL_HYST_REG 0xA
23 #define MAX31827_CONFIGURATION_1SHOT_MASK BIT(0)
24 #define MAX31827_CONFIGURATION_CNV_RATE_MASK GENMASK(3, 1)
25 #define MAX31827_CONFIGURATION_U_TEMP_STAT_MASK BIT(14)
26 #define MAX31827_CONFIGURATION_O_TEMP_STAT_MASK BIT(15)
28 #define MAX31827_12_BIT_CNV_TIME 140
30 #define MAX31827_16_BIT_TO_M_DGR(x) (sign_extend32(x, 15) * 1000 / 16)
31 #define MAX31827_M_DGR_TO_16_BIT(x) (((x) << 4) / 1000)
32 #define MAX31827_DEVICE_ENABLE(x) ((x) ? 0xA : 0x0)
35 MAX31827_CNV_1_DIV_64_HZ = 1,
36 MAX31827_CNV_1_DIV_32_HZ,
37 MAX31827_CNV_1_DIV_16_HZ,
38 MAX31827_CNV_1_DIV_4_HZ,
44 static const u16 max31827_conversions[] = {
45 [MAX31827_CNV_1_DIV_64_HZ] = 64000,
46 [MAX31827_CNV_1_DIV_32_HZ] = 32000,
47 [MAX31827_CNV_1_DIV_16_HZ] = 16000,
48 [MAX31827_CNV_1_DIV_4_HZ] = 4000,
49 [MAX31827_CNV_1_HZ] = 1000,
50 [MAX31827_CNV_4_HZ] = 250,
51 [MAX31827_CNV_8_HZ] = 125,
54 struct max31827_state {
56 * Prevent simultaneous access to the i2c client.
59 struct regmap *regmap;
63 static const struct regmap_config max31827_regmap = {
69 static int shutdown_write(struct max31827_state *st, unsigned int reg,
73 unsigned int cnv_rate;
77 * Before the Temperature Threshold Alarm and Alarm Hysteresis Threshold
78 * register values are changed over I2C, the part must be in shutdown
81 * Mutex is used to ensure, that some other process doesn't change the
82 * configuration register.
84 mutex_lock(&st->lock);
87 ret = regmap_write(st->regmap, reg, val);
91 ret = regmap_read(st->regmap, MAX31827_CONFIGURATION_REG, &cfg);
95 cnv_rate = MAX31827_CONFIGURATION_CNV_RATE_MASK & cfg;
96 cfg = cfg & ~(MAX31827_CONFIGURATION_1SHOT_MASK |
97 MAX31827_CONFIGURATION_CNV_RATE_MASK);
98 ret = regmap_write(st->regmap, MAX31827_CONFIGURATION_REG, cfg);
102 ret = regmap_write(st->regmap, reg, val);
106 ret = regmap_update_bits(st->regmap, MAX31827_CONFIGURATION_REG,
107 MAX31827_CONFIGURATION_CNV_RATE_MASK,
111 mutex_unlock(&st->lock);
115 static int write_alarm_val(struct max31827_state *st, unsigned int reg,
118 val = MAX31827_M_DGR_TO_16_BIT(val);
120 return shutdown_write(st, reg, val);
123 static umode_t max31827_is_visible(const void *state,
124 enum hwmon_sensor_types type, u32 attr,
127 if (type == hwmon_temp) {
129 case hwmon_temp_enable:
132 case hwmon_temp_max_hyst:
133 case hwmon_temp_min_hyst:
135 case hwmon_temp_input:
136 case hwmon_temp_min_alarm:
137 case hwmon_temp_max_alarm:
142 } else if (type == hwmon_chip) {
143 if (attr == hwmon_chip_update_interval)
150 static int max31827_read(struct device *dev, enum hwmon_sensor_types type,
151 u32 attr, int channel, long *val)
153 struct max31827_state *st = dev_get_drvdata(dev);
160 case hwmon_temp_enable:
161 ret = regmap_read(st->regmap,
162 MAX31827_CONFIGURATION_REG, &uval);
166 uval = FIELD_GET(MAX31827_CONFIGURATION_1SHOT_MASK |
167 MAX31827_CONFIGURATION_CNV_RATE_MASK,
172 case hwmon_temp_input:
173 mutex_lock(&st->lock);
177 * This operation requires mutex protection,
178 * because the chip configuration should not
179 * be changed during the conversion process.
182 ret = regmap_update_bits(st->regmap,
183 MAX31827_CONFIGURATION_REG,
184 MAX31827_CONFIGURATION_1SHOT_MASK,
187 mutex_unlock(&st->lock);
191 msleep(MAX31827_12_BIT_CNV_TIME);
193 ret = regmap_read(st->regmap, MAX31827_T_REG, &uval);
195 mutex_unlock(&st->lock);
200 *val = MAX31827_16_BIT_TO_M_DGR(uval);
204 ret = regmap_read(st->regmap, MAX31827_TH_REG, &uval);
208 *val = MAX31827_16_BIT_TO_M_DGR(uval);
210 case hwmon_temp_max_hyst:
211 ret = regmap_read(st->regmap, MAX31827_TH_HYST_REG,
216 *val = MAX31827_16_BIT_TO_M_DGR(uval);
218 case hwmon_temp_max_alarm:
219 ret = regmap_read(st->regmap,
220 MAX31827_CONFIGURATION_REG, &uval);
224 *val = FIELD_GET(MAX31827_CONFIGURATION_O_TEMP_STAT_MASK,
228 ret = regmap_read(st->regmap, MAX31827_TL_REG, &uval);
232 *val = MAX31827_16_BIT_TO_M_DGR(uval);
234 case hwmon_temp_min_hyst:
235 ret = regmap_read(st->regmap, MAX31827_TL_HYST_REG,
240 *val = MAX31827_16_BIT_TO_M_DGR(uval);
242 case hwmon_temp_min_alarm:
243 ret = regmap_read(st->regmap,
244 MAX31827_CONFIGURATION_REG, &uval);
248 *val = FIELD_GET(MAX31827_CONFIGURATION_U_TEMP_STAT_MASK,
259 if (attr == hwmon_chip_update_interval) {
260 ret = regmap_read(st->regmap,
261 MAX31827_CONFIGURATION_REG, &uval);
265 uval = FIELD_GET(MAX31827_CONFIGURATION_CNV_RATE_MASK,
267 *val = max31827_conversions[uval];
279 static int max31827_write(struct device *dev, enum hwmon_sensor_types type,
280 u32 attr, int channel, long val)
282 struct max31827_state *st = dev_get_drvdata(dev);
289 case hwmon_temp_enable:
293 mutex_lock(&st->lock);
295 * The chip should not be enabled while a conversion is
296 * performed. Neither should the chip be enabled when
297 * the alarm values are changed.
302 ret = regmap_update_bits(st->regmap,
303 MAX31827_CONFIGURATION_REG,
304 MAX31827_CONFIGURATION_1SHOT_MASK |
305 MAX31827_CONFIGURATION_CNV_RATE_MASK,
306 MAX31827_DEVICE_ENABLE(val));
308 mutex_unlock(&st->lock);
313 return write_alarm_val(st, MAX31827_TH_REG, val);
315 case hwmon_temp_max_hyst:
316 return write_alarm_val(st, MAX31827_TH_HYST_REG, val);
319 return write_alarm_val(st, MAX31827_TL_REG, val);
321 case hwmon_temp_min_hyst:
322 return write_alarm_val(st, MAX31827_TL_HYST_REG, val);
329 if (attr == hwmon_chip_update_interval) {
334 * Convert the desired conversion rate into register
335 * bits. res is already initialized with 1.
337 * This was inspired by lm73 driver.
339 while (res < ARRAY_SIZE(max31827_conversions) &&
340 val < max31827_conversions[res])
343 if (res == ARRAY_SIZE(max31827_conversions) ||
344 val != max31827_conversions[res])
347 res = FIELD_PREP(MAX31827_CONFIGURATION_CNV_RATE_MASK,
350 return regmap_update_bits(st->regmap,
351 MAX31827_CONFIGURATION_REG,
352 MAX31827_CONFIGURATION_CNV_RATE_MASK,
364 static int max31827_init_client(struct max31827_state *st)
368 return regmap_update_bits(st->regmap, MAX31827_CONFIGURATION_REG,
369 MAX31827_CONFIGURATION_1SHOT_MASK |
370 MAX31827_CONFIGURATION_CNV_RATE_MASK,
371 MAX31827_DEVICE_ENABLE(1));
374 static const struct hwmon_channel_info *max31827_info[] = {
375 HWMON_CHANNEL_INFO(temp, HWMON_T_ENABLE | HWMON_T_INPUT | HWMON_T_MIN |
376 HWMON_T_MIN_HYST | HWMON_T_MIN_ALARM |
377 HWMON_T_MAX | HWMON_T_MAX_HYST |
379 HWMON_CHANNEL_INFO(chip, HWMON_C_UPDATE_INTERVAL),
383 static const struct hwmon_ops max31827_hwmon_ops = {
384 .is_visible = max31827_is_visible,
385 .read = max31827_read,
386 .write = max31827_write,
389 static const struct hwmon_chip_info max31827_chip_info = {
390 .ops = &max31827_hwmon_ops,
391 .info = max31827_info,
394 static int max31827_probe(struct i2c_client *client)
396 struct device *dev = &client->dev;
397 struct device *hwmon_dev;
398 struct max31827_state *st;
401 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA))
404 st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
408 mutex_init(&st->lock);
410 st->regmap = devm_regmap_init_i2c(client, &max31827_regmap);
411 if (IS_ERR(st->regmap))
412 return dev_err_probe(dev, PTR_ERR(st->regmap),
413 "Failed to allocate regmap.\n");
415 err = devm_regulator_get_enable(dev, "vref");
417 return dev_err_probe(dev, err, "failed to enable regulator\n");
419 err = max31827_init_client(st);
423 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, st,
427 return PTR_ERR_OR_ZERO(hwmon_dev);
430 static const struct i2c_device_id max31827_i2c_ids[] = {
434 MODULE_DEVICE_TABLE(i2c, max31827_i2c_ids);
436 static const struct of_device_id max31827_of_match[] = {
437 { .compatible = "adi,max31827" },
440 MODULE_DEVICE_TABLE(of, max31827_of_match);
442 static struct i2c_driver max31827_driver = {
443 .class = I2C_CLASS_HWMON,
446 .of_match_table = max31827_of_match,
448 .probe = max31827_probe,
449 .id_table = max31827_i2c_ids,
451 module_i2c_driver(max31827_driver);
454 MODULE_DESCRIPTION("Maxim MAX31827 low-power temperature switch driver");
455 MODULE_LICENSE("GPL");