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) ")");
59I2C_CLIENT_INSMOD_7(fscpos, fscher, fscscy, fschrc, fschmd, fschds, fscsyl);
60
61
62
63
64
65
66#define FSCHMD_REG_IDENT_0 0x00
67#define FSCHMD_REG_IDENT_1 0x01
68#define FSCHMD_REG_IDENT_2 0x02
69#define FSCHMD_REG_REVISION 0x03
70
71
72#define FSCHMD_REG_EVENT_STATE 0x04
73#define FSCHMD_REG_CONTROL 0x05
74
75#define FSCHMD_CONTROL_ALERT_LED 0x01
76
77
78static const u8 FSCHMD_REG_WDOG_CONTROL[7] =
79 { 0x21, 0x21, 0x21, 0x21, 0x21, 0x28, 0x28 };
80static const u8 FSCHMD_REG_WDOG_STATE[7] =
81 { 0x23, 0x23, 0x23, 0x23, 0x23, 0x29, 0x29 };
82static const u8 FSCHMD_REG_WDOG_PRESET[7] =
83 { 0x28, 0x28, 0x28, 0x28, 0x28, 0x2a, 0x2a };
84
85#define FSCHMD_WDOG_CONTROL_TRIGGER 0x10
86#define FSCHMD_WDOG_CONTROL_STARTED 0x10
87#define FSCHMD_WDOG_CONTROL_STOP 0x20
88#define FSCHMD_WDOG_CONTROL_RESOLUTION 0x40
89
90#define FSCHMD_WDOG_STATE_CARDRESET 0x02
91
92
93static const u8 FSCHMD_REG_VOLT[7][6] = {
94 { 0x45, 0x42, 0x48 },
95 { 0x45, 0x42, 0x48 },
96 { 0x45, 0x42, 0x48 },
97 { 0x45, 0x42, 0x48 },
98 { 0x45, 0x42, 0x48 },
99 { 0x21, 0x20, 0x22 },
100 { 0x21, 0x20, 0x22, 0x23, 0x24, 0x25 },
101};
102
103static const int FSCHMD_NO_VOLT_SENSORS[7] = { 3, 3, 3, 3, 3, 3, 6 };
104
105
106
107
108
109static const u8 FSCHMD_REG_FAN_MIN[7][7] = {
110 { 0x55, 0x65 },
111 { 0x55, 0x65, 0xb5 },
112 { 0x65, 0x65, 0x55, 0xa5, 0x55, 0xa5 },
113 { 0x55, 0x65, 0xa5, 0xb5 },
114 { 0x55, 0x65, 0xa5, 0xb5, 0xc5 },
115 { 0x55, 0x65, 0xa5, 0xb5, 0xc5 },
116 { 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb4 },
117};
118
119
120static const u8 FSCHMD_REG_FAN_ACT[7][7] = {
121 { 0x0e, 0x6b, 0xab },
122 { 0x0e, 0x6b, 0xbb },
123 { 0x6b, 0x6c, 0x0e, 0xab, 0x5c, 0xbb },
124 { 0x0e, 0x6b, 0xab, 0xbb },
125 { 0x5b, 0x6b, 0xab, 0xbb, 0xcb },
126 { 0x5b, 0x6b, 0xab, 0xbb, 0xcb },
127 { 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7 },
128};
129
130
131static const u8 FSCHMD_REG_FAN_STATE[7][7] = {
132 { 0x0d, 0x62, 0xa2 },
133 { 0x0d, 0x62, 0xb2 },
134 { 0x62, 0x61, 0x0d, 0xa2, 0x52, 0xb2 },
135 { 0x0d, 0x62, 0xa2, 0xb2 },
136 { 0x52, 0x62, 0xa2, 0xb2, 0xc2 },
137 { 0x52, 0x62, 0xa2, 0xb2, 0xc2 },
138 { 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0 },
139};
140
141
142static const u8 FSCHMD_REG_FAN_RIPPLE[7][7] = {
143 { 0x0f, 0x6f, 0xaf },
144 { 0x0f, 0x6f, 0xbf },
145 { 0x6f, 0x6f, 0x0f, 0xaf, 0x0f, 0xbf },
146 { 0x0f, 0x6f, 0xaf, 0xbf },
147 { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf },
148 { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf },
149 { 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6 },
150};
151
152static const int FSCHMD_NO_FAN_SENSORS[7] = { 3, 3, 6, 4, 5, 5, 7 };
153
154
155#define FSCHMD_FAN_ALARM 0x04
156#define FSCHMD_FAN_NOT_PRESENT 0x08
157#define FSCHMD_FAN_DISABLED 0x80
158
159
160
161static const u8 FSCHMD_REG_TEMP_ACT[7][11] = {
162 { 0x64, 0x32, 0x35 },
163 { 0x64, 0x32, 0x35 },
164 { 0x64, 0xD0, 0x32, 0x35 },
165 { 0x64, 0x32, 0x35 },
166 { 0x70, 0x80, 0x90, 0xd0, 0xe0 },
167 { 0x70, 0x80, 0x90, 0xd0, 0xe0 },
168 { 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8,
169 0xb8, 0xc8, 0xd8, 0xe8, 0xf8 },
170};
171
172
173static const u8 FSCHMD_REG_TEMP_STATE[7][11] = {
174 { 0x71, 0x81, 0x91 },
175 { 0x71, 0x81, 0x91 },
176 { 0x71, 0xd1, 0x81, 0x91 },
177 { 0x71, 0x81, 0x91 },
178 { 0x71, 0x81, 0x91, 0xd1, 0xe1 },
179 { 0x71, 0x81, 0x91, 0xd1, 0xe1 },
180 { 0x59, 0x69, 0x79, 0x89, 0x99, 0xa9,
181 0xb9, 0xc9, 0xd9, 0xe9, 0xf9 },
182};
183
184
185
186
187
188
189static const u8 FSCHMD_REG_TEMP_LIMIT[7][11] = {
190 { 0, 0, 0 },
191 { 0x76, 0x86, 0x96 },
192 { 0x76, 0xd6, 0x86, 0x96 },
193 { 0x76, 0x86, 0x96 },
194 { 0x76, 0x86, 0x96, 0xd6, 0xe6 },
195 { 0x76, 0x86, 0x96, 0xd6, 0xe6 },
196 { 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa,
197 0xba, 0xca, 0xda, 0xea, 0xfa },
198};
199
200
201
202
203
204
205
206
207
208static const int FSCHMD_NO_TEMP_SENSORS[7] = { 3, 3, 4, 3, 5, 5, 11 };
209
210
211#define FSCHMD_TEMP_WORKING 0x01
212#define FSCHMD_TEMP_ALERT 0x02
213#define FSCHMD_TEMP_DISABLED 0x80
214
215#define FSCHMD_TEMP_ALARM_MASK \
216 (FSCHMD_TEMP_WORKING | FSCHMD_TEMP_ALERT)
217
218
219
220
221
222static int fschmd_probe(struct i2c_client *client,
223 const struct i2c_device_id *id);
224static int fschmd_detect(struct i2c_client *client, int kind,
225 struct i2c_board_info *info);
226static int fschmd_remove(struct i2c_client *client);
227static struct fschmd_data *fschmd_update_device(struct device *dev);
228
229
230
231
232
233static const struct i2c_device_id fschmd_id[] = {
234 { "fscpos", fscpos },
235 { "fscher", fscher },
236 { "fscscy", fscscy },
237 { "fschrc", fschrc },
238 { "fschmd", fschmd },
239 { "fschds", fschds },
240 { "fscsyl", fscsyl },
241 { }
242};
243MODULE_DEVICE_TABLE(i2c, fschmd_id);
244
245static struct i2c_driver fschmd_driver = {
246 .class = I2C_CLASS_HWMON,
247 .driver = {
248 .name = "fschmd",
249 },
250 .probe = fschmd_probe,
251 .remove = fschmd_remove,
252 .id_table = fschmd_id,
253 .detect = fschmd_detect,
254 .address_data = &addr_data,
255};
256
257
258
259
260
261struct fschmd_data {
262 struct i2c_client *client;
263 struct device *hwmon_dev;
264 struct mutex update_lock;
265 struct mutex watchdog_lock;
266 struct list_head list;
267 struct kref kref;
268 struct miscdevice watchdog_miscdev;
269 int kind;
270 unsigned long watchdog_is_open;
271 char watchdog_expect_close;
272 char watchdog_name[10];
273 char valid;
274 unsigned long last_updated;
275
276
277 u8 revision;
278 u8 global_control;
279 u8 watchdog_control;
280 u8 watchdog_state;
281 u8 watchdog_preset;
282 u8 volt[6];
283 u8 temp_act[11];
284 u8 temp_status[11];
285 u8 temp_max[11];
286 u8 fan_act[7];
287 u8 fan_status[7];
288 u8 fan_min[7];
289 u8 fan_ripple[7];
290};
291
292
293
294
295
296
297static int dmi_mult[6] = { 490, 200, 100, 100, 200, 100 };
298static int dmi_offset[6] = { 0, 0, 0, 0, 0, 0 };
299static int dmi_vref = -1;
300
301
302
303
304static LIST_HEAD(watchdog_data_list);
305
306static DEFINE_MUTEX(watchdog_data_mutex);
307
308
309
310static void fschmd_release_resources(struct kref *ref)
311{
312 struct fschmd_data *data = container_of(ref, struct fschmd_data, kref);
313 kfree(data);
314}
315
316
317
318
319
320static ssize_t show_in_value(struct device *dev,
321 struct device_attribute *devattr, char *buf)
322{
323 const int max_reading[3] = { 14200, 6600, 3300 };
324 int index = to_sensor_dev_attr(devattr)->index;
325 struct fschmd_data *data = fschmd_update_device(dev);
326
327
328 if (data->kind == (fscher - 1) || data->kind >= (fschrc - 1))
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 - 1)
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 - 1) {
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
771
772
773
774
775 if (!mutex_trylock(&watchdog_data_mutex))
776 return -ERESTARTSYS;
777 list_for_each_entry(pos, &watchdog_data_list, list) {
778 if (pos->watchdog_miscdev.minor == iminor(inode)) {
779 data = pos;
780 break;
781 }
782 }
783
784 kref_get(&data->kref);
785 mutex_unlock(&watchdog_data_mutex);
786
787 if (test_and_set_bit(0, &data->watchdog_is_open))
788 return -EBUSY;
789
790
791 watchdog_trigger(data);
792 filp->private_data = data;
793
794 return nonseekable_open(inode, filp);
795}
796
797static int watchdog_release(struct inode *inode, struct file *filp)
798{
799 struct fschmd_data *data = filp->private_data;
800
801 if (data->watchdog_expect_close) {
802 watchdog_stop(data);
803 data->watchdog_expect_close = 0;
804 } else {
805 watchdog_trigger(data);
806 dev_crit(&data->client->dev,
807 "unexpected close, not stopping watchdog!\n");
808 }
809
810 clear_bit(0, &data->watchdog_is_open);
811
812 mutex_lock(&watchdog_data_mutex);
813 kref_put(&data->kref, fschmd_release_resources);
814 mutex_unlock(&watchdog_data_mutex);
815
816 return 0;
817}
818
819static ssize_t watchdog_write(struct file *filp, const char __user *buf,
820 size_t count, loff_t *offset)
821{
822 size_t ret;
823 struct fschmd_data *data = filp->private_data;
824
825 if (count) {
826 if (!nowayout) {
827 size_t i;
828
829
830 data->watchdog_expect_close = 0;
831
832 for (i = 0; i != count; i++) {
833 char c;
834 if (get_user(c, buf + i))
835 return -EFAULT;
836 if (c == 'V')
837 data->watchdog_expect_close = 1;
838 }
839 }
840 ret = watchdog_trigger(data);
841 if (ret < 0)
842 return ret;
843 }
844 return count;
845}
846
847static int watchdog_ioctl(struct inode *inode, struct file *filp,
848 unsigned int cmd, unsigned long arg)
849{
850 static struct watchdog_info ident = {
851 .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
852 WDIOF_CARDRESET,
853 .identity = "FSC watchdog"
854 };
855 int i, ret = 0;
856 struct fschmd_data *data = filp->private_data;
857
858 switch (cmd) {
859 case WDIOC_GETSUPPORT:
860 ident.firmware_version = data->revision;
861 if (!nowayout)
862 ident.options |= WDIOF_MAGICCLOSE;
863 if (copy_to_user((void __user *)arg, &ident, sizeof(ident)))
864 ret = -EFAULT;
865 break;
866
867 case WDIOC_GETSTATUS:
868 ret = put_user(0, (int __user *)arg);
869 break;
870
871 case WDIOC_GETBOOTSTATUS:
872 if (data->watchdog_state & FSCHMD_WDOG_STATE_CARDRESET)
873 ret = put_user(WDIOF_CARDRESET, (int __user *)arg);
874 else
875 ret = put_user(0, (int __user *)arg);
876 break;
877
878 case WDIOC_KEEPALIVE:
879 ret = watchdog_trigger(data);
880 break;
881
882 case WDIOC_GETTIMEOUT:
883 i = watchdog_get_timeout(data);
884 ret = put_user(i, (int __user *)arg);
885 break;
886
887 case WDIOC_SETTIMEOUT:
888 if (get_user(i, (int __user *)arg)) {
889 ret = -EFAULT;
890 break;
891 }
892 ret = watchdog_set_timeout(data, i);
893 if (ret > 0)
894 ret = put_user(ret, (int __user *)arg);
895 break;
896
897 case WDIOC_SETOPTIONS:
898 if (get_user(i, (int __user *)arg)) {
899 ret = -EFAULT;
900 break;
901 }
902
903 if (i & WDIOS_DISABLECARD)
904 ret = watchdog_stop(data);
905 else if (i & WDIOS_ENABLECARD)
906 ret = watchdog_trigger(data);
907 else
908 ret = -EINVAL;
909
910 break;
911 default:
912 ret = -ENOTTY;
913 }
914
915 return ret;
916}
917
918static struct file_operations watchdog_fops = {
919 .owner = THIS_MODULE,
920 .llseek = no_llseek,
921 .open = watchdog_open,
922 .release = watchdog_release,
923 .write = watchdog_write,
924 .ioctl = watchdog_ioctl,
925};
926
927
928
929
930
931
932
933
934static void fschmd_dmi_decode(const struct dmi_header *header, void *dummy)
935{
936 int i, mult[3] = { 0 }, offset[3] = { 0 }, vref = 0, found = 0;
937
938
939
940
941
942 u8 *dmi_data = (u8 *)header;
943
944
945 if (header->type != 185)
946 return;
947
948
949
950 if (header->length < 5 || dmi_data[4] != 19)
951 return;
952
953
954
955
956 for (i = 6; (i + 4) < header->length; i += 5) {
957
958 if (dmi_data[i] >= 1 && dmi_data[i] <= 3) {
959
960 const int shuffle[3] = { 1, 0, 2 };
961 int in = shuffle[dmi_data[i] - 1];
962
963
964 if (found & (1 << in))
965 return;
966
967 mult[in] = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
968 offset[in] = dmi_data[i + 3] | (dmi_data[i + 4] << 8);
969
970 found |= 1 << in;
971 }
972
973
974 if (dmi_data[i] == 7) {
975
976 if (found & 0x08)
977 return;
978
979 vref = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
980
981 found |= 0x08;
982 }
983 }
984
985 if (found == 0x0F) {
986 for (i = 0; i < 3; i++) {
987 dmi_mult[i] = mult[i] * 10;
988 dmi_offset[i] = offset[i] * 10;
989 }
990
991
992
993 dmi_mult[3] = dmi_mult[2];
994 dmi_mult[4] = dmi_mult[1];
995 dmi_mult[5] = dmi_mult[2];
996 dmi_offset[3] = dmi_offset[2];
997 dmi_offset[4] = dmi_offset[1];
998 dmi_offset[5] = dmi_offset[2];
999 dmi_vref = vref;
1000 }
1001}
1002
1003static int fschmd_detect(struct i2c_client *client, int kind,
1004 struct i2c_board_info *info)
1005{
1006 struct i2c_adapter *adapter = client->adapter;
1007
1008 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1009 return -ENODEV;
1010
1011
1012 if (kind <= 0) {
1013 char id[4];
1014
1015 id[0] = i2c_smbus_read_byte_data(client,
1016 FSCHMD_REG_IDENT_0);
1017 id[1] = i2c_smbus_read_byte_data(client,
1018 FSCHMD_REG_IDENT_1);
1019 id[2] = i2c_smbus_read_byte_data(client,
1020 FSCHMD_REG_IDENT_2);
1021 id[3] = '\0';
1022
1023 if (!strcmp(id, "PEG"))
1024 kind = fscpos;
1025 else if (!strcmp(id, "HER"))
1026 kind = fscher;
1027 else if (!strcmp(id, "SCY"))
1028 kind = fscscy;
1029 else if (!strcmp(id, "HRC"))
1030 kind = fschrc;
1031 else if (!strcmp(id, "HMD"))
1032 kind = fschmd;
1033 else if (!strcmp(id, "HDS"))
1034 kind = fschds;
1035 else if (!strcmp(id, "SYL"))
1036 kind = fscsyl;
1037 else
1038 return -ENODEV;
1039 }
1040
1041 strlcpy(info->type, fschmd_id[kind - 1].name, I2C_NAME_SIZE);
1042
1043 return 0;
1044}
1045
1046static int fschmd_probe(struct i2c_client *client,
1047 const struct i2c_device_id *id)
1048{
1049 struct fschmd_data *data;
1050 const char * const names[7] = { "Poseidon", "Hermes", "Scylla",
1051 "Heracles", "Heimdall", "Hades", "Syleus" };
1052 const int watchdog_minors[] = { WATCHDOG_MINOR, 212, 213, 214, 215 };
1053 int i, err;
1054 enum chips kind = id->driver_data;
1055
1056 data = kzalloc(sizeof(struct fschmd_data), GFP_KERNEL);
1057 if (!data)
1058 return -ENOMEM;
1059
1060 i2c_set_clientdata(client, data);
1061 mutex_init(&data->update_lock);
1062 mutex_init(&data->watchdog_lock);
1063 INIT_LIST_HEAD(&data->list);
1064 kref_init(&data->kref);
1065
1066
1067
1068 data->client = client;
1069
1070 if (kind == fscpos) {
1071
1072
1073 data->temp_max[0] = 70 + 128;
1074 data->temp_max[1] = 50 + 128;
1075 data->temp_max[2] = 50 + 128;
1076 }
1077
1078
1079 if ((kind == fscher || kind >= fschrc) && dmi_vref == -1) {
1080 dmi_walk(fschmd_dmi_decode, NULL);
1081 if (dmi_vref == -1) {
1082 dev_warn(&client->dev,
1083 "Couldn't get voltage scaling factors from "
1084 "BIOS DMI table, using builtin defaults\n");
1085 dmi_vref = 33;
1086 }
1087 }
1088
1089
1090 data->kind = kind - 1;
1091
1092
1093 data->revision = i2c_smbus_read_byte_data(client, FSCHMD_REG_REVISION);
1094 data->global_control = i2c_smbus_read_byte_data(client,
1095 FSCHMD_REG_CONTROL);
1096 data->watchdog_control = i2c_smbus_read_byte_data(client,
1097 FSCHMD_REG_WDOG_CONTROL[data->kind]);
1098 data->watchdog_state = i2c_smbus_read_byte_data(client,
1099 FSCHMD_REG_WDOG_STATE[data->kind]);
1100 data->watchdog_preset = i2c_smbus_read_byte_data(client,
1101 FSCHMD_REG_WDOG_PRESET[data->kind]);
1102
1103 err = device_create_file(&client->dev, &dev_attr_alert_led);
1104 if (err)
1105 goto exit_detach;
1106
1107 for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++) {
1108 err = device_create_file(&client->dev,
1109 &fschmd_attr[i].dev_attr);
1110 if (err)
1111 goto exit_detach;
1112 }
1113
1114 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++) {
1115
1116 if (kind == fscpos && fschmd_temp_attr[i].dev_attr.show ==
1117 show_temp_max)
1118 continue;
1119
1120 if (kind == fscsyl) {
1121 if (i % 4 == 0)
1122 data->temp_status[i / 4] =
1123 i2c_smbus_read_byte_data(client,
1124 FSCHMD_REG_TEMP_STATE
1125 [data->kind][i / 4]);
1126 if (data->temp_status[i / 4] & FSCHMD_TEMP_DISABLED)
1127 continue;
1128 }
1129
1130 err = device_create_file(&client->dev,
1131 &fschmd_temp_attr[i].dev_attr);
1132 if (err)
1133 goto exit_detach;
1134 }
1135
1136 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++) {
1137
1138 if (kind == fscpos &&
1139 !strcmp(fschmd_fan_attr[i].dev_attr.attr.name,
1140 "pwm3_auto_point1_pwm"))
1141 continue;
1142
1143 if (kind == fscsyl) {
1144 if (i % 5 == 0)
1145 data->fan_status[i / 5] =
1146 i2c_smbus_read_byte_data(client,
1147 FSCHMD_REG_FAN_STATE
1148 [data->kind][i / 5]);
1149 if (data->fan_status[i / 5] & FSCHMD_FAN_DISABLED)
1150 continue;
1151 }
1152
1153 err = device_create_file(&client->dev,
1154 &fschmd_fan_attr[i].dev_attr);
1155 if (err)
1156 goto exit_detach;
1157 }
1158
1159 data->hwmon_dev = hwmon_device_register(&client->dev);
1160 if (IS_ERR(data->hwmon_dev)) {
1161 err = PTR_ERR(data->hwmon_dev);
1162 data->hwmon_dev = NULL;
1163 goto exit_detach;
1164 }
1165
1166
1167
1168
1169 mutex_lock(&watchdog_data_mutex);
1170 for (i = 0; i < ARRAY_SIZE(watchdog_minors); i++) {
1171
1172 snprintf(data->watchdog_name, sizeof(data->watchdog_name),
1173 "watchdog%c", (i == 0) ? '\0' : ('0' + i));
1174 data->watchdog_miscdev.name = data->watchdog_name;
1175 data->watchdog_miscdev.fops = &watchdog_fops;
1176 data->watchdog_miscdev.minor = watchdog_minors[i];
1177 err = misc_register(&data->watchdog_miscdev);
1178 if (err == -EBUSY)
1179 continue;
1180 if (err) {
1181 data->watchdog_miscdev.minor = 0;
1182 dev_err(&client->dev,
1183 "Registering watchdog chardev: %d\n", err);
1184 break;
1185 }
1186
1187 list_add(&data->list, &watchdog_data_list);
1188 watchdog_set_timeout(data, 60);
1189 dev_info(&client->dev,
1190 "Registered watchdog chardev major 10, minor: %d\n",
1191 watchdog_minors[i]);
1192 break;
1193 }
1194 if (i == ARRAY_SIZE(watchdog_minors)) {
1195 data->watchdog_miscdev.minor = 0;
1196 dev_warn(&client->dev, "Couldn't register watchdog chardev "
1197 "(due to no free minor)\n");
1198 }
1199 mutex_unlock(&watchdog_data_mutex);
1200
1201 dev_info(&client->dev, "Detected FSC %s chip, revision: %d\n",
1202 names[data->kind], (int) data->revision);
1203
1204 return 0;
1205
1206exit_detach:
1207 fschmd_remove(client);
1208 return err;
1209}
1210
1211static int fschmd_remove(struct i2c_client *client)
1212{
1213 struct fschmd_data *data = i2c_get_clientdata(client);
1214 int i;
1215
1216
1217 if (data->watchdog_miscdev.minor) {
1218 misc_deregister(&data->watchdog_miscdev);
1219 if (data->watchdog_is_open) {
1220 dev_warn(&client->dev,
1221 "i2c client detached with watchdog open! "
1222 "Stopping watchdog.\n");
1223 watchdog_stop(data);
1224 }
1225 mutex_lock(&watchdog_data_mutex);
1226 list_del(&data->list);
1227 mutex_unlock(&watchdog_data_mutex);
1228
1229 mutex_lock(&data->watchdog_lock);
1230 data->client = NULL;
1231 mutex_unlock(&data->watchdog_lock);
1232 }
1233
1234
1235
1236 if (data->hwmon_dev)
1237 hwmon_device_unregister(data->hwmon_dev);
1238
1239 device_remove_file(&client->dev, &dev_attr_alert_led);
1240 for (i = 0; i < (FSCHMD_NO_VOLT_SENSORS[data->kind]); i++)
1241 device_remove_file(&client->dev, &fschmd_attr[i].dev_attr);
1242 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++)
1243 device_remove_file(&client->dev,
1244 &fschmd_temp_attr[i].dev_attr);
1245 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++)
1246 device_remove_file(&client->dev,
1247 &fschmd_fan_attr[i].dev_attr);
1248
1249 mutex_lock(&watchdog_data_mutex);
1250 kref_put(&data->kref, fschmd_release_resources);
1251 mutex_unlock(&watchdog_data_mutex);
1252
1253 return 0;
1254}
1255
1256static struct fschmd_data *fschmd_update_device(struct device *dev)
1257{
1258 struct i2c_client *client = to_i2c_client(dev);
1259 struct fschmd_data *data = i2c_get_clientdata(client);
1260 int i;
1261
1262 mutex_lock(&data->update_lock);
1263
1264 if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
1265
1266 for (i = 0; i < FSCHMD_NO_TEMP_SENSORS[data->kind]; i++) {
1267 data->temp_act[i] = i2c_smbus_read_byte_data(client,
1268 FSCHMD_REG_TEMP_ACT[data->kind][i]);
1269 data->temp_status[i] = i2c_smbus_read_byte_data(client,
1270 FSCHMD_REG_TEMP_STATE[data->kind][i]);
1271
1272
1273 if (FSCHMD_REG_TEMP_LIMIT[data->kind][i])
1274 data->temp_max[i] = i2c_smbus_read_byte_data(
1275 client,
1276 FSCHMD_REG_TEMP_LIMIT[data->kind][i]);
1277
1278
1279
1280 if ((data->temp_status[i] & FSCHMD_TEMP_ALARM_MASK) ==
1281 FSCHMD_TEMP_ALARM_MASK &&
1282 data->temp_act[i] < data->temp_max[i])
1283 i2c_smbus_write_byte_data(client,
1284 FSCHMD_REG_TEMP_STATE[data->kind][i],
1285 data->temp_status[i]);
1286 }
1287
1288 for (i = 0; i < FSCHMD_NO_FAN_SENSORS[data->kind]; i++) {
1289 data->fan_act[i] = i2c_smbus_read_byte_data(client,
1290 FSCHMD_REG_FAN_ACT[data->kind][i]);
1291 data->fan_status[i] = i2c_smbus_read_byte_data(client,
1292 FSCHMD_REG_FAN_STATE[data->kind][i]);
1293 data->fan_ripple[i] = i2c_smbus_read_byte_data(client,
1294 FSCHMD_REG_FAN_RIPPLE[data->kind][i]);
1295
1296
1297 if (FSCHMD_REG_FAN_MIN[data->kind][i])
1298 data->fan_min[i] = i2c_smbus_read_byte_data(
1299 client,
1300 FSCHMD_REG_FAN_MIN[data->kind][i]);
1301
1302
1303 if ((data->fan_status[i] & FSCHMD_FAN_ALARM) &&
1304 data->fan_act[i])
1305 i2c_smbus_write_byte_data(client,
1306 FSCHMD_REG_FAN_STATE[data->kind][i],
1307 data->fan_status[i]);
1308 }
1309
1310 for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++)
1311 data->volt[i] = i2c_smbus_read_byte_data(client,
1312 FSCHMD_REG_VOLT[data->kind][i]);
1313
1314 data->last_updated = jiffies;
1315 data->valid = 1;
1316 }
1317
1318 mutex_unlock(&data->update_lock);
1319
1320 return data;
1321}
1322
1323static int __init fschmd_init(void)
1324{
1325 return i2c_add_driver(&fschmd_driver);
1326}
1327
1328static void __exit fschmd_exit(void)
1329{
1330 i2c_del_driver(&fschmd_driver);
1331}
1332
1333MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
1334MODULE_DESCRIPTION("FSC Poseidon, Hermes, Scylla, Heracles, Heimdall, Hades "
1335 "and Syleus driver");
1336MODULE_LICENSE("GPL");
1337
1338module_init(fschmd_init);
1339module_exit(fschmd_exit);
1340