2 gl520sm.c - Part of lm_sensors, Linux kernel modules for hardware
4 Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>,
5 Kyösti Mälkki <kmalkki@cc.hut.fi>
6 Copyright (c) 2005 Maarten Deprez <maartendeprez@users.sourceforge.net>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/slab.h>
27 #include <linux/i2c.h>
28 #include <linux/i2c-sensor.h>
29 #include <linux/i2c-vid.h>
31 /* Type of the extra sensor */
32 static unsigned short extra_sensor_type
;
33 module_param(extra_sensor_type
, ushort
, 0);
34 MODULE_PARM_DESC(extra_sensor_type
, "Type of extra sensor (0=autodetect, 1=temperature, 2=voltage)");
36 /* Addresses to scan */
37 static unsigned short normal_i2c
[] = { 0x2c, 0x2d, I2C_CLIENT_END
};
38 static unsigned int normal_isa
[] = { I2C_CLIENT_ISA_END
};
40 /* Insmod parameters */
41 SENSORS_INSMOD_1(gl520sm
);
43 /* Many GL520 constants specified below
44 One of the inputs can be configured as either temp or voltage.
45 That's why _TEMP2 and _IN4 access the same register
48 /* The GL520 registers */
49 #define GL520_REG_CHIP_ID 0x00
50 #define GL520_REG_REVISION 0x01
51 #define GL520_REG_CONF 0x03
52 #define GL520_REG_MASK 0x11
54 #define GL520_REG_VID_INPUT 0x02
56 #define GL520_REG_IN0_INPUT 0x15
57 #define GL520_REG_IN0_LIMIT 0x0c
58 #define GL520_REG_IN0_MIN GL520_REG_IN0_LIMIT
59 #define GL520_REG_IN0_MAX GL520_REG_IN0_LIMIT
61 #define GL520_REG_IN1_INPUT 0x14
62 #define GL520_REG_IN1_LIMIT 0x09
63 #define GL520_REG_IN1_MIN GL520_REG_IN1_LIMIT
64 #define GL520_REG_IN1_MAX GL520_REG_IN1_LIMIT
66 #define GL520_REG_IN2_INPUT 0x13
67 #define GL520_REG_IN2_LIMIT 0x0a
68 #define GL520_REG_IN2_MIN GL520_REG_IN2_LIMIT
69 #define GL520_REG_IN2_MAX GL520_REG_IN2_LIMIT
71 #define GL520_REG_IN3_INPUT 0x0d
72 #define GL520_REG_IN3_LIMIT 0x0b
73 #define GL520_REG_IN3_MIN GL520_REG_IN3_LIMIT
74 #define GL520_REG_IN3_MAX GL520_REG_IN3_LIMIT
76 #define GL520_REG_IN4_INPUT 0x0e
77 #define GL520_REG_IN4_MAX 0x17
78 #define GL520_REG_IN4_MIN 0x18
80 #define GL520_REG_TEMP1_INPUT 0x04
81 #define GL520_REG_TEMP1_MAX 0x05
82 #define GL520_REG_TEMP1_MAX_HYST 0x06
84 #define GL520_REG_TEMP2_INPUT 0x0e
85 #define GL520_REG_TEMP2_MAX 0x17
86 #define GL520_REG_TEMP2_MAX_HYST 0x18
88 #define GL520_REG_FAN_INPUT 0x07
89 #define GL520_REG_FAN_MIN 0x08
90 #define GL520_REG_FAN_DIV 0x0f
91 #define GL520_REG_FAN_OFF GL520_REG_FAN_DIV
93 #define GL520_REG_ALARMS 0x12
94 #define GL520_REG_BEEP_MASK 0x10
95 #define GL520_REG_BEEP_ENABLE GL520_REG_CONF
98 * Function declarations
101 static int gl520_attach_adapter(struct i2c_adapter
*adapter
);
102 static int gl520_detect(struct i2c_adapter
*adapter
, int address
, int kind
);
103 static void gl520_init_client(struct i2c_client
*client
);
104 static int gl520_detach_client(struct i2c_client
*client
);
105 static int gl520_read_value(struct i2c_client
*client
, u8 reg
);
106 static int gl520_write_value(struct i2c_client
*client
, u8 reg
, u16 value
);
107 static struct gl520_data
*gl520_update_device(struct device
*dev
);
110 static struct i2c_driver gl520_driver
= {
111 .owner
= THIS_MODULE
,
113 .id
= I2C_DRIVERID_GL520
,
114 .flags
= I2C_DF_NOTIFY
,
115 .attach_adapter
= gl520_attach_adapter
,
116 .detach_client
= gl520_detach_client
,
121 struct i2c_client client
;
122 struct semaphore update_lock
;
123 char valid
; /* zero until the following fields are valid */
124 unsigned long last_updated
; /* in jiffies */
128 u8 in_input
[5]; /* [0] = VVD */
129 u8 in_min
[5]; /* [0] = VDD */
130 u8 in_max
[5]; /* [0] = VDD */
149 #define sysfs_r(type, n, item, reg) \
150 static ssize_t get_##type##item (struct gl520_data *, char *, int); \
151 static ssize_t get_##type##n##item (struct device *, char *); \
152 static ssize_t get_##type##n##item (struct device *dev, char *buf) \
154 struct gl520_data *data = gl520_update_device(dev); \
155 return get_##type##item(data, buf, (n)); \
158 #define sysfs_w(type, n, item, reg) \
159 static ssize_t set_##type##item (struct i2c_client *, struct gl520_data *, const char *, size_t, int, int); \
160 static ssize_t set_##type##n##item (struct device *, const char *, size_t); \
161 static ssize_t set_##type##n##item (struct device *dev, const char *buf, size_t count) \
163 struct i2c_client *client = to_i2c_client(dev); \
164 struct gl520_data *data = i2c_get_clientdata(client); \
165 return set_##type##item(client, data, buf, count, (n), reg); \
168 #define sysfs_rw_n(type, n, item, reg) \
169 sysfs_r(type, n, item, reg) \
170 sysfs_w(type, n, item, reg) \
171 static DEVICE_ATTR(type##n##item, S_IRUGO | S_IWUSR, get_##type##n##item, set_##type##n##item);
173 #define sysfs_ro_n(type, n, item, reg) \
174 sysfs_r(type, n, item, reg) \
175 static DEVICE_ATTR(type##n##item, S_IRUGO, get_##type##n##item, NULL);
177 #define sysfs_rw(type, item, reg) \
178 sysfs_r(type, 0, item, reg) \
179 sysfs_w(type, 0, item, reg) \
180 static DEVICE_ATTR(type##item, S_IRUGO | S_IWUSR, get_##type##0##item, set_##type##0##item);
182 #define sysfs_ro(type, item, reg) \
183 sysfs_r(type, 0, item, reg) \
184 static DEVICE_ATTR(type##item, S_IRUGO, get_##type##0##item, NULL);
187 #define sysfs_vid(n) \
188 sysfs_ro_n(cpu, n, _vid, GL520_REG_VID_INPUT)
190 #define device_create_file_vid(client, n) \
191 device_create_file(&client->dev, &dev_attr_cpu##n##_vid)
193 #define sysfs_in(n) \
194 sysfs_ro_n(in, n, _input, GL520_REG_IN##n##INPUT) \
195 sysfs_rw_n(in, n, _min, GL520_REG_IN##n##_MIN) \
196 sysfs_rw_n(in, n, _max, GL520_REG_IN##n##_MAX) \
198 #define device_create_file_in(client, n) \
199 ({device_create_file(&client->dev, &dev_attr_in##n##_input); \
200 device_create_file(&client->dev, &dev_attr_in##n##_min); \
201 device_create_file(&client->dev, &dev_attr_in##n##_max);})
203 #define sysfs_fan(n) \
204 sysfs_ro_n(fan, n, _input, GL520_REG_FAN_INPUT) \
205 sysfs_rw_n(fan, n, _min, GL520_REG_FAN_MIN) \
206 sysfs_rw_n(fan, n, _div, GL520_REG_FAN_DIV)
208 #define device_create_file_fan(client, n) \
209 ({device_create_file(&client->dev, &dev_attr_fan##n##_input); \
210 device_create_file(&client->dev, &dev_attr_fan##n##_min); \
211 device_create_file(&client->dev, &dev_attr_fan##n##_div);})
213 #define sysfs_fan_off(n) \
214 sysfs_rw_n(fan, n, _off, GL520_REG_FAN_OFF) \
216 #define device_create_file_fan_off(client, n) \
217 device_create_file(&client->dev, &dev_attr_fan##n##_off)
219 #define sysfs_temp(n) \
220 sysfs_ro_n(temp, n, _input, GL520_REG_TEMP##n##_INPUT) \
221 sysfs_rw_n(temp, n, _max, GL520_REG_TEMP##n##_MAX) \
222 sysfs_rw_n(temp, n, _max_hyst, GL520_REG_TEMP##n##_MAX_HYST)
224 #define device_create_file_temp(client, n) \
225 ({device_create_file(&client->dev, &dev_attr_temp##n##_input); \
226 device_create_file(&client->dev, &dev_attr_temp##n##_max); \
227 device_create_file(&client->dev, &dev_attr_temp##n##_max_hyst);})
229 #define sysfs_alarms() \
230 sysfs_ro(alarms, , GL520_REG_ALARMS) \
231 sysfs_rw(beep_enable, , GL520_REG_BEEP_ENABLE) \
232 sysfs_rw(beep_mask, , GL520_REG_BEEP_MASK)
234 #define device_create_file_alarms(client) \
235 ({device_create_file(&client->dev, &dev_attr_alarms); \
236 device_create_file(&client->dev, &dev_attr_beep_enable); \
237 device_create_file(&client->dev, &dev_attr_beep_mask);})
258 static ssize_t
get_cpu_vid(struct gl520_data
*data
, char *buf
, int n
)
260 return sprintf(buf
, "%u\n", vid_from_reg(data
->vid
, data
->vrm
));
263 #define VDD_FROM_REG(val) (((val)*95+2)/4)
264 #define VDD_TO_REG(val) (SENSORS_LIMIT((((val)*4+47)/95),0,255))
266 #define IN_FROM_REG(val) ((val)*19)
267 #define IN_TO_REG(val) (SENSORS_LIMIT((((val)+9)/19),0,255))
269 static ssize_t
get_in_input(struct gl520_data
*data
, char *buf
, int n
)
271 u8 r
= data
->in_input
[n
];
274 return sprintf(buf
, "%d\n", VDD_FROM_REG(r
));
276 return sprintf(buf
, "%d\n", IN_FROM_REG(r
));
279 static ssize_t
get_in_min(struct gl520_data
*data
, char *buf
, int n
)
281 u8 r
= data
->in_min
[n
];
284 return sprintf(buf
, "%d\n", VDD_FROM_REG(r
));
286 return sprintf(buf
, "%d\n", IN_FROM_REG(r
));
289 static ssize_t
get_in_max(struct gl520_data
*data
, char *buf
, int n
)
291 u8 r
= data
->in_max
[n
];
294 return sprintf(buf
, "%d\n", VDD_FROM_REG(r
));
296 return sprintf(buf
, "%d\n", IN_FROM_REG(r
));
299 static ssize_t
set_in_min(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
301 long v
= simple_strtol(buf
, NULL
, 10);
304 down(&data
->update_lock
);
314 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0xff) | r
);
316 gl520_write_value(client
, reg
, r
);
318 up(&data
->update_lock
);
322 static ssize_t
set_in_max(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
324 long v
= simple_strtol(buf
, NULL
, 10);
332 down(&data
->update_lock
);
337 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0xff00) | (r
<< 8));
339 gl520_write_value(client
, reg
, r
);
341 up(&data
->update_lock
);
345 #define DIV_FROM_REG(val) (1 << (val))
346 #define FAN_FROM_REG(val,div) ((val)==0 ? 0 : (480000/((val) << (div))))
347 #define FAN_TO_REG(val,div) ((val)<=0?0:SENSORS_LIMIT((480000 + ((val) << ((div)-1))) / ((val) << (div)), 1, 255));
349 static ssize_t
get_fan_input(struct gl520_data
*data
, char *buf
, int n
)
351 return sprintf(buf
, "%d\n", FAN_FROM_REG(data
->fan_input
[n
- 1], data
->fan_div
[n
- 1]));
354 static ssize_t
get_fan_min(struct gl520_data
*data
, char *buf
, int n
)
356 return sprintf(buf
, "%d\n", FAN_FROM_REG(data
->fan_min
[n
- 1], data
->fan_div
[n
- 1]));
359 static ssize_t
get_fan_div(struct gl520_data
*data
, char *buf
, int n
)
361 return sprintf(buf
, "%d\n", DIV_FROM_REG(data
->fan_div
[n
- 1]));
364 static ssize_t
get_fan_off(struct gl520_data
*data
, char *buf
, int n
)
366 return sprintf(buf
, "%d\n", data
->fan_off
);
369 static ssize_t
set_fan_min(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
371 unsigned long v
= simple_strtoul(buf
, NULL
, 10);
374 down(&data
->update_lock
);
375 r
= FAN_TO_REG(v
, data
->fan_div
[n
- 1]);
376 data
->fan_min
[n
- 1] = r
;
379 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0xff00) | (r
<< 8));
381 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0xff) | r
);
383 data
->beep_mask
= gl520_read_value(client
, GL520_REG_BEEP_MASK
);
384 if (data
->fan_min
[n
- 1] == 0)
385 data
->alarm_mask
&= (n
== 1) ? ~0x20 : ~0x40;
387 data
->alarm_mask
|= (n
== 1) ? 0x20 : 0x40;
388 data
->beep_mask
&= data
->alarm_mask
;
389 gl520_write_value(client
, GL520_REG_BEEP_MASK
, data
->beep_mask
);
391 up(&data
->update_lock
);
395 static ssize_t
set_fan_div(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
397 unsigned long v
= simple_strtoul(buf
, NULL
, 10);
401 case 1: r
= 0; break;
402 case 2: r
= 1; break;
403 case 4: r
= 2; break;
404 case 8: r
= 3; break;
406 dev_err(&client
->dev
, "fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n", v
);
410 down(&data
->update_lock
);
411 data
->fan_div
[n
- 1] = r
;
414 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0xc0) | (r
<< 6));
416 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0x30) | (r
<< 4));
418 up(&data
->update_lock
);
422 static ssize_t
set_fan_off(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
424 u8 r
= simple_strtoul(buf
, NULL
, 10)?1:0;
426 down(&data
->update_lock
);
428 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0x0c) | (r
<< 2));
429 up(&data
->update_lock
);
433 #define TEMP_FROM_REG(val) (((val) - 130) * 1000)
434 #define TEMP_TO_REG(val) (SENSORS_LIMIT(((((val)<0?(val)-500:(val)+500) / 1000)+130),0,255))
436 static ssize_t
get_temp_input(struct gl520_data
*data
, char *buf
, int n
)
438 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_input
[n
- 1]));
441 static ssize_t
get_temp_max(struct gl520_data
*data
, char *buf
, int n
)
443 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_max
[n
- 1]));
446 static ssize_t
get_temp_max_hyst(struct gl520_data
*data
, char *buf
, int n
)
448 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_max_hyst
[n
- 1]));
451 static ssize_t
set_temp_max(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
453 long v
= simple_strtol(buf
, NULL
, 10);
455 down(&data
->update_lock
);
456 data
->temp_max
[n
- 1] = TEMP_TO_REG(v
);;
457 gl520_write_value(client
, reg
, data
->temp_max
[n
- 1]);
458 up(&data
->update_lock
);
462 static ssize_t
set_temp_max_hyst(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
464 long v
= simple_strtol(buf
, NULL
, 10);
466 down(&data
->update_lock
);
467 data
->temp_max_hyst
[n
- 1] = TEMP_TO_REG(v
);
468 gl520_write_value(client
, reg
, data
->temp_max_hyst
[n
- 1]);
469 up(&data
->update_lock
);
473 static ssize_t
get_alarms(struct gl520_data
*data
, char *buf
, int n
)
475 return sprintf(buf
, "%d\n", data
->alarms
);
478 static ssize_t
get_beep_enable(struct gl520_data
*data
, char *buf
, int n
)
480 return sprintf(buf
, "%d\n", data
->beep_enable
);
483 static ssize_t
get_beep_mask(struct gl520_data
*data
, char *buf
, int n
)
485 return sprintf(buf
, "%d\n", data
->beep_mask
);
488 static ssize_t
set_beep_enable(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
490 u8 r
= simple_strtoul(buf
, NULL
, 10)?0:1;
492 down(&data
->update_lock
);
493 data
->beep_enable
= !r
;
494 gl520_write_value(client
, reg
, (gl520_read_value(client
, reg
) & ~0x04) | (r
<< 2));
495 up(&data
->update_lock
);
499 static ssize_t
set_beep_mask(struct i2c_client
*client
, struct gl520_data
*data
, const char *buf
, size_t count
, int n
, int reg
)
501 u8 r
= simple_strtoul(buf
, NULL
, 10);
503 down(&data
->update_lock
);
504 r
&= data
->alarm_mask
;
506 gl520_write_value(client
, reg
, r
);
507 up(&data
->update_lock
);
516 static int gl520_attach_adapter(struct i2c_adapter
*adapter
)
518 if (!(adapter
->class & I2C_CLASS_HWMON
))
520 return i2c_detect(adapter
, &addr_data
, gl520_detect
);
523 static int gl520_detect(struct i2c_adapter
*adapter
, int address
, int kind
)
525 struct i2c_client
*new_client
;
526 struct gl520_data
*data
;
529 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
|
530 I2C_FUNC_SMBUS_WORD_DATA
))
533 /* OK. For now, we presume we have a valid client. We now create the
534 client structure, even though we cannot fill it completely yet.
535 But it allows us to access gl520_{read,write}_value. */
537 if (!(data
= kmalloc(sizeof(struct gl520_data
), GFP_KERNEL
))) {
541 memset(data
, 0, sizeof(struct gl520_data
));
543 new_client
= &data
->client
;
544 i2c_set_clientdata(new_client
, data
);
545 new_client
->addr
= address
;
546 new_client
->adapter
= adapter
;
547 new_client
->driver
= &gl520_driver
;
548 new_client
->flags
= 0;
550 /* Determine the chip type. */
552 if ((gl520_read_value(new_client
, GL520_REG_CHIP_ID
) != 0x20) ||
553 ((gl520_read_value(new_client
, GL520_REG_REVISION
) & 0x7f) != 0x00) ||
554 ((gl520_read_value(new_client
, GL520_REG_CONF
) & 0x80) != 0x00)) {
555 dev_dbg(&new_client
->dev
, "Unknown chip type, skipping\n");
560 /* Fill in the remaining client fields */
561 strlcpy(new_client
->name
, "gl520sm", I2C_NAME_SIZE
);
563 init_MUTEX(&data
->update_lock
);
565 /* Tell the I2C layer a new client has arrived */
566 if ((err
= i2c_attach_client(new_client
)))
569 /* Initialize the GL520SM chip */
570 gl520_init_client(new_client
);
572 /* Register sysfs hooks */
573 device_create_file_vid(new_client
, 0);
575 device_create_file_in(new_client
, 0);
576 device_create_file_in(new_client
, 1);
577 device_create_file_in(new_client
, 2);
578 device_create_file_in(new_client
, 3);
579 if (!data
->two_temps
)
580 device_create_file_in(new_client
, 4);
582 device_create_file_fan(new_client
, 1);
583 device_create_file_fan(new_client
, 2);
584 device_create_file_fan_off(new_client
, 1);
586 device_create_file_temp(new_client
, 1);
588 device_create_file_temp(new_client
, 2);
590 device_create_file_alarms(new_client
);
601 /* Called when we have found a new GL520SM. */
602 static void gl520_init_client(struct i2c_client
*client
)
604 struct gl520_data
*data
= i2c_get_clientdata(client
);
607 conf
= oldconf
= gl520_read_value(client
, GL520_REG_CONF
);
609 data
->alarm_mask
= 0xff;
610 data
->vrm
= i2c_which_vrm();
612 if (extra_sensor_type
== 1)
614 else if (extra_sensor_type
== 2)
616 data
->two_temps
= !(conf
& 0x10);
618 /* If IRQ# is disabled, we can safely force comparator mode */
622 /* Enable monitoring if needed */
626 gl520_write_value(client
, GL520_REG_CONF
, conf
);
628 gl520_update_device(&(client
->dev
));
630 if (data
->fan_min
[0] == 0)
631 data
->alarm_mask
&= ~0x20;
632 if (data
->fan_min
[1] == 0)
633 data
->alarm_mask
&= ~0x40;
635 data
->beep_mask
&= data
->alarm_mask
;
636 gl520_write_value(client
, GL520_REG_BEEP_MASK
, data
->beep_mask
);
639 static int gl520_detach_client(struct i2c_client
*client
)
643 if ((err
= i2c_detach_client(client
))) {
644 dev_err(&client
->dev
, "Client deregistration failed, "
645 "client not detached.\n");
649 kfree(i2c_get_clientdata(client
));
654 /* Registers 0x07 to 0x0c are word-sized, others are byte-sized
655 GL520 uses a high-byte first convention */
656 static int gl520_read_value(struct i2c_client
*client
, u8 reg
)
658 if ((reg
>= 0x07) && (reg
<= 0x0c))
659 return swab16(i2c_smbus_read_word_data(client
, reg
));
661 return i2c_smbus_read_byte_data(client
, reg
);
664 static int gl520_write_value(struct i2c_client
*client
, u8 reg
, u16 value
)
666 if ((reg
>= 0x07) && (reg
<= 0x0c))
667 return i2c_smbus_write_word_data(client
, reg
, swab16(value
));
669 return i2c_smbus_write_byte_data(client
, reg
, value
);
673 static struct gl520_data
*gl520_update_device(struct device
*dev
)
675 struct i2c_client
*client
= to_i2c_client(dev
);
676 struct gl520_data
*data
= i2c_get_clientdata(client
);
679 down(&data
->update_lock
);
681 if ((jiffies
- data
->last_updated
> 2 * HZ
) ||
682 (jiffies
< data
->last_updated
) || !data
->valid
) {
684 dev_dbg(&client
->dev
, "Starting gl520sm update\n");
686 data
->alarms
= gl520_read_value(client
, GL520_REG_ALARMS
);
687 data
->beep_mask
= gl520_read_value(client
, GL520_REG_BEEP_MASK
);
688 data
->vid
= gl520_read_value(client
, GL520_REG_VID_INPUT
) & 0x1f;
690 val
= gl520_read_value(client
, GL520_REG_IN0_LIMIT
);
691 data
->in_min
[0] = val
& 0xff;
692 data
->in_max
[0] = (val
>> 8) & 0xff;
693 val
= gl520_read_value(client
, GL520_REG_IN1_LIMIT
);
694 data
->in_min
[1] = val
& 0xff;
695 data
->in_max
[1] = (val
>> 8) & 0xff;
696 val
= gl520_read_value(client
, GL520_REG_IN2_LIMIT
);
697 data
->in_min
[2] = val
& 0xff;
698 data
->in_max
[2] = (val
>> 8) & 0xff;
699 val
= gl520_read_value(client
, GL520_REG_IN3_LIMIT
);
700 data
->in_min
[3] = val
& 0xff;
701 data
->in_max
[3] = (val
>> 8) & 0xff;
703 val
= gl520_read_value(client
, GL520_REG_FAN_INPUT
);
704 data
->fan_input
[0] = (val
>> 8) & 0xff;
705 data
->fan_input
[1] = val
& 0xff;
707 val
= gl520_read_value(client
, GL520_REG_FAN_MIN
);
708 data
->fan_min
[0] = (val
>> 8) & 0xff;
709 data
->fan_min
[1] = val
& 0xff;
711 data
->temp_input
[0] = gl520_read_value(client
, GL520_REG_TEMP1_INPUT
);
712 data
->temp_max
[0] = gl520_read_value(client
, GL520_REG_TEMP1_MAX
);
713 data
->temp_max_hyst
[0] = gl520_read_value(client
, GL520_REG_TEMP1_MAX_HYST
);
715 val
= gl520_read_value(client
, GL520_REG_FAN_DIV
);
716 data
->fan_div
[0] = (val
>> 6) & 0x03;
717 data
->fan_div
[1] = (val
>> 4) & 0x03;
718 data
->fan_off
= (val
>> 2) & 0x01;
720 data
->alarms
&= data
->alarm_mask
;
722 val
= gl520_read_value(client
, GL520_REG_CONF
);
723 data
->beep_enable
= !((val
>> 2) & 1);
725 data
->in_input
[0] = gl520_read_value(client
, GL520_REG_IN0_INPUT
);
726 data
->in_input
[1] = gl520_read_value(client
, GL520_REG_IN1_INPUT
);
727 data
->in_input
[2] = gl520_read_value(client
, GL520_REG_IN2_INPUT
);
728 data
->in_input
[3] = gl520_read_value(client
, GL520_REG_IN3_INPUT
);
730 /* Temp1 and Vin4 are the same input */
731 if (data
->two_temps
) {
732 data
->temp_input
[1] = gl520_read_value(client
, GL520_REG_TEMP2_INPUT
);
733 data
->temp_max
[1] = gl520_read_value(client
, GL520_REG_TEMP2_MAX
);
734 data
->temp_max_hyst
[1] = gl520_read_value(client
, GL520_REG_TEMP2_MAX_HYST
);
736 data
->in_input
[4] = gl520_read_value(client
, GL520_REG_IN4_INPUT
);
737 data
->in_min
[4] = gl520_read_value(client
, GL520_REG_IN4_MIN
);
738 data
->in_max
[4] = gl520_read_value(client
, GL520_REG_IN4_MAX
);
741 data
->last_updated
= jiffies
;
745 up(&data
->update_lock
);
751 static int __init
sensors_gl520sm_init(void)
753 return i2c_add_driver(&gl520_driver
);
756 static void __exit
sensors_gl520sm_exit(void)
758 i2c_del_driver(&gl520_driver
);
762 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
763 "Kyösti Mälkki <kmalkki@cc.hut.fi>, "
764 "Maarten Deprez <maartendeprez@users.sourceforge.net>");
765 MODULE_DESCRIPTION("GL520SM driver");
766 MODULE_LICENSE("GPL");
768 module_init(sensors_gl520sm_init
);
769 module_exit(sensors_gl520sm_exit
);