hwmon: (tmp421) Restore missing inputs
[safe/jmp/linux-2.6] / drivers / hwmon / fschmd.c
1 /* fschmd.c
2  *
3  * Copyright (C) 2007 - 2009 Hans de Goede <hdegoede@redhat.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19
20 /*
21  *  Merged Fujitsu Siemens hwmon driver, supporting the Poseidon, Hermes,
22  *  Scylla, Heracles, Heimdall, Hades and Syleus chips
23  *
24  *  Based on the original 2.4 fscscy, 2.6 fscpos, 2.6 fscher and 2.6
25  *  (candidate) fschmd drivers:
26  *  Copyright (C) 2006 Thilo Cestonaro
27  *                      <thilo.cestonaro.external@fujitsu-siemens.com>
28  *  Copyright (C) 2004, 2005 Stefan Ott <stefan@desire.ch>
29  *  Copyright (C) 2003, 2004 Reinhard Nissl <rnissl@gmx.de>
30  *  Copyright (c) 2001 Martin Knoblauch <mkn@teraport.de, knobi@knobisoft.de>
31  *  Copyright (C) 2000 Hermann Jung <hej@odn.de>
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 /* Addresses to scan */
52 static const unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END };
53
54 /* Insmod parameters */
55 static int nowayout = WATCHDOG_NOWAYOUT;
56 module_param(nowayout, int, 0);
57 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
58         __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
59
60 enum chips { fscpos, fscher, fscscy, fschrc, fschmd, fschds, fscsyl };
61
62 /*
63  * The FSCHMD registers and other defines
64  */
65
66 /* chip identification */
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 /* global control and status */
73 #define FSCHMD_REG_EVENT_STATE          0x04
74 #define FSCHMD_REG_CONTROL              0x05
75
76 #define FSCHMD_CONTROL_ALERT_LED        0x01
77
78 /* watchdog */
79 static const u8 FSCHMD_REG_WDOG_CONTROL[7] =
80         { 0x21, 0x21, 0x21, 0x21, 0x21, 0x28, 0x28 };
81 static const u8 FSCHMD_REG_WDOG_STATE[7] =
82         { 0x23, 0x23, 0x23, 0x23, 0x23, 0x29, 0x29 };
83 static 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 /* the same as trigger */
88 #define FSCHMD_WDOG_CONTROL_STOP        0x20
89 #define FSCHMD_WDOG_CONTROL_RESOLUTION  0x40
90
91 #define FSCHMD_WDOG_STATE_CARDRESET     0x02
92
93 /* voltages, weird order is to keep the same order as the old drivers */
94 static const u8 FSCHMD_REG_VOLT[7][6] = {
95         { 0x45, 0x42, 0x48 },                           /* pos */
96         { 0x45, 0x42, 0x48 },                           /* her */
97         { 0x45, 0x42, 0x48 },                           /* scy */
98         { 0x45, 0x42, 0x48 },                           /* hrc */
99         { 0x45, 0x42, 0x48 },                           /* hmd */
100         { 0x21, 0x20, 0x22 },                           /* hds */
101         { 0x21, 0x20, 0x22, 0x23, 0x24, 0x25 },         /* syl */
102 };
103
104 static const int FSCHMD_NO_VOLT_SENSORS[7] = { 3, 3, 3, 3, 3, 3, 6 };
105
106 /* minimum pwm at which the fan is driven (pwm can by increased depending on
107    the temp. Notice that for the scy some fans share there minimum speed.
108    Also notice that with the scy the sensor order is different than with the
109    other chips, this order was in the 2.4 driver and kept for consistency. */
110 static const u8 FSCHMD_REG_FAN_MIN[7][7] = {
111         { 0x55, 0x65 },                                 /* pos */
112         { 0x55, 0x65, 0xb5 },                           /* her */
113         { 0x65, 0x65, 0x55, 0xa5, 0x55, 0xa5 },         /* scy */
114         { 0x55, 0x65, 0xa5, 0xb5 },                     /* hrc */
115         { 0x55, 0x65, 0xa5, 0xb5, 0xc5 },               /* hmd */
116         { 0x55, 0x65, 0xa5, 0xb5, 0xc5 },               /* hds */
117         { 0x54, 0x64, 0x74, 0x84, 0x94, 0xa4, 0xb4 },   /* syl */
118 };
119
120 /* actual fan speed */
121 static const u8 FSCHMD_REG_FAN_ACT[7][7] = {
122         { 0x0e, 0x6b, 0xab },                           /* pos */
123         { 0x0e, 0x6b, 0xbb },                           /* her */
124         { 0x6b, 0x6c, 0x0e, 0xab, 0x5c, 0xbb },         /* scy */
125         { 0x0e, 0x6b, 0xab, 0xbb },                     /* hrc */
126         { 0x5b, 0x6b, 0xab, 0xbb, 0xcb },               /* hmd */
127         { 0x5b, 0x6b, 0xab, 0xbb, 0xcb },               /* hds */
128         { 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7 },   /* syl */
129 };
130
131 /* fan status registers */
132 static const u8 FSCHMD_REG_FAN_STATE[7][7] = {
133         { 0x0d, 0x62, 0xa2 },                           /* pos */
134         { 0x0d, 0x62, 0xb2 },                           /* her */
135         { 0x62, 0x61, 0x0d, 0xa2, 0x52, 0xb2 },         /* scy */
136         { 0x0d, 0x62, 0xa2, 0xb2 },                     /* hrc */
137         { 0x52, 0x62, 0xa2, 0xb2, 0xc2 },               /* hmd */
138         { 0x52, 0x62, 0xa2, 0xb2, 0xc2 },               /* hds */
139         { 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0 },   /* syl */
140 };
141
142 /* fan ripple / divider registers */
143 static const u8 FSCHMD_REG_FAN_RIPPLE[7][7] = {
144         { 0x0f, 0x6f, 0xaf },                           /* pos */
145         { 0x0f, 0x6f, 0xbf },                           /* her */
146         { 0x6f, 0x6f, 0x0f, 0xaf, 0x0f, 0xbf },         /* scy */
147         { 0x0f, 0x6f, 0xaf, 0xbf },                     /* hrc */
148         { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf },               /* hmd */
149         { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf },               /* hds */
150         { 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6 },   /* syl */
151 };
152
153 static const int FSCHMD_NO_FAN_SENSORS[7] = { 3, 3, 6, 4, 5, 5, 7 };
154
155 /* Fan status register bitmasks */
156 #define FSCHMD_FAN_ALARM        0x04 /* called fault by FSC! */
157 #define FSCHMD_FAN_NOT_PRESENT  0x08
158 #define FSCHMD_FAN_DISABLED     0x80
159
160
161 /* actual temperature registers */
162 static const u8 FSCHMD_REG_TEMP_ACT[7][11] = {
163         { 0x64, 0x32, 0x35 },                           /* pos */
164         { 0x64, 0x32, 0x35 },                           /* her */
165         { 0x64, 0xD0, 0x32, 0x35 },                     /* scy */
166         { 0x64, 0x32, 0x35 },                           /* hrc */
167         { 0x70, 0x80, 0x90, 0xd0, 0xe0 },               /* hmd */
168         { 0x70, 0x80, 0x90, 0xd0, 0xe0 },               /* hds */
169         { 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8,           /* syl */
170           0xb8, 0xc8, 0xd8, 0xe8, 0xf8 },
171 };
172
173 /* temperature state registers */
174 static const u8 FSCHMD_REG_TEMP_STATE[7][11] = {
175         { 0x71, 0x81, 0x91 },                           /* pos */
176         { 0x71, 0x81, 0x91 },                           /* her */
177         { 0x71, 0xd1, 0x81, 0x91 },                     /* scy */
178         { 0x71, 0x81, 0x91 },                           /* hrc */
179         { 0x71, 0x81, 0x91, 0xd1, 0xe1 },               /* hmd */
180         { 0x71, 0x81, 0x91, 0xd1, 0xe1 },               /* hds */
181         { 0x59, 0x69, 0x79, 0x89, 0x99, 0xa9,           /* syl */
182           0xb9, 0xc9, 0xd9, 0xe9, 0xf9 },
183 };
184
185 /* temperature high limit registers, FSC does not document these. Proven to be
186    there with field testing on the fscher and fschrc, already supported / used
187    in the fscscy 2.4 driver. FSC has confirmed that the fschmd has registers
188    at these addresses, but doesn't want to confirm they are the same as with
189    the fscher?? */
190 static const u8 FSCHMD_REG_TEMP_LIMIT[7][11] = {
191         { 0, 0, 0 },                                    /* pos */
192         { 0x76, 0x86, 0x96 },                           /* her */
193         { 0x76, 0xd6, 0x86, 0x96 },                     /* scy */
194         { 0x76, 0x86, 0x96 },                           /* hrc */
195         { 0x76, 0x86, 0x96, 0xd6, 0xe6 },               /* hmd */
196         { 0x76, 0x86, 0x96, 0xd6, 0xe6 },               /* hds */
197         { 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa,           /* syl */
198           0xba, 0xca, 0xda, 0xea, 0xfa },
199 };
200
201 /* These were found through experimenting with an fscher, currently they are
202    not used, but we keep them around for future reference.
203    On the fscsyl AUTOP1 lives at 0x#c (so 0x5c for fan1, 0x6c for fan2, etc),
204    AUTOP2 lives at 0x#e, and 0x#1 is a bitmask defining which temps influence
205    the fan speed.
206 static const u8 FSCHER_REG_TEMP_AUTOP1[] =      { 0x73, 0x83, 0x93 };
207 static const u8 FSCHER_REG_TEMP_AUTOP2[] =      { 0x75, 0x85, 0x95 }; */
208
209 static const int FSCHMD_NO_TEMP_SENSORS[7] = { 3, 3, 4, 3, 5, 5, 11 };
210
211 /* temp status register bitmasks */
212 #define FSCHMD_TEMP_WORKING     0x01
213 #define FSCHMD_TEMP_ALERT       0x02
214 #define FSCHMD_TEMP_DISABLED    0x80
215 /* there only really is an alarm if the sensor is working and alert == 1 */
216 #define FSCHMD_TEMP_ALARM_MASK \
217         (FSCHMD_TEMP_WORKING | FSCHMD_TEMP_ALERT)
218
219 /*
220  * Functions declarations
221  */
222
223 static int fschmd_probe(struct i2c_client *client,
224                         const struct i2c_device_id *id);
225 static int fschmd_detect(struct i2c_client *client,
226                          struct i2c_board_info *info);
227 static int fschmd_remove(struct i2c_client *client);
228 static struct fschmd_data *fschmd_update_device(struct device *dev);
229
230 /*
231  * Driver data (common to all clients)
232  */
233
234 static 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 };
244 MODULE_DEVICE_TABLE(i2c, fschmd_id);
245
246 static 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  * Client data (each client gets its own)
260  */
261
262 struct 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; /* member of the watchdog_data_list */
268         struct kref kref;
269         struct miscdevice watchdog_miscdev;
270         int kind;
271         unsigned long watchdog_is_open;
272         char watchdog_expect_close;
273         char watchdog_name[10]; /* must be unique to avoid sysfs conflict */
274         char valid; /* zero until following fields are valid */
275         unsigned long last_updated; /* in jiffies */
276
277         /* register values */
278         u8 revision;            /* chip revision */
279         u8 global_control;      /* global control register */
280         u8 watchdog_control;    /* watchdog control register */
281         u8 watchdog_state;      /* watchdog status register */
282         u8 watchdog_preset;     /* watchdog counter preset on trigger val */
283         u8 volt[6];             /* voltage */
284         u8 temp_act[11];        /* temperature */
285         u8 temp_status[11];     /* status of sensor */
286         u8 temp_max[11];        /* high temp limit, notice: undocumented! */
287         u8 fan_act[7];          /* fans revolutions per second */
288         u8 fan_status[7];       /* fan status */
289         u8 fan_min[7];          /* fan min value for rps */
290         u8 fan_ripple[7];       /* divider for rps */
291 };
292
293 /* Global variables to hold information read from special DMI tables, which are
294    available on FSC machines with an fscher or later chip. There is no need to
295    protect these with a lock as they are only modified from our attach function
296    which always gets called with the i2c-core lock held and never accessed
297    before the attach function is done with them. */
298 static int dmi_mult[6] = { 490, 200, 100, 100, 200, 100 };
299 static int dmi_offset[6] = { 0, 0, 0, 0, 0, 0 };
300 static int dmi_vref = -1;
301
302 /* Somewhat ugly :( global data pointer list with all fschmd devices, so that
303    we can find our device data as when using misc_register there is no other
304    method to get to ones device data from the open fop. */
305 static LIST_HEAD(watchdog_data_list);
306 /* Note this lock not only protect list access, but also data.kref access */
307 static DEFINE_MUTEX(watchdog_data_mutex);
308
309 /* Release our data struct when we're detached from the i2c client *and* all
310    references to our watchdog device are released */
311 static 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  * Sysfs attr show / store functions
319  */
320
321 static 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         /* fscher / fschrc - 1 as data->kind is an array index, not a chips */
329         if (data->kind == (fscher - 1) || data->kind >= (fschrc - 1))
330                 return sprintf(buf, "%d\n", (data->volt[index] * dmi_vref *
331                         dmi_mult[index]) / 255 + dmi_offset[index]);
332         else
333                 return sprintf(buf, "%d\n", (data->volt[index] *
334                         max_reading[index] + 128) / 255);
335 }
336
337
338 #define TEMP_FROM_REG(val)      (((val) - 128) * 1000)
339
340 static ssize_t show_temp_value(struct device *dev,
341         struct device_attribute *devattr, char *buf)
342 {
343         int index = to_sensor_dev_attr(devattr)->index;
344         struct fschmd_data *data = fschmd_update_device(dev);
345
346         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_act[index]));
347 }
348
349 static ssize_t show_temp_max(struct device *dev,
350         struct device_attribute *devattr, char *buf)
351 {
352         int index = to_sensor_dev_attr(devattr)->index;
353         struct fschmd_data *data = fschmd_update_device(dev);
354
355         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index]));
356 }
357
358 static ssize_t store_temp_max(struct device *dev, struct device_attribute
359         *devattr, const char *buf, size_t count)
360 {
361         int index = to_sensor_dev_attr(devattr)->index;
362         struct fschmd_data *data = dev_get_drvdata(dev);
363         long v = simple_strtol(buf, NULL, 10) / 1000;
364
365         v = SENSORS_LIMIT(v, -128, 127) + 128;
366
367         mutex_lock(&data->update_lock);
368         i2c_smbus_write_byte_data(to_i2c_client(dev),
369                 FSCHMD_REG_TEMP_LIMIT[data->kind][index], v);
370         data->temp_max[index] = v;
371         mutex_unlock(&data->update_lock);
372
373         return count;
374 }
375
376 static ssize_t show_temp_fault(struct device *dev,
377         struct device_attribute *devattr, char *buf)
378 {
379         int index = to_sensor_dev_attr(devattr)->index;
380         struct fschmd_data *data = fschmd_update_device(dev);
381
382         /* bit 0 set means sensor working ok, so no fault! */
383         if (data->temp_status[index] & FSCHMD_TEMP_WORKING)
384                 return sprintf(buf, "0\n");
385         else
386                 return sprintf(buf, "1\n");
387 }
388
389 static ssize_t show_temp_alarm(struct device *dev,
390         struct device_attribute *devattr, char *buf)
391 {
392         int index = to_sensor_dev_attr(devattr)->index;
393         struct fschmd_data *data = fschmd_update_device(dev);
394
395         if ((data->temp_status[index] & FSCHMD_TEMP_ALARM_MASK) ==
396                         FSCHMD_TEMP_ALARM_MASK)
397                 return sprintf(buf, "1\n");
398         else
399                 return sprintf(buf, "0\n");
400 }
401
402
403 #define RPM_FROM_REG(val)       ((val) * 60)
404
405 static ssize_t show_fan_value(struct device *dev,
406         struct device_attribute *devattr, char *buf)
407 {
408         int index = to_sensor_dev_attr(devattr)->index;
409         struct fschmd_data *data = fschmd_update_device(dev);
410
411         return sprintf(buf, "%u\n", RPM_FROM_REG(data->fan_act[index]));
412 }
413
414 static ssize_t show_fan_div(struct device *dev,
415         struct device_attribute *devattr, char *buf)
416 {
417         int index = to_sensor_dev_attr(devattr)->index;
418         struct fschmd_data *data = fschmd_update_device(dev);
419
420         /* bits 2..7 reserved => mask with 3 */
421         return sprintf(buf, "%d\n", 1 << (data->fan_ripple[index] & 3));
422 }
423
424 static ssize_t store_fan_div(struct device *dev, struct device_attribute
425         *devattr, const char *buf, size_t count)
426 {
427         u8 reg;
428         int index = to_sensor_dev_attr(devattr)->index;
429         struct fschmd_data *data = dev_get_drvdata(dev);
430         /* supported values: 2, 4, 8 */
431         unsigned long v = simple_strtoul(buf, NULL, 10);
432
433         switch (v) {
434         case 2: v = 1; break;
435         case 4: v = 2; break;
436         case 8: v = 3; break;
437         default:
438                 dev_err(dev, "fan_div value %lu not supported. "
439                         "Choose one of 2, 4 or 8!\n", v);
440                 return -EINVAL;
441         }
442
443         mutex_lock(&data->update_lock);
444
445         reg = i2c_smbus_read_byte_data(to_i2c_client(dev),
446                 FSCHMD_REG_FAN_RIPPLE[data->kind][index]);
447
448         /* bits 2..7 reserved => mask with 0x03 */
449         reg &= ~0x03;
450         reg |= v;
451
452         i2c_smbus_write_byte_data(to_i2c_client(dev),
453                 FSCHMD_REG_FAN_RIPPLE[data->kind][index], reg);
454
455         data->fan_ripple[index] = reg;
456
457         mutex_unlock(&data->update_lock);
458
459         return count;
460 }
461
462 static ssize_t show_fan_alarm(struct device *dev,
463         struct device_attribute *devattr, char *buf)
464 {
465         int index = to_sensor_dev_attr(devattr)->index;
466         struct fschmd_data *data = fschmd_update_device(dev);
467
468         if (data->fan_status[index] & FSCHMD_FAN_ALARM)
469                 return sprintf(buf, "1\n");
470         else
471                 return sprintf(buf, "0\n");
472 }
473
474 static ssize_t show_fan_fault(struct device *dev,
475         struct device_attribute *devattr, char *buf)
476 {
477         int index = to_sensor_dev_attr(devattr)->index;
478         struct fschmd_data *data = fschmd_update_device(dev);
479
480         if (data->fan_status[index] & FSCHMD_FAN_NOT_PRESENT)
481                 return sprintf(buf, "1\n");
482         else
483                 return sprintf(buf, "0\n");
484 }
485
486
487 static ssize_t show_pwm_auto_point1_pwm(struct device *dev,
488         struct device_attribute *devattr, char *buf)
489 {
490         int index = to_sensor_dev_attr(devattr)->index;
491         struct fschmd_data *data = fschmd_update_device(dev);
492         int val = data->fan_min[index];
493
494         /* 0 = allow turning off (except on the syl), 1-255 = 50-100% */
495         if (val || data->kind == fscsyl - 1)
496                 val = val / 2 + 128;
497
498         return sprintf(buf, "%d\n", val);
499 }
500
501 static ssize_t store_pwm_auto_point1_pwm(struct device *dev,
502         struct device_attribute *devattr, const char *buf, size_t count)
503 {
504         int index = to_sensor_dev_attr(devattr)->index;
505         struct fschmd_data *data = dev_get_drvdata(dev);
506         unsigned long v = simple_strtoul(buf, NULL, 10);
507
508         /* reg: 0 = allow turning off (except on the syl), 1-255 = 50-100% */
509         if (v || data->kind == fscsyl - 1) {
510                 v = SENSORS_LIMIT(v, 128, 255);
511                 v = (v - 128) * 2 + 1;
512         }
513
514         mutex_lock(&data->update_lock);
515
516         i2c_smbus_write_byte_data(to_i2c_client(dev),
517                 FSCHMD_REG_FAN_MIN[data->kind][index], v);
518         data->fan_min[index] = v;
519
520         mutex_unlock(&data->update_lock);
521
522         return count;
523 }
524
525
526 /* The FSC hwmon family has the ability to force an attached alert led to flash
527    from software, we export this as an alert_led sysfs attr */
528 static ssize_t show_alert_led(struct device *dev,
529         struct device_attribute *devattr, char *buf)
530 {
531         struct fschmd_data *data = fschmd_update_device(dev);
532
533         if (data->global_control & FSCHMD_CONTROL_ALERT_LED)
534                 return sprintf(buf, "1\n");
535         else
536                 return sprintf(buf, "0\n");
537 }
538
539 static ssize_t store_alert_led(struct device *dev,
540         struct device_attribute *devattr, const char *buf, size_t count)
541 {
542         u8 reg;
543         struct fschmd_data *data = dev_get_drvdata(dev);
544         unsigned long v = simple_strtoul(buf, NULL, 10);
545
546         mutex_lock(&data->update_lock);
547
548         reg = i2c_smbus_read_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL);
549
550         if (v)
551                 reg |= FSCHMD_CONTROL_ALERT_LED;
552         else
553                 reg &= ~FSCHMD_CONTROL_ALERT_LED;
554
555         i2c_smbus_write_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL, reg);
556
557         data->global_control = reg;
558
559         mutex_unlock(&data->update_lock);
560
561         return count;
562 }
563
564 static DEVICE_ATTR(alert_led, 0644, show_alert_led, store_alert_led);
565
566 static struct sensor_device_attribute fschmd_attr[] = {
567         SENSOR_ATTR(in0_input, 0444, show_in_value, NULL, 0),
568         SENSOR_ATTR(in1_input, 0444, show_in_value, NULL, 1),
569         SENSOR_ATTR(in2_input, 0444, show_in_value, NULL, 2),
570         SENSOR_ATTR(in3_input, 0444, show_in_value, NULL, 3),
571         SENSOR_ATTR(in4_input, 0444, show_in_value, NULL, 4),
572         SENSOR_ATTR(in5_input, 0444, show_in_value, NULL, 5),
573 };
574
575 static struct sensor_device_attribute fschmd_temp_attr[] = {
576         SENSOR_ATTR(temp1_input, 0444, show_temp_value, NULL, 0),
577         SENSOR_ATTR(temp1_max,   0644, show_temp_max, store_temp_max, 0),
578         SENSOR_ATTR(temp1_fault, 0444, show_temp_fault, NULL, 0),
579         SENSOR_ATTR(temp1_alarm, 0444, show_temp_alarm, NULL, 0),
580         SENSOR_ATTR(temp2_input, 0444, show_temp_value, NULL, 1),
581         SENSOR_ATTR(temp2_max,   0644, show_temp_max, store_temp_max, 1),
582         SENSOR_ATTR(temp2_fault, 0444, show_temp_fault, NULL, 1),
583         SENSOR_ATTR(temp2_alarm, 0444, show_temp_alarm, NULL, 1),
584         SENSOR_ATTR(temp3_input, 0444, show_temp_value, NULL, 2),
585         SENSOR_ATTR(temp3_max,   0644, show_temp_max, store_temp_max, 2),
586         SENSOR_ATTR(temp3_fault, 0444, show_temp_fault, NULL, 2),
587         SENSOR_ATTR(temp3_alarm, 0444, show_temp_alarm, NULL, 2),
588         SENSOR_ATTR(temp4_input, 0444, show_temp_value, NULL, 3),
589         SENSOR_ATTR(temp4_max,   0644, show_temp_max, store_temp_max, 3),
590         SENSOR_ATTR(temp4_fault, 0444, show_temp_fault, NULL, 3),
591         SENSOR_ATTR(temp4_alarm, 0444, show_temp_alarm, NULL, 3),
592         SENSOR_ATTR(temp5_input, 0444, show_temp_value, NULL, 4),
593         SENSOR_ATTR(temp5_max,   0644, show_temp_max, store_temp_max, 4),
594         SENSOR_ATTR(temp5_fault, 0444, show_temp_fault, NULL, 4),
595         SENSOR_ATTR(temp5_alarm, 0444, show_temp_alarm, NULL, 4),
596         SENSOR_ATTR(temp6_input, 0444, show_temp_value, NULL, 5),
597         SENSOR_ATTR(temp6_max,   0644, show_temp_max, store_temp_max, 5),
598         SENSOR_ATTR(temp6_fault, 0444, show_temp_fault, NULL, 5),
599         SENSOR_ATTR(temp6_alarm, 0444, show_temp_alarm, NULL, 5),
600         SENSOR_ATTR(temp7_input, 0444, show_temp_value, NULL, 6),
601         SENSOR_ATTR(temp7_max,   0644, show_temp_max, store_temp_max, 6),
602         SENSOR_ATTR(temp7_fault, 0444, show_temp_fault, NULL, 6),
603         SENSOR_ATTR(temp7_alarm, 0444, show_temp_alarm, NULL, 6),
604         SENSOR_ATTR(temp8_input, 0444, show_temp_value, NULL, 7),
605         SENSOR_ATTR(temp8_max,   0644, show_temp_max, store_temp_max, 7),
606         SENSOR_ATTR(temp8_fault, 0444, show_temp_fault, NULL, 7),
607         SENSOR_ATTR(temp8_alarm, 0444, show_temp_alarm, NULL, 7),
608         SENSOR_ATTR(temp9_input, 0444, show_temp_value, NULL, 8),
609         SENSOR_ATTR(temp9_max,   0644, show_temp_max, store_temp_max, 8),
610         SENSOR_ATTR(temp9_fault, 0444, show_temp_fault, NULL, 8),
611         SENSOR_ATTR(temp9_alarm, 0444, show_temp_alarm, NULL, 8),
612         SENSOR_ATTR(temp10_input, 0444, show_temp_value, NULL, 9),
613         SENSOR_ATTR(temp10_max,   0644, show_temp_max, store_temp_max, 9),
614         SENSOR_ATTR(temp10_fault, 0444, show_temp_fault, NULL, 9),
615         SENSOR_ATTR(temp10_alarm, 0444, show_temp_alarm, NULL, 9),
616         SENSOR_ATTR(temp11_input, 0444, show_temp_value, NULL, 10),
617         SENSOR_ATTR(temp11_max,   0644, show_temp_max, store_temp_max, 10),
618         SENSOR_ATTR(temp11_fault, 0444, show_temp_fault, NULL, 10),
619         SENSOR_ATTR(temp11_alarm, 0444, show_temp_alarm, NULL, 10),
620 };
621
622 static struct sensor_device_attribute fschmd_fan_attr[] = {
623         SENSOR_ATTR(fan1_input, 0444, show_fan_value, NULL, 0),
624         SENSOR_ATTR(fan1_div,   0644, show_fan_div, store_fan_div, 0),
625         SENSOR_ATTR(fan1_alarm, 0444, show_fan_alarm, NULL, 0),
626         SENSOR_ATTR(fan1_fault, 0444, show_fan_fault, NULL, 0),
627         SENSOR_ATTR(pwm1_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
628                 store_pwm_auto_point1_pwm, 0),
629         SENSOR_ATTR(fan2_input, 0444, show_fan_value, NULL, 1),
630         SENSOR_ATTR(fan2_div,   0644, show_fan_div, store_fan_div, 1),
631         SENSOR_ATTR(fan2_alarm, 0444, show_fan_alarm, NULL, 1),
632         SENSOR_ATTR(fan2_fault, 0444, show_fan_fault, NULL, 1),
633         SENSOR_ATTR(pwm2_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
634                 store_pwm_auto_point1_pwm, 1),
635         SENSOR_ATTR(fan3_input, 0444, show_fan_value, NULL, 2),
636         SENSOR_ATTR(fan3_div,   0644, show_fan_div, store_fan_div, 2),
637         SENSOR_ATTR(fan3_alarm, 0444, show_fan_alarm, NULL, 2),
638         SENSOR_ATTR(fan3_fault, 0444, show_fan_fault, NULL, 2),
639         SENSOR_ATTR(pwm3_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
640                 store_pwm_auto_point1_pwm, 2),
641         SENSOR_ATTR(fan4_input, 0444, show_fan_value, NULL, 3),
642         SENSOR_ATTR(fan4_div,   0644, show_fan_div, store_fan_div, 3),
643         SENSOR_ATTR(fan4_alarm, 0444, show_fan_alarm, NULL, 3),
644         SENSOR_ATTR(fan4_fault, 0444, show_fan_fault, NULL, 3),
645         SENSOR_ATTR(pwm4_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
646                 store_pwm_auto_point1_pwm, 3),
647         SENSOR_ATTR(fan5_input, 0444, show_fan_value, NULL, 4),
648         SENSOR_ATTR(fan5_div,   0644, show_fan_div, store_fan_div, 4),
649         SENSOR_ATTR(fan5_alarm, 0444, show_fan_alarm, NULL, 4),
650         SENSOR_ATTR(fan5_fault, 0444, show_fan_fault, NULL, 4),
651         SENSOR_ATTR(pwm5_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
652                 store_pwm_auto_point1_pwm, 4),
653         SENSOR_ATTR(fan6_input, 0444, show_fan_value, NULL, 5),
654         SENSOR_ATTR(fan6_div,   0644, show_fan_div, store_fan_div, 5),
655         SENSOR_ATTR(fan6_alarm, 0444, show_fan_alarm, NULL, 5),
656         SENSOR_ATTR(fan6_fault, 0444, show_fan_fault, NULL, 5),
657         SENSOR_ATTR(pwm6_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
658                 store_pwm_auto_point1_pwm, 5),
659         SENSOR_ATTR(fan7_input, 0444, show_fan_value, NULL, 6),
660         SENSOR_ATTR(fan7_div,   0644, show_fan_div, store_fan_div, 6),
661         SENSOR_ATTR(fan7_alarm, 0444, show_fan_alarm, NULL, 6),
662         SENSOR_ATTR(fan7_fault, 0444, show_fan_fault, NULL, 6),
663         SENSOR_ATTR(pwm7_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
664                 store_pwm_auto_point1_pwm, 6),
665 };
666
667
668 /*
669  * Watchdog routines
670  */
671
672 static int watchdog_set_timeout(struct fschmd_data *data, int timeout)
673 {
674         int ret, resolution;
675         int kind = data->kind + 1; /* 0-x array index -> 1-x module param */
676
677         /* 2 second or 60 second resolution? */
678         if (timeout <= 510 || kind == fscpos || kind == fscscy)
679                 resolution = 2;
680         else
681                 resolution = 60;
682
683         if (timeout < resolution || timeout > (resolution * 255))
684                 return -EINVAL;
685
686         mutex_lock(&data->watchdog_lock);
687         if (!data->client) {
688                 ret = -ENODEV;
689                 goto leave;
690         }
691
692         if (resolution == 2)
693                 data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_RESOLUTION;
694         else
695                 data->watchdog_control |= FSCHMD_WDOG_CONTROL_RESOLUTION;
696
697         data->watchdog_preset = DIV_ROUND_UP(timeout, resolution);
698
699         /* Write new timeout value */
700         i2c_smbus_write_byte_data(data->client,
701                 FSCHMD_REG_WDOG_PRESET[data->kind], data->watchdog_preset);
702         /* Write new control register, do not trigger! */
703         i2c_smbus_write_byte_data(data->client,
704                 FSCHMD_REG_WDOG_CONTROL[data->kind],
705                 data->watchdog_control & ~FSCHMD_WDOG_CONTROL_TRIGGER);
706
707         ret = data->watchdog_preset * resolution;
708
709 leave:
710         mutex_unlock(&data->watchdog_lock);
711         return ret;
712 }
713
714 static int watchdog_get_timeout(struct fschmd_data *data)
715 {
716         int timeout;
717
718         mutex_lock(&data->watchdog_lock);
719         if (data->watchdog_control & FSCHMD_WDOG_CONTROL_RESOLUTION)
720                 timeout = data->watchdog_preset * 60;
721         else
722                 timeout = data->watchdog_preset * 2;
723         mutex_unlock(&data->watchdog_lock);
724
725         return timeout;
726 }
727
728 static int watchdog_trigger(struct fschmd_data *data)
729 {
730         int ret = 0;
731
732         mutex_lock(&data->watchdog_lock);
733         if (!data->client) {
734                 ret = -ENODEV;
735                 goto leave;
736         }
737
738         data->watchdog_control |= FSCHMD_WDOG_CONTROL_TRIGGER;
739         i2c_smbus_write_byte_data(data->client,
740                                   FSCHMD_REG_WDOG_CONTROL[data->kind],
741                                   data->watchdog_control);
742 leave:
743         mutex_unlock(&data->watchdog_lock);
744         return ret;
745 }
746
747 static int watchdog_stop(struct fschmd_data *data)
748 {
749         int ret = 0;
750
751         mutex_lock(&data->watchdog_lock);
752         if (!data->client) {
753                 ret = -ENODEV;
754                 goto leave;
755         }
756
757         data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_STARTED;
758         /* Don't store the stop flag in our watchdog control register copy, as
759            its a write only bit (read always returns 0) */
760         i2c_smbus_write_byte_data(data->client,
761                 FSCHMD_REG_WDOG_CONTROL[data->kind],
762                 data->watchdog_control | FSCHMD_WDOG_CONTROL_STOP);
763 leave:
764         mutex_unlock(&data->watchdog_lock);
765         return ret;
766 }
767
768 static int watchdog_open(struct inode *inode, struct file *filp)
769 {
770         struct fschmd_data *pos, *data = NULL;
771         int watchdog_is_open;
772
773         /* We get called from drivers/char/misc.c with misc_mtx hold, and we
774            call misc_register() from fschmd_probe() with watchdog_data_mutex
775            hold, as misc_register() takes the misc_mtx lock, this is a possible
776            deadlock, so we use mutex_trylock here. */
777         if (!mutex_trylock(&watchdog_data_mutex))
778                 return -ERESTARTSYS;
779         list_for_each_entry(pos, &watchdog_data_list, list) {
780                 if (pos->watchdog_miscdev.minor == iminor(inode)) {
781                         data = pos;
782                         break;
783                 }
784         }
785         /* Note we can never not have found data, so we don't check for this */
786         watchdog_is_open = test_and_set_bit(0, &data->watchdog_is_open);
787         if (!watchdog_is_open)
788                 kref_get(&data->kref);
789         mutex_unlock(&watchdog_data_mutex);
790
791         if (watchdog_is_open)
792                 return -EBUSY;
793
794         /* Start the watchdog */
795         watchdog_trigger(data);
796         filp->private_data = data;
797
798         return nonseekable_open(inode, filp);
799 }
800
801 static int watchdog_release(struct inode *inode, struct file *filp)
802 {
803         struct fschmd_data *data = filp->private_data;
804
805         if (data->watchdog_expect_close) {
806                 watchdog_stop(data);
807                 data->watchdog_expect_close = 0;
808         } else {
809                 watchdog_trigger(data);
810                 dev_crit(&data->client->dev,
811                         "unexpected close, not stopping watchdog!\n");
812         }
813
814         clear_bit(0, &data->watchdog_is_open);
815
816         mutex_lock(&watchdog_data_mutex);
817         kref_put(&data->kref, fschmd_release_resources);
818         mutex_unlock(&watchdog_data_mutex);
819
820         return 0;
821 }
822
823 static ssize_t watchdog_write(struct file *filp, const char __user *buf,
824         size_t count, loff_t *offset)
825 {
826         int ret;
827         struct fschmd_data *data = filp->private_data;
828
829         if (count) {
830                 if (!nowayout) {
831                         size_t i;
832
833                         /* Clear it in case it was set with a previous write */
834                         data->watchdog_expect_close = 0;
835
836                         for (i = 0; i != count; i++) {
837                                 char c;
838                                 if (get_user(c, buf + i))
839                                         return -EFAULT;
840                                 if (c == 'V')
841                                         data->watchdog_expect_close = 1;
842                         }
843                 }
844                 ret = watchdog_trigger(data);
845                 if (ret < 0)
846                         return ret;
847         }
848         return count;
849 }
850
851 static int watchdog_ioctl(struct inode *inode, struct file *filp,
852         unsigned int cmd, unsigned long arg)
853 {
854         static struct watchdog_info ident = {
855                 .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
856                                 WDIOF_CARDRESET,
857                 .identity = "FSC watchdog"
858         };
859         int i, ret = 0;
860         struct fschmd_data *data = filp->private_data;
861
862         switch (cmd) {
863         case WDIOC_GETSUPPORT:
864                 ident.firmware_version = data->revision;
865                 if (!nowayout)
866                         ident.options |= WDIOF_MAGICCLOSE;
867                 if (copy_to_user((void __user *)arg, &ident, sizeof(ident)))
868                         ret = -EFAULT;
869                 break;
870
871         case WDIOC_GETSTATUS:
872                 ret = put_user(0, (int __user *)arg);
873                 break;
874
875         case WDIOC_GETBOOTSTATUS:
876                 if (data->watchdog_state & FSCHMD_WDOG_STATE_CARDRESET)
877                         ret = put_user(WDIOF_CARDRESET, (int __user *)arg);
878                 else
879                         ret = put_user(0, (int __user *)arg);
880                 break;
881
882         case WDIOC_KEEPALIVE:
883                 ret = watchdog_trigger(data);
884                 break;
885
886         case WDIOC_GETTIMEOUT:
887                 i = watchdog_get_timeout(data);
888                 ret = put_user(i, (int __user *)arg);
889                 break;
890
891         case WDIOC_SETTIMEOUT:
892                 if (get_user(i, (int __user *)arg)) {
893                         ret = -EFAULT;
894                         break;
895                 }
896                 ret = watchdog_set_timeout(data, i);
897                 if (ret > 0)
898                         ret = put_user(ret, (int __user *)arg);
899                 break;
900
901         case WDIOC_SETOPTIONS:
902                 if (get_user(i, (int __user *)arg)) {
903                         ret = -EFAULT;
904                         break;
905                 }
906
907                 if (i & WDIOS_DISABLECARD)
908                         ret = watchdog_stop(data);
909                 else if (i & WDIOS_ENABLECARD)
910                         ret = watchdog_trigger(data);
911                 else
912                         ret = -EINVAL;
913
914                 break;
915         default:
916                 ret = -ENOTTY;
917         }
918
919         return ret;
920 }
921
922 static const struct file_operations watchdog_fops = {
923         .owner = THIS_MODULE,
924         .llseek = no_llseek,
925         .open = watchdog_open,
926         .release = watchdog_release,
927         .write = watchdog_write,
928         .ioctl = watchdog_ioctl,
929 };
930
931
932 /*
933  * Detect, register, unregister and update device functions
934  */
935
936 /* DMI decode routine to read voltage scaling factors from special DMI tables,
937    which are available on FSC machines with an fscher or later chip. */
938 static void fschmd_dmi_decode(const struct dmi_header *header, void *dummy)
939 {
940         int i, mult[3] = { 0 }, offset[3] = { 0 }, vref = 0, found = 0;
941
942         /* dmi code ugliness, we get passed the address of the contents of
943            a complete DMI record, but in the form of a dmi_header pointer, in
944            reality this address holds header->length bytes of which the header
945            are the first 4 bytes */
946         u8 *dmi_data = (u8 *)header;
947
948         /* We are looking for OEM-specific type 185 */
949         if (header->type != 185)
950                 return;
951
952         /* we are looking for what Siemens calls "subtype" 19, the subtype
953            is stored in byte 5 of the dmi block */
954         if (header->length < 5 || dmi_data[4] != 19)
955                 return;
956
957         /* After the subtype comes 1 unknown byte and then blocks of 5 bytes,
958            consisting of what Siemens calls an "Entity" number, followed by
959            2 16-bit words in LSB first order */
960         for (i = 6; (i + 4) < header->length; i += 5) {
961                 /* entity 1 - 3: voltage multiplier and offset */
962                 if (dmi_data[i] >= 1 && dmi_data[i] <= 3) {
963                         /* Our in sensors order and the DMI order differ */
964                         const int shuffle[3] = { 1, 0, 2 };
965                         int in = shuffle[dmi_data[i] - 1];
966
967                         /* Check for twice the same entity */
968                         if (found & (1 << in))
969                                 return;
970
971                         mult[in] = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
972                         offset[in] = dmi_data[i + 3] | (dmi_data[i + 4] << 8);
973
974                         found |= 1 << in;
975                 }
976
977                 /* entity 7: reference voltage */
978                 if (dmi_data[i] == 7) {
979                         /* Check for twice the same entity */
980                         if (found & 0x08)
981                                 return;
982
983                         vref = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
984
985                         found |= 0x08;
986                 }
987         }
988
989         if (found == 0x0F) {
990                 for (i = 0; i < 3; i++) {
991                         dmi_mult[i] = mult[i] * 10;
992                         dmi_offset[i] = offset[i] * 10;
993                 }
994                 /* According to the docs there should be separate dmi entries
995                    for the mult's and offsets of in3-5 of the syl, but on
996                    my test machine these are not present */
997                 dmi_mult[3] = dmi_mult[2];
998                 dmi_mult[4] = dmi_mult[1];
999                 dmi_mult[5] = dmi_mult[2];
1000                 dmi_offset[3] = dmi_offset[2];
1001                 dmi_offset[4] = dmi_offset[1];
1002                 dmi_offset[5] = dmi_offset[2];
1003                 dmi_vref = vref;
1004         }
1005 }
1006
1007 static int fschmd_detect(struct i2c_client *client,
1008                          struct i2c_board_info *info)
1009 {
1010         enum chips kind;
1011         struct i2c_adapter *adapter = client->adapter;
1012         char id[4];
1013
1014         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1015                 return -ENODEV;
1016
1017         /* Detect & Identify the chip */
1018         id[0] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_0);
1019         id[1] = i2c_smbus_read_byte_data(client, FSCHMD_REG_IDENT_1);
1020         id[2] = i2c_smbus_read_byte_data(client, 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         strlcpy(info->type, fschmd_id[kind - 1].name, I2C_NAME_SIZE);
1041
1042         return 0;
1043 }
1044
1045 static int fschmd_probe(struct i2c_client *client,
1046                         const struct i2c_device_id *id)
1047 {
1048         struct fschmd_data *data;
1049         const char * const names[7] = { "Poseidon", "Hermes", "Scylla",
1050                                 "Heracles", "Heimdall", "Hades", "Syleus" };
1051         const int watchdog_minors[] = { WATCHDOG_MINOR, 212, 213, 214, 215 };
1052         int i, err;
1053         enum chips kind = id->driver_data;
1054
1055         data = kzalloc(sizeof(struct fschmd_data), GFP_KERNEL);
1056         if (!data)
1057                 return -ENOMEM;
1058
1059         i2c_set_clientdata(client, data);
1060         mutex_init(&data->update_lock);
1061         mutex_init(&data->watchdog_lock);
1062         INIT_LIST_HEAD(&data->list);
1063         kref_init(&data->kref);
1064         /* Store client pointer in our data struct for watchdog usage
1065            (where the client is found through a data ptr instead of the
1066            otherway around) */
1067         data->client = client;
1068
1069         if (kind == fscpos) {
1070                 /* The Poseidon has hardwired temp limits, fill these
1071                    in for the alarm resetting code */
1072                 data->temp_max[0] = 70 + 128;
1073                 data->temp_max[1] = 50 + 128;
1074                 data->temp_max[2] = 50 + 128;
1075         }
1076
1077         /* Read the special DMI table for fscher and newer chips */
1078         if ((kind == fscher || kind >= fschrc) && dmi_vref == -1) {
1079                 dmi_walk(fschmd_dmi_decode, NULL);
1080                 if (dmi_vref == -1) {
1081                         dev_warn(&client->dev,
1082                                 "Couldn't get voltage scaling factors from "
1083                                 "BIOS DMI table, using builtin defaults\n");
1084                         dmi_vref = 33;
1085                 }
1086         }
1087
1088         /* i2c kind goes from 1-6, we want from 0-5 to address arrays */
1089         data->kind = kind - 1;
1090
1091         /* Read in some never changing registers */
1092         data->revision = i2c_smbus_read_byte_data(client, FSCHMD_REG_REVISION);
1093         data->global_control = i2c_smbus_read_byte_data(client,
1094                                         FSCHMD_REG_CONTROL);
1095         data->watchdog_control = i2c_smbus_read_byte_data(client,
1096                                         FSCHMD_REG_WDOG_CONTROL[data->kind]);
1097         data->watchdog_state = i2c_smbus_read_byte_data(client,
1098                                         FSCHMD_REG_WDOG_STATE[data->kind]);
1099         data->watchdog_preset = i2c_smbus_read_byte_data(client,
1100                                         FSCHMD_REG_WDOG_PRESET[data->kind]);
1101
1102         err = device_create_file(&client->dev, &dev_attr_alert_led);
1103         if (err)
1104                 goto exit_detach;
1105
1106         for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++) {
1107                 err = device_create_file(&client->dev,
1108                                         &fschmd_attr[i].dev_attr);
1109                 if (err)
1110                         goto exit_detach;
1111         }
1112
1113         for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++) {
1114                 /* Poseidon doesn't have TEMP_LIMIT registers */
1115                 if (kind == fscpos && fschmd_temp_attr[i].dev_attr.show ==
1116                                 show_temp_max)
1117                         continue;
1118
1119                 if (kind == fscsyl) {
1120                         if (i % 4 == 0)
1121                                 data->temp_status[i / 4] =
1122                                         i2c_smbus_read_byte_data(client,
1123                                                 FSCHMD_REG_TEMP_STATE
1124                                                 [data->kind][i / 4]);
1125                         if (data->temp_status[i / 4] & FSCHMD_TEMP_DISABLED)
1126                                 continue;
1127                 }
1128
1129                 err = device_create_file(&client->dev,
1130                                         &fschmd_temp_attr[i].dev_attr);
1131                 if (err)
1132                         goto exit_detach;
1133         }
1134
1135         for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++) {
1136                 /* Poseidon doesn't have a FAN_MIN register for its 3rd fan */
1137                 if (kind == fscpos &&
1138                                 !strcmp(fschmd_fan_attr[i].dev_attr.attr.name,
1139                                         "pwm3_auto_point1_pwm"))
1140                         continue;
1141
1142                 if (kind == fscsyl) {
1143                         if (i % 5 == 0)
1144                                 data->fan_status[i / 5] =
1145                                         i2c_smbus_read_byte_data(client,
1146                                                 FSCHMD_REG_FAN_STATE
1147                                                 [data->kind][i / 5]);
1148                         if (data->fan_status[i / 5] & FSCHMD_FAN_DISABLED)
1149                                 continue;
1150                 }
1151
1152                 err = device_create_file(&client->dev,
1153                                         &fschmd_fan_attr[i].dev_attr);
1154                 if (err)
1155                         goto exit_detach;
1156         }
1157
1158         data->hwmon_dev = hwmon_device_register(&client->dev);
1159         if (IS_ERR(data->hwmon_dev)) {
1160                 err = PTR_ERR(data->hwmon_dev);
1161                 data->hwmon_dev = NULL;
1162                 goto exit_detach;
1163         }
1164
1165         /* We take the data_mutex lock early so that watchdog_open() cannot
1166            run when misc_register() has completed, but we've not yet added
1167            our data to the watchdog_data_list (and set the default timeout) */
1168         mutex_lock(&watchdog_data_mutex);
1169         for (i = 0; i < ARRAY_SIZE(watchdog_minors); i++) {
1170                 /* Register our watchdog part */
1171                 snprintf(data->watchdog_name, sizeof(data->watchdog_name),
1172                         "watchdog%c", (i == 0) ? '\0' : ('0' + i));
1173                 data->watchdog_miscdev.name = data->watchdog_name;
1174                 data->watchdog_miscdev.fops = &watchdog_fops;
1175                 data->watchdog_miscdev.minor = watchdog_minors[i];
1176                 err = misc_register(&data->watchdog_miscdev);
1177                 if (err == -EBUSY)
1178                         continue;
1179                 if (err) {
1180                         data->watchdog_miscdev.minor = 0;
1181                         dev_err(&client->dev,
1182                                 "Registering watchdog chardev: %d\n", err);
1183                         break;
1184                 }
1185
1186                 list_add(&data->list, &watchdog_data_list);
1187                 watchdog_set_timeout(data, 60);
1188                 dev_info(&client->dev,
1189                         "Registered watchdog chardev major 10, minor: %d\n",
1190                         watchdog_minors[i]);
1191                 break;
1192         }
1193         if (i == ARRAY_SIZE(watchdog_minors)) {
1194                 data->watchdog_miscdev.minor = 0;
1195                 dev_warn(&client->dev, "Couldn't register watchdog chardev "
1196                         "(due to no free minor)\n");
1197         }
1198         mutex_unlock(&watchdog_data_mutex);
1199
1200         dev_info(&client->dev, "Detected FSC %s chip, revision: %d\n",
1201                 names[data->kind], (int) data->revision);
1202
1203         return 0;
1204
1205 exit_detach:
1206         fschmd_remove(client); /* will also free data for us */
1207         return err;
1208 }
1209
1210 static int fschmd_remove(struct i2c_client *client)
1211 {
1212         struct fschmd_data *data = i2c_get_clientdata(client);
1213         int i;
1214
1215         /* Unregister the watchdog (if registered) */
1216         if (data->watchdog_miscdev.minor) {
1217                 misc_deregister(&data->watchdog_miscdev);
1218                 if (data->watchdog_is_open) {
1219                         dev_warn(&client->dev,
1220                                 "i2c client detached with watchdog open! "
1221                                 "Stopping watchdog.\n");
1222                         watchdog_stop(data);
1223                 }
1224                 mutex_lock(&watchdog_data_mutex);
1225                 list_del(&data->list);
1226                 mutex_unlock(&watchdog_data_mutex);
1227                 /* Tell the watchdog code the client is gone */
1228                 mutex_lock(&data->watchdog_lock);
1229                 data->client = NULL;
1230                 mutex_unlock(&data->watchdog_lock);
1231         }
1232
1233         /* Check if registered in case we're called from fschmd_detect
1234            to cleanup after an error */
1235         if (data->hwmon_dev)
1236                 hwmon_device_unregister(data->hwmon_dev);
1237
1238         device_remove_file(&client->dev, &dev_attr_alert_led);
1239         for (i = 0; i < (FSCHMD_NO_VOLT_SENSORS[data->kind]); i++)
1240                 device_remove_file(&client->dev, &fschmd_attr[i].dev_attr);
1241         for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++)
1242                 device_remove_file(&client->dev,
1243                                         &fschmd_temp_attr[i].dev_attr);
1244         for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++)
1245                 device_remove_file(&client->dev,
1246                                         &fschmd_fan_attr[i].dev_attr);
1247
1248         mutex_lock(&watchdog_data_mutex);
1249         kref_put(&data->kref, fschmd_release_resources);
1250         mutex_unlock(&watchdog_data_mutex);
1251
1252         return 0;
1253 }
1254
1255 static struct fschmd_data *fschmd_update_device(struct device *dev)
1256 {
1257         struct i2c_client *client = to_i2c_client(dev);
1258         struct fschmd_data *data = i2c_get_clientdata(client);
1259         int i;
1260
1261         mutex_lock(&data->update_lock);
1262
1263         if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
1264
1265                 for (i = 0; i < FSCHMD_NO_TEMP_SENSORS[data->kind]; i++) {
1266                         data->temp_act[i] = i2c_smbus_read_byte_data(client,
1267                                         FSCHMD_REG_TEMP_ACT[data->kind][i]);
1268                         data->temp_status[i] = i2c_smbus_read_byte_data(client,
1269                                         FSCHMD_REG_TEMP_STATE[data->kind][i]);
1270
1271                         /* The fscpos doesn't have TEMP_LIMIT registers */
1272                         if (FSCHMD_REG_TEMP_LIMIT[data->kind][i])
1273                                 data->temp_max[i] = i2c_smbus_read_byte_data(
1274                                         client,
1275                                         FSCHMD_REG_TEMP_LIMIT[data->kind][i]);
1276
1277                         /* reset alarm if the alarm condition is gone,
1278                            the chip doesn't do this itself */
1279                         if ((data->temp_status[i] & FSCHMD_TEMP_ALARM_MASK) ==
1280                                         FSCHMD_TEMP_ALARM_MASK &&
1281                                         data->temp_act[i] < data->temp_max[i])
1282                                 i2c_smbus_write_byte_data(client,
1283                                         FSCHMD_REG_TEMP_STATE[data->kind][i],
1284                                         data->temp_status[i]);
1285                 }
1286
1287                 for (i = 0; i < FSCHMD_NO_FAN_SENSORS[data->kind]; i++) {
1288                         data->fan_act[i] = i2c_smbus_read_byte_data(client,
1289                                         FSCHMD_REG_FAN_ACT[data->kind][i]);
1290                         data->fan_status[i] = i2c_smbus_read_byte_data(client,
1291                                         FSCHMD_REG_FAN_STATE[data->kind][i]);
1292                         data->fan_ripple[i] = i2c_smbus_read_byte_data(client,
1293                                         FSCHMD_REG_FAN_RIPPLE[data->kind][i]);
1294
1295                         /* The fscpos third fan doesn't have a fan_min */
1296                         if (FSCHMD_REG_FAN_MIN[data->kind][i])
1297                                 data->fan_min[i] = i2c_smbus_read_byte_data(
1298                                         client,
1299                                         FSCHMD_REG_FAN_MIN[data->kind][i]);
1300
1301                         /* reset fan status if speed is back to > 0 */
1302                         if ((data->fan_status[i] & FSCHMD_FAN_ALARM) &&
1303                                         data->fan_act[i])
1304                                 i2c_smbus_write_byte_data(client,
1305                                         FSCHMD_REG_FAN_STATE[data->kind][i],
1306                                         data->fan_status[i]);
1307                 }
1308
1309                 for (i = 0; i < FSCHMD_NO_VOLT_SENSORS[data->kind]; i++)
1310                         data->volt[i] = i2c_smbus_read_byte_data(client,
1311                                                FSCHMD_REG_VOLT[data->kind][i]);
1312
1313                 data->last_updated = jiffies;
1314                 data->valid = 1;
1315         }
1316
1317         mutex_unlock(&data->update_lock);
1318
1319         return data;
1320 }
1321
1322 static int __init fschmd_init(void)
1323 {
1324         return i2c_add_driver(&fschmd_driver);
1325 }
1326
1327 static void __exit fschmd_exit(void)
1328 {
1329         i2c_del_driver(&fschmd_driver);
1330 }
1331
1332 MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
1333 MODULE_DESCRIPTION("FSC Poseidon, Hermes, Scylla, Heracles, Heimdall, Hades "
1334                         "and Syleus driver");
1335 MODULE_LICENSE("GPL");
1336
1337 module_init(fschmd_init);
1338 module_exit(fschmd_exit);