1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <linux/module.h>
35#include <linux/init.h>
36#include <linux/slab.h>
37#include <linux/jiffies.h>
38#include <linux/i2c.h>
39#include <linux/hwmon.h>
40#include <linux/hwmon-sysfs.h>
41#include <linux/err.h>
42#include <linux/mutex.h>
43#include <linux/sysfs.h>
44#include <linux/dmi.h>
45#include <linux/fs.h>
46#include <linux/watchdog.h>
47#include <linux/miscdevice.h>
48#include <linux/uaccess.h>
49#include <linux/kref.h>
50
51
52static const unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END };
53
54
55static int nowayout = WATCHDOG_NOWAYOUT;
56module_param(nowayout, int, 0);
57MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
58 __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
59
60enum chips { fscpos, fscher, fscscy, fschrc, fschmd, fschds, fscsyl };
61
62
63
64
65
66
67#define FSCHMD_REG_IDENT_0 0x00
68#define FSCHMD_REG_IDENT_1 0x01
69#define FSCHMD_REG_IDENT_2 0x02
70#define FSCHMD_REG_REVISION 0x03
71
72
73#define FSCHMD_REG_EVENT_STATE 0x04
74#define FSCHMD_REG_CONTROL 0x05
75
76#define FSCHMD_CONTROL_ALERT_LED 0x01
77
78
79static const u8 FSCHMD_REG_WDOG_CONTROL[7] =
80 { 0x21, 0x21, 0x21, 0x21, 0x21, 0x28, 0x28 };
81static const u8 FSCHMD_REG_WDOG_STATE[7] =
82 { 0x23, 0x23, 0x23, 0x23, 0x23, 0x29, 0x29 };
83static const u8 FSCHMD_REG_WDOG_PRESET[7] =
84 { 0x28, 0x28, 0x28, 0x28, 0x28, 0x2a, 0x2a };
85
86#define FSCHMD_WDOG_CONTROL_TRIGGER 0x10
87#define FSCHMD_WDOG_CONTROL_STARTED 0x10
88#define FSCHMD_WDOG_CONTROL_STOP 0x20
89#define FSCHMD_WDOG_CONTROL_RESOLUTION 0x40
90
91#define FSCHMD_WDOG_STATE_CARDRESET 0x02
92
93
94static const u8 FSCHMD_REG_VOLT[7][6] = {
95 { 0x45, 0x42, 0x48 },
96 { 0x45, 0x42, 0x48 },
97 { 0x45, 0x42, 0x48 },
98 { 0x45, 0x42, 0x48 },
99 { 0x45, 0x42, 0x48 },
100 { 0x21, 0x20, 0x22 },
101 { 0x21, 0x20, 0x22, 0x23, 0x24, 0x25 },
102};
103
104static const int FSCHMD_NO_VOLT_SENSORS[7] = { 3, 3, 3, 3, 3, 3, 6 };
105
106
107
108
109
110static const u8 FSCHMD_REG_FAN_MIN[7][7] = {
111 { 0x55, 0x65 },
112 { 0x55, 0x65, 0xb5 },
113 { 0x65, 0x65, 0x55, 0xa5, 0x55, 0xa5 },
114 { 0x55, 0x65, 0xa5, 0xb5 },
115 { 0x55, 0x65, 0xa5, 0xb5, 0xc5 },
116 { 0x55, 0x65, 0xa5, 0xb5, 0xc5 },
117 { 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb4 },
118};
119
120
121static const u8 FSCHMD_REG_FAN_ACT[7][7] = {
122 { 0x0e, 0x6b, 0xab },
123 { 0x0e, 0x6b, 0xbb },
124 { 0x6b, 0x6c, 0x0e, 0xab, 0x5c, 0xbb },
125 { 0x0e, 0x6b, 0xab, 0xbb },
126 { 0x5b, 0x6b, 0xab, 0xbb, 0xcb },
127 { 0x5b, 0x6b, 0xab, 0xbb, 0xcb },
128 { 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7 },
129};
130
131
132static const u8 FSCHMD_REG_FAN_STATE[7][7] = {
133 { 0x0d, 0x62, 0xa2 },
134 { 0x0d, 0x62, 0xb2 },
135 { 0x62, 0x61, 0x0d, 0xa2, 0x52, 0xb2 },
136 { 0x0d, 0x62, 0xa2, 0xb2 },
137 { 0x52, 0x62, 0xa2, 0xb2, 0xc2 },
138 { 0x52, 0x62, 0xa2, 0xb2, 0xc2 },
139 { 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0 },
140};
141
142
143static const u8 FSCHMD_REG_FAN_RIPPLE[7][7] = {
144 { 0x0f, 0x6f, 0xaf },
145 { 0x0f, 0x6f, 0xbf },
146 { 0x6f, 0x6f, 0x0f, 0xaf, 0x0f, 0xbf },
147 { 0x0f, 0x6f, 0xaf, 0xbf },
148 { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf },
149 { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf },
150 { 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6 },
151};
152
153static const int FSCHMD_NO_FAN_SENSORS[7] = { 3, 3, 6, 4, 5, 5, 7 };
154
155
156#define FSCHMD_FAN_ALARM 0x04
157#define FSCHMD_FAN_NOT_PRESENT 0x08
158#define FSCHMD_FAN_DISABLED 0x80
159
160
161
162static const u8 FSCHMD_REG_TEMP_ACT[7][11] = {
163 { 0x64, 0x32, 0x35 },
164 { 0x64, 0x32, 0x35 },
165 { 0x64, 0xD0, 0x32, 0x35 },
166 { 0x64, 0x32, 0x35 },
167 { 0x70, 0x80, 0x90, 0xd0, 0xe0 },
168 { 0x70, 0x80, 0x90, 0xd0, 0xe0 },
169 { 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8,
170 0xb8, 0xc8, 0xd8, 0xe8, 0xf8 },
171};
172
173
174static const u8 FSCHMD_REG_TEMP_STATE[7][11] = {
175 { 0x71, 0x81, 0x91 },
176 { 0x71, 0x81, 0x91 },
177 { 0x71, 0xd1, 0x81, 0x91 },
178 { 0x71, 0x81, 0x91 },
179 { 0x71, 0x81, 0x91, 0xd1, 0xe1 },
180 { 0x71, 0x81, 0x91, 0xd1, 0xe1 },
181 { 0x59, 0x69, 0x79, 0x89, 0x99, 0xa9,
182 0xb9, 0xc9, 0xd9, 0xe9, 0xf9 },
183};
184
185
186
187
188
189
190static const u8 FSCHMD_REG_TEMP_LIMIT[7][11] = {
191 { 0, 0, 0 },
192 { 0x76, 0x86, 0x96 },
193 { 0x76, 0xd6, 0x86, 0x96 },
194 { 0x76, 0x86, 0x96 },
195 { 0x76, 0x86, 0x96, 0xd6, 0xe6 },
196 { 0x76, 0x86, 0x96, 0xd6, 0xe6 },
197 { 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa,
198 0xba, 0xca, 0xda, 0xea, 0xfa },
199};
200
201
202
203
204
205
206
207
208
209static const int FSCHMD_NO_TEMP_SENSORS[7] = { 3, 3, 4, 3, 5, 5, 11 };
210
211
212#define FSCHMD_TEMP_WORKING 0x01
213#define FSCHMD_TEMP_ALERT 0x02
214#define FSCHMD_TEMP_DISABLED 0x80
215
216#define FSCHMD_TEMP_ALARM_MASK \
217 (FSCHMD_TEMP_WORKING | FSCHMD_TEMP_ALERT)
218
219
220
221
222
223static int fschmd_probe(struct i2c_client *client,
224 const struct i2c_device_id *id);
225static int fschmd_detect(struct i2c_client *client,
226 struct i2c_board_info *info);
227static int fschmd_remove(struct i2c_client *client);
228static struct fschmd_data *fschmd_update_device(struct device *dev);
229
230
231
232
233
234static const struct i2c_device_id fschmd_id[] = {
235 { "fscpos", fscpos },
236 { "fscher", fscher },
237 { "fscscy", fscscy },
238 { "fschrc", fschrc },
239 { "fschmd", fschmd },
240 { "fschds", fschds },
241 { "fscsyl", fscsyl },
242 { }
243};
244MODULE_DEVICE_TABLE(i2c, fschmd_id);
245
246static struct i2c_driver fschmd_driver = {
247 .class = I2C_CLASS_HWMON,
248 .driver = {
249 .name = "fschmd",
250 },
251 .probe = fschmd_probe,
252 .remove = fschmd_remove,
253 .id_table = fschmd_id,
254 .detect = fschmd_detect,
255 .address_list = normal_i2c,
256};
257
258
259
260
261
262struct fschmd_data {
263 struct i2c_client *client;
264 struct device *hwmon_dev;
265 struct mutex update_lock;
266 struct mutex watchdog_lock;
267 struct list_head list;
268 struct kref kref;
269 struct miscdevice watchdog_miscdev;
270 enum chips kind;
271 unsigned long watchdog_is_open;
272 char watchdog_expect_close;
273 char watchdog_name[10];
274 char valid;
275 unsigned long last_updated;
276
277
278 u8 revision;
279 u8 global_control;
280 u8 watchdog_control;
281 u8 watchdog_state;
282 u8 watchdog_preset;
283 u8 volt[6];
284 u8 temp_act[11];
285 u8 temp_status[11];
286 u8 temp_max[11];
287 u8 fan_act[7];
288 u8 fan_status[7];
289 u8 fan_min[7];
290 u8 fan_ripple[7];
291};
292
293
294
295
296
297
298static int dmi_mult[6] = { 490, 200, 100, 100, 200, 100 };
299static int dmi_offset[6] = { 0, 0, 0, 0, 0, 0 };
300static int dmi_vref = -1;
301
302
303
304
305static LIST_HEAD(watchdog_data_list);
306
307static DEFINE_MUTEX(watchdog_data_mutex);
308
309
310
311static void fschmd_release_resources(struct kref *ref)
312{
313 struct fschmd_data *data = container_of(ref, struct fschmd_data, kref);
314 kfree(data);
315}
316
317
318
319
320
321static ssize_t show_in_value(struct device *dev,
322 struct device_attribute *devattr, char *buf)
323{
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);
327
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]);
331 else
332 return sprintf(buf, "%d\n", (data->volt[index] *
333 max_reading[index] + 128) / 255);
334}
335
336
337#define TEMP_FROM_REG(val) (((val) - 128) * 1000)
338
339static ssize_t show_temp_value(struct device *dev,
340 struct device_attribute *devattr, char *buf)
341{
342 int index = to_sensor_dev_attr(devattr)->index;
343 struct fschmd_data *data = fschmd_update_device(dev);
344
345 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_act[index]));
346}
347
348static ssize_t show_temp_max(struct device *dev,
349 struct device_attribute *devattr, char *buf)
350{
351 int index = to_sensor_dev_attr(devattr)->index;
352 struct fschmd_data *data = fschmd_update_device(dev);
353
354 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index]));
355}
356
357static ssize_t store_temp_max(struct device *dev, struct device_attribute
358 *devattr, const char *buf, size_t count)
359{
360 int index = to_sensor_dev_attr(devattr)->index;
361 struct fschmd_data *data = dev_get_drvdata(dev);
362 long v = simple_strtol(buf, NULL, 10) / 1000;
363
364 v = SENSORS_LIMIT(v, -128, 127) + 128;
365
366 mutex_lock(&data->update_lock);
367 i2c_smbus_write_byte_data(to_i2c_client(dev),
368 FSCHMD_REG_TEMP_LIMIT[data->kind][index], v);
369 data->temp_max[index] = v;
370 mutex_unlock(&data->update_lock);
371
372 return count;
373}
374
375static ssize_t show_temp_fault(struct device *dev,
376 struct device_attribute *devattr, char *buf)
377{
378 int index = to_sensor_dev_attr(devattr)->index;
379 struct fschmd_data *data = fschmd_update_device(dev);
380
381
382 if (data->temp_status[index] & FSCHMD_TEMP_WORKING)
383 return sprintf(buf, "0\n");
384 else
385 return sprintf(buf, "1\n");
386}
387
388static ssize_t show_temp_alarm(struct device *dev,
389 struct device_attribute *devattr, char *buf)
390{
391 int index = to_sensor_dev_attr(devattr)->index;
392 struct fschmd_data *data = fschmd_update_device(dev);
393
394 if ((data->temp_status[index] & FSCHMD_TEMP_ALARM_MASK) ==
395 FSCHMD_TEMP_ALARM_MASK)
396 return sprintf(buf, "1\n");
397 else
398 return sprintf(buf, "0\n");
399}
400
401
402#define RPM_FROM_REG(val) ((val) * 60)
403
404static ssize_t show_fan_value(struct device *dev,
405 struct device_attribute *devattr, char *buf)
406{
407 int index = to_sensor_dev_attr(devattr)->index;
408 struct fschmd_data *data = fschmd_update_device(dev);
409
410 return sprintf(buf, "%u\n", RPM_FROM_REG(data->fan_act[index]));
411}
412
413static ssize_t show_fan_div(struct device *dev,
414 struct device_attribute *devattr, char *buf)
415{
416 int index = to_sensor_dev_attr(devattr)->index;
417 struct fschmd_data *data = fschmd_update_device(dev);
418
419
420 return sprintf(buf, "%d\n", 1 << (data->fan_ripple[index] & 3));
421}
422
423static ssize_t store_fan_div(struct device *dev, struct device_attribute
424 *devattr, const char *buf, size_t count)
425{
426 u8 reg;
427 int index = to_sensor_dev_attr(devattr)->index;
428 struct fschmd_data *data = dev_get_drvdata(dev);
429
430 unsigned long v = simple_strtoul(buf, NULL, 10);
431
432 switch (v) {
433 case 2: v = 1; break;
434 case 4: v = 2; break;
435 case 8: v = 3; break;
436 default:
437 dev_err(dev, "fan_div value %lu not supported. "
438 "Choose one of 2, 4 or 8!\n", v);
439 return -EINVAL;
440 }
441
442 mutex_lock(&data->update_lock);
443
444 reg = i2c_smbus_read_byte_data(to_i2c_client(dev),
445 FSCHMD_REG_FAN_RIPPLE[data->kind][index]);
446
447
448 reg &= ~0x03;
449 reg |= v;
450
451 i2c_smbus_write_byte_data(to_i2c_client(dev),
452 FSCHMD_REG_FAN_RIPPLE[data->kind][index], reg);
453
454 data->fan_ripple[index] = reg;
455
456 mutex_unlock(&data->update_lock);
457
458 return count;
459}
460
461static ssize_t show_fan_alarm(struct device *dev,
462 struct device_attribute *devattr, char *buf)
463{
464 int index = to_sensor_dev_attr(devattr)->index;
465 struct fschmd_data *data = fschmd_update_device(dev);
466
467 if (data->fan_status[index] & FSCHMD_FAN_ALARM)
468 return sprintf(buf, "1\n");
469 else
470 return sprintf(buf, "0\n");
471}
472
473static ssize_t show_fan_fault(struct device *dev,
474 struct device_attribute *devattr, char *buf)
475{
476 int index = to_sensor_dev_attr(devattr)->index;
477 struct fschmd_data *data = fschmd_update_device(dev);
478
479 if (data->fan_status[index] & FSCHMD_FAN_NOT_PRESENT)
480 return sprintf(buf, "1\n");
481 else
482 return sprintf(buf, "0\n");
483}
484
485
486static ssize_t show_pwm_auto_point1_pwm(struct device *dev,
487 struct device_attribute *devattr, char *buf)
488{
489 int index = to_sensor_dev_attr(devattr)->index;
490 struct fschmd_data *data = fschmd_update_device(dev);
491 int val = data->fan_min[index];
492
493
494 if (val || data->kind == fscsyl)
495 val = val / 2 + 128;
496
497 return sprintf(buf, "%d\n", val);
498}
499
500static ssize_t store_pwm_auto_point1_pwm(struct device *dev,
501 struct device_attribute *devattr, const char *buf, size_t count)
502{
503 int index = to_sensor_dev_attr(devattr)->index;
504 struct fschmd_data *data = dev_get_drvdata(dev);
505 unsigned long v = simple_strtoul(buf, NULL, 10);
506
507
508 if (v || data->kind == fscsyl) {
509 v = SENSORS_LIMIT(v, 128, 255);
510 v = (v - 128) * 2 + 1;
511 }
512
513 mutex_lock(&data->update_lock);
514
515 i2c_smbus_write_byte_data(to_i2c_client(dev),
516 FSCHMD_REG_FAN_MIN[data->kind][index], v);
517 data->fan_min[index] = v;
518
519 mutex_unlock(&data->update_lock);
520
521 return count;
522}
523
524
525
526
527static ssize_t show_alert_led(struct device *dev,
528 struct device_attribute *devattr, char *buf)
529{
530 struct fschmd_data *data = fschmd_update_device(dev);
531
532 if (data->global_control & FSCHMD_CONTROL_ALERT_LED)
533 return sprintf(buf, "1\n");
534 else
535 return sprintf(buf, "0\n");
536}
537
538static ssize_t store_alert_led(struct device *dev,
539 struct device_attribute *devattr, const char *buf, size_t count)
540{
541 u8 reg;
542 struct fschmd_data *data = dev_get_drvdata(dev);
543 unsigned long v = simple_strtoul(buf, NULL, 10);
544
545 mutex_lock(&data->update_lock);
546
547 reg = i2c_smbus_read_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL);
548
549 if (v)
550 reg |= FSCHMD_CONTROL_ALERT_LED;
551 else
552 reg &= ~FSCHMD_CONTROL_ALERT_LED;
553
554 i2c_smbus_write_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL, reg);
555
556 data->global_control = reg;
557
558 mutex_unlock(&data->update_lock);
559
560 return count;
561}
562
563static DEVICE_ATTR(alert_led, 0644, show_alert_led, store_alert_led);
564
565static struct sensor_device_attribute fschmd_attr[] = {
566 SENSOR_ATTR(in0_input, 0444, show_in_value, NULL, 0),
567 SENSOR_ATTR(in1_input, 0444, show_in_value, NULL, 1),
568 SENSOR_ATTR(in2_input, 0444, show_in_value, NULL, 2),
569 SENSOR_ATTR(in3_input, 0444, show_in_value, NULL, 3),
570 SENSOR_ATTR(in4_input, 0444, show_in_value, NULL, 4),
571 SENSOR_ATTR(in5_input, 0444, show_in_value, NULL, 5),
572};
573
574static struct sensor_device_attribute fschmd_temp_attr[] = {
575 SENSOR_ATTR(temp1_input, 0444, show_temp_value, NULL, 0),
576 SENSOR_ATTR(temp1_max, 0644, show_temp_max, store_temp_max, 0),
577 SENSOR_ATTR(temp1_fault, 0444, show_temp_fault, NULL, 0),
578 SENSOR_ATTR(temp1_alarm, 0444, show_temp_alarm, NULL, 0),
579 SENSOR_ATTR(temp2_input, 0444, show_temp_value, NULL, 1),
580 SENSOR_ATTR(temp2_max, 0644, show_temp_max, store_temp_max, 1),
581 SENSOR_ATTR(temp2_fault, 0444, show_temp_fault, NULL, 1),
582 SENSOR_ATTR(temp2_alarm, 0444, show_temp_alarm, NULL, 1),
583 SENSOR_ATTR(temp3_input, 0444, show_temp_value, NULL, 2),
584 SENSOR_ATTR(temp3_max, 0644, show_temp_max, store_temp_max, 2),
585 SENSOR_ATTR(temp3_fault, 0444, show_temp_fault, NULL, 2),
586 SENSOR_ATTR(temp3_alarm, 0444, show_temp_alarm, NULL, 2),
587 SENSOR_ATTR(temp4_input, 0444, show_temp_value, NULL, 3),
588 SENSOR_ATTR(temp4_max, 0644, show_temp_max, store_temp_max, 3),
589 SENSOR_ATTR(temp4_fault, 0444, show_temp_fault, NULL, 3),
590 SENSOR_ATTR(temp4_alarm, 0444, show_temp_alarm, NULL, 3),
591 SENSOR_ATTR(temp5_input, 0444, show_temp_value, NULL, 4),
592 SENSOR_ATTR(temp5_max, 0644, show_temp_max, store_temp_max, 4),
593 SENSOR_ATTR(temp5_fault, 0444, show_temp_fault, NULL, 4),
594 SENSOR_ATTR(temp5_alarm, 0444, show_temp_alarm, NULL, 4),
595 SENSOR_ATTR(temp6_input, 0444, show_temp_value, NULL, 5),
596 SENSOR_ATTR(temp6_max, 0644, show_temp_max, store_temp_max, 5),
597 SENSOR_ATTR(temp6_fault, 0444, show_temp_fault, NULL, 5),
598 SENSOR_ATTR(temp6_alarm, 0444, show_temp_alarm, NULL, 5),
599 SENSOR_ATTR(temp7_input, 0444, show_temp_value, NULL, 6),
600 SENSOR_ATTR(temp7_max, 0644, show_temp_max, store_temp_max, 6),
601 SENSOR_ATTR(temp7_fault, 0444, show_temp_fault, NULL, 6),
602 SENSOR_ATTR(temp7_alarm, 0444, show_temp_alarm, NULL, 6),
603 SENSOR_ATTR(temp8_input, 0444, show_temp_value, NULL, 7),
604 SENSOR_ATTR(temp8_max, 0644, show_temp_max, store_temp_max, 7),
605 SENSOR_ATTR(temp8_fault, 0444, show_temp_fault, NULL, 7),
606 SENSOR_ATTR(temp8_alarm, 0444, show_temp_alarm, NULL, 7),
607 SENSOR_ATTR(temp9_input, 0444, show_temp_value, NULL, 8),
608 SENSOR_ATTR(temp9_max, 0644, show_temp_max, store_temp_max, 8),
609 SENSOR_ATTR(temp9_fault, 0444, show_temp_fault, NULL, 8),
610 SENSOR_ATTR(temp9_alarm, 0444, show_temp_alarm, NULL, 8),
611 SENSOR_ATTR(temp10_input, 0444, show_temp_value, NULL, 9),
612 SENSOR_ATTR(temp10_max, 0644, show_temp_max, store_temp_max, 9),
613 SENSOR_ATTR(temp10_fault, 0444, show_temp_fault, NULL, 9),
614 SENSOR_ATTR(temp10_alarm, 0444, show_temp_alarm, NULL, 9),
615 SENSOR_ATTR(temp11_input, 0444, show_temp_value, NULL, 10),
616 SENSOR_ATTR(temp11_max, 0644, show_temp_max, store_temp_max, 10),
617 SENSOR_ATTR(temp11_fault, 0444, show_temp_fault, NULL, 10),
618 SENSOR_ATTR(temp11_alarm, 0444, show_temp_alarm, NULL, 10),
619};
620
621static struct sensor_device_attribute fschmd_fan_attr[] = {
622 SENSOR_ATTR(fan1_input, 0444, show_fan_value, NULL, 0),
623 SENSOR_ATTR(fan1_div, 0644, show_fan_div, store_fan_div, 0),
624 SENSOR_ATTR(fan1_alarm, 0444, show_fan_alarm, NULL, 0),
625 SENSOR_ATTR(fan1_fault, 0444, show_fan_fault, NULL, 0),
626 SENSOR_ATTR(pwm1_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
627 store_pwm_auto_point1_pwm, 0),
628 SENSOR_ATTR(fan2_input, 0444, show_fan_value, NULL, 1),
629 SENSOR_ATTR(fan2_div, 0644, show_fan_div, store_fan_div, 1),
630 SENSOR_ATTR(fan2_alarm, 0444, show_fan_alarm, NULL, 1),
631 SENSOR_ATTR(fan2_fault, 0444, show_fan_fault, NULL, 1),
632 SENSOR_ATTR(pwm2_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
633 store_pwm_auto_point1_pwm, 1),
634 SENSOR_ATTR(fan3_input, 0444, show_fan_value, NULL, 2),
635 SENSOR_ATTR(fan3_div, 0644, show_fan_div, store_fan_div, 2),
636 SENSOR_ATTR(fan3_alarm, 0444, show_fan_alarm, NULL, 2),
637 SENSOR_ATTR(fan3_fault, 0444, show_fan_fault, NULL, 2),
638 SENSOR_ATTR(pwm3_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
639 store_pwm_auto_point1_pwm, 2),
640 SENSOR_ATTR(fan4_input, 0444, show_fan_value, NULL, 3),
641 SENSOR_ATTR(fan4_div, 0644, show_fan_div, store_fan_div, 3),
642 SENSOR_ATTR(fan4_alarm, 0444, show_fan_alarm, NULL, 3),
643 SENSOR_ATTR(fan4_fault, 0444, show_fan_fault, NULL, 3),
644 SENSOR_ATTR(pwm4_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
645 store_pwm_auto_point1_pwm, 3),
646 SENSOR_ATTR(fan5_input, 0444, show_fan_value, NULL, 4),
647 SENSOR_ATTR(fan5_div, 0644, show_fan_div, store_fan_div, 4),
648 SENSOR_ATTR(fan5_alarm, 0444, show_fan_alarm, NULL, 4),
649 SENSOR_ATTR(fan5_fault, 0444, show_fan_fault, NULL, 4),
650 SENSOR_ATTR(pwm5_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
651 store_pwm_auto_point1_pwm, 4),
652 SENSOR_ATTR(fan6_input, 0444, show_fan_value, NULL, 5),
653 SENSOR_ATTR(fan6_div, 0644, show_fan_div, store_fan_div, 5),
654 SENSOR_ATTR(fan6_alarm, 0444, show_fan_alarm, NULL, 5),
655 SENSOR_ATTR(fan6_fault, 0444, show_fan_fault, NULL, 5),
656 SENSOR_ATTR(pwm6_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
657 store_pwm_auto_point1_pwm, 5),
658 SENSOR_ATTR(fan7_input, 0444, show_fan_value, NULL, 6),
659 SENSOR_ATTR(fan7_div, 0644, show_fan_div, store_fan_div, 6),
660 SENSOR_ATTR(fan7_alarm, 0444, show_fan_alarm, NULL, 6),
661 SENSOR_ATTR(fan7_fault, 0444, show_fan_fault, NULL, 6),
662 SENSOR_ATTR(pwm7_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
663 store_pwm_auto_point1_pwm, 6),
664};
665
666
667
668
669
670
671static int watchdog_set_timeout(struct fschmd_data *data, int timeout)
672{
673 int ret, resolution;
674 int kind = data->kind + 1;
675
676
677 if (timeout <= 510 || kind == fscpos || kind == fscscy)
678 resolution = 2;
679 else
680 resolution = 60;
681
682 if (timeout < resolution || timeout > (resolution * 255))
683 return -EINVAL;
684
685 mutex_lock(&data->watchdog_lock);
686 if (!data->client) {
687 ret = -ENODEV;
688 goto leave;
689 }
690
691 if (resolution == 2)
692 data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_RESOLUTION;
693 else
694 data->watchdog_control |= FSCHMD_WDOG_CONTROL_RESOLUTION;
695
696 data->watchdog_preset = DIV_ROUND_UP(timeout, resolution);
697
698
699 i2c_smbus_write_byte_data(data->client,
700 FSCHMD_REG_WDOG_PRESET[data->kind], data->watchdog_preset);
701
702 i2c_smbus_write_byte_data(data->client,
703 FSCHMD_REG_WDOG_CONTROL[data->kind],
704 data->watchdog_control & ~FSCHMD_WDOG_CONTROL_TRIGGER);
705
706 ret = data->watchdog_preset * resolution;
707
708leave:
709 mutex_unlock(&data->watchdog_lock);
710 return ret;
711}
712
713static int watchdog_get_timeout(struct fschmd_data *data)
714{
715 int timeout;
716
717 mutex_lock(&data->watchdog_lock);
718 if (data->watchdog_control & FSCHMD_WDOG_CONTROL_RESOLUTION)
719 timeout = data->watchdog_preset * 60;
720 else
721 timeout = data->watchdog_preset * 2;
722 mutex_unlock(&data->watchdog_lock);
723
724 return timeout;
725}
726
727static int watchdog_trigger(struct fschmd_data *data)
728{
729 int ret = 0;
730
731 mutex_lock(&data->watchdog_lock);
732 if (!data->client) {
733 ret = -ENODEV;
734 goto leave;
735 }
736
737 data->watchdog_control |= FSCHMD_WDOG_CONTROL_TRIGGER;
738 i2c_smbus_write_byte_data(data->client,
739 FSCHMD_REG_WDOG_CONTROL[data->kind],
740 data->watchdog_control);
741leave:
742 mutex_unlock(&data->watchdog_lock);
743 return ret;
744}
745
746static int watchdog_stop(struct fschmd_data *data)
747{
748 int ret = 0;
749
750 mutex_lock(&data->watchdog_lock);
751 if (!data->client) {
752 ret = -ENODEV;
753 goto leave;
754 }
755
756 data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_STARTED;
757
758
759 i2c_smbus_write_byte_data(data->client,
760 FSCHMD_REG_WDOG_CONTROL[data->kind],
761 data->watchdog_control | FSCHMD_WDOG_CONTROL_STOP);
762leave:
763 mutex_unlock(&data->watchdog_lock);
764 return ret;
765}
766
767static int watchdog_open(struct inode *inode, struct file *filp)
768{
769 struct fschmd_data *pos, *data = NULL;
770 int watchdog_is_open;
771
772
773
774
775
776 if (!mutex_trylock(&watchdog_data_mutex))
777 return -ERESTARTSYS;
778 list_for_each_entry(pos, &watchdog_data_list, list) {
779 if (pos->watchdog_miscdev.minor == iminor(inode)) {
780 data = pos;
781 break;
782 }
783 }
784
785 watchdog_is_open = test_and_set_bit(0, &data->watchdog_is_open);
786 if (!watchdog_is_open)
787 kref_get(&data->kref);
788 mutex_unlock(&watchdog_data_mutex);
789
790 if (watchdog_is_open)
791 return -EBUSY;
792
793
794 watchdog_trigger(data);
795 filp->private_data = data;
796
797 return nonseekable_open(inode, filp);
798}
799
800static int watchdog_release(struct inode *inode, struct file *filp)
801{
802 struct fschmd_data *data = filp->private_data;
803
804 if (data->watchdog_expect_close) {
805 watchdog_stop(data);
806 data->watchdog_expect_close = 0;
807 } else {
808 watchdog_trigger(data);
809 dev_crit(&data->client->dev,
810 "unexpected close, not stopping watchdog!\n");
811 }
812
813 clear_bit(0, &data->watchdog_is_open);
814
815 mutex_lock(&watchdog_data_mutex);
816 kref_put(&data->kref, fschmd_release_resources);
817 mutex_unlock(&watchdog_data_mutex);
818
819 return 0;
820}
821
822static ssize_t watchdog_write(struct file *filp, const char __user *buf,
823 size_t count, loff_t *offset)
824{
825 int ret;
826 struct fschmd_data *data = filp->private_data;
827
828 if (count) {
829 if (!nowayout) {
830 size_t i;
831
832
833 data->watchdog_expect_close = 0;
834
835 for (i = 0; i != count; i++) {
836 char c;
837 if (get_user(c, buf + i))
838 return -EFAULT;
839 if (c == 'V')
840 data->watchdog_expect_close = 1;
841 }
842 }
843 ret = watchdog_trigger(data);
844 if (ret < 0)
845 return ret;
846 }
847 return count;
848}
849
850static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
851{
852 struct watchdog_info ident = {
853 .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
854 WDIOF_CARDRESET,
855 .identity = "FSC watchdog"
856 };
857 int i, ret = 0;
858 struct fschmd_data *data = filp->private_data;
859
860 switch (cmd) {
861 case WDIOC_GETSUPPORT:
862 ident.firmware_version = data->revision;
863 if (!nowayout)
864 ident.options |= WDIOF_MAGICCLOSE;
865 if (copy_to_user((void __user *)arg, &ident, sizeof(ident)))
866 ret = -EFAULT;
867 break;
868
869 case WDIOC_GETSTATUS:
870 ret = put_user(0, (int __user *)arg);
871 break;
872
873 case WDIOC_GETBOOTSTATUS:
874 if (data->watchdog_state & FSCHMD_WDOG_STATE_CARDRESET)
875 ret = put_user(WDIOF_CARDRESET, (int __user *)arg);
876 else
877 ret = put_user(0, (int __user *)arg);
878 break;
879
880 case WDIOC_KEEPALIVE:
881 ret = watchdog_trigger(data);
882 break;
883
884 case WDIOC_GETTIMEOUT:
885 i = watchdog_get_timeout(data);
886 ret = put_user(i, (int __user *)arg);
887 break;
888
889 case WDIOC_SETTIMEOUT:
890 if (get_user(i, (int __user *)arg)) {
891 ret = -EFAULT;
892 break;
893 }
894 ret = watchdog_set_timeout(data, i);
895 if (ret > 0)
896 ret = put_user(ret, (int __user *)arg);
897 break;
898
899 case WDIOC_SETOPTIONS:
900 if (get_user(i, (int __user *)arg)) {
901 ret = -EFAULT;
902 break;
903 }
904
905 if (i & WDIOS_DISABLECARD)
906 ret = watchdog_stop(data);
907 else if (i & WDIOS_ENABLECARD)
908 ret = watchdog_trigger(data);
909 else
910 ret = -EINVAL;
911
912 break;
913 default:
914 ret = -ENOTTY;
915 }
916 return ret;
917}
918
919static const struct file_operations watchdog_fops = {
920 .owner = THIS_MODULE,
921 .llseek = no_llseek,
922 .open = watchdog_open,
923 .release = watchdog_release,
924 .write = watchdog_write,
925 .unlocked_ioctl = watchdog_ioctl,
926};
927
928
929
930
931
932
933
934
935static void fschmd_dmi_decode(const struct dmi_header *header, void *dummy)
936{
937 int i, mult[3] = { 0 }, offset[3] = { 0 }, vref = 0, found = 0;
938
939
940
941
942
943 u8 *dmi_data = (u8 *)header;
944
945
946 if (header->type != 185)
947 return;
948
949
950
951 if (header->length < 5 || dmi_data[4] != 19)
952 return;
953
954
955
956
957 for (i = 6; (i + 4) < header->length; i += 5) {
958
959 if (dmi_data[i] >= 1 && dmi_data[i] <= 3) {
960
961 const int shuffle[3] = { 1, 0, 2 };
962 int in = shuffle[dmi_data[i] - 1];
963
964
965 if (found & (1 << in))
966 return;
967
968 mult[in] = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
969 offset[in] = dmi_data[i + 3] | (dmi_data[i + 4] << 8);
970
971 found |= 1 << in;
972 }
973
974
975 if (dmi_data[i] == 7) {
976
977 if (found & 0x08)
978 return;
979
980 vref = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
981
982 found |= 0x08;
983 }
984 }
985
986 if (found == 0x0F) {
987 for (i = 0; i < 3; i++) {
988 dmi_mult[i] = mult[i] * 10;
989 dmi_offset[i] = offset[i] * 10;
990 }
991
992
993
994 dmi_mult[3] = dmi_mult[2];
995 dmi_mult[4] = dmi_mult[1];
996 dmi_mult[5] = dmi_mult[2];
997 dmi_offset[3] = dmi_offset[2];
998 dmi_offset[4] = dmi_offset[1];
999 dmi_offset[5] = dmi_offset[2];
1000 dmi_vref = vref;
1001 }
1002}
1003
1004static int fschmd_detect(struct i2c_client *client,
1005 struct i2c_board_info *info)
1006{
1007 enum chips kind;
1008 struct i2c_adapter *adapter = client->adapter;
1009 char id[4];
1010
1011 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1012 return -ENODEV;
1013
1014
1015 id[0] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_0);
1016 id[1] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_1);
1017 id[2] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_2);
1018 id[3] = '\0';
1019
1020 if (!strcmp(id, "PEG"))
1021 kind = fscpos;
1022 else if (!strcmp(id, "HER"))
1023 kind = fscher;
1024 else if (!strcmp(id, "SCY"))
1025 kind = fscscy;
1026 else if (!strcmp(id, "HRC"))
1027 kind = fschrc;
1028 else if (!strcmp(id, "HMD"))
1029 kind = fschmd;
1030 else if (!strcmp(id, "HDS"))
1031 kind = fschds;
1032 else if (!strcmp(id, "SYL"))
1033 kind = fscsyl;
1034 else
1035 return -ENODEV;
1036
1037 strlcpy(info->type, fschmd_id[kind].name, I2C_NAME_SIZE);
1038
1039 return 0;
1040}
1041
1042static int fschmd_probe(struct i2c_client *client,
1043 const struct i2c_device_id *id)
1044{
1045 struct fschmd_data *data;
1046 const char * const names[7] = { "Poseidon", "Hermes", "Scylla",
1047 "Heracles", "Heimdall", "Hades", "Syleus" };
1048 const int watchdog_minors[] = { WATCHDOG_MINOR, 212, 213, 214, 215 };
1049 int i, err;
1050 enum chips kind = id->driver_data;
1051
1052 data = kzalloc(sizeof(struct fschmd_data), GFP_KERNEL);
1053 if (!data)
1054 return -ENOMEM;
1055
1056 i2c_set_clientdata(client, data);
1057 mutex_init(&data->update_lock);
1058 mutex_init(&data->watchdog_lock);
1059 INIT_LIST_HEAD(&data->list);
1060 kref_init(&data->kref);
1061
1062
1063
1064 data->client = client;
1065 data->kind = kind;
1066
1067 if (kind == fscpos) {
1068
1069
1070 data->temp_max[0] = 70 + 128;
1071 data->temp_max[1] = 50 + 128;
1072 data->temp_max[2] = 50 + 128;
1073 }
1074
1075
1076 if ((kind == fscher || kind >= fschrc) && dmi_vref == -1) {
1077 dmi_walk(fschmd_dmi_decode, NULL);
1078 if (dmi_vref == -1) {
1079 dev_warn(&client->dev,
1080 "Couldn't get voltage scaling factors from "
1081 "BIOS DMI table, using builtin defaults\n");
1082 dmi_vref = 33;
1083 }
1084 }
1085
1086
1087 data->revision = i2c_smbus_read_byte_data(client, FSCHMD_REG_REVISION);
1088 data->global_control = i2c_smbus_read_byte_data(client,
1089 FSCHMD_REG_CONTROL);
1090 data->watchdog_control = i2c_smbus_read_byte_data(client,
1091 FSCHMD_REG_WDOG_CONTROL[data->kind]);
1092 data->watchdog_state = i2c_smbus_read_byte_data(client,
1093 FSCHMD_REG_WDOG_STATE[data->kind]);
1094 data->watchdog_preset = i2c_smbus_read_byte_data(client,
1095 FSCHMD_REG_WDOG_PRESET[data->kind]);
1096
1097 err = device_create_file(&client->dev, &dev_attr_alert_led);
1098 if (err)
1099 goto exit_detach;
1100
1101 for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++) {
1102 err = device_create_file(&client->dev,
1103 &fschmd_attr[i].dev_attr);
1104 if (err)
1105 goto exit_detach;
1106 }
1107
1108 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++) {
1109
1110 if (kind == fscpos && fschmd_temp_attr[i].dev_attr.show ==
1111 show_temp_max)
1112 continue;
1113
1114 if (kind == fscsyl) {
1115 if (i % 4 == 0)
1116 data->temp_status[i / 4] =
1117 i2c_smbus_read_byte_data(client,
1118 FSCHMD_REG_TEMP_STATE
1119 [data->kind][i / 4]);
1120 if (data->temp_status[i / 4] & FSCHMD_TEMP_DISABLED)
1121 continue;
1122 }
1123
1124 err = device_create_file(&client->dev,
1125 &fschmd_temp_attr[i].dev_attr);
1126 if (err)
1127 goto exit_detach;
1128 }
1129
1130 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++) {
1131
1132 if (kind == fscpos &&
1133 !strcmp(fschmd_fan_attr[i].dev_attr.attr.name,
1134 "pwm3_auto_point1_pwm"))
1135 continue;
1136
1137 if (kind == fscsyl) {
1138 if (i % 5 == 0)
1139 data->fan_status[i / 5] =
1140 i2c_smbus_read_byte_data(client,
1141 FSCHMD_REG_FAN_STATE
1142 [data->kind][i / 5]);
1143 if (data->fan_status[i / 5] & FSCHMD_FAN_DISABLED)
1144 continue;
1145 }
1146
1147 err = device_create_file(&client->dev,
1148 &fschmd_fan_attr[i].dev_attr);
1149 if (err)
1150 goto exit_detach;
1151 }
1152
1153 data->hwmon_dev = hwmon_device_register(&client->dev);
1154 if (IS_ERR(data->hwmon_dev)) {
1155 err = PTR_ERR(data->hwmon_dev);
1156 data->hwmon_dev = NULL;
1157 goto exit_detach;
1158 }
1159
1160
1161
1162
1163 mutex_lock(&watchdog_data_mutex);
1164 for (i = 0; i < ARRAY_SIZE(watchdog_minors); i++) {
1165
1166 snprintf(data->watchdog_name, sizeof(data->watchdog_name),
1167 "watchdog%c", (i == 0) ? '\0' : ('0' + i));
1168 data->watchdog_miscdev.name = data->watchdog_name;
1169 data->watchdog_miscdev.fops = &watchdog_fops;
1170 data->watchdog_miscdev.minor = watchdog_minors[i];
1171 err = misc_register(&data->watchdog_miscdev);
1172 if (err == -EBUSY)
1173 continue;
1174 if (err) {
1175 data->watchdog_miscdev.minor = 0;
1176 dev_err(&client->dev,
1177 "Registering watchdog chardev: %d\n", err);
1178 break;
1179 }
1180
1181 list_add(&data->list, &watchdog_data_list);
1182 watchdog_set_timeout(data, 60);
1183 dev_info(&client->dev,
1184 "Registered watchdog chardev major 10, minor: %d\n",
1185 watchdog_minors[i]);
1186 break;
1187 }
1188 if (i == ARRAY_SIZE(watchdog_minors)) {
1189 data->watchdog_miscdev.minor = 0;
1190 dev_warn(&client->dev, "Couldn't register watchdog chardev "
1191 "(due to no free minor)\n");
1192 }
1193 mutex_unlock(&watchdog_data_mutex);
1194
1195 dev_info(&client->dev, "Detected FSC %s chip, revision: %d\n",
1196 names[data->kind], (int) data->revision);
1197
1198 return 0;
1199
1200exit_detach:
1201 fschmd_remove(client);
1202 return err;
1203}
1204
1205static int fschmd_remove(struct i2c_client *client)
1206{
1207 struct fschmd_data *data = i2c_get_clientdata(client);
1208 int i;
1209
1210
1211 if (data->watchdog_miscdev.minor) {
1212 misc_deregister(&data->watchdog_miscdev);
1213 if (data->watchdog_is_open) {
1214 dev_warn(&client->dev,
1215 "i2c client detached with watchdog open! "
1216 "Stopping watchdog.\n");
1217 watchdog_stop(data);
1218 }
1219 mutex_lock(&watchdog_data_mutex);
1220 list_del(&data->list);
1221 mutex_unlock(&watchdog_data_mutex);
1222
1223 mutex_lock(&data->watchdog_lock);
1224 data->client = NULL;
1225 mutex_unlock(&data->watchdog_lock);
1226 }
1227
1228
1229
1230 if (data->hwmon_dev)
1231 hwmon_device_unregister(data->hwmon_dev);
1232
1233 device_remove_file(&client->dev, &dev_attr_alert_led);
1234 for (i = 0; i < (FSCHMD_NO_VOLT_SENSORS[data->kind]); i++)
1235 device_remove_file(&client->dev, &fschmd_attr[i].dev_attr);
1236 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++)
1237 device_remove_file(&client->dev,
1238 &fschmd_temp_attr[i].dev_attr);
1239 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++)
1240 device_remove_file(&client->dev,
1241 &fschmd_fan_attr[i].dev_attr);
1242
1243 mutex_lock(&watchdog_data_mutex);
1244 kref_put(&data->kref, fschmd_release_resources);
1245 mutex_unlock(&watchdog_data_mutex);
1246
1247 return 0;
1248}
1249
1250static struct fschmd_data *fschmd_update_device(struct device *dev)
1251{
1252 struct i2c_client *client = to_i2c_client(dev);
1253 struct fschmd_data *data = i2c_get_clientdata(client);
1254 int i;
1255
1256 mutex_lock(&data->update_lock);
1257
1258 if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
1259
1260 for (i = 0; i < FSCHMD_NO_TEMP_SENSORS[data->kind]; i++) {
1261 data->temp_act[i] = i2c_smbus_read_byte_data(client,
1262 FSCHMD_REG_TEMP_ACT[data->kind][i]);
1263 data->temp_status[i] = i2c_smbus_read_byte_data(client,
1264 FSCHMD_REG_TEMP_STATE[data->kind][i]);
1265
1266
1267 if (FSCHMD_REG_TEMP_LIMIT[data->kind][i])
1268 data->temp_max[i] = i2c_smbus_read_byte_data(
1269 client,
1270 FSCHMD_REG_TEMP_LIMIT[data->kind][i]);
1271
1272
1273
1274 if ((data->temp_status[i] & FSCHMD_TEMP_ALARM_MASK) ==
1275 FSCHMD_TEMP_ALARM_MASK &&
1276 data->temp_act[i] < data->temp_max[i])
1277 i2c_smbus_write_byte_data(client,
1278 FSCHMD_REG_TEMP_STATE[data->kind][i],
1279 data->temp_status[i]);
1280 }
1281
1282 for (i = 0; i < FSCHMD_NO_FAN_SENSORS[data->kind]; i++) {
1283 data->fan_act[i] = i2c_smbus_read_byte_data(client,
1284 FSCHMD_REG_FAN_ACT[data->kind][i]);
1285 data->fan_status[i] = i2c_smbus_read_byte_data(client,
1286 FSCHMD_REG_FAN_STATE[data->kind][i]);
1287 data->fan_ripple[i] = i2c_smbus_read_byte_data(client,
1288 FSCHMD_REG_FAN_RIPPLE[data->kind][i]);
1289
1290
1291 if (FSCHMD_REG_FAN_MIN[data->kind][i])
1292 data->fan_min[i] = i2c_smbus_read_byte_data(
1293 client,
1294 FSCHMD_REG_FAN_MIN[data->kind][i]);
1295
1296
1297 if ((data->fan_status[i] & FSCHMD_FAN_ALARM) &&
1298 data->fan_act[i])
1299 i2c_smbus_write_byte_data(client,
1300 FSCHMD_REG_FAN_STATE[data->kind][i],
1301 data->fan_status[i]);
1302 }
1303
1304 for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++)
1305 data->volt[i] = i2c_smbus_read_byte_data(client,
1306 FSCHMD_REG_VOLT[data->kind][i]);
1307
1308 data->last_updated = jiffies;
1309 data->valid = 1;
1310 }
1311
1312 mutex_unlock(&data->update_lock);
1313
1314 return data;
1315}
1316
1317static int __init fschmd_init(void)
1318{
1319 return i2c_add_driver(&fschmd_driver);
1320}
1321
1322static void __exit fschmd_exit(void)
1323{
1324 i2c_del_driver(&fschmd_driver);
1325}
1326
1327MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
1328MODULE_DESCRIPTION("FSC Poseidon, Hermes, Scylla, Heracles, Heimdall, Hades "
1329 "and Syleus driver");
1330MODULE_LICENSE("GPL");
1331
1332module_init(fschmd_init);
1333module_exit(fschmd_exit);
1334