1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * Merged Fujitsu Siemens hwmon driver, supporting the Poseidon, Hermes,
10 * Scylla, Heracles, Heimdall, Hades and Syleus chips
12 * Based on the original 2.4 fscscy, 2.6 fscpos, 2.6 fscher and 2.6
13 * (candidate) fschmd drivers:
14 * Copyright (C) 2006 Thilo Cestonaro
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/jiffies.h>
26 #include <linux/i2c.h>
27 #include <linux/hwmon.h>
28 #include <linux/hwmon-sysfs.h>
29 #include <linux/err.h>
30 #include <linux/mutex.h>
31 #include <linux/sysfs.h>
32 #include <linux/dmi.h>
34 #include <linux/watchdog.h>
35 #include <linux/miscdevice.h>
36 #include <linux/uaccess.h>
37 #include <linux/kref.h>
39 /* Addresses to scan */
40 static const unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END };
42 /* Insmod parameters */
43 static bool nowayout = WATCHDOG_NOWAYOUT;
44 module_param(nowayout, bool, 0);
45 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
46 __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
48 enum chips { fscpos, fscher, fscscy, fschrc, fschmd, fschds, fscsyl };
51 * The FSCHMD registers and other defines
54 /* chip identification */
55 #define FSCHMD_REG_IDENT_0 0x00
56 #define FSCHMD_REG_IDENT_1 0x01
57 #define FSCHMD_REG_IDENT_2 0x02
58 #define FSCHMD_REG_REVISION 0x03
60 /* global control and status */
61 #define FSCHMD_REG_EVENT_STATE 0x04
62 #define FSCHMD_REG_CONTROL 0x05
64 #define FSCHMD_CONTROL_ALERT_LED 0x01
67 static const u8 FSCHMD_REG_WDOG_CONTROL[7] = {
68 0x21, 0x21, 0x21, 0x21, 0x21, 0x28, 0x28 };
69 static const u8 FSCHMD_REG_WDOG_STATE[7] = {
70 0x23, 0x23, 0x23, 0x23, 0x23, 0x29, 0x29 };
71 static const u8 FSCHMD_REG_WDOG_PRESET[7] = {
72 0x28, 0x28, 0x28, 0x28, 0x28, 0x2a, 0x2a };
74 #define FSCHMD_WDOG_CONTROL_TRIGGER 0x10
75 #define FSCHMD_WDOG_CONTROL_STARTED 0x10 /* the same as trigger */
76 #define FSCHMD_WDOG_CONTROL_STOP 0x20
77 #define FSCHMD_WDOG_CONTROL_RESOLUTION 0x40
79 #define FSCHMD_WDOG_STATE_CARDRESET 0x02
81 /* voltages, weird order is to keep the same order as the old drivers */
82 static const u8 FSCHMD_REG_VOLT[7][6] = {
83 { 0x45, 0x42, 0x48 }, /* pos */
84 { 0x45, 0x42, 0x48 }, /* her */
85 { 0x45, 0x42, 0x48 }, /* scy */
86 { 0x45, 0x42, 0x48 }, /* hrc */
87 { 0x45, 0x42, 0x48 }, /* hmd */
88 { 0x21, 0x20, 0x22 }, /* hds */
89 { 0x21, 0x20, 0x22, 0x23, 0x24, 0x25 }, /* syl */
92 static const int FSCHMD_NO_VOLT_SENSORS[7] = { 3, 3, 3, 3, 3, 3, 6 };
95 * minimum pwm at which the fan is driven (pwm can be increased depending on
96 * the temp. Notice that for the scy some fans share there minimum speed.
97 * Also notice that with the scy the sensor order is different than with the
98 * other chips, this order was in the 2.4 driver and kept for consistency.
100 static const u8 FSCHMD_REG_FAN_MIN[7][7] = {
101 { 0x55, 0x65 }, /* pos */
102 { 0x55, 0x65, 0xb5 }, /* her */
103 { 0x65, 0x65, 0x55, 0xa5, 0x55, 0xa5 }, /* scy */
104 { 0x55, 0x65, 0xa5, 0xb5 }, /* hrc */
105 { 0x55, 0x65, 0xa5, 0xb5, 0xc5 }, /* hmd */
106 { 0x55, 0x65, 0xa5, 0xb5, 0xc5 }, /* hds */
107 { 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb4 }, /* syl */
110 /* actual fan speed */
111 static const u8 FSCHMD_REG_FAN_ACT[7][7] = {
112 { 0x0e, 0x6b, 0xab }, /* pos */
113 { 0x0e, 0x6b, 0xbb }, /* her */
114 { 0x6b, 0x6c, 0x0e, 0xab, 0x5c, 0xbb }, /* scy */
115 { 0x0e, 0x6b, 0xab, 0xbb }, /* hrc */
116 { 0x5b, 0x6b, 0xab, 0xbb, 0xcb }, /* hmd */
117 { 0x5b, 0x6b, 0xab, 0xbb, 0xcb }, /* hds */
118 { 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7 }, /* syl */
121 /* fan status registers */
122 static const u8 FSCHMD_REG_FAN_STATE[7][7] = {
123 { 0x0d, 0x62, 0xa2 }, /* pos */
124 { 0x0d, 0x62, 0xb2 }, /* her */
125 { 0x62, 0x61, 0x0d, 0xa2, 0x52, 0xb2 }, /* scy */
126 { 0x0d, 0x62, 0xa2, 0xb2 }, /* hrc */
127 { 0x52, 0x62, 0xa2, 0xb2, 0xc2 }, /* hmd */
128 { 0x52, 0x62, 0xa2, 0xb2, 0xc2 }, /* hds */
129 { 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0 }, /* syl */
132 /* fan ripple / divider registers */
133 static const u8 FSCHMD_REG_FAN_RIPPLE[7][7] = {
134 { 0x0f, 0x6f, 0xaf }, /* pos */
135 { 0x0f, 0x6f, 0xbf }, /* her */
136 { 0x6f, 0x6f, 0x0f, 0xaf, 0x0f, 0xbf }, /* scy */
137 { 0x0f, 0x6f, 0xaf, 0xbf }, /* hrc */
138 { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf }, /* hmd */
139 { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf }, /* hds */
140 { 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6 }, /* syl */
143 static const int FSCHMD_NO_FAN_SENSORS[7] = { 3, 3, 6, 4, 5, 5, 7 };
145 /* Fan status register bitmasks */
146 #define FSCHMD_FAN_ALARM 0x04 /* called fault by FSC! */
147 #define FSCHMD_FAN_NOT_PRESENT 0x08
148 #define FSCHMD_FAN_DISABLED 0x80
151 /* actual temperature registers */
152 static const u8 FSCHMD_REG_TEMP_ACT[7][11] = {
153 { 0x64, 0x32, 0x35 }, /* pos */
154 { 0x64, 0x32, 0x35 }, /* her */
155 { 0x64, 0xD0, 0x32, 0x35 }, /* scy */
156 { 0x64, 0x32, 0x35 }, /* hrc */
157 { 0x70, 0x80, 0x90, 0xd0, 0xe0 }, /* hmd */
158 { 0x70, 0x80, 0x90, 0xd0, 0xe0 }, /* hds */
159 { 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8, /* syl */
160 0xb8, 0xc8, 0xd8, 0xe8, 0xf8 },
163 /* temperature state registers */
164 static const u8 FSCHMD_REG_TEMP_STATE[7][11] = {
165 { 0x71, 0x81, 0x91 }, /* pos */
166 { 0x71, 0x81, 0x91 }, /* her */
167 { 0x71, 0xd1, 0x81, 0x91 }, /* scy */
168 { 0x71, 0x81, 0x91 }, /* hrc */
169 { 0x71, 0x81, 0x91, 0xd1, 0xe1 }, /* hmd */
170 { 0x71, 0x81, 0x91, 0xd1, 0xe1 }, /* hds */
171 { 0x59, 0x69, 0x79, 0x89, 0x99, 0xa9, /* syl */
172 0xb9, 0xc9, 0xd9, 0xe9, 0xf9 },
176 * temperature high limit registers, FSC does not document these. Proven to be
177 * there with field testing on the fscher and fschrc, already supported / used
178 * in the fscscy 2.4 driver. FSC has confirmed that the fschmd has registers
179 * at these addresses, but doesn't want to confirm they are the same as with
182 static const u8 FSCHMD_REG_TEMP_LIMIT[7][11] = {
183 { 0, 0, 0 }, /* pos */
184 { 0x76, 0x86, 0x96 }, /* her */
185 { 0x76, 0xd6, 0x86, 0x96 }, /* scy */
186 { 0x76, 0x86, 0x96 }, /* hrc */
187 { 0x76, 0x86, 0x96, 0xd6, 0xe6 }, /* hmd */
188 { 0x76, 0x86, 0x96, 0xd6, 0xe6 }, /* hds */
189 { 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, /* syl */
190 0xba, 0xca, 0xda, 0xea, 0xfa },
194 * These were found through experimenting with an fscher, currently they are
195 * not used, but we keep them around for future reference.
196 * On the fscsyl AUTOP1 lives at 0x#c (so 0x5c for fan1, 0x6c for fan2, etc),
197 * AUTOP2 lives at 0x#e, and 0x#1 is a bitmask defining which temps influence
199 * static const u8 FSCHER_REG_TEMP_AUTOP1[] = { 0x73, 0x83, 0x93 };
200 * static const u8 FSCHER_REG_TEMP_AUTOP2[] = { 0x75, 0x85, 0x95 };
203 static const int FSCHMD_NO_TEMP_SENSORS[7] = { 3, 3, 4, 3, 5, 5, 11 };
205 /* temp status register bitmasks */
206 #define FSCHMD_TEMP_WORKING 0x01
207 #define FSCHMD_TEMP_ALERT 0x02
208 #define FSCHMD_TEMP_DISABLED 0x80
209 /* there only really is an alarm if the sensor is working and alert == 1 */
210 #define FSCHMD_TEMP_ALARM_MASK \
211 (FSCHMD_TEMP_WORKING | FSCHMD_TEMP_ALERT)
214 * Functions declarations
217 static int fschmd_probe(struct i2c_client *client,
218 const struct i2c_device_id *id);
219 static int fschmd_detect(struct i2c_client *client,
220 struct i2c_board_info *info);
221 static int fschmd_remove(struct i2c_client *client);
222 static struct fschmd_data *fschmd_update_device(struct device *dev);
225 * Driver data (common to all clients)
228 static const struct i2c_device_id fschmd_id[] = {
229 { "fscpos", fscpos },
230 { "fscher", fscher },
231 { "fscscy", fscscy },
232 { "fschrc", fschrc },
233 { "fschmd", fschmd },
234 { "fschds", fschds },
235 { "fscsyl", fscsyl },
238 MODULE_DEVICE_TABLE(i2c, fschmd_id);
240 static struct i2c_driver fschmd_driver = {
241 .class = I2C_CLASS_HWMON,
245 .probe = fschmd_probe,
246 .remove = fschmd_remove,
247 .id_table = fschmd_id,
248 .detect = fschmd_detect,
249 .address_list = normal_i2c,
253 * Client data (each client gets its own)
257 struct i2c_client *client;
258 struct device *hwmon_dev;
259 struct mutex update_lock;
260 struct mutex watchdog_lock;
261 struct list_head list; /* member of the watchdog_data_list */
263 struct miscdevice watchdog_miscdev;
265 unsigned long watchdog_is_open;
266 char watchdog_expect_close;
267 char watchdog_name[10]; /* must be unique to avoid sysfs conflict */
268 char valid; /* zero until following fields are valid */
269 unsigned long last_updated; /* in jiffies */
271 /* register values */
272 u8 revision; /* chip revision */
273 u8 global_control; /* global control register */
274 u8 watchdog_control; /* watchdog control register */
275 u8 watchdog_state; /* watchdog status register */
276 u8 watchdog_preset; /* watchdog counter preset on trigger val */
277 u8 volt[6]; /* voltage */
278 u8 temp_act[11]; /* temperature */
279 u8 temp_status[11]; /* status of sensor */
280 u8 temp_max[11]; /* high temp limit, notice: undocumented! */
281 u8 fan_act[7]; /* fans revolutions per second */
282 u8 fan_status[7]; /* fan status */
283 u8 fan_min[7]; /* fan min value for rps */
284 u8 fan_ripple[7]; /* divider for rps */
288 * Global variables to hold information read from special DMI tables, which are
289 * available on FSC machines with an fscher or later chip. There is no need to
290 * protect these with a lock as they are only modified from our attach function
291 * which always gets called with the i2c-core lock held and never accessed
292 * before the attach function is done with them.
294 static int dmi_mult[6] = { 490, 200, 100, 100, 200, 100 };
295 static int dmi_offset[6] = { 0, 0, 0, 0, 0, 0 };
296 static int dmi_vref = -1;
299 * Somewhat ugly :( global data pointer list with all fschmd devices, so that
300 * we can find our device data as when using misc_register there is no other
301 * method to get to ones device data from the open fop.
303 static LIST_HEAD(watchdog_data_list);
304 /* Note this lock not only protect list access, but also data.kref access */
305 static DEFINE_MUTEX(watchdog_data_mutex);
308 * Release our data struct when we're detached from the i2c client *and* all
309 * references to our watchdog device are released
311 static void fschmd_release_resources(struct kref *ref)
313 struct fschmd_data *data = container_of(ref, struct fschmd_data, kref);
318 * Sysfs attr show / store functions
321 static ssize_t in_value_show(struct device *dev,
322 struct device_attribute *devattr, char *buf)
324 const int max_reading[3] = { 14200, 6600, 3300 };
325 int index = to_sensor_dev_attr(devattr)->index;
326 struct fschmd_data *data = fschmd_update_device(dev);
328 if (data->kind == fscher || data->kind >= fschrc)
329 return sprintf(buf, "%d\n", (data->volt[index] * dmi_vref *
330 dmi_mult[index]) / 255 + dmi_offset[index]);
332 return sprintf(buf, "%d\n", (data->volt[index] *
333 max_reading[index] + 128) / 255);
337 #define TEMP_FROM_REG(val) (((val) - 128) * 1000)
339 static ssize_t temp_value_show(struct device *dev,
340 struct device_attribute *devattr, char *buf)
342 int index = to_sensor_dev_attr(devattr)->index;
343 struct fschmd_data *data = fschmd_update_device(dev);
345 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_act[index]));
348 static ssize_t temp_max_show(struct device *dev,
349 struct device_attribute *devattr, char *buf)
351 int index = to_sensor_dev_attr(devattr)->index;
352 struct fschmd_data *data = fschmd_update_device(dev);
354 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index]));
357 static ssize_t temp_max_store(struct device *dev,
358 struct device_attribute *devattr,
359 const char *buf, size_t count)
361 int index = to_sensor_dev_attr(devattr)->index;
362 struct fschmd_data *data = dev_get_drvdata(dev);
366 err = kstrtol(buf, 10, &v);
370 v = clamp_val(v / 1000, -128, 127) + 128;
372 mutex_lock(&data->update_lock);
373 i2c_smbus_write_byte_data(to_i2c_client(dev),
374 FSCHMD_REG_TEMP_LIMIT[data->kind][index], v);
375 data->temp_max[index] = v;
376 mutex_unlock(&data->update_lock);
381 static ssize_t temp_fault_show(struct device *dev,
382 struct device_attribute *devattr, char *buf)
384 int index = to_sensor_dev_attr(devattr)->index;
385 struct fschmd_data *data = fschmd_update_device(dev);
387 /* bit 0 set means sensor working ok, so no fault! */
388 if (data->temp_status[index] & FSCHMD_TEMP_WORKING)
389 return sprintf(buf, "0\n");
391 return sprintf(buf, "1\n");
394 static ssize_t temp_alarm_show(struct device *dev,
395 struct device_attribute *devattr, char *buf)
397 int index = to_sensor_dev_attr(devattr)->index;
398 struct fschmd_data *data = fschmd_update_device(dev);
400 if ((data->temp_status[index] & FSCHMD_TEMP_ALARM_MASK) ==
401 FSCHMD_TEMP_ALARM_MASK)
402 return sprintf(buf, "1\n");
404 return sprintf(buf, "0\n");
408 #define RPM_FROM_REG(val) ((val) * 60)
410 static ssize_t fan_value_show(struct device *dev,
411 struct device_attribute *devattr, char *buf)
413 int index = to_sensor_dev_attr(devattr)->index;
414 struct fschmd_data *data = fschmd_update_device(dev);
416 return sprintf(buf, "%u\n", RPM_FROM_REG(data->fan_act[index]));
419 static ssize_t fan_div_show(struct device *dev,
420 struct device_attribute *devattr, char *buf)
422 int index = to_sensor_dev_attr(devattr)->index;
423 struct fschmd_data *data = fschmd_update_device(dev);
425 /* bits 2..7 reserved => mask with 3 */
426 return sprintf(buf, "%d\n", 1 << (data->fan_ripple[index] & 3));
429 static ssize_t fan_div_store(struct device *dev,
430 struct device_attribute *devattr,
431 const char *buf, size_t count)
434 int index = to_sensor_dev_attr(devattr)->index;
435 struct fschmd_data *data = dev_get_drvdata(dev);
436 /* supported values: 2, 4, 8 */
440 err = kstrtoul(buf, 10, &v);
456 "fan_div value %lu not supported. Choose one of 2, 4 or 8!\n",
461 mutex_lock(&data->update_lock);
463 reg = i2c_smbus_read_byte_data(to_i2c_client(dev),
464 FSCHMD_REG_FAN_RIPPLE[data->kind][index]);
466 /* bits 2..7 reserved => mask with 0x03 */
470 i2c_smbus_write_byte_data(to_i2c_client(dev),
471 FSCHMD_REG_FAN_RIPPLE[data->kind][index], reg);
473 data->fan_ripple[index] = reg;
475 mutex_unlock(&data->update_lock);
480 static ssize_t fan_alarm_show(struct device *dev,
481 struct device_attribute *devattr, char *buf)
483 int index = to_sensor_dev_attr(devattr)->index;
484 struct fschmd_data *data = fschmd_update_device(dev);
486 if (data->fan_status[index] & FSCHMD_FAN_ALARM)
487 return sprintf(buf, "1\n");
489 return sprintf(buf, "0\n");
492 static ssize_t fan_fault_show(struct device *dev,
493 struct device_attribute *devattr, char *buf)
495 int index = to_sensor_dev_attr(devattr)->index;
496 struct fschmd_data *data = fschmd_update_device(dev);
498 if (data->fan_status[index] & FSCHMD_FAN_NOT_PRESENT)
499 return sprintf(buf, "1\n");
501 return sprintf(buf, "0\n");
505 static ssize_t pwm_auto_point1_pwm_show(struct device *dev,
506 struct device_attribute *devattr,
509 int index = to_sensor_dev_attr(devattr)->index;
510 struct fschmd_data *data = fschmd_update_device(dev);
511 int val = data->fan_min[index];
513 /* 0 = allow turning off (except on the syl), 1-255 = 50-100% */
514 if (val || data->kind == fscsyl)
517 return sprintf(buf, "%d\n", val);
520 static ssize_t pwm_auto_point1_pwm_store(struct device *dev,
521 struct device_attribute *devattr,
522 const char *buf, size_t count)
524 int index = to_sensor_dev_attr(devattr)->index;
525 struct fschmd_data *data = dev_get_drvdata(dev);
529 err = kstrtoul(buf, 10, &v);
533 /* reg: 0 = allow turning off (except on the syl), 1-255 = 50-100% */
534 if (v || data->kind == fscsyl) {
535 v = clamp_val(v, 128, 255);
536 v = (v - 128) * 2 + 1;
539 mutex_lock(&data->update_lock);
541 i2c_smbus_write_byte_data(to_i2c_client(dev),
542 FSCHMD_REG_FAN_MIN[data->kind][index], v);
543 data->fan_min[index] = v;
545 mutex_unlock(&data->update_lock);
552 * The FSC hwmon family has the ability to force an attached alert led to flash
553 * from software, we export this as an alert_led sysfs attr
555 static ssize_t alert_led_show(struct device *dev,
556 struct device_attribute *devattr, char *buf)
558 struct fschmd_data *data = fschmd_update_device(dev);
560 if (data->global_control & FSCHMD_CONTROL_ALERT_LED)
561 return sprintf(buf, "1\n");
563 return sprintf(buf, "0\n");
566 static ssize_t alert_led_store(struct device *dev,
567 struct device_attribute *devattr, const char *buf, size_t count)
570 struct fschmd_data *data = dev_get_drvdata(dev);
574 err = kstrtoul(buf, 10, &v);
578 mutex_lock(&data->update_lock);
580 reg = i2c_smbus_read_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL);
583 reg |= FSCHMD_CONTROL_ALERT_LED;
585 reg &= ~FSCHMD_CONTROL_ALERT_LED;
587 i2c_smbus_write_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL, reg);
589 data->global_control = reg;
591 mutex_unlock(&data->update_lock);
596 static DEVICE_ATTR_RW(alert_led);
598 static struct sensor_device_attribute fschmd_attr[] = {
599 SENSOR_ATTR_RO(in0_input, in_value, 0),
600 SENSOR_ATTR_RO(in1_input, in_value, 1),
601 SENSOR_ATTR_RO(in2_input, in_value, 2),
602 SENSOR_ATTR_RO(in3_input, in_value, 3),
603 SENSOR_ATTR_RO(in4_input, in_value, 4),
604 SENSOR_ATTR_RO(in5_input, in_value, 5),
607 static struct sensor_device_attribute fschmd_temp_attr[] = {
608 SENSOR_ATTR_RO(temp1_input, temp_value, 0),
609 SENSOR_ATTR_RW(temp1_max, temp_max, 0),
610 SENSOR_ATTR_RO(temp1_fault, temp_fault, 0),
611 SENSOR_ATTR_RO(temp1_alarm, temp_alarm, 0),
612 SENSOR_ATTR_RO(temp2_input, temp_value, 1),
613 SENSOR_ATTR_RW(temp2_max, temp_max, 1),
614 SENSOR_ATTR_RO(temp2_fault, temp_fault, 1),
615 SENSOR_ATTR_RO(temp2_alarm, temp_alarm, 1),
616 SENSOR_ATTR_RO(temp3_input, temp_value, 2),
617 SENSOR_ATTR_RW(temp3_max, temp_max, 2),
618 SENSOR_ATTR_RO(temp3_fault, temp_fault, 2),
619 SENSOR_ATTR_RO(temp3_alarm, temp_alarm, 2),
620 SENSOR_ATTR_RO(temp4_input, temp_value, 3),
621 SENSOR_ATTR_RW(temp4_max, temp_max, 3),
622 SENSOR_ATTR_RO(temp4_fault, temp_fault, 3),
623 SENSOR_ATTR_RO(temp4_alarm, temp_alarm, 3),
624 SENSOR_ATTR_RO(temp5_input, temp_value, 4),
625 SENSOR_ATTR_RW(temp5_max, temp_max, 4),
626 SENSOR_ATTR_RO(temp5_fault, temp_fault, 4),
627 SENSOR_ATTR_RO(temp5_alarm, temp_alarm, 4),
628 SENSOR_ATTR_RO(temp6_input, temp_value, 5),
629 SENSOR_ATTR_RW(temp6_max, temp_max, 5),
630 SENSOR_ATTR_RO(temp6_fault, temp_fault, 5),
631 SENSOR_ATTR_RO(temp6_alarm, temp_alarm, 5),
632 SENSOR_ATTR_RO(temp7_input, temp_value, 6),
633 SENSOR_ATTR_RW(temp7_max, temp_max, 6),
634 SENSOR_ATTR_RO(temp7_fault, temp_fault, 6),
635 SENSOR_ATTR_RO(temp7_alarm, temp_alarm, 6),
636 SENSOR_ATTR_RO(temp8_input, temp_value, 7),
637 SENSOR_ATTR_RW(temp8_max, temp_max, 7),
638 SENSOR_ATTR_RO(temp8_fault, temp_fault, 7),
639 SENSOR_ATTR_RO(temp8_alarm, temp_alarm, 7),
640 SENSOR_ATTR_RO(temp9_input, temp_value, 8),
641 SENSOR_ATTR_RW(temp9_max, temp_max, 8),
642 SENSOR_ATTR_RO(temp9_fault, temp_fault, 8),
643 SENSOR_ATTR_RO(temp9_alarm, temp_alarm, 8),
644 SENSOR_ATTR_RO(temp10_input, temp_value, 9),
645 SENSOR_ATTR_RW(temp10_max, temp_max, 9),
646 SENSOR_ATTR_RO(temp10_fault, temp_fault, 9),
647 SENSOR_ATTR_RO(temp10_alarm, temp_alarm, 9),
648 SENSOR_ATTR_RO(temp11_input, temp_value, 10),
649 SENSOR_ATTR_RW(temp11_max, temp_max, 10),
650 SENSOR_ATTR_RO(temp11_fault, temp_fault, 10),
651 SENSOR_ATTR_RO(temp11_alarm, temp_alarm, 10),
654 static struct sensor_device_attribute fschmd_fan_attr[] = {
655 SENSOR_ATTR_RO(fan1_input, fan_value, 0),
656 SENSOR_ATTR_RW(fan1_div, fan_div, 0),
657 SENSOR_ATTR_RO(fan1_alarm, fan_alarm, 0),
658 SENSOR_ATTR_RO(fan1_fault, fan_fault, 0),
659 SENSOR_ATTR_RW(pwm1_auto_point1_pwm, pwm_auto_point1_pwm, 0),
660 SENSOR_ATTR_RO(fan2_input, fan_value, 1),
661 SENSOR_ATTR_RW(fan2_div, fan_div, 1),
662 SENSOR_ATTR_RO(fan2_alarm, fan_alarm, 1),
663 SENSOR_ATTR_RO(fan2_fault, fan_fault, 1),
664 SENSOR_ATTR_RW(pwm2_auto_point1_pwm, pwm_auto_point1_pwm, 1),
665 SENSOR_ATTR_RO(fan3_input, fan_value, 2),
666 SENSOR_ATTR_RW(fan3_div, fan_div, 2),
667 SENSOR_ATTR_RO(fan3_alarm, fan_alarm, 2),
668 SENSOR_ATTR_RO(fan3_fault, fan_fault, 2),
669 SENSOR_ATTR_RW(pwm3_auto_point1_pwm, pwm_auto_point1_pwm, 2),
670 SENSOR_ATTR_RO(fan4_input, fan_value, 3),
671 SENSOR_ATTR_RW(fan4_div, fan_div, 3),
672 SENSOR_ATTR_RO(fan4_alarm, fan_alarm, 3),
673 SENSOR_ATTR_RO(fan4_fault, fan_fault, 3),
674 SENSOR_ATTR_RW(pwm4_auto_point1_pwm, pwm_auto_point1_pwm, 3),
675 SENSOR_ATTR_RO(fan5_input, fan_value, 4),
676 SENSOR_ATTR_RW(fan5_div, fan_div, 4),
677 SENSOR_ATTR_RO(fan5_alarm, fan_alarm, 4),
678 SENSOR_ATTR_RO(fan5_fault, fan_fault, 4),
679 SENSOR_ATTR_RW(pwm5_auto_point1_pwm, pwm_auto_point1_pwm, 4),
680 SENSOR_ATTR_RO(fan6_input, fan_value, 5),
681 SENSOR_ATTR_RW(fan6_div, fan_div, 5),
682 SENSOR_ATTR_RO(fan6_alarm, fan_alarm, 5),
683 SENSOR_ATTR_RO(fan6_fault, fan_fault, 5),
684 SENSOR_ATTR_RW(pwm6_auto_point1_pwm, pwm_auto_point1_pwm, 5),
685 SENSOR_ATTR_RO(fan7_input, fan_value, 6),
686 SENSOR_ATTR_RW(fan7_div, fan_div, 6),
687 SENSOR_ATTR_RO(fan7_alarm, fan_alarm, 6),
688 SENSOR_ATTR_RO(fan7_fault, fan_fault, 6),
689 SENSOR_ATTR_RW(pwm7_auto_point1_pwm, pwm_auto_point1_pwm, 6),
697 static int watchdog_set_timeout(struct fschmd_data *data, int timeout)
700 int kind = data->kind + 1; /* 0-x array index -> 1-x module param */
702 /* 2 second or 60 second resolution? */
703 if (timeout <= 510 || kind == fscpos || kind == fscscy)
708 if (timeout < resolution || timeout > (resolution * 255))
711 mutex_lock(&data->watchdog_lock);
718 data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_RESOLUTION;
720 data->watchdog_control |= FSCHMD_WDOG_CONTROL_RESOLUTION;
722 data->watchdog_preset = DIV_ROUND_UP(timeout, resolution);
724 /* Write new timeout value */
725 i2c_smbus_write_byte_data(data->client,
726 FSCHMD_REG_WDOG_PRESET[data->kind], data->watchdog_preset);
727 /* Write new control register, do not trigger! */
728 i2c_smbus_write_byte_data(data->client,
729 FSCHMD_REG_WDOG_CONTROL[data->kind],
730 data->watchdog_control & ~FSCHMD_WDOG_CONTROL_TRIGGER);
732 ret = data->watchdog_preset * resolution;
735 mutex_unlock(&data->watchdog_lock);
739 static int watchdog_get_timeout(struct fschmd_data *data)
743 mutex_lock(&data->watchdog_lock);
744 if (data->watchdog_control & FSCHMD_WDOG_CONTROL_RESOLUTION)
745 timeout = data->watchdog_preset * 60;
747 timeout = data->watchdog_preset * 2;
748 mutex_unlock(&data->watchdog_lock);
753 static int watchdog_trigger(struct fschmd_data *data)
757 mutex_lock(&data->watchdog_lock);
763 data->watchdog_control |= FSCHMD_WDOG_CONTROL_TRIGGER;
764 i2c_smbus_write_byte_data(data->client,
765 FSCHMD_REG_WDOG_CONTROL[data->kind],
766 data->watchdog_control);
768 mutex_unlock(&data->watchdog_lock);
772 static int watchdog_stop(struct fschmd_data *data)
776 mutex_lock(&data->watchdog_lock);
782 data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_STARTED;
784 * Don't store the stop flag in our watchdog control register copy, as
785 * its a write only bit (read always returns 0)
787 i2c_smbus_write_byte_data(data->client,
788 FSCHMD_REG_WDOG_CONTROL[data->kind],
789 data->watchdog_control | FSCHMD_WDOG_CONTROL_STOP);
791 mutex_unlock(&data->watchdog_lock);
795 static int watchdog_open(struct inode *inode, struct file *filp)
797 struct fschmd_data *pos, *data = NULL;
798 int watchdog_is_open;
801 * We get called from drivers/char/misc.c with misc_mtx hold, and we
802 * call misc_register() from fschmd_probe() with watchdog_data_mutex
803 * hold, as misc_register() takes the misc_mtx lock, this is a possible
804 * deadlock, so we use mutex_trylock here.
806 if (!mutex_trylock(&watchdog_data_mutex))
808 list_for_each_entry(pos, &watchdog_data_list, list) {
809 if (pos->watchdog_miscdev.minor == iminor(inode)) {
814 /* Note we can never not have found data, so we don't check for this */
815 watchdog_is_open = test_and_set_bit(0, &data->watchdog_is_open);
816 if (!watchdog_is_open)
817 kref_get(&data->kref);
818 mutex_unlock(&watchdog_data_mutex);
820 if (watchdog_is_open)
823 /* Start the watchdog */
824 watchdog_trigger(data);
825 filp->private_data = data;
827 return stream_open(inode, filp);
830 static int watchdog_release(struct inode *inode, struct file *filp)
832 struct fschmd_data *data = filp->private_data;
834 if (data->watchdog_expect_close) {
836 data->watchdog_expect_close = 0;
838 watchdog_trigger(data);
839 dev_crit(&data->client->dev,
840 "unexpected close, not stopping watchdog!\n");
843 clear_bit(0, &data->watchdog_is_open);
845 mutex_lock(&watchdog_data_mutex);
846 kref_put(&data->kref, fschmd_release_resources);
847 mutex_unlock(&watchdog_data_mutex);
852 static ssize_t watchdog_write(struct file *filp, const char __user *buf,
853 size_t count, loff_t *offset)
856 struct fschmd_data *data = filp->private_data;
862 /* Clear it in case it was set with a previous write */
863 data->watchdog_expect_close = 0;
865 for (i = 0; i != count; i++) {
867 if (get_user(c, buf + i))
870 data->watchdog_expect_close = 1;
873 ret = watchdog_trigger(data);
880 static long watchdog_ioctl(struct file *filp, unsigned int cmd,
883 struct watchdog_info ident = {
884 .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
886 .identity = "FSC watchdog"
889 struct fschmd_data *data = filp->private_data;
892 case WDIOC_GETSUPPORT:
893 ident.firmware_version = data->revision;
895 ident.options |= WDIOF_MAGICCLOSE;
896 if (copy_to_user((void __user *)arg, &ident, sizeof(ident)))
900 case WDIOC_GETSTATUS:
901 ret = put_user(0, (int __user *)arg);
904 case WDIOC_GETBOOTSTATUS:
905 if (data->watchdog_state & FSCHMD_WDOG_STATE_CARDRESET)
906 ret = put_user(WDIOF_CARDRESET, (int __user *)arg);
908 ret = put_user(0, (int __user *)arg);
911 case WDIOC_KEEPALIVE:
912 ret = watchdog_trigger(data);
915 case WDIOC_GETTIMEOUT:
916 i = watchdog_get_timeout(data);
917 ret = put_user(i, (int __user *)arg);
920 case WDIOC_SETTIMEOUT:
921 if (get_user(i, (int __user *)arg)) {
925 ret = watchdog_set_timeout(data, i);
927 ret = put_user(ret, (int __user *)arg);
930 case WDIOC_SETOPTIONS:
931 if (get_user(i, (int __user *)arg)) {
936 if (i & WDIOS_DISABLECARD)
937 ret = watchdog_stop(data);
938 else if (i & WDIOS_ENABLECARD)
939 ret = watchdog_trigger(data);
950 static const struct file_operations watchdog_fops = {
951 .owner = THIS_MODULE,
953 .open = watchdog_open,
954 .release = watchdog_release,
955 .write = watchdog_write,
956 .unlocked_ioctl = watchdog_ioctl,
961 * Detect, register, unregister and update device functions
965 * DMI decode routine to read voltage scaling factors from special DMI tables,
966 * which are available on FSC machines with an fscher or later chip.
968 static void fschmd_dmi_decode(const struct dmi_header *header, void *dummy)
970 int i, mult[3] = { 0 }, offset[3] = { 0 }, vref = 0, found = 0;
973 * dmi code ugliness, we get passed the address of the contents of
974 * a complete DMI record, but in the form of a dmi_header pointer, in
975 * reality this address holds header->length bytes of which the header
976 * are the first 4 bytes
978 u8 *dmi_data = (u8 *)header;
980 /* We are looking for OEM-specific type 185 */
981 if (header->type != 185)
985 * we are looking for what Siemens calls "subtype" 19, the subtype
986 * is stored in byte 5 of the dmi block
988 if (header->length < 5 || dmi_data[4] != 19)
992 * After the subtype comes 1 unknown byte and then blocks of 5 bytes,
993 * consisting of what Siemens calls an "Entity" number, followed by
994 * 2 16-bit words in LSB first order
996 for (i = 6; (i + 4) < header->length; i += 5) {
997 /* entity 1 - 3: voltage multiplier and offset */
998 if (dmi_data[i] >= 1 && dmi_data[i] <= 3) {
999 /* Our in sensors order and the DMI order differ */
1000 const int shuffle[3] = { 1, 0, 2 };
1001 int in = shuffle[dmi_data[i] - 1];
1003 /* Check for twice the same entity */
1004 if (found & (1 << in))
1007 mult[in] = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
1008 offset[in] = dmi_data[i + 3] | (dmi_data[i + 4] << 8);
1013 /* entity 7: reference voltage */
1014 if (dmi_data[i] == 7) {
1015 /* Check for twice the same entity */
1019 vref = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
1025 if (found == 0x0F) {
1026 for (i = 0; i < 3; i++) {
1027 dmi_mult[i] = mult[i] * 10;
1028 dmi_offset[i] = offset[i] * 10;
1031 * According to the docs there should be separate dmi entries
1032 * for the mult's and offsets of in3-5 of the syl, but on
1033 * my test machine these are not present
1035 dmi_mult[3] = dmi_mult[2];
1036 dmi_mult[4] = dmi_mult[1];
1037 dmi_mult[5] = dmi_mult[2];
1038 dmi_offset[3] = dmi_offset[2];
1039 dmi_offset[4] = dmi_offset[1];
1040 dmi_offset[5] = dmi_offset[2];
1045 static int fschmd_detect(struct i2c_client *client,
1046 struct i2c_board_info *info)
1049 struct i2c_adapter *adapter = client->adapter;
1052 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1055 /* Detect & Identify the chip */
1056 id[0] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_0);
1057 id[1] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_1);
1058 id[2] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_2);
1061 if (!strcmp(id, "PEG"))
1063 else if (!strcmp(id, "HER"))
1065 else if (!strcmp(id, "SCY"))
1067 else if (!strcmp(id, "HRC"))
1069 else if (!strcmp(id, "HMD"))
1071 else if (!strcmp(id, "HDS"))
1073 else if (!strcmp(id, "SYL"))
1078 strlcpy(info->type, fschmd_id[kind].name, I2C_NAME_SIZE);
1083 static int fschmd_probe(struct i2c_client *client,
1084 const struct i2c_device_id *id)
1086 struct fschmd_data *data;
1087 const char * const names[7] = { "Poseidon", "Hermes", "Scylla",
1088 "Heracles", "Heimdall", "Hades", "Syleus" };
1089 const int watchdog_minors[] = { WATCHDOG_MINOR, 212, 213, 214, 215 };
1091 enum chips kind = id->driver_data;
1093 data = kzalloc(sizeof(struct fschmd_data), GFP_KERNEL);
1097 i2c_set_clientdata(client, data);
1098 mutex_init(&data->update_lock);
1099 mutex_init(&data->watchdog_lock);
1100 INIT_LIST_HEAD(&data->list);
1101 kref_init(&data->kref);
1103 * Store client pointer in our data struct for watchdog usage
1104 * (where the client is found through a data ptr instead of the
1107 data->client = client;
1110 if (kind == fscpos) {
1112 * The Poseidon has hardwired temp limits, fill these
1113 * in for the alarm resetting code
1115 data->temp_max[0] = 70 + 128;
1116 data->temp_max[1] = 50 + 128;
1117 data->temp_max[2] = 50 + 128;
1120 /* Read the special DMI table for fscher and newer chips */
1121 if ((kind == fscher || kind >= fschrc) && dmi_vref == -1) {
1122 dmi_walk(fschmd_dmi_decode, NULL);
1123 if (dmi_vref == -1) {
1124 dev_warn(&client->dev,
1125 "Couldn't get voltage scaling factors from "
1126 "BIOS DMI table, using builtin defaults\n");
1131 /* Read in some never changing registers */
1132 data->revision = i2c_smbus_read_byte_data(client, FSCHMD_REG_REVISION);
1133 data->global_control = i2c_smbus_read_byte_data(client,
1134 FSCHMD_REG_CONTROL);
1135 data->watchdog_control = i2c_smbus_read_byte_data(client,
1136 FSCHMD_REG_WDOG_CONTROL[data->kind]);
1137 data->watchdog_state = i2c_smbus_read_byte_data(client,
1138 FSCHMD_REG_WDOG_STATE[data->kind]);
1139 data->watchdog_preset = i2c_smbus_read_byte_data(client,
1140 FSCHMD_REG_WDOG_PRESET[data->kind]);
1142 err = device_create_file(&client->dev, &dev_attr_alert_led);
1146 for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++) {
1147 err = device_create_file(&client->dev,
1148 &fschmd_attr[i].dev_attr);
1153 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++) {
1154 /* Poseidon doesn't have TEMP_LIMIT registers */
1155 if (kind == fscpos && fschmd_temp_attr[i].dev_attr.show ==
1159 if (kind == fscsyl) {
1161 data->temp_status[i / 4] =
1162 i2c_smbus_read_byte_data(client,
1163 FSCHMD_REG_TEMP_STATE
1164 [data->kind][i / 4]);
1165 if (data->temp_status[i / 4] & FSCHMD_TEMP_DISABLED)
1169 err = device_create_file(&client->dev,
1170 &fschmd_temp_attr[i].dev_attr);
1175 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++) {
1176 /* Poseidon doesn't have a FAN_MIN register for its 3rd fan */
1177 if (kind == fscpos &&
1178 !strcmp(fschmd_fan_attr[i].dev_attr.attr.name,
1179 "pwm3_auto_point1_pwm"))
1182 if (kind == fscsyl) {
1184 data->fan_status[i / 5] =
1185 i2c_smbus_read_byte_data(client,
1186 FSCHMD_REG_FAN_STATE
1187 [data->kind][i / 5]);
1188 if (data->fan_status[i / 5] & FSCHMD_FAN_DISABLED)
1192 err = device_create_file(&client->dev,
1193 &fschmd_fan_attr[i].dev_attr);
1198 data->hwmon_dev = hwmon_device_register(&client->dev);
1199 if (IS_ERR(data->hwmon_dev)) {
1200 err = PTR_ERR(data->hwmon_dev);
1201 data->hwmon_dev = NULL;
1206 * We take the data_mutex lock early so that watchdog_open() cannot
1207 * run when misc_register() has completed, but we've not yet added
1208 * our data to the watchdog_data_list (and set the default timeout)
1210 mutex_lock(&watchdog_data_mutex);
1211 for (i = 0; i < ARRAY_SIZE(watchdog_minors); i++) {
1212 /* Register our watchdog part */
1213 snprintf(data->watchdog_name, sizeof(data->watchdog_name),
1214 "watchdog%c", (i == 0) ? '\0' : ('0' + i));
1215 data->watchdog_miscdev.name = data->watchdog_name;
1216 data->watchdog_miscdev.fops = &watchdog_fops;
1217 data->watchdog_miscdev.minor = watchdog_minors[i];
1218 err = misc_register(&data->watchdog_miscdev);
1222 data->watchdog_miscdev.minor = 0;
1223 dev_err(&client->dev,
1224 "Registering watchdog chardev: %d\n", err);
1228 list_add(&data->list, &watchdog_data_list);
1229 watchdog_set_timeout(data, 60);
1230 dev_info(&client->dev,
1231 "Registered watchdog chardev major 10, minor: %d\n",
1232 watchdog_minors[i]);
1235 if (i == ARRAY_SIZE(watchdog_minors)) {
1236 data->watchdog_miscdev.minor = 0;
1237 dev_warn(&client->dev,
1238 "Couldn't register watchdog chardev (due to no free minor)\n");
1240 mutex_unlock(&watchdog_data_mutex);
1242 dev_info(&client->dev, "Detected FSC %s chip, revision: %d\n",
1243 names[data->kind], (int) data->revision);
1248 fschmd_remove(client); /* will also free data for us */
1252 static int fschmd_remove(struct i2c_client *client)
1254 struct fschmd_data *data = i2c_get_clientdata(client);
1257 /* Unregister the watchdog (if registered) */
1258 if (data->watchdog_miscdev.minor) {
1259 misc_deregister(&data->watchdog_miscdev);
1260 if (data->watchdog_is_open) {
1261 dev_warn(&client->dev,
1262 "i2c client detached with watchdog open! "
1263 "Stopping watchdog.\n");
1264 watchdog_stop(data);
1266 mutex_lock(&watchdog_data_mutex);
1267 list_del(&data->list);
1268 mutex_unlock(&watchdog_data_mutex);
1269 /* Tell the watchdog code the client is gone */
1270 mutex_lock(&data->watchdog_lock);
1271 data->client = NULL;
1272 mutex_unlock(&data->watchdog_lock);
1276 * Check if registered in case we're called from fschmd_detect
1277 * to cleanup after an error
1279 if (data->hwmon_dev)
1280 hwmon_device_unregister(data->hwmon_dev);
1282 device_remove_file(&client->dev, &dev_attr_alert_led);
1283 for (i = 0; i < (FSCHMD_NO_VOLT_SENSORS[data->kind]); i++)
1284 device_remove_file(&client->dev, &fschmd_attr[i].dev_attr);
1285 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++)
1286 device_remove_file(&client->dev,
1287 &fschmd_temp_attr[i].dev_attr);
1288 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++)
1289 device_remove_file(&client->dev,
1290 &fschmd_fan_attr[i].dev_attr);
1292 mutex_lock(&watchdog_data_mutex);
1293 kref_put(&data->kref, fschmd_release_resources);
1294 mutex_unlock(&watchdog_data_mutex);
1299 static struct fschmd_data *fschmd_update_device(struct device *dev)
1301 struct i2c_client *client = to_i2c_client(dev);
1302 struct fschmd_data *data = i2c_get_clientdata(client);
1305 mutex_lock(&data->update_lock);
1307 if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
1309 for (i = 0; i < FSCHMD_NO_TEMP_SENSORS[data->kind]; i++) {
1310 data->temp_act[i] = i2c_smbus_read_byte_data(client,
1311 FSCHMD_REG_TEMP_ACT[data->kind][i]);
1312 data->temp_status[i] = i2c_smbus_read_byte_data(client,
1313 FSCHMD_REG_TEMP_STATE[data->kind][i]);
1315 /* The fscpos doesn't have TEMP_LIMIT registers */
1316 if (FSCHMD_REG_TEMP_LIMIT[data->kind][i])
1317 data->temp_max[i] = i2c_smbus_read_byte_data(
1319 FSCHMD_REG_TEMP_LIMIT[data->kind][i]);
1322 * reset alarm if the alarm condition is gone,
1323 * the chip doesn't do this itself
1325 if ((data->temp_status[i] & FSCHMD_TEMP_ALARM_MASK) ==
1326 FSCHMD_TEMP_ALARM_MASK &&
1327 data->temp_act[i] < data->temp_max[i])
1328 i2c_smbus_write_byte_data(client,
1329 FSCHMD_REG_TEMP_STATE[data->kind][i],
1330 data->temp_status[i]);
1333 for (i = 0; i < FSCHMD_NO_FAN_SENSORS[data->kind]; i++) {
1334 data->fan_act[i] = i2c_smbus_read_byte_data(client,
1335 FSCHMD_REG_FAN_ACT[data->kind][i]);
1336 data->fan_status[i] = i2c_smbus_read_byte_data(client,
1337 FSCHMD_REG_FAN_STATE[data->kind][i]);
1338 data->fan_ripple[i] = i2c_smbus_read_byte_data(client,
1339 FSCHMD_REG_FAN_RIPPLE[data->kind][i]);
1341 /* The fscpos third fan doesn't have a fan_min */
1342 if (FSCHMD_REG_FAN_MIN[data->kind][i])
1343 data->fan_min[i] = i2c_smbus_read_byte_data(
1345 FSCHMD_REG_FAN_MIN[data->kind][i]);
1347 /* reset fan status if speed is back to > 0 */
1348 if ((data->fan_status[i] & FSCHMD_FAN_ALARM) &&
1350 i2c_smbus_write_byte_data(client,
1351 FSCHMD_REG_FAN_STATE[data->kind][i],
1352 data->fan_status[i]);
1355 for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++)
1356 data->volt[i] = i2c_smbus_read_byte_data(client,
1357 FSCHMD_REG_VOLT[data->kind][i]);
1359 data->last_updated = jiffies;
1363 mutex_unlock(&data->update_lock);
1368 module_i2c_driver(fschmd_driver);
1371 MODULE_DESCRIPTION("FSC Poseidon, Hermes, Scylla, Heracles, Heimdall, Hades "
1372 "and Syleus driver");
1373 MODULE_LICENSE("GPL");