1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2012 Guenter Roeck <linux@roeck-us.net>
6 * Copyright (c) 2011 David George <david.george@ska.ac.za>
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/slab.h>
12 #include <linux/jiffies.h>
13 #include <linux/i2c.h>
14 #include <linux/hwmon.h>
15 #include <linux/hwmon-sysfs.h>
16 #include <linux/err.h>
17 #include <linux/mutex.h>
18 #include <linux/of_device.h>
21 #include <linux/platform_data/max6697.h>
23 enum chips
{ max6581
, max6602
, max6622
, max6636
, max6689
, max6693
, max6694
,
24 max6697
, max6698
, max6699
};
26 /* Report local sensor as temp1 */
28 static const u8 MAX6697_REG_TEMP
[] = {
29 0x07, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08 };
30 static const u8 MAX6697_REG_TEMP_EXT
[] = {
31 0x57, 0x09, 0x52, 0x53, 0x54, 0x55, 0x56, 0 };
32 static const u8 MAX6697_REG_MAX
[] = {
33 0x17, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18 };
34 static const u8 MAX6697_REG_CRIT
[] = {
35 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27 };
38 * Map device tree / platform data register bit map to chip bit map.
39 * Applies to alert register and over-temperature register.
41 #define MAX6697_ALERT_MAP_BITS(reg) ((((reg) & 0x7e) >> 1) | \
42 (((reg) & 0x01) << 6) | ((reg) & 0x80))
43 #define MAX6697_OVERT_MAP_BITS(reg) (((reg) >> 1) | (((reg) & 0x01) << 7))
45 #define MAX6697_REG_STAT(n) (0x44 + (n))
47 #define MAX6697_REG_CONFIG 0x41
48 #define MAX6581_CONF_EXTENDED (1 << 1)
49 #define MAX6693_CONF_BETA (1 << 2)
50 #define MAX6697_CONF_RESISTANCE (1 << 3)
51 #define MAX6697_CONF_TIMEOUT (1 << 5)
52 #define MAX6697_REG_ALERT_MASK 0x42
53 #define MAX6697_REG_OVERT_MASK 0x43
55 #define MAX6581_REG_RESISTANCE 0x4a
56 #define MAX6581_REG_IDEALITY 0x4b
57 #define MAX6581_REG_IDEALITY_SELECT 0x4c
58 #define MAX6581_REG_OFFSET 0x4d
59 #define MAX6581_REG_OFFSET_SELECT 0x4e
60 #define MAX6581_OFFSET_MIN -31750
61 #define MAX6581_OFFSET_MAX 31750
63 #define MAX6697_CONV_TIME 156 /* ms per channel, worst case */
65 struct max6697_chip_data
{
75 struct i2c_client
*client
;
78 const struct max6697_chip_data
*chip
;
80 int update_interval
; /* in milli-seconds */
81 int temp_offset
; /* in degrees C */
83 struct mutex update_lock
;
84 unsigned long last_updated
; /* In jiffies */
85 bool valid
; /* true if following fields are valid */
87 /* 1x local and up to 7x remote */
88 u8 temp
[8][4]; /* [nr][0]=temp [1]=ext [2]=max [3]=crit */
89 #define MAX6697_TEMP_INPUT 0
90 #define MAX6697_TEMP_EXT 1
91 #define MAX6697_TEMP_MAX 2
92 #define MAX6697_TEMP_CRIT 3
96 /* Diode fault status bits on MAX6581 are right shifted by one bit */
97 static const u8 max6581_alarm_map
[] = {
98 0, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15,
99 16, 17, 18, 19, 20, 21, 22, 23 };
101 static const struct max6697_chip_data max6697_chip_data
[] = {
107 .valid_conf
= MAX6581_CONF_EXTENDED
| MAX6697_CONF_TIMEOUT
,
108 .alarm_map
= max6581_alarm_map
,
115 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6697_CONF_TIMEOUT
,
122 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6697_CONF_TIMEOUT
,
129 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6697_CONF_TIMEOUT
,
136 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6697_CONF_TIMEOUT
,
143 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6693_CONF_BETA
|
144 MAX6697_CONF_TIMEOUT
,
151 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6693_CONF_BETA
|
152 MAX6697_CONF_TIMEOUT
,
159 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6697_CONF_TIMEOUT
,
166 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6697_CONF_TIMEOUT
,
173 .valid_conf
= MAX6697_CONF_RESISTANCE
| MAX6697_CONF_TIMEOUT
,
177 static inline int max6581_offset_to_millic(int val
)
179 return sign_extend32(val
, 7) * 250;
182 static struct max6697_data
*max6697_update_device(struct device
*dev
)
184 struct max6697_data
*data
= dev_get_drvdata(dev
);
185 struct i2c_client
*client
= data
->client
;
186 struct max6697_data
*ret
= data
;
191 mutex_lock(&data
->update_lock
);
194 !time_after(jiffies
, data
->last_updated
195 + msecs_to_jiffies(data
->update_interval
)))
198 for (i
= 0; i
< data
->chip
->channels
; i
++) {
199 if (data
->chip
->have_ext
& (1 << i
)) {
200 val
= i2c_smbus_read_byte_data(client
,
201 MAX6697_REG_TEMP_EXT
[i
]);
202 if (unlikely(val
< 0)) {
206 data
->temp
[i
][MAX6697_TEMP_EXT
] = val
;
209 val
= i2c_smbus_read_byte_data(client
, MAX6697_REG_TEMP
[i
]);
210 if (unlikely(val
< 0)) {
214 data
->temp
[i
][MAX6697_TEMP_INPUT
] = val
;
216 val
= i2c_smbus_read_byte_data(client
, MAX6697_REG_MAX
[i
]);
217 if (unlikely(val
< 0)) {
221 data
->temp
[i
][MAX6697_TEMP_MAX
] = val
;
223 if (data
->chip
->have_crit
& (1 << i
)) {
224 val
= i2c_smbus_read_byte_data(client
,
225 MAX6697_REG_CRIT
[i
]);
226 if (unlikely(val
< 0)) {
230 data
->temp
[i
][MAX6697_TEMP_CRIT
] = val
;
235 for (i
= 0; i
< 3; i
++) {
236 val
= i2c_smbus_read_byte_data(client
, MAX6697_REG_STAT(i
));
237 if (unlikely(val
< 0)) {
241 alarms
= (alarms
<< 8) | val
;
243 data
->alarms
= alarms
;
244 data
->last_updated
= jiffies
;
247 mutex_unlock(&data
->update_lock
);
252 static ssize_t
temp_input_show(struct device
*dev
,
253 struct device_attribute
*devattr
, char *buf
)
255 int index
= to_sensor_dev_attr(devattr
)->index
;
256 struct max6697_data
*data
= max6697_update_device(dev
);
260 return PTR_ERR(data
);
262 temp
= (data
->temp
[index
][MAX6697_TEMP_INPUT
] - data
->temp_offset
) << 3;
263 temp
|= data
->temp
[index
][MAX6697_TEMP_EXT
] >> 5;
265 return sprintf(buf
, "%d\n", temp
* 125);
268 static ssize_t
temp_show(struct device
*dev
, struct device_attribute
*devattr
,
271 int nr
= to_sensor_dev_attr_2(devattr
)->nr
;
272 int index
= to_sensor_dev_attr_2(devattr
)->index
;
273 struct max6697_data
*data
= max6697_update_device(dev
);
277 return PTR_ERR(data
);
279 temp
= data
->temp
[nr
][index
];
280 temp
-= data
->temp_offset
;
282 return sprintf(buf
, "%d\n", temp
* 1000);
285 static ssize_t
alarm_show(struct device
*dev
, struct device_attribute
*attr
,
288 int index
= to_sensor_dev_attr(attr
)->index
;
289 struct max6697_data
*data
= max6697_update_device(dev
);
292 return PTR_ERR(data
);
294 if (data
->chip
->alarm_map
)
295 index
= data
->chip
->alarm_map
[index
];
297 return sprintf(buf
, "%u\n", (data
->alarms
>> index
) & 0x1);
300 static ssize_t
temp_store(struct device
*dev
,
301 struct device_attribute
*devattr
, const char *buf
,
304 int nr
= to_sensor_dev_attr_2(devattr
)->nr
;
305 int index
= to_sensor_dev_attr_2(devattr
)->index
;
306 struct max6697_data
*data
= dev_get_drvdata(dev
);
310 ret
= kstrtol(buf
, 10, &temp
);
314 mutex_lock(&data
->update_lock
);
315 temp
= DIV_ROUND_CLOSEST(temp
, 1000) + data
->temp_offset
;
316 temp
= clamp_val(temp
, 0, data
->type
== max6581
? 255 : 127);
317 data
->temp
[nr
][index
] = temp
;
318 ret
= i2c_smbus_write_byte_data(data
->client
,
319 index
== 2 ? MAX6697_REG_MAX
[nr
]
320 : MAX6697_REG_CRIT
[nr
],
322 mutex_unlock(&data
->update_lock
);
324 return ret
< 0 ? ret
: count
;
327 static ssize_t
offset_store(struct device
*dev
, struct device_attribute
*devattr
, const char *buf
,
330 int val
, ret
, index
, select
;
331 struct max6697_data
*data
;
332 bool channel_enabled
;
335 index
= to_sensor_dev_attr(devattr
)->index
;
336 data
= dev_get_drvdata(dev
);
337 ret
= kstrtol(buf
, 10, &temp
);
341 mutex_lock(&data
->update_lock
);
342 select
= i2c_smbus_read_byte_data(data
->client
, MAX6581_REG_OFFSET_SELECT
);
347 channel_enabled
= (select
& (1 << (index
- 1)));
348 temp
= clamp_val(temp
, MAX6581_OFFSET_MIN
, MAX6581_OFFSET_MAX
);
349 val
= DIV_ROUND_CLOSEST(temp
, 250);
350 /* disable the offset for channel if the new offset is 0 */
353 ret
= i2c_smbus_write_byte_data(data
->client
, MAX6581_REG_OFFSET_SELECT
,
354 select
& ~(1 << (index
- 1)));
355 ret
= ret
< 0 ? ret
: count
;
358 if (!channel_enabled
) {
359 ret
= i2c_smbus_write_byte_data(data
->client
, MAX6581_REG_OFFSET_SELECT
,
360 select
| (1 << (index
- 1)));
364 ret
= i2c_smbus_write_byte_data(data
->client
, MAX6581_REG_OFFSET
, val
);
365 ret
= ret
< 0 ? ret
: count
;
368 mutex_unlock(&data
->update_lock
);
372 static ssize_t
offset_show(struct device
*dev
, struct device_attribute
*devattr
, char *buf
)
374 struct max6697_data
*data
;
375 int select
, ret
, index
;
377 index
= to_sensor_dev_attr(devattr
)->index
;
378 data
= dev_get_drvdata(dev
);
379 mutex_lock(&data
->update_lock
);
380 select
= i2c_smbus_read_byte_data(data
->client
, MAX6581_REG_OFFSET_SELECT
);
383 else if (select
& (1 << (index
- 1)))
384 ret
= i2c_smbus_read_byte_data(data
->client
, MAX6581_REG_OFFSET
);
387 mutex_unlock(&data
->update_lock
);
388 return ret
< 0 ? ret
: sprintf(buf
, "%d\n", max6581_offset_to_millic(ret
));
391 static SENSOR_DEVICE_ATTR_RO(temp1_input
, temp_input
, 0);
392 static SENSOR_DEVICE_ATTR_2_RW(temp1_max
, temp
, 0, MAX6697_TEMP_MAX
);
393 static SENSOR_DEVICE_ATTR_2_RW(temp1_crit
, temp
, 0, MAX6697_TEMP_CRIT
);
395 static SENSOR_DEVICE_ATTR_RO(temp2_input
, temp_input
, 1);
396 static SENSOR_DEVICE_ATTR_2_RW(temp2_max
, temp
, 1, MAX6697_TEMP_MAX
);
397 static SENSOR_DEVICE_ATTR_2_RW(temp2_crit
, temp
, 1, MAX6697_TEMP_CRIT
);
399 static SENSOR_DEVICE_ATTR_RO(temp3_input
, temp_input
, 2);
400 static SENSOR_DEVICE_ATTR_2_RW(temp3_max
, temp
, 2, MAX6697_TEMP_MAX
);
401 static SENSOR_DEVICE_ATTR_2_RW(temp3_crit
, temp
, 2, MAX6697_TEMP_CRIT
);
403 static SENSOR_DEVICE_ATTR_RO(temp4_input
, temp_input
, 3);
404 static SENSOR_DEVICE_ATTR_2_RW(temp4_max
, temp
, 3, MAX6697_TEMP_MAX
);
405 static SENSOR_DEVICE_ATTR_2_RW(temp4_crit
, temp
, 3, MAX6697_TEMP_CRIT
);
407 static SENSOR_DEVICE_ATTR_RO(temp5_input
, temp_input
, 4);
408 static SENSOR_DEVICE_ATTR_2_RW(temp5_max
, temp
, 4, MAX6697_TEMP_MAX
);
409 static SENSOR_DEVICE_ATTR_2_RW(temp5_crit
, temp
, 4, MAX6697_TEMP_CRIT
);
411 static SENSOR_DEVICE_ATTR_RO(temp6_input
, temp_input
, 5);
412 static SENSOR_DEVICE_ATTR_2_RW(temp6_max
, temp
, 5, MAX6697_TEMP_MAX
);
413 static SENSOR_DEVICE_ATTR_2_RW(temp6_crit
, temp
, 5, MAX6697_TEMP_CRIT
);
415 static SENSOR_DEVICE_ATTR_RO(temp7_input
, temp_input
, 6);
416 static SENSOR_DEVICE_ATTR_2_RW(temp7_max
, temp
, 6, MAX6697_TEMP_MAX
);
417 static SENSOR_DEVICE_ATTR_2_RW(temp7_crit
, temp
, 6, MAX6697_TEMP_CRIT
);
419 static SENSOR_DEVICE_ATTR_RO(temp8_input
, temp_input
, 7);
420 static SENSOR_DEVICE_ATTR_2_RW(temp8_max
, temp
, 7, MAX6697_TEMP_MAX
);
421 static SENSOR_DEVICE_ATTR_2_RW(temp8_crit
, temp
, 7, MAX6697_TEMP_CRIT
);
423 static SENSOR_DEVICE_ATTR_RO(temp1_max_alarm
, alarm
, 22);
424 static SENSOR_DEVICE_ATTR_RO(temp2_max_alarm
, alarm
, 16);
425 static SENSOR_DEVICE_ATTR_RO(temp3_max_alarm
, alarm
, 17);
426 static SENSOR_DEVICE_ATTR_RO(temp4_max_alarm
, alarm
, 18);
427 static SENSOR_DEVICE_ATTR_RO(temp5_max_alarm
, alarm
, 19);
428 static SENSOR_DEVICE_ATTR_RO(temp6_max_alarm
, alarm
, 20);
429 static SENSOR_DEVICE_ATTR_RO(temp7_max_alarm
, alarm
, 21);
430 static SENSOR_DEVICE_ATTR_RO(temp8_max_alarm
, alarm
, 23);
432 static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm
, alarm
, 14);
433 static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm
, alarm
, 8);
434 static SENSOR_DEVICE_ATTR_RO(temp3_crit_alarm
, alarm
, 9);
435 static SENSOR_DEVICE_ATTR_RO(temp4_crit_alarm
, alarm
, 10);
436 static SENSOR_DEVICE_ATTR_RO(temp5_crit_alarm
, alarm
, 11);
437 static SENSOR_DEVICE_ATTR_RO(temp6_crit_alarm
, alarm
, 12);
438 static SENSOR_DEVICE_ATTR_RO(temp7_crit_alarm
, alarm
, 13);
439 static SENSOR_DEVICE_ATTR_RO(temp8_crit_alarm
, alarm
, 15);
441 static SENSOR_DEVICE_ATTR_RO(temp2_fault
, alarm
, 1);
442 static SENSOR_DEVICE_ATTR_RO(temp3_fault
, alarm
, 2);
443 static SENSOR_DEVICE_ATTR_RO(temp4_fault
, alarm
, 3);
444 static SENSOR_DEVICE_ATTR_RO(temp5_fault
, alarm
, 4);
445 static SENSOR_DEVICE_ATTR_RO(temp6_fault
, alarm
, 5);
446 static SENSOR_DEVICE_ATTR_RO(temp7_fault
, alarm
, 6);
447 static SENSOR_DEVICE_ATTR_RO(temp8_fault
, alarm
, 7);
449 /* There is no offset for local temperature so starting from temp2 */
450 static SENSOR_DEVICE_ATTR_RW(temp2_offset
, offset
, 1);
451 static SENSOR_DEVICE_ATTR_RW(temp3_offset
, offset
, 2);
452 static SENSOR_DEVICE_ATTR_RW(temp4_offset
, offset
, 3);
453 static SENSOR_DEVICE_ATTR_RW(temp5_offset
, offset
, 4);
454 static SENSOR_DEVICE_ATTR_RW(temp6_offset
, offset
, 5);
455 static SENSOR_DEVICE_ATTR_RW(temp7_offset
, offset
, 6);
456 static SENSOR_DEVICE_ATTR_RW(temp8_offset
, offset
, 7);
458 static DEVICE_ATTR(dummy
, 0, NULL
, NULL
);
460 static umode_t
max6697_is_visible(struct kobject
*kobj
, struct attribute
*attr
,
463 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
464 struct max6697_data
*data
= dev_get_drvdata(dev
);
465 const struct max6697_chip_data
*chip
= data
->chip
;
466 int channel
= index
/ 7; /* channel number */
467 int nr
= index
% 7; /* attribute index within channel */
469 if (channel
>= chip
->channels
)
472 if ((nr
== 3 || nr
== 4) && !(chip
->have_crit
& (1 << channel
)))
474 if (nr
== 5 && !(chip
->have_fault
& (1 << channel
)))
476 /* offset reg is only supported on max6581 remote channels */
478 if (data
->type
!= max6581
|| channel
== 0)
485 * max6697_is_visible uses the index into the following array to determine
486 * if attributes should be created or not. Any change in order or content
487 * must be matched in max6697_is_visible.
489 static struct attribute
*max6697_attributes
[] = {
490 &sensor_dev_attr_temp1_input
.dev_attr
.attr
,
491 &sensor_dev_attr_temp1_max
.dev_attr
.attr
,
492 &sensor_dev_attr_temp1_max_alarm
.dev_attr
.attr
,
493 &sensor_dev_attr_temp1_crit
.dev_attr
.attr
,
494 &sensor_dev_attr_temp1_crit_alarm
.dev_attr
.attr
,
495 &dev_attr_dummy
.attr
,
496 &dev_attr_dummy
.attr
,
498 &sensor_dev_attr_temp2_input
.dev_attr
.attr
,
499 &sensor_dev_attr_temp2_max
.dev_attr
.attr
,
500 &sensor_dev_attr_temp2_max_alarm
.dev_attr
.attr
,
501 &sensor_dev_attr_temp2_crit
.dev_attr
.attr
,
502 &sensor_dev_attr_temp2_crit_alarm
.dev_attr
.attr
,
503 &sensor_dev_attr_temp2_fault
.dev_attr
.attr
,
504 &sensor_dev_attr_temp2_offset
.dev_attr
.attr
,
506 &sensor_dev_attr_temp3_input
.dev_attr
.attr
,
507 &sensor_dev_attr_temp3_max
.dev_attr
.attr
,
508 &sensor_dev_attr_temp3_max_alarm
.dev_attr
.attr
,
509 &sensor_dev_attr_temp3_crit
.dev_attr
.attr
,
510 &sensor_dev_attr_temp3_crit_alarm
.dev_attr
.attr
,
511 &sensor_dev_attr_temp3_fault
.dev_attr
.attr
,
512 &sensor_dev_attr_temp3_offset
.dev_attr
.attr
,
514 &sensor_dev_attr_temp4_input
.dev_attr
.attr
,
515 &sensor_dev_attr_temp4_max
.dev_attr
.attr
,
516 &sensor_dev_attr_temp4_max_alarm
.dev_attr
.attr
,
517 &sensor_dev_attr_temp4_crit
.dev_attr
.attr
,
518 &sensor_dev_attr_temp4_crit_alarm
.dev_attr
.attr
,
519 &sensor_dev_attr_temp4_fault
.dev_attr
.attr
,
520 &sensor_dev_attr_temp4_offset
.dev_attr
.attr
,
522 &sensor_dev_attr_temp5_input
.dev_attr
.attr
,
523 &sensor_dev_attr_temp5_max
.dev_attr
.attr
,
524 &sensor_dev_attr_temp5_max_alarm
.dev_attr
.attr
,
525 &sensor_dev_attr_temp5_crit
.dev_attr
.attr
,
526 &sensor_dev_attr_temp5_crit_alarm
.dev_attr
.attr
,
527 &sensor_dev_attr_temp5_fault
.dev_attr
.attr
,
528 &sensor_dev_attr_temp5_offset
.dev_attr
.attr
,
530 &sensor_dev_attr_temp6_input
.dev_attr
.attr
,
531 &sensor_dev_attr_temp6_max
.dev_attr
.attr
,
532 &sensor_dev_attr_temp6_max_alarm
.dev_attr
.attr
,
533 &sensor_dev_attr_temp6_crit
.dev_attr
.attr
,
534 &sensor_dev_attr_temp6_crit_alarm
.dev_attr
.attr
,
535 &sensor_dev_attr_temp6_fault
.dev_attr
.attr
,
536 &sensor_dev_attr_temp6_offset
.dev_attr
.attr
,
538 &sensor_dev_attr_temp7_input
.dev_attr
.attr
,
539 &sensor_dev_attr_temp7_max
.dev_attr
.attr
,
540 &sensor_dev_attr_temp7_max_alarm
.dev_attr
.attr
,
541 &sensor_dev_attr_temp7_crit
.dev_attr
.attr
,
542 &sensor_dev_attr_temp7_crit_alarm
.dev_attr
.attr
,
543 &sensor_dev_attr_temp7_fault
.dev_attr
.attr
,
544 &sensor_dev_attr_temp7_offset
.dev_attr
.attr
,
546 &sensor_dev_attr_temp8_input
.dev_attr
.attr
,
547 &sensor_dev_attr_temp8_max
.dev_attr
.attr
,
548 &sensor_dev_attr_temp8_max_alarm
.dev_attr
.attr
,
549 &sensor_dev_attr_temp8_crit
.dev_attr
.attr
,
550 &sensor_dev_attr_temp8_crit_alarm
.dev_attr
.attr
,
551 &sensor_dev_attr_temp8_fault
.dev_attr
.attr
,
552 &sensor_dev_attr_temp8_offset
.dev_attr
.attr
,
556 static const struct attribute_group max6697_group
= {
557 .attrs
= max6697_attributes
, .is_visible
= max6697_is_visible
,
559 __ATTRIBUTE_GROUPS(max6697
);
561 static void max6697_get_config_of(struct device_node
*node
,
562 struct max6697_platform_data
*pdata
)
567 pdata
->smbus_timeout_disable
=
568 of_property_read_bool(node
, "smbus-timeout-disable");
569 pdata
->extended_range_enable
=
570 of_property_read_bool(node
, "extended-range-enable");
571 pdata
->beta_compensation
=
572 of_property_read_bool(node
, "beta-compensation-enable");
574 prop
= of_get_property(node
, "alert-mask", &len
);
575 if (prop
&& len
== sizeof(u32
))
576 pdata
->alert_mask
= be32_to_cpu(prop
[0]);
577 prop
= of_get_property(node
, "over-temperature-mask", &len
);
578 if (prop
&& len
== sizeof(u32
))
579 pdata
->over_temperature_mask
= be32_to_cpu(prop
[0]);
580 prop
= of_get_property(node
, "resistance-cancellation", &len
);
582 if (len
== sizeof(u32
))
583 pdata
->resistance_cancellation
= be32_to_cpu(prop
[0]);
585 pdata
->resistance_cancellation
= 0xfe;
587 prop
= of_get_property(node
, "transistor-ideality", &len
);
588 if (prop
&& len
== 2 * sizeof(u32
)) {
589 pdata
->ideality_mask
= be32_to_cpu(prop
[0]);
590 pdata
->ideality_value
= be32_to_cpu(prop
[1]);
594 static int max6697_init_chip(struct max6697_data
*data
,
595 struct i2c_client
*client
)
597 struct max6697_platform_data
*pdata
= dev_get_platdata(&client
->dev
);
598 struct max6697_platform_data p
;
599 const struct max6697_chip_data
*chip
= data
->chip
;
600 int factor
= chip
->channels
;
604 * Don't touch configuration if neither platform data nor OF
605 * configuration was specified. If that is the case, use the
606 * current chip configuration.
608 if (!pdata
&& !client
->dev
.of_node
) {
609 reg
= i2c_smbus_read_byte_data(client
, MAX6697_REG_CONFIG
);
612 if (data
->type
== max6581
) {
613 if (reg
& MAX6581_CONF_EXTENDED
)
614 data
->temp_offset
= 64;
615 reg
= i2c_smbus_read_byte_data(client
,
616 MAX6581_REG_RESISTANCE
);
619 factor
+= hweight8(reg
);
621 if (reg
& MAX6697_CONF_RESISTANCE
)
627 if (client
->dev
.of_node
) {
628 memset(&p
, 0, sizeof(p
));
629 max6697_get_config_of(client
->dev
.of_node
, &p
);
634 if (pdata
->smbus_timeout_disable
&&
635 (chip
->valid_conf
& MAX6697_CONF_TIMEOUT
)) {
636 reg
|= MAX6697_CONF_TIMEOUT
;
638 if (pdata
->extended_range_enable
&&
639 (chip
->valid_conf
& MAX6581_CONF_EXTENDED
)) {
640 reg
|= MAX6581_CONF_EXTENDED
;
641 data
->temp_offset
= 64;
643 if (pdata
->resistance_cancellation
&&
644 (chip
->valid_conf
& MAX6697_CONF_RESISTANCE
)) {
645 reg
|= MAX6697_CONF_RESISTANCE
;
648 if (pdata
->beta_compensation
&&
649 (chip
->valid_conf
& MAX6693_CONF_BETA
)) {
650 reg
|= MAX6693_CONF_BETA
;
653 ret
= i2c_smbus_write_byte_data(client
, MAX6697_REG_CONFIG
, reg
);
657 ret
= i2c_smbus_write_byte_data(client
, MAX6697_REG_ALERT_MASK
,
658 MAX6697_ALERT_MAP_BITS(pdata
->alert_mask
));
662 ret
= i2c_smbus_write_byte_data(client
, MAX6697_REG_OVERT_MASK
,
663 MAX6697_OVERT_MAP_BITS(pdata
->over_temperature_mask
));
667 if (data
->type
== max6581
) {
668 factor
+= hweight8(pdata
->resistance_cancellation
>> 1);
669 ret
= i2c_smbus_write_byte_data(client
, MAX6581_REG_RESISTANCE
,
670 pdata
->resistance_cancellation
>> 1);
673 ret
= i2c_smbus_write_byte_data(client
, MAX6581_REG_IDEALITY
,
674 pdata
->ideality_value
);
677 ret
= i2c_smbus_write_byte_data(client
,
678 MAX6581_REG_IDEALITY_SELECT
,
679 pdata
->ideality_mask
>> 1);
684 data
->update_interval
= factor
* MAX6697_CONV_TIME
;
688 static const struct i2c_device_id max6697_id
[];
690 static int max6697_probe(struct i2c_client
*client
)
692 struct i2c_adapter
*adapter
= client
->adapter
;
693 struct device
*dev
= &client
->dev
;
694 struct max6697_data
*data
;
695 struct device
*hwmon_dev
;
698 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
))
701 data
= devm_kzalloc(dev
, sizeof(struct max6697_data
), GFP_KERNEL
);
705 if (client
->dev
.of_node
)
706 data
->type
= (enum chips
)of_device_get_match_data(&client
->dev
);
708 data
->type
= i2c_match_id(max6697_id
, client
)->driver_data
;
709 data
->chip
= &max6697_chip_data
[data
->type
];
710 data
->client
= client
;
711 mutex_init(&data
->update_lock
);
713 err
= max6697_init_chip(data
, client
);
717 hwmon_dev
= devm_hwmon_device_register_with_groups(dev
, client
->name
,
720 return PTR_ERR_OR_ZERO(hwmon_dev
);
723 static const struct i2c_device_id max6697_id
[] = {
724 { "max6581", max6581
},
725 { "max6602", max6602
},
726 { "max6622", max6622
},
727 { "max6636", max6636
},
728 { "max6689", max6689
},
729 { "max6693", max6693
},
730 { "max6694", max6694
},
731 { "max6697", max6697
},
732 { "max6698", max6698
},
733 { "max6699", max6699
},
736 MODULE_DEVICE_TABLE(i2c
, max6697_id
);
738 static const struct of_device_id __maybe_unused max6697_of_match
[] = {
740 .compatible
= "maxim,max6581",
741 .data
= (void *)max6581
744 .compatible
= "maxim,max6602",
745 .data
= (void *)max6602
748 .compatible
= "maxim,max6622",
749 .data
= (void *)max6622
752 .compatible
= "maxim,max6636",
753 .data
= (void *)max6636
756 .compatible
= "maxim,max6689",
757 .data
= (void *)max6689
760 .compatible
= "maxim,max6693",
761 .data
= (void *)max6693
764 .compatible
= "maxim,max6694",
765 .data
= (void *)max6694
768 .compatible
= "maxim,max6697",
769 .data
= (void *)max6697
772 .compatible
= "maxim,max6698",
773 .data
= (void *)max6698
776 .compatible
= "maxim,max6699",
777 .data
= (void *)max6699
781 MODULE_DEVICE_TABLE(of
, max6697_of_match
);
783 static struct i2c_driver max6697_driver
= {
784 .class = I2C_CLASS_HWMON
,
787 .of_match_table
= of_match_ptr(max6697_of_match
),
789 .probe_new
= max6697_probe
,
790 .id_table
= max6697_id
,
793 module_i2c_driver(max6697_driver
);
795 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
796 MODULE_DESCRIPTION("MAX6697 temperature sensor driver");
797 MODULE_LICENSE("GPL");