1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * gl520sm.c - Part of lm_sensors, Linux kernel modules for hardware
5 * Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>,
6 * Kyösti Mälkki <kmalkki@cc.hut.fi>
7 * Copyright (c) 2005 Maarten Deprez <maartendeprez@users.sourceforge.net>
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/slab.h>
13 #include <linux/jiffies.h>
14 #include <linux/i2c.h>
15 #include <linux/hwmon.h>
16 #include <linux/hwmon-sysfs.h>
17 #include <linux/hwmon-vid.h>
18 #include <linux/err.h>
19 #include <linux/mutex.h>
20 #include <linux/sysfs.h>
22 /* Type of the extra sensor */
23 static unsigned short extra_sensor_type
;
24 module_param(extra_sensor_type
, ushort
, 0);
25 MODULE_PARM_DESC(extra_sensor_type
, "Type of extra sensor (0=autodetect, 1=temperature, 2=voltage)");
27 /* Addresses to scan */
28 static const unsigned short normal_i2c
[] = { 0x2c, 0x2d, I2C_CLIENT_END
};
31 * Many GL520 constants specified below
32 * One of the inputs can be configured as either temp or voltage.
33 * That's why _TEMP2 and _IN4 access the same register
36 /* The GL520 registers */
37 #define GL520_REG_CHIP_ID 0x00
38 #define GL520_REG_REVISION 0x01
39 #define GL520_REG_CONF 0x03
40 #define GL520_REG_MASK 0x11
42 #define GL520_REG_VID_INPUT 0x02
44 static const u8 GL520_REG_IN_INPUT
[] = { 0x15, 0x14, 0x13, 0x0d, 0x0e };
45 static const u8 GL520_REG_IN_LIMIT
[] = { 0x0c, 0x09, 0x0a, 0x0b };
46 static const u8 GL520_REG_IN_MIN
[] = { 0x0c, 0x09, 0x0a, 0x0b, 0x18 };
47 static const u8 GL520_REG_IN_MAX
[] = { 0x0c, 0x09, 0x0a, 0x0b, 0x17 };
49 static const u8 GL520_REG_TEMP_INPUT
[] = { 0x04, 0x0e };
50 static const u8 GL520_REG_TEMP_MAX
[] = { 0x05, 0x17 };
51 static const u8 GL520_REG_TEMP_MAX_HYST
[] = { 0x06, 0x18 };
53 #define GL520_REG_FAN_INPUT 0x07
54 #define GL520_REG_FAN_MIN 0x08
55 #define GL520_REG_FAN_DIV 0x0f
56 #define GL520_REG_FAN_OFF GL520_REG_FAN_DIV
58 #define GL520_REG_ALARMS 0x12
59 #define GL520_REG_BEEP_MASK 0x10
60 #define GL520_REG_BEEP_ENABLE GL520_REG_CONF
64 struct i2c_client
*client
;
65 const struct attribute_group
*groups
[3];
66 struct mutex update_lock
;
67 char valid
; /* zero until the following fields are valid */
68 unsigned long last_updated
; /* in jiffies */
72 u8 in_input
[5]; /* [0] = VVD */
73 u8 in_min
[5]; /* [0] = VDD */
74 u8 in_max
[5]; /* [0] = VDD */
90 * Registers 0x07 to 0x0c are word-sized, others are byte-sized
91 * GL520 uses a high-byte first convention
93 static int gl520_read_value(struct i2c_client
*client
, u8 reg
)
95 if ((reg
>= 0x07) && (reg
<= 0x0c))
96 return i2c_smbus_read_word_swapped(client
, reg
);
98 return i2c_smbus_read_byte_data(client
, reg
);
101 static int gl520_write_value(struct i2c_client
*client
, u8 reg
, u16 value
)
103 if ((reg
>= 0x07) && (reg
<= 0x0c))
104 return i2c_smbus_write_word_swapped(client
, reg
, value
);
106 return i2c_smbus_write_byte_data(client
, reg
, value
);
109 static struct gl520_data
*gl520_update_device(struct device
*dev
)
111 struct gl520_data
*data
= dev_get_drvdata(dev
);
112 struct i2c_client
*client
= data
->client
;
115 mutex_lock(&data
->update_lock
);
117 if (time_after(jiffies
, data
->last_updated
+ 2 * HZ
) || !data
->valid
) {
119 dev_dbg(&client
->dev
, "Starting gl520sm update\n");
121 data
->alarms
= gl520_read_value(client
, GL520_REG_ALARMS
);
122 data
->beep_mask
= gl520_read_value(client
, GL520_REG_BEEP_MASK
);
123 data
->vid
= gl520_read_value(client
,
124 GL520_REG_VID_INPUT
) & 0x1f;
126 for (i
= 0; i
< 4; i
++) {
127 data
->in_input
[i
] = gl520_read_value(client
,
128 GL520_REG_IN_INPUT
[i
]);
129 val
= gl520_read_value(client
, GL520_REG_IN_LIMIT
[i
]);
130 data
->in_min
[i
] = val
& 0xff;
131 data
->in_max
[i
] = (val
>> 8) & 0xff;
134 val
= gl520_read_value(client
, GL520_REG_FAN_INPUT
);
135 data
->fan_input
[0] = (val
>> 8) & 0xff;
136 data
->fan_input
[1] = val
& 0xff;
138 val
= gl520_read_value(client
, GL520_REG_FAN_MIN
);
139 data
->fan_min
[0] = (val
>> 8) & 0xff;
140 data
->fan_min
[1] = val
& 0xff;
142 data
->temp_input
[0] = gl520_read_value(client
,
143 GL520_REG_TEMP_INPUT
[0]);
144 data
->temp_max
[0] = gl520_read_value(client
,
145 GL520_REG_TEMP_MAX
[0]);
146 data
->temp_max_hyst
[0] = gl520_read_value(client
,
147 GL520_REG_TEMP_MAX_HYST
[0]);
149 val
= gl520_read_value(client
, GL520_REG_FAN_DIV
);
150 data
->fan_div
[0] = (val
>> 6) & 0x03;
151 data
->fan_div
[1] = (val
>> 4) & 0x03;
152 data
->fan_off
= (val
>> 2) & 0x01;
154 data
->alarms
&= data
->alarm_mask
;
156 val
= gl520_read_value(client
, GL520_REG_CONF
);
157 data
->beep_enable
= !((val
>> 2) & 1);
159 /* Temp1 and Vin4 are the same input */
160 if (data
->two_temps
) {
161 data
->temp_input
[1] = gl520_read_value(client
,
162 GL520_REG_TEMP_INPUT
[1]);
163 data
->temp_max
[1] = gl520_read_value(client
,
164 GL520_REG_TEMP_MAX
[1]);
165 data
->temp_max_hyst
[1] = gl520_read_value(client
,
166 GL520_REG_TEMP_MAX_HYST
[1]);
168 data
->in_input
[4] = gl520_read_value(client
,
169 GL520_REG_IN_INPUT
[4]);
170 data
->in_min
[4] = gl520_read_value(client
,
171 GL520_REG_IN_MIN
[4]);
172 data
->in_max
[4] = gl520_read_value(client
,
173 GL520_REG_IN_MAX
[4]);
176 data
->last_updated
= jiffies
;
180 mutex_unlock(&data
->update_lock
);
189 static ssize_t
cpu0_vid_show(struct device
*dev
,
190 struct device_attribute
*attr
, char *buf
)
192 struct gl520_data
*data
= gl520_update_device(dev
);
193 return sprintf(buf
, "%u\n", vid_from_reg(data
->vid
, data
->vrm
));
195 static DEVICE_ATTR_RO(cpu0_vid
);
197 #define VDD_FROM_REG(val) DIV_ROUND_CLOSEST((val) * 95, 4)
198 #define VDD_CLAMP(val) clamp_val(val, 0, 255 * 95 / 4)
199 #define VDD_TO_REG(val) DIV_ROUND_CLOSEST(VDD_CLAMP(val) * 4, 95)
201 #define IN_FROM_REG(val) ((val) * 19)
202 #define IN_CLAMP(val) clamp_val(val, 0, 255 * 19)
203 #define IN_TO_REG(val) DIV_ROUND_CLOSEST(IN_CLAMP(val), 19)
205 static ssize_t
in_input_show(struct device
*dev
,
206 struct device_attribute
*attr
, char *buf
)
208 int n
= to_sensor_dev_attr(attr
)->index
;
209 struct gl520_data
*data
= gl520_update_device(dev
);
210 u8 r
= data
->in_input
[n
];
213 return sprintf(buf
, "%d\n", VDD_FROM_REG(r
));
215 return sprintf(buf
, "%d\n", IN_FROM_REG(r
));
218 static ssize_t
in_min_show(struct device
*dev
, struct device_attribute
*attr
,
221 int n
= to_sensor_dev_attr(attr
)->index
;
222 struct gl520_data
*data
= gl520_update_device(dev
);
223 u8 r
= data
->in_min
[n
];
226 return sprintf(buf
, "%d\n", VDD_FROM_REG(r
));
228 return sprintf(buf
, "%d\n", IN_FROM_REG(r
));
231 static ssize_t
in_max_show(struct device
*dev
, struct device_attribute
*attr
,
234 int n
= to_sensor_dev_attr(attr
)->index
;
235 struct gl520_data
*data
= gl520_update_device(dev
);
236 u8 r
= data
->in_max
[n
];
239 return sprintf(buf
, "%d\n", VDD_FROM_REG(r
));
241 return sprintf(buf
, "%d\n", IN_FROM_REG(r
));
244 static ssize_t
in_min_store(struct device
*dev
, struct device_attribute
*attr
,
245 const char *buf
, size_t count
)
247 struct gl520_data
*data
= dev_get_drvdata(dev
);
248 struct i2c_client
*client
= data
->client
;
249 int n
= to_sensor_dev_attr(attr
)->index
;
254 err
= kstrtol(buf
, 10, &v
);
258 mutex_lock(&data
->update_lock
);
268 gl520_write_value(client
, GL520_REG_IN_MIN
[n
],
269 (gl520_read_value(client
, GL520_REG_IN_MIN
[n
])
272 gl520_write_value(client
, GL520_REG_IN_MIN
[n
], r
);
274 mutex_unlock(&data
->update_lock
);
278 static ssize_t
in_max_store(struct device
*dev
, struct device_attribute
*attr
,
279 const char *buf
, size_t count
)
281 struct gl520_data
*data
= dev_get_drvdata(dev
);
282 struct i2c_client
*client
= data
->client
;
283 int n
= to_sensor_dev_attr(attr
)->index
;
288 err
= kstrtol(buf
, 10, &v
);
297 mutex_lock(&data
->update_lock
);
302 gl520_write_value(client
, GL520_REG_IN_MAX
[n
],
303 (gl520_read_value(client
, GL520_REG_IN_MAX
[n
])
304 & ~0xff00) | (r
<< 8));
306 gl520_write_value(client
, GL520_REG_IN_MAX
[n
], r
);
308 mutex_unlock(&data
->update_lock
);
312 static SENSOR_DEVICE_ATTR_RO(in0_input
, in_input
, 0);
313 static SENSOR_DEVICE_ATTR_RO(in1_input
, in_input
, 1);
314 static SENSOR_DEVICE_ATTR_RO(in2_input
, in_input
, 2);
315 static SENSOR_DEVICE_ATTR_RO(in3_input
, in_input
, 3);
316 static SENSOR_DEVICE_ATTR_RO(in4_input
, in_input
, 4);
317 static SENSOR_DEVICE_ATTR_RW(in0_min
, in_min
, 0);
318 static SENSOR_DEVICE_ATTR_RW(in1_min
, in_min
, 1);
319 static SENSOR_DEVICE_ATTR_RW(in2_min
, in_min
, 2);
320 static SENSOR_DEVICE_ATTR_RW(in3_min
, in_min
, 3);
321 static SENSOR_DEVICE_ATTR_RW(in4_min
, in_min
, 4);
322 static SENSOR_DEVICE_ATTR_RW(in0_max
, in_max
, 0);
323 static SENSOR_DEVICE_ATTR_RW(in1_max
, in_max
, 1);
324 static SENSOR_DEVICE_ATTR_RW(in2_max
, in_max
, 2);
325 static SENSOR_DEVICE_ATTR_RW(in3_max
, in_max
, 3);
326 static SENSOR_DEVICE_ATTR_RW(in4_max
, in_max
, 4);
328 #define DIV_FROM_REG(val) (1 << (val))
329 #define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (480000 / ((val) << (div))))
331 #define FAN_BASE(div) (480000 >> (div))
332 #define FAN_CLAMP(val, div) clamp_val(val, FAN_BASE(div) / 255, \
334 #define FAN_TO_REG(val, div) ((val) == 0 ? 0 : \
335 DIV_ROUND_CLOSEST(480000, \
336 FAN_CLAMP(val, div) << (div)))
338 static ssize_t
fan_input_show(struct device
*dev
,
339 struct device_attribute
*attr
, char *buf
)
341 int n
= to_sensor_dev_attr(attr
)->index
;
342 struct gl520_data
*data
= gl520_update_device(dev
);
344 return sprintf(buf
, "%d\n", FAN_FROM_REG(data
->fan_input
[n
],
348 static ssize_t
fan_min_show(struct device
*dev
, struct device_attribute
*attr
,
351 int n
= to_sensor_dev_attr(attr
)->index
;
352 struct gl520_data
*data
= gl520_update_device(dev
);
354 return sprintf(buf
, "%d\n", FAN_FROM_REG(data
->fan_min
[n
],
358 static ssize_t
fan_div_show(struct device
*dev
, struct device_attribute
*attr
,
361 int n
= to_sensor_dev_attr(attr
)->index
;
362 struct gl520_data
*data
= gl520_update_device(dev
);
364 return sprintf(buf
, "%d\n", DIV_FROM_REG(data
->fan_div
[n
]));
367 static ssize_t
fan1_off_show(struct device
*dev
,
368 struct device_attribute
*attr
, char *buf
)
370 struct gl520_data
*data
= gl520_update_device(dev
);
371 return sprintf(buf
, "%d\n", data
->fan_off
);
374 static ssize_t
fan_min_store(struct device
*dev
,
375 struct device_attribute
*attr
, const char *buf
,
378 struct gl520_data
*data
= dev_get_drvdata(dev
);
379 struct i2c_client
*client
= data
->client
;
380 int n
= to_sensor_dev_attr(attr
)->index
;
385 err
= kstrtoul(buf
, 10, &v
);
389 mutex_lock(&data
->update_lock
);
390 r
= FAN_TO_REG(v
, data
->fan_div
[n
]);
391 data
->fan_min
[n
] = r
;
394 gl520_write_value(client
, GL520_REG_FAN_MIN
,
395 (gl520_read_value(client
, GL520_REG_FAN_MIN
)
396 & ~0xff00) | (r
<< 8));
398 gl520_write_value(client
, GL520_REG_FAN_MIN
,
399 (gl520_read_value(client
, GL520_REG_FAN_MIN
)
402 data
->beep_mask
= gl520_read_value(client
, GL520_REG_BEEP_MASK
);
403 if (data
->fan_min
[n
] == 0)
404 data
->alarm_mask
&= (n
== 0) ? ~0x20 : ~0x40;
406 data
->alarm_mask
|= (n
== 0) ? 0x20 : 0x40;
407 data
->beep_mask
&= data
->alarm_mask
;
408 gl520_write_value(client
, GL520_REG_BEEP_MASK
, data
->beep_mask
);
410 mutex_unlock(&data
->update_lock
);
414 static ssize_t
fan_div_store(struct device
*dev
,
415 struct device_attribute
*attr
, const char *buf
,
418 struct gl520_data
*data
= dev_get_drvdata(dev
);
419 struct i2c_client
*client
= data
->client
;
420 int n
= to_sensor_dev_attr(attr
)->index
;
425 err
= kstrtoul(buf
, 10, &v
);
443 dev_err(&client
->dev
,
444 "fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n", v
);
448 mutex_lock(&data
->update_lock
);
449 data
->fan_div
[n
] = r
;
452 gl520_write_value(client
, GL520_REG_FAN_DIV
,
453 (gl520_read_value(client
, GL520_REG_FAN_DIV
)
454 & ~0xc0) | (r
<< 6));
456 gl520_write_value(client
, GL520_REG_FAN_DIV
,
457 (gl520_read_value(client
, GL520_REG_FAN_DIV
)
458 & ~0x30) | (r
<< 4));
460 mutex_unlock(&data
->update_lock
);
464 static ssize_t
fan1_off_store(struct device
*dev
,
465 struct device_attribute
*attr
, const char *buf
,
468 struct gl520_data
*data
= dev_get_drvdata(dev
);
469 struct i2c_client
*client
= data
->client
;
474 err
= kstrtoul(buf
, 10, &v
);
480 mutex_lock(&data
->update_lock
);
482 gl520_write_value(client
, GL520_REG_FAN_OFF
,
483 (gl520_read_value(client
, GL520_REG_FAN_OFF
)
484 & ~0x0c) | (r
<< 2));
485 mutex_unlock(&data
->update_lock
);
489 static SENSOR_DEVICE_ATTR_RO(fan1_input
, fan_input
, 0);
490 static SENSOR_DEVICE_ATTR_RO(fan2_input
, fan_input
, 1);
491 static SENSOR_DEVICE_ATTR_RW(fan1_min
, fan_min
, 0);
492 static SENSOR_DEVICE_ATTR_RW(fan2_min
, fan_min
, 1);
493 static SENSOR_DEVICE_ATTR_RW(fan1_div
, fan_div
, 0);
494 static SENSOR_DEVICE_ATTR_RW(fan2_div
, fan_div
, 1);
495 static DEVICE_ATTR_RW(fan1_off
);
497 #define TEMP_FROM_REG(val) (((val) - 130) * 1000)
498 #define TEMP_CLAMP(val) clamp_val(val, -130000, 125000)
499 #define TEMP_TO_REG(val) (DIV_ROUND_CLOSEST(TEMP_CLAMP(val), 1000) + 130)
501 static ssize_t
temp_input_show(struct device
*dev
,
502 struct device_attribute
*attr
, char *buf
)
504 int n
= to_sensor_dev_attr(attr
)->index
;
505 struct gl520_data
*data
= gl520_update_device(dev
);
507 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_input
[n
]));
510 static ssize_t
temp_max_show(struct device
*dev
,
511 struct device_attribute
*attr
, char *buf
)
513 int n
= to_sensor_dev_attr(attr
)->index
;
514 struct gl520_data
*data
= gl520_update_device(dev
);
516 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_max
[n
]));
519 static ssize_t
temp_max_hyst_show(struct device
*dev
,
520 struct device_attribute
*attr
, char *buf
)
522 int n
= to_sensor_dev_attr(attr
)->index
;
523 struct gl520_data
*data
= gl520_update_device(dev
);
525 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_max_hyst
[n
]));
528 static ssize_t
temp_max_store(struct device
*dev
,
529 struct device_attribute
*attr
, const char *buf
,
532 struct gl520_data
*data
= dev_get_drvdata(dev
);
533 struct i2c_client
*client
= data
->client
;
534 int n
= to_sensor_dev_attr(attr
)->index
;
538 err
= kstrtol(buf
, 10, &v
);
542 mutex_lock(&data
->update_lock
);
543 data
->temp_max
[n
] = TEMP_TO_REG(v
);
544 gl520_write_value(client
, GL520_REG_TEMP_MAX
[n
], data
->temp_max
[n
]);
545 mutex_unlock(&data
->update_lock
);
549 static ssize_t
temp_max_hyst_store(struct device
*dev
,
550 struct device_attribute
*attr
,
551 const char *buf
, size_t count
)
553 struct gl520_data
*data
= dev_get_drvdata(dev
);
554 struct i2c_client
*client
= data
->client
;
555 int n
= to_sensor_dev_attr(attr
)->index
;
559 err
= kstrtol(buf
, 10, &v
);
563 mutex_lock(&data
->update_lock
);
564 data
->temp_max_hyst
[n
] = TEMP_TO_REG(v
);
565 gl520_write_value(client
, GL520_REG_TEMP_MAX_HYST
[n
],
566 data
->temp_max_hyst
[n
]);
567 mutex_unlock(&data
->update_lock
);
571 static SENSOR_DEVICE_ATTR_RO(temp1_input
, temp_input
, 0);
572 static SENSOR_DEVICE_ATTR_RO(temp2_input
, temp_input
, 1);
573 static SENSOR_DEVICE_ATTR_RW(temp1_max
, temp_max
, 0);
574 static SENSOR_DEVICE_ATTR_RW(temp2_max
, temp_max
, 1);
575 static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst
, temp_max_hyst
, 0);
576 static SENSOR_DEVICE_ATTR_RW(temp2_max_hyst
, temp_max_hyst
, 1);
578 static ssize_t
alarms_show(struct device
*dev
, struct device_attribute
*attr
,
581 struct gl520_data
*data
= gl520_update_device(dev
);
582 return sprintf(buf
, "%d\n", data
->alarms
);
585 static ssize_t
beep_enable_show(struct device
*dev
,
586 struct device_attribute
*attr
, char *buf
)
588 struct gl520_data
*data
= gl520_update_device(dev
);
589 return sprintf(buf
, "%d\n", data
->beep_enable
);
592 static ssize_t
beep_mask_show(struct device
*dev
,
593 struct device_attribute
*attr
, char *buf
)
595 struct gl520_data
*data
= gl520_update_device(dev
);
596 return sprintf(buf
, "%d\n", data
->beep_mask
);
599 static ssize_t
beep_enable_store(struct device
*dev
,
600 struct device_attribute
*attr
,
601 const char *buf
, size_t count
)
603 struct gl520_data
*data
= dev_get_drvdata(dev
);
604 struct i2c_client
*client
= data
->client
;
609 err
= kstrtoul(buf
, 10, &v
);
615 mutex_lock(&data
->update_lock
);
616 data
->beep_enable
= !r
;
617 gl520_write_value(client
, GL520_REG_BEEP_ENABLE
,
618 (gl520_read_value(client
, GL520_REG_BEEP_ENABLE
)
619 & ~0x04) | (r
<< 2));
620 mutex_unlock(&data
->update_lock
);
624 static ssize_t
beep_mask_store(struct device
*dev
,
625 struct device_attribute
*attr
, const char *buf
,
628 struct gl520_data
*data
= dev_get_drvdata(dev
);
629 struct i2c_client
*client
= data
->client
;
633 err
= kstrtoul(buf
, 10, &r
);
637 mutex_lock(&data
->update_lock
);
638 r
&= data
->alarm_mask
;
640 gl520_write_value(client
, GL520_REG_BEEP_MASK
, r
);
641 mutex_unlock(&data
->update_lock
);
645 static DEVICE_ATTR_RO(alarms
);
646 static DEVICE_ATTR_RW(beep_enable
);
647 static DEVICE_ATTR_RW(beep_mask
);
649 static ssize_t
alarm_show(struct device
*dev
, struct device_attribute
*attr
,
652 int bit_nr
= to_sensor_dev_attr(attr
)->index
;
653 struct gl520_data
*data
= gl520_update_device(dev
);
655 return sprintf(buf
, "%d\n", (data
->alarms
>> bit_nr
) & 1);
658 static SENSOR_DEVICE_ATTR_RO(in0_alarm
, alarm
, 0);
659 static SENSOR_DEVICE_ATTR_RO(in1_alarm
, alarm
, 1);
660 static SENSOR_DEVICE_ATTR_RO(in2_alarm
, alarm
, 2);
661 static SENSOR_DEVICE_ATTR_RO(in3_alarm
, alarm
, 3);
662 static SENSOR_DEVICE_ATTR_RO(temp1_alarm
, alarm
, 4);
663 static SENSOR_DEVICE_ATTR_RO(fan1_alarm
, alarm
, 5);
664 static SENSOR_DEVICE_ATTR_RO(fan2_alarm
, alarm
, 6);
665 static SENSOR_DEVICE_ATTR_RO(temp2_alarm
, alarm
, 7);
666 static SENSOR_DEVICE_ATTR_RO(in4_alarm
, alarm
, 7);
668 static ssize_t
beep_show(struct device
*dev
, struct device_attribute
*attr
,
671 int bitnr
= to_sensor_dev_attr(attr
)->index
;
672 struct gl520_data
*data
= gl520_update_device(dev
);
674 return sprintf(buf
, "%d\n", (data
->beep_mask
>> bitnr
) & 1);
677 static ssize_t
beep_store(struct device
*dev
, struct device_attribute
*attr
,
678 const char *buf
, size_t count
)
680 struct gl520_data
*data
= dev_get_drvdata(dev
);
681 struct i2c_client
*client
= data
->client
;
682 int bitnr
= to_sensor_dev_attr(attr
)->index
;
687 err
= kstrtoul(buf
, 10, &bit
);
693 mutex_lock(&data
->update_lock
);
694 data
->beep_mask
= gl520_read_value(client
, GL520_REG_BEEP_MASK
);
696 data
->beep_mask
|= (1 << bitnr
);
698 data
->beep_mask
&= ~(1 << bitnr
);
699 gl520_write_value(client
, GL520_REG_BEEP_MASK
, data
->beep_mask
);
700 mutex_unlock(&data
->update_lock
);
704 static SENSOR_DEVICE_ATTR_RW(in0_beep
, beep
, 0);
705 static SENSOR_DEVICE_ATTR_RW(in1_beep
, beep
, 1);
706 static SENSOR_DEVICE_ATTR_RW(in2_beep
, beep
, 2);
707 static SENSOR_DEVICE_ATTR_RW(in3_beep
, beep
, 3);
708 static SENSOR_DEVICE_ATTR_RW(temp1_beep
, beep
, 4);
709 static SENSOR_DEVICE_ATTR_RW(fan1_beep
, beep
, 5);
710 static SENSOR_DEVICE_ATTR_RW(fan2_beep
, beep
, 6);
711 static SENSOR_DEVICE_ATTR_RW(temp2_beep
, beep
, 7);
712 static SENSOR_DEVICE_ATTR_RW(in4_beep
, beep
, 7);
714 static struct attribute
*gl520_attributes
[] = {
715 &dev_attr_cpu0_vid
.attr
,
717 &sensor_dev_attr_in0_input
.dev_attr
.attr
,
718 &sensor_dev_attr_in0_min
.dev_attr
.attr
,
719 &sensor_dev_attr_in0_max
.dev_attr
.attr
,
720 &sensor_dev_attr_in0_alarm
.dev_attr
.attr
,
721 &sensor_dev_attr_in0_beep
.dev_attr
.attr
,
722 &sensor_dev_attr_in1_input
.dev_attr
.attr
,
723 &sensor_dev_attr_in1_min
.dev_attr
.attr
,
724 &sensor_dev_attr_in1_max
.dev_attr
.attr
,
725 &sensor_dev_attr_in1_alarm
.dev_attr
.attr
,
726 &sensor_dev_attr_in1_beep
.dev_attr
.attr
,
727 &sensor_dev_attr_in2_input
.dev_attr
.attr
,
728 &sensor_dev_attr_in2_min
.dev_attr
.attr
,
729 &sensor_dev_attr_in2_max
.dev_attr
.attr
,
730 &sensor_dev_attr_in2_alarm
.dev_attr
.attr
,
731 &sensor_dev_attr_in2_beep
.dev_attr
.attr
,
732 &sensor_dev_attr_in3_input
.dev_attr
.attr
,
733 &sensor_dev_attr_in3_min
.dev_attr
.attr
,
734 &sensor_dev_attr_in3_max
.dev_attr
.attr
,
735 &sensor_dev_attr_in3_alarm
.dev_attr
.attr
,
736 &sensor_dev_attr_in3_beep
.dev_attr
.attr
,
738 &sensor_dev_attr_fan1_input
.dev_attr
.attr
,
739 &sensor_dev_attr_fan1_min
.dev_attr
.attr
,
740 &sensor_dev_attr_fan1_div
.dev_attr
.attr
,
741 &sensor_dev_attr_fan1_alarm
.dev_attr
.attr
,
742 &sensor_dev_attr_fan1_beep
.dev_attr
.attr
,
743 &dev_attr_fan1_off
.attr
,
744 &sensor_dev_attr_fan2_input
.dev_attr
.attr
,
745 &sensor_dev_attr_fan2_min
.dev_attr
.attr
,
746 &sensor_dev_attr_fan2_div
.dev_attr
.attr
,
747 &sensor_dev_attr_fan2_alarm
.dev_attr
.attr
,
748 &sensor_dev_attr_fan2_beep
.dev_attr
.attr
,
750 &sensor_dev_attr_temp1_input
.dev_attr
.attr
,
751 &sensor_dev_attr_temp1_max
.dev_attr
.attr
,
752 &sensor_dev_attr_temp1_max_hyst
.dev_attr
.attr
,
753 &sensor_dev_attr_temp1_alarm
.dev_attr
.attr
,
754 &sensor_dev_attr_temp1_beep
.dev_attr
.attr
,
756 &dev_attr_alarms
.attr
,
757 &dev_attr_beep_enable
.attr
,
758 &dev_attr_beep_mask
.attr
,
762 static const struct attribute_group gl520_group
= {
763 .attrs
= gl520_attributes
,
766 static struct attribute
*gl520_attributes_in4
[] = {
767 &sensor_dev_attr_in4_input
.dev_attr
.attr
,
768 &sensor_dev_attr_in4_min
.dev_attr
.attr
,
769 &sensor_dev_attr_in4_max
.dev_attr
.attr
,
770 &sensor_dev_attr_in4_alarm
.dev_attr
.attr
,
771 &sensor_dev_attr_in4_beep
.dev_attr
.attr
,
775 static struct attribute
*gl520_attributes_temp2
[] = {
776 &sensor_dev_attr_temp2_input
.dev_attr
.attr
,
777 &sensor_dev_attr_temp2_max
.dev_attr
.attr
,
778 &sensor_dev_attr_temp2_max_hyst
.dev_attr
.attr
,
779 &sensor_dev_attr_temp2_alarm
.dev_attr
.attr
,
780 &sensor_dev_attr_temp2_beep
.dev_attr
.attr
,
784 static const struct attribute_group gl520_group_in4
= {
785 .attrs
= gl520_attributes_in4
,
788 static const struct attribute_group gl520_group_temp2
= {
789 .attrs
= gl520_attributes_temp2
,
797 /* Return 0 if detection is successful, -ENODEV otherwise */
798 static int gl520_detect(struct i2c_client
*client
, struct i2c_board_info
*info
)
800 struct i2c_adapter
*adapter
= client
->adapter
;
802 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
|
803 I2C_FUNC_SMBUS_WORD_DATA
))
806 /* Determine the chip type. */
807 if ((gl520_read_value(client
, GL520_REG_CHIP_ID
) != 0x20) ||
808 ((gl520_read_value(client
, GL520_REG_REVISION
) & 0x7f) != 0x00) ||
809 ((gl520_read_value(client
, GL520_REG_CONF
) & 0x80) != 0x00)) {
810 dev_dbg(&client
->dev
, "Unknown chip type, skipping\n");
814 strlcpy(info
->type
, "gl520sm", I2C_NAME_SIZE
);
819 /* Called when we have found a new GL520SM. */
820 static void gl520_init_client(struct i2c_client
*client
)
822 struct gl520_data
*data
= i2c_get_clientdata(client
);
825 conf
= oldconf
= gl520_read_value(client
, GL520_REG_CONF
);
827 data
->alarm_mask
= 0xff;
828 data
->vrm
= vid_which_vrm();
830 if (extra_sensor_type
== 1)
832 else if (extra_sensor_type
== 2)
834 data
->two_temps
= !(conf
& 0x10);
836 /* If IRQ# is disabled, we can safely force comparator mode */
840 /* Enable monitoring if needed */
844 gl520_write_value(client
, GL520_REG_CONF
, conf
);
846 gl520_update_device(&(client
->dev
));
848 if (data
->fan_min
[0] == 0)
849 data
->alarm_mask
&= ~0x20;
850 if (data
->fan_min
[1] == 0)
851 data
->alarm_mask
&= ~0x40;
853 data
->beep_mask
&= data
->alarm_mask
;
854 gl520_write_value(client
, GL520_REG_BEEP_MASK
, data
->beep_mask
);
857 static int gl520_probe(struct i2c_client
*client
,
858 const struct i2c_device_id
*id
)
860 struct device
*dev
= &client
->dev
;
861 struct device
*hwmon_dev
;
862 struct gl520_data
*data
;
864 data
= devm_kzalloc(dev
, sizeof(struct gl520_data
), GFP_KERNEL
);
868 i2c_set_clientdata(client
, data
);
869 mutex_init(&data
->update_lock
);
870 data
->client
= client
;
872 /* Initialize the GL520SM chip */
873 gl520_init_client(client
);
876 data
->groups
[0] = &gl520_group
;
879 data
->groups
[1] = &gl520_group_temp2
;
881 data
->groups
[1] = &gl520_group_in4
;
883 hwmon_dev
= devm_hwmon_device_register_with_groups(dev
, client
->name
,
885 return PTR_ERR_OR_ZERO(hwmon_dev
);
888 static const struct i2c_device_id gl520_id
[] = {
892 MODULE_DEVICE_TABLE(i2c
, gl520_id
);
894 static struct i2c_driver gl520_driver
= {
895 .class = I2C_CLASS_HWMON
,
899 .probe
= gl520_probe
,
900 .id_table
= gl520_id
,
901 .detect
= gl520_detect
,
902 .address_list
= normal_i2c
,
905 module_i2c_driver(gl520_driver
);
907 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
908 "Kyösti Mälkki <kmalkki@cc.hut.fi>, "
909 "Maarten Deprez <maartendeprez@users.sourceforge.net>");
910 MODULE_DESCRIPTION("GL520SM driver");
911 MODULE_LICENSE("GPL");