1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * lm92 - Hardware monitoring driver
4 * Copyright (C) 2005-2008 Jean Delvare <jdelvare@suse.de>
6 * Based on the lm90 driver, with some ideas taken from the lm_sensors
9 * The LM92 is a sensor chip made by National Semiconductor. It reports
10 * its own temperature with a 0.0625 deg resolution and a 0.33 deg
11 * accuracy. Complete datasheet can be obtained from National's website
13 * http://www.national.com/pf/LM/LM92.html
15 * This driver also supports the MAX6635 sensor chip made by Maxim.
16 * This chip is compatible with the LM92, but has a lesser accuracy
17 * (1.0 deg). Complete datasheet can be obtained from Maxim's website
19 * http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3074
21 * Since the LM92 was the first chipset supported by this driver, most
22 * comments will refer to this chipset, but are actually general and
23 * concern all supported chipsets, unless mentioned otherwise.
25 * Support could easily be added for the National Semiconductor LM76
26 * and Maxim MAX6633 and MAX6634 chips, which are mostly compatible
30 #include <linux/err.h>
31 #include <linux/hwmon.h>
32 #include <linux/i2c.h>
33 #include <linux/init.h>
34 #include <linux/module.h>
35 #include <linux/mutex.h>
36 #include <linux/regmap.h>
37 #include <linux/slab.h>
40 * The LM92 and MAX6635 have 2 two-state pins for address selection,
41 * resulting in 4 possible addresses.
43 static const unsigned short normal_i2c
[] = { 0x48, 0x49, 0x4a, 0x4b,
45 /* The LM92 registers */
46 #define LM92_REG_CONFIG 0x01 /* 8-bit, RW */
47 #define LM92_REG_TEMP 0x00 /* 16-bit, RO */
48 #define LM92_REG_TEMP_HYST 0x02 /* 16-bit, RW */
49 #define LM92_REG_TEMP_CRIT 0x03 /* 16-bit, RW */
50 #define LM92_REG_TEMP_LOW 0x04 /* 16-bit, RW */
51 #define LM92_REG_TEMP_HIGH 0x05 /* 16-bit, RW */
52 #define LM92_REG_MAN_ID 0x07 /* 16-bit, RO, LM92 only */
55 * The LM92 uses signed 13-bit values with LSB = 0.0625 degree Celsius,
56 * left-justified in 16-bit registers. No rounding is done, with such
57 * a resolution it's just not worth it. Note that the MAX6635 doesn't
58 * make use of the 4 lower bits for limits (i.e. effective resolution
59 * for limits is 1 degree Celsius).
61 static inline int TEMP_FROM_REG(s16 reg
)
63 return reg
/ 8 * 625 / 10;
66 static inline s16
TEMP_TO_REG(long val
, int resolution
)
68 val
= clamp_val(val
, -60000, 160000);
69 return DIV_ROUND_CLOSEST(val
<< (resolution
- 9), 1000) << (16 - resolution
);
72 /* Alarm flags are stored in the 3 LSB of the temperature register */
73 static inline u8
ALARMS_FROM_REG(s16 reg
)
78 /* Client data (each client gets its own) */
80 struct regmap
*regmap
;
81 struct mutex update_lock
;
85 static int lm92_temp_read(struct lm92_data
*data
, u32 attr
, int channel
, long *val
)
87 int reg
= -1, hyst_reg
= -1, alarm_bit
= 0;
88 struct regmap
*regmap
= data
->regmap
;
93 case hwmon_temp_input
:
97 reg
= LM92_REG_TEMP_LOW
;
100 reg
= LM92_REG_TEMP_HIGH
;
102 case hwmon_temp_crit
:
103 reg
= LM92_REG_TEMP_CRIT
;
105 case hwmon_temp_min_hyst
:
106 hyst_reg
= LM92_REG_TEMP_LOW
;
108 case hwmon_temp_max_hyst
:
109 hyst_reg
= LM92_REG_TEMP_HIGH
;
111 case hwmon_temp_crit_hyst
:
112 hyst_reg
= LM92_REG_TEMP_CRIT
;
114 case hwmon_temp_min_alarm
:
117 case hwmon_temp_max_alarm
:
120 case hwmon_temp_crit_alarm
:
127 ret
= regmap_read(regmap
, reg
, &temp
);
130 *val
= TEMP_FROM_REG(temp
);
131 } else if (hyst_reg
>= 0) {
132 u32 regs
[2] = { hyst_reg
, LM92_REG_TEMP_HYST
};
135 ret
= regmap_multi_reg_read(regmap
, regs
, regvals
, 2);
138 if (attr
== hwmon_temp_min_hyst
)
139 *val
= TEMP_FROM_REG(regvals
[0]) + TEMP_FROM_REG(regvals
[1]);
141 *val
= TEMP_FROM_REG(regvals
[0]) - TEMP_FROM_REG(regvals
[1]);
143 ret
= regmap_read(regmap
, LM92_REG_TEMP
, &temp
);
146 *val
= !!(temp
& BIT(alarm_bit
));
151 static int lm92_chip_read(struct lm92_data
*data
, u32 attr
, long *val
)
157 case hwmon_chip_alarms
:
158 ret
= regmap_read(data
->regmap
, LM92_REG_TEMP
, &temp
);
161 *val
= ALARMS_FROM_REG(temp
);
169 static int lm92_read(struct device
*dev
, enum hwmon_sensor_types type
, u32 attr
,
170 int channel
, long *val
)
172 struct lm92_data
*data
= dev_get_drvdata(dev
);
176 return lm92_chip_read(data
, attr
, val
);
178 return lm92_temp_read(data
, attr
, channel
, val
);
184 static int lm92_temp_write(struct lm92_data
*data
, u32 attr
, long val
)
186 struct regmap
*regmap
= data
->regmap
;
192 reg
= LM92_REG_TEMP_LOW
;
195 reg
= LM92_REG_TEMP_HIGH
;
197 case hwmon_temp_crit
:
198 reg
= LM92_REG_TEMP_CRIT
;
200 case hwmon_temp_crit_hyst
:
201 val
= clamp_val(val
, -120000, 220000);
202 mutex_lock(&data
->update_lock
);
203 err
= regmap_read(regmap
, LM92_REG_TEMP_CRIT
, &temp
);
206 val
= TEMP_TO_REG(TEMP_FROM_REG(temp
) - val
, data
->resolution
);
207 err
= regmap_write(regmap
, LM92_REG_TEMP_HYST
, val
);
209 mutex_unlock(&data
->update_lock
);
214 return regmap_write(regmap
, reg
, TEMP_TO_REG(val
, data
->resolution
));
217 static int lm92_write(struct device
*dev
, enum hwmon_sensor_types type
,
218 u32 attr
, int channel
, long val
)
220 struct lm92_data
*data
= dev_get_drvdata(dev
);
224 return lm92_temp_write(data
, attr
, val
);
230 static umode_t
lm92_is_visible(const void *_data
, enum hwmon_sensor_types type
,
231 u32 attr
, int channel
)
236 case hwmon_chip_alarms
:
246 case hwmon_temp_crit
:
247 case hwmon_temp_crit_hyst
:
249 case hwmon_temp_input
:
250 case hwmon_temp_min_hyst
:
251 case hwmon_temp_max_hyst
:
252 case hwmon_temp_min_alarm
:
253 case hwmon_temp_max_alarm
:
254 case hwmon_temp_crit_alarm
:
266 static const struct hwmon_channel_info
* const lm92_info
[] = {
267 HWMON_CHANNEL_INFO(chip
, HWMON_C_ALARMS
),
268 HWMON_CHANNEL_INFO(temp
,
270 HWMON_T_MIN
| HWMON_T_MIN_HYST
|
271 HWMON_T_MAX
| HWMON_T_MAX_HYST
|
272 HWMON_T_CRIT
| HWMON_T_CRIT_HYST
|
273 HWMON_T_MIN_ALARM
| HWMON_T_MAX_ALARM
|
278 static const struct hwmon_ops lm92_hwmon_ops
= {
279 .is_visible
= lm92_is_visible
,
284 static const struct hwmon_chip_info lm92_chip_info
= {
285 .ops
= &lm92_hwmon_ops
,
290 * Detection and registration
293 static int lm92_init_client(struct regmap
*regmap
)
295 return regmap_clear_bits(regmap
, LM92_REG_CONFIG
, 0x01);
298 /* Return 0 if detection is successful, -ENODEV otherwise */
299 static int lm92_detect(struct i2c_client
*new_client
,
300 struct i2c_board_info
*info
)
302 struct i2c_adapter
*adapter
= new_client
->adapter
;
303 u8 config_addr
= LM92_REG_CONFIG
;
304 u8 man_id_addr
= LM92_REG_MAN_ID
;
307 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
308 | I2C_FUNC_SMBUS_WORD_DATA
))
312 * Register values repeat with multiples of 8.
313 * Read twice to improve detection accuracy.
315 for (i
= 0; i
< 2; i
++) {
316 regval
= i2c_smbus_read_word_data(new_client
, man_id_addr
);
317 if (regval
!= 0x0180)
319 regval
= i2c_smbus_read_byte_data(new_client
, config_addr
);
320 if (regval
< 0 || (regval
& 0xe0))
326 strscpy(info
->type
, "lm92", I2C_NAME_SIZE
);
333 static int lm92_reg_read(void *context
, unsigned int reg
, unsigned int *val
)
337 if (reg
== LM92_REG_CONFIG
)
338 ret
= i2c_smbus_read_byte_data(context
, reg
);
340 ret
= i2c_smbus_read_word_swapped(context
, reg
);
348 static int lm92_reg_write(void *context
, unsigned int reg
, unsigned int val
)
350 if (reg
== LM92_REG_CONFIG
)
351 return i2c_smbus_write_byte_data(context
, LM92_REG_CONFIG
, val
);
353 return i2c_smbus_write_word_swapped(context
, reg
, val
);
356 static bool lm92_regmap_is_volatile(struct device
*dev
, unsigned int reg
)
358 return reg
== LM92_REG_TEMP
;
361 static bool lm92_regmap_is_writeable(struct device
*dev
, unsigned int reg
)
363 return reg
>= LM92_REG_CONFIG
;
366 static const struct regmap_config lm92_regmap_config
= {
369 .max_register
= LM92_REG_TEMP_HIGH
,
370 .cache_type
= REGCACHE_MAPLE
,
371 .volatile_reg
= lm92_regmap_is_volatile
,
372 .writeable_reg
= lm92_regmap_is_writeable
,
375 static const struct regmap_bus lm92_regmap_bus
= {
376 .reg_write
= lm92_reg_write
,
377 .reg_read
= lm92_reg_read
,
380 static int lm92_probe(struct i2c_client
*client
)
382 struct device
*dev
= &client
->dev
;
383 struct device
*hwmon_dev
;
384 struct lm92_data
*data
;
385 struct regmap
*regmap
;
388 regmap
= devm_regmap_init(dev
, &lm92_regmap_bus
, client
,
389 &lm92_regmap_config
);
391 return PTR_ERR(regmap
);
393 data
= devm_kzalloc(dev
, sizeof(struct lm92_data
), GFP_KERNEL
);
397 data
->regmap
= regmap
;
398 data
->resolution
= (unsigned long)i2c_get_match_data(client
);
399 mutex_init(&data
->update_lock
);
401 /* Initialize the chipset */
402 err
= lm92_init_client(regmap
);
406 hwmon_dev
= devm_hwmon_device_register_with_info(dev
, client
->name
, data
,
407 &lm92_chip_info
, NULL
);
408 return PTR_ERR_OR_ZERO(hwmon_dev
);
412 * Module and driver stuff
415 /* .driver_data is limit register resolution */
416 static const struct i2c_device_id lm92_id
[] = {
421 MODULE_DEVICE_TABLE(i2c
, lm92_id
);
423 static struct i2c_driver lm92_driver
= {
424 .class = I2C_CLASS_HWMON
,
430 .detect
= lm92_detect
,
431 .address_list
= normal_i2c
,
434 module_i2c_driver(lm92_driver
);
436 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
437 MODULE_DESCRIPTION("LM92/MAX6635 driver");
438 MODULE_LICENSE("GPL");