added 2.6.29.6 aldebaran kernel
[nao-ulib.git] / kernel / 2.6.29.6-aldebaran-rt / drivers / hwmon / fschmd.c
blobd07f4ef750923ca728556ed353ca6eb8ae052873
1 /* fschmd.c
3 * Copyright (C) 2007,2008 Hans de Goede <hdegoede@redhat.com>
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.
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.
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.
21 * Merged Fujitsu Siemens hwmon driver, supporting the Poseidon, Hermes,
22 * Scylla, Heracles and Heimdall chips
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>
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>
51 /* Addresses to scan */
52 static const unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END };
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 I2C_CLIENT_INSMOD_5(fscpos, fscher, fscscy, fschrc, fschmd);
62 * The FSCHMD registers and other defines
65 /* chip identification */
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
71 /* global control and status */
72 #define FSCHMD_REG_EVENT_STATE 0x04
73 #define FSCHMD_REG_CONTROL 0x05
75 #define FSCHMD_CONTROL_ALERT_LED 0x01
77 /* watchdog */
78 #define FSCHMD_REG_WDOG_PRESET 0x28
79 #define FSCHMD_REG_WDOG_STATE 0x23
80 #define FSCHMD_REG_WDOG_CONTROL 0x21
82 #define FSCHMD_WDOG_CONTROL_TRIGGER 0x10
83 #define FSCHMD_WDOG_CONTROL_STARTED 0x10 /* the same as trigger */
84 #define FSCHMD_WDOG_CONTROL_STOP 0x20
85 #define FSCHMD_WDOG_CONTROL_RESOLUTION 0x40
87 #define FSCHMD_WDOG_STATE_CARDRESET 0x02
89 /* voltages, weird order is to keep the same order as the old drivers */
90 static const u8 FSCHMD_REG_VOLT[3] = { 0x45, 0x42, 0x48 };
92 /* minimum pwm at which the fan is driven (pwm can by increased depending on
93 the temp. Notice that for the scy some fans share there minimum speed.
94 Also notice that with the scy the sensor order is different than with the
95 other chips, this order was in the 2.4 driver and kept for consistency. */
96 static const u8 FSCHMD_REG_FAN_MIN[5][6] = {
97 { 0x55, 0x65 }, /* pos */
98 { 0x55, 0x65, 0xb5 }, /* her */
99 { 0x65, 0x65, 0x55, 0xa5, 0x55, 0xa5 }, /* scy */
100 { 0x55, 0x65, 0xa5, 0xb5 }, /* hrc */
101 { 0x55, 0x65, 0xa5, 0xb5, 0xc5 }, /* hmd */
104 /* actual fan speed */
105 static const u8 FSCHMD_REG_FAN_ACT[5][6] = {
106 { 0x0e, 0x6b, 0xab }, /* pos */
107 { 0x0e, 0x6b, 0xbb }, /* her */
108 { 0x6b, 0x6c, 0x0e, 0xab, 0x5c, 0xbb }, /* scy */
109 { 0x0e, 0x6b, 0xab, 0xbb }, /* hrc */
110 { 0x5b, 0x6b, 0xab, 0xbb, 0xcb }, /* hmd */
113 /* fan status registers */
114 static const u8 FSCHMD_REG_FAN_STATE[5][6] = {
115 { 0x0d, 0x62, 0xa2 }, /* pos */
116 { 0x0d, 0x62, 0xb2 }, /* her */
117 { 0x62, 0x61, 0x0d, 0xa2, 0x52, 0xb2 }, /* scy */
118 { 0x0d, 0x62, 0xa2, 0xb2 }, /* hrc */
119 { 0x52, 0x62, 0xa2, 0xb2, 0xc2 }, /* hmd */
122 /* fan ripple / divider registers */
123 static const u8 FSCHMD_REG_FAN_RIPPLE[5][6] = {
124 { 0x0f, 0x6f, 0xaf }, /* pos */
125 { 0x0f, 0x6f, 0xbf }, /* her */
126 { 0x6f, 0x6f, 0x0f, 0xaf, 0x0f, 0xbf }, /* scy */
127 { 0x0f, 0x6f, 0xaf, 0xbf }, /* hrc */
128 { 0x5f, 0x6f, 0xaf, 0xbf, 0xcf }, /* hmd */
131 static const int FSCHMD_NO_FAN_SENSORS[5] = { 3, 3, 6, 4, 5 };
133 /* Fan status register bitmasks */
134 #define FSCHMD_FAN_ALARM 0x04 /* called fault by FSC! */
135 #define FSCHMD_FAN_NOT_PRESENT 0x08 /* not documented */
138 /* actual temperature registers */
139 static const u8 FSCHMD_REG_TEMP_ACT[5][5] = {
140 { 0x64, 0x32, 0x35 }, /* pos */
141 { 0x64, 0x32, 0x35 }, /* her */
142 { 0x64, 0xD0, 0x32, 0x35 }, /* scy */
143 { 0x64, 0x32, 0x35 }, /* hrc */
144 { 0x70, 0x80, 0x90, 0xd0, 0xe0 }, /* hmd */
147 /* temperature state registers */
148 static const u8 FSCHMD_REG_TEMP_STATE[5][5] = {
149 { 0x71, 0x81, 0x91 }, /* pos */
150 { 0x71, 0x81, 0x91 }, /* her */
151 { 0x71, 0xd1, 0x81, 0x91 }, /* scy */
152 { 0x71, 0x81, 0x91 }, /* hrc */
153 { 0x71, 0x81, 0x91, 0xd1, 0xe1 }, /* hmd */
156 /* temperature high limit registers, FSC does not document these. Proven to be
157 there with field testing on the fscher and fschrc, already supported / used
158 in the fscscy 2.4 driver. FSC has confirmed that the fschmd has registers
159 at these addresses, but doesn't want to confirm they are the same as with
160 the fscher?? */
161 static const u8 FSCHMD_REG_TEMP_LIMIT[5][5] = {
162 { 0, 0, 0 }, /* pos */
163 { 0x76, 0x86, 0x96 }, /* her */
164 { 0x76, 0xd6, 0x86, 0x96 }, /* scy */
165 { 0x76, 0x86, 0x96 }, /* hrc */
166 { 0x76, 0x86, 0x96, 0xd6, 0xe6 }, /* hmd */
169 /* These were found through experimenting with an fscher, currently they are
170 not used, but we keep them around for future reference.
171 static const u8 FSCHER_REG_TEMP_AUTOP1[] = { 0x73, 0x83, 0x93 };
172 static const u8 FSCHER_REG_TEMP_AUTOP2[] = { 0x75, 0x85, 0x95 }; */
174 static const int FSCHMD_NO_TEMP_SENSORS[5] = { 3, 3, 4, 3, 5 };
176 /* temp status register bitmasks */
177 #define FSCHMD_TEMP_WORKING 0x01
178 #define FSCHMD_TEMP_ALERT 0x02
179 /* there only really is an alarm if the sensor is working and alert == 1 */
180 #define FSCHMD_TEMP_ALARM_MASK \
181 (FSCHMD_TEMP_WORKING | FSCHMD_TEMP_ALERT)
184 * Functions declarations
187 static int fschmd_probe(struct i2c_client *client,
188 const struct i2c_device_id *id);
189 static int fschmd_detect(struct i2c_client *client, int kind,
190 struct i2c_board_info *info);
191 static int fschmd_remove(struct i2c_client *client);
192 static struct fschmd_data *fschmd_update_device(struct device *dev);
195 * Driver data (common to all clients)
198 static const struct i2c_device_id fschmd_id[] = {
199 { "fscpos", fscpos },
200 { "fscher", fscher },
201 { "fscscy", fscscy },
202 { "fschrc", fschrc },
203 { "fschmd", fschmd },
206 MODULE_DEVICE_TABLE(i2c, fschmd_id);
208 static struct i2c_driver fschmd_driver = {
209 .class = I2C_CLASS_HWMON,
210 .driver = {
211 .name = "fschmd",
213 .probe = fschmd_probe,
214 .remove = fschmd_remove,
215 .id_table = fschmd_id,
216 .detect = fschmd_detect,
217 .address_data = &addr_data,
221 * Client data (each client gets its own)
224 struct fschmd_data {
225 struct i2c_client *client;
226 struct device *hwmon_dev;
227 struct mutex update_lock;
228 struct mutex watchdog_lock;
229 struct list_head list; /* member of the watchdog_data_list */
230 struct kref kref;
231 struct miscdevice watchdog_miscdev;
232 int kind;
233 unsigned long watchdog_is_open;
234 char watchdog_expect_close;
235 char watchdog_name[10]; /* must be unique to avoid sysfs conflict */
236 char valid; /* zero until following fields are valid */
237 unsigned long last_updated; /* in jiffies */
239 /* register values */
240 u8 revision; /* chip revision */
241 u8 global_control; /* global control register */
242 u8 watchdog_control; /* watchdog control register */
243 u8 watchdog_state; /* watchdog status register */
244 u8 watchdog_preset; /* watchdog counter preset on trigger val */
245 u8 volt[3]; /* 12, 5, battery voltage */
246 u8 temp_act[5]; /* temperature */
247 u8 temp_status[5]; /* status of sensor */
248 u8 temp_max[5]; /* high temp limit, notice: undocumented! */
249 u8 fan_act[6]; /* fans revolutions per second */
250 u8 fan_status[6]; /* fan status */
251 u8 fan_min[6]; /* fan min value for rps */
252 u8 fan_ripple[6]; /* divider for rps */
255 /* Global variables to hold information read from special DMI tables, which are
256 available on FSC machines with an fscher or later chip. There is no need to
257 protect these with a lock as they are only modified from our attach function
258 which always gets called with the i2c-core lock held and never accessed
259 before the attach function is done with them. */
260 static int dmi_mult[3] = { 490, 200, 100 };
261 static int dmi_offset[3] = { 0, 0, 0 };
262 static int dmi_vref = -1;
264 /* Somewhat ugly :( global data pointer list with all fschmd devices, so that
265 we can find our device data as when using misc_register there is no other
266 method to get to ones device data from the open fop. */
267 static LIST_HEAD(watchdog_data_list);
268 /* Note this lock not only protect list access, but also data.kref access */
269 static DEFINE_MUTEX(watchdog_data_mutex);
271 /* Release our data struct when we're detached from the i2c client *and* all
272 references to our watchdog device are released */
273 static void fschmd_release_resources(struct kref *ref)
275 struct fschmd_data *data = container_of(ref, struct fschmd_data, kref);
276 kfree(data);
280 * Sysfs attr show / store functions
283 static ssize_t show_in_value(struct device *dev,
284 struct device_attribute *devattr, char *buf)
286 const int max_reading[3] = { 14200, 6600, 3300 };
287 int index = to_sensor_dev_attr(devattr)->index;
288 struct fschmd_data *data = fschmd_update_device(dev);
290 /* fscher / fschrc - 1 as data->kind is an array index, not a chips */
291 if (data->kind == (fscher - 1) || data->kind >= (fschrc - 1))
292 return sprintf(buf, "%d\n", (data->volt[index] * dmi_vref *
293 dmi_mult[index]) / 255 + dmi_offset[index]);
294 else
295 return sprintf(buf, "%d\n", (data->volt[index] *
296 max_reading[index] + 128) / 255);
300 #define TEMP_FROM_REG(val) (((val) - 128) * 1000)
302 static ssize_t show_temp_value(struct device *dev,
303 struct device_attribute *devattr, char *buf)
305 int index = to_sensor_dev_attr(devattr)->index;
306 struct fschmd_data *data = fschmd_update_device(dev);
308 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_act[index]));
311 static ssize_t show_temp_max(struct device *dev,
312 struct device_attribute *devattr, char *buf)
314 int index = to_sensor_dev_attr(devattr)->index;
315 struct fschmd_data *data = fschmd_update_device(dev);
317 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index]));
320 static ssize_t store_temp_max(struct device *dev, struct device_attribute
321 *devattr, const char *buf, size_t count)
323 int index = to_sensor_dev_attr(devattr)->index;
324 struct fschmd_data *data = dev_get_drvdata(dev);
325 long v = simple_strtol(buf, NULL, 10) / 1000;
327 v = SENSORS_LIMIT(v, -128, 127) + 128;
329 mutex_lock(&data->update_lock);
330 i2c_smbus_write_byte_data(to_i2c_client(dev),
331 FSCHMD_REG_TEMP_LIMIT[data->kind][index], v);
332 data->temp_max[index] = v;
333 mutex_unlock(&data->update_lock);
335 return count;
338 static ssize_t show_temp_fault(struct device *dev,
339 struct device_attribute *devattr, char *buf)
341 int index = to_sensor_dev_attr(devattr)->index;
342 struct fschmd_data *data = fschmd_update_device(dev);
344 /* bit 0 set means sensor working ok, so no fault! */
345 if (data->temp_status[index] & FSCHMD_TEMP_WORKING)
346 return sprintf(buf, "0\n");
347 else
348 return sprintf(buf, "1\n");
351 static ssize_t show_temp_alarm(struct device *dev,
352 struct device_attribute *devattr, char *buf)
354 int index = to_sensor_dev_attr(devattr)->index;
355 struct fschmd_data *data = fschmd_update_device(dev);
357 if ((data->temp_status[index] & FSCHMD_TEMP_ALARM_MASK) ==
358 FSCHMD_TEMP_ALARM_MASK)
359 return sprintf(buf, "1\n");
360 else
361 return sprintf(buf, "0\n");
365 #define RPM_FROM_REG(val) ((val) * 60)
367 static ssize_t show_fan_value(struct device *dev,
368 struct device_attribute *devattr, char *buf)
370 int index = to_sensor_dev_attr(devattr)->index;
371 struct fschmd_data *data = fschmd_update_device(dev);
373 return sprintf(buf, "%u\n", RPM_FROM_REG(data->fan_act[index]));
376 static ssize_t show_fan_div(struct device *dev,
377 struct device_attribute *devattr, char *buf)
379 int index = to_sensor_dev_attr(devattr)->index;
380 struct fschmd_data *data = fschmd_update_device(dev);
382 /* bits 2..7 reserved => mask with 3 */
383 return sprintf(buf, "%d\n", 1 << (data->fan_ripple[index] & 3));
386 static ssize_t store_fan_div(struct device *dev, struct device_attribute
387 *devattr, const char *buf, size_t count)
389 u8 reg;
390 int index = to_sensor_dev_attr(devattr)->index;
391 struct fschmd_data *data = dev_get_drvdata(dev);
392 /* supported values: 2, 4, 8 */
393 unsigned long v = simple_strtoul(buf, NULL, 10);
395 switch (v) {
396 case 2: v = 1; break;
397 case 4: v = 2; break;
398 case 8: v = 3; break;
399 default:
400 dev_err(dev, "fan_div value %lu not supported. "
401 "Choose one of 2, 4 or 8!\n", v);
402 return -EINVAL;
405 mutex_lock(&data->update_lock);
407 reg = i2c_smbus_read_byte_data(to_i2c_client(dev),
408 FSCHMD_REG_FAN_RIPPLE[data->kind][index]);
410 /* bits 2..7 reserved => mask with 0x03 */
411 reg &= ~0x03;
412 reg |= v;
414 i2c_smbus_write_byte_data(to_i2c_client(dev),
415 FSCHMD_REG_FAN_RIPPLE[data->kind][index], reg);
417 data->fan_ripple[index] = reg;
419 mutex_unlock(&data->update_lock);
421 return count;
424 static ssize_t show_fan_alarm(struct device *dev,
425 struct device_attribute *devattr, char *buf)
427 int index = to_sensor_dev_attr(devattr)->index;
428 struct fschmd_data *data = fschmd_update_device(dev);
430 if (data->fan_status[index] & FSCHMD_FAN_ALARM)
431 return sprintf(buf, "1\n");
432 else
433 return sprintf(buf, "0\n");
436 static ssize_t show_fan_fault(struct device *dev,
437 struct device_attribute *devattr, char *buf)
439 int index = to_sensor_dev_attr(devattr)->index;
440 struct fschmd_data *data = fschmd_update_device(dev);
442 if (data->fan_status[index] & FSCHMD_FAN_NOT_PRESENT)
443 return sprintf(buf, "1\n");
444 else
445 return sprintf(buf, "0\n");
449 static ssize_t show_pwm_auto_point1_pwm(struct device *dev,
450 struct device_attribute *devattr, char *buf)
452 int index = to_sensor_dev_attr(devattr)->index;
453 int val = fschmd_update_device(dev)->fan_min[index];
455 /* 0 = allow turning off, 1-255 = 50-100% */
456 if (val)
457 val = val / 2 + 128;
459 return sprintf(buf, "%d\n", val);
462 static ssize_t store_pwm_auto_point1_pwm(struct device *dev,
463 struct device_attribute *devattr, const char *buf, size_t count)
465 int index = to_sensor_dev_attr(devattr)->index;
466 struct fschmd_data *data = dev_get_drvdata(dev);
467 unsigned long v = simple_strtoul(buf, NULL, 10);
469 /* register: 0 = allow turning off, 1-255 = 50-100% */
470 if (v) {
471 v = SENSORS_LIMIT(v, 128, 255);
472 v = (v - 128) * 2 + 1;
475 mutex_lock(&data->update_lock);
477 i2c_smbus_write_byte_data(to_i2c_client(dev),
478 FSCHMD_REG_FAN_MIN[data->kind][index], v);
479 data->fan_min[index] = v;
481 mutex_unlock(&data->update_lock);
483 return count;
487 /* The FSC hwmon family has the ability to force an attached alert led to flash
488 from software, we export this as an alert_led sysfs attr */
489 static ssize_t show_alert_led(struct device *dev,
490 struct device_attribute *devattr, char *buf)
492 struct fschmd_data *data = fschmd_update_device(dev);
494 if (data->global_control & FSCHMD_CONTROL_ALERT_LED)
495 return sprintf(buf, "1\n");
496 else
497 return sprintf(buf, "0\n");
500 static ssize_t store_alert_led(struct device *dev,
501 struct device_attribute *devattr, const char *buf, size_t count)
503 u8 reg;
504 struct fschmd_data *data = dev_get_drvdata(dev);
505 unsigned long v = simple_strtoul(buf, NULL, 10);
507 mutex_lock(&data->update_lock);
509 reg = i2c_smbus_read_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL);
511 if (v)
512 reg |= FSCHMD_CONTROL_ALERT_LED;
513 else
514 reg &= ~FSCHMD_CONTROL_ALERT_LED;
516 i2c_smbus_write_byte_data(to_i2c_client(dev), FSCHMD_REG_CONTROL, reg);
518 data->global_control = reg;
520 mutex_unlock(&data->update_lock);
522 return count;
525 static struct sensor_device_attribute fschmd_attr[] = {
526 SENSOR_ATTR(in0_input, 0444, show_in_value, NULL, 0),
527 SENSOR_ATTR(in1_input, 0444, show_in_value, NULL, 1),
528 SENSOR_ATTR(in2_input, 0444, show_in_value, NULL, 2),
529 SENSOR_ATTR(alert_led, 0644, show_alert_led, store_alert_led, 0),
532 static struct sensor_device_attribute fschmd_temp_attr[] = {
533 SENSOR_ATTR(temp1_input, 0444, show_temp_value, NULL, 0),
534 SENSOR_ATTR(temp1_max, 0644, show_temp_max, store_temp_max, 0),
535 SENSOR_ATTR(temp1_fault, 0444, show_temp_fault, NULL, 0),
536 SENSOR_ATTR(temp1_alarm, 0444, show_temp_alarm, NULL, 0),
537 SENSOR_ATTR(temp2_input, 0444, show_temp_value, NULL, 1),
538 SENSOR_ATTR(temp2_max, 0644, show_temp_max, store_temp_max, 1),
539 SENSOR_ATTR(temp2_fault, 0444, show_temp_fault, NULL, 1),
540 SENSOR_ATTR(temp2_alarm, 0444, show_temp_alarm, NULL, 1),
541 SENSOR_ATTR(temp3_input, 0444, show_temp_value, NULL, 2),
542 SENSOR_ATTR(temp3_max, 0644, show_temp_max, store_temp_max, 2),
543 SENSOR_ATTR(temp3_fault, 0444, show_temp_fault, NULL, 2),
544 SENSOR_ATTR(temp3_alarm, 0444, show_temp_alarm, NULL, 2),
545 SENSOR_ATTR(temp4_input, 0444, show_temp_value, NULL, 3),
546 SENSOR_ATTR(temp4_max, 0644, show_temp_max, store_temp_max, 3),
547 SENSOR_ATTR(temp4_fault, 0444, show_temp_fault, NULL, 3),
548 SENSOR_ATTR(temp4_alarm, 0444, show_temp_alarm, NULL, 3),
549 SENSOR_ATTR(temp5_input, 0444, show_temp_value, NULL, 4),
550 SENSOR_ATTR(temp5_max, 0644, show_temp_max, store_temp_max, 4),
551 SENSOR_ATTR(temp5_fault, 0444, show_temp_fault, NULL, 4),
552 SENSOR_ATTR(temp5_alarm, 0444, show_temp_alarm, NULL, 4),
555 static struct sensor_device_attribute fschmd_fan_attr[] = {
556 SENSOR_ATTR(fan1_input, 0444, show_fan_value, NULL, 0),
557 SENSOR_ATTR(fan1_div, 0644, show_fan_div, store_fan_div, 0),
558 SENSOR_ATTR(fan1_alarm, 0444, show_fan_alarm, NULL, 0),
559 SENSOR_ATTR(fan1_fault, 0444, show_fan_fault, NULL, 0),
560 SENSOR_ATTR(pwm1_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
561 store_pwm_auto_point1_pwm, 0),
562 SENSOR_ATTR(fan2_input, 0444, show_fan_value, NULL, 1),
563 SENSOR_ATTR(fan2_div, 0644, show_fan_div, store_fan_div, 1),
564 SENSOR_ATTR(fan2_alarm, 0444, show_fan_alarm, NULL, 1),
565 SENSOR_ATTR(fan2_fault, 0444, show_fan_fault, NULL, 1),
566 SENSOR_ATTR(pwm2_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
567 store_pwm_auto_point1_pwm, 1),
568 SENSOR_ATTR(fan3_input, 0444, show_fan_value, NULL, 2),
569 SENSOR_ATTR(fan3_div, 0644, show_fan_div, store_fan_div, 2),
570 SENSOR_ATTR(fan3_alarm, 0444, show_fan_alarm, NULL, 2),
571 SENSOR_ATTR(fan3_fault, 0444, show_fan_fault, NULL, 2),
572 SENSOR_ATTR(pwm3_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
573 store_pwm_auto_point1_pwm, 2),
574 SENSOR_ATTR(fan4_input, 0444, show_fan_value, NULL, 3),
575 SENSOR_ATTR(fan4_div, 0644, show_fan_div, store_fan_div, 3),
576 SENSOR_ATTR(fan4_alarm, 0444, show_fan_alarm, NULL, 3),
577 SENSOR_ATTR(fan4_fault, 0444, show_fan_fault, NULL, 3),
578 SENSOR_ATTR(pwm4_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
579 store_pwm_auto_point1_pwm, 3),
580 SENSOR_ATTR(fan5_input, 0444, show_fan_value, NULL, 4),
581 SENSOR_ATTR(fan5_div, 0644, show_fan_div, store_fan_div, 4),
582 SENSOR_ATTR(fan5_alarm, 0444, show_fan_alarm, NULL, 4),
583 SENSOR_ATTR(fan5_fault, 0444, show_fan_fault, NULL, 4),
584 SENSOR_ATTR(pwm5_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
585 store_pwm_auto_point1_pwm, 4),
586 SENSOR_ATTR(fan6_input, 0444, show_fan_value, NULL, 5),
587 SENSOR_ATTR(fan6_div, 0644, show_fan_div, store_fan_div, 5),
588 SENSOR_ATTR(fan6_alarm, 0444, show_fan_alarm, NULL, 5),
589 SENSOR_ATTR(fan6_fault, 0444, show_fan_fault, NULL, 5),
590 SENSOR_ATTR(pwm6_auto_point1_pwm, 0644, show_pwm_auto_point1_pwm,
591 store_pwm_auto_point1_pwm, 5),
596 * Watchdog routines
599 static int watchdog_set_timeout(struct fschmd_data *data, int timeout)
601 int ret, resolution;
602 int kind = data->kind + 1; /* 0-x array index -> 1-x module param */
604 /* 2 second or 60 second resolution? */
605 if (timeout <= 510 || kind == fscpos || kind == fscscy)
606 resolution = 2;
607 else
608 resolution = 60;
610 if (timeout < resolution || timeout > (resolution * 255))
611 return -EINVAL;
613 mutex_lock(&data->watchdog_lock);
614 if (!data->client) {
615 ret = -ENODEV;
616 goto leave;
619 if (resolution == 2)
620 data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_RESOLUTION;
621 else
622 data->watchdog_control |= FSCHMD_WDOG_CONTROL_RESOLUTION;
624 data->watchdog_preset = DIV_ROUND_UP(timeout, resolution);
626 /* Write new timeout value */
627 i2c_smbus_write_byte_data(data->client, FSCHMD_REG_WDOG_PRESET,
628 data->watchdog_preset);
629 /* Write new control register, do not trigger! */
630 i2c_smbus_write_byte_data(data->client, FSCHMD_REG_WDOG_CONTROL,
631 data->watchdog_control & ~FSCHMD_WDOG_CONTROL_TRIGGER);
633 ret = data->watchdog_preset * resolution;
635 leave:
636 mutex_unlock(&data->watchdog_lock);
637 return ret;
640 static int watchdog_get_timeout(struct fschmd_data *data)
642 int timeout;
644 mutex_lock(&data->watchdog_lock);
645 if (data->watchdog_control & FSCHMD_WDOG_CONTROL_RESOLUTION)
646 timeout = data->watchdog_preset * 60;
647 else
648 timeout = data->watchdog_preset * 2;
649 mutex_unlock(&data->watchdog_lock);
651 return timeout;
654 static int watchdog_trigger(struct fschmd_data *data)
656 int ret = 0;
658 mutex_lock(&data->watchdog_lock);
659 if (!data->client) {
660 ret = -ENODEV;
661 goto leave;
664 data->watchdog_control |= FSCHMD_WDOG_CONTROL_TRIGGER;
665 i2c_smbus_write_byte_data(data->client, FSCHMD_REG_WDOG_CONTROL,
666 data->watchdog_control);
667 leave:
668 mutex_unlock(&data->watchdog_lock);
669 return ret;
672 static int watchdog_stop(struct fschmd_data *data)
674 int ret = 0;
676 mutex_lock(&data->watchdog_lock);
677 if (!data->client) {
678 ret = -ENODEV;
679 goto leave;
682 data->watchdog_control &= ~FSCHMD_WDOG_CONTROL_STARTED;
683 /* Don't store the stop flag in our watchdog control register copy, as
684 its a write only bit (read always returns 0) */
685 i2c_smbus_write_byte_data(data->client, FSCHMD_REG_WDOG_CONTROL,
686 data->watchdog_control | FSCHMD_WDOG_CONTROL_STOP);
687 leave:
688 mutex_unlock(&data->watchdog_lock);
689 return ret;
692 static int watchdog_open(struct inode *inode, struct file *filp)
694 struct fschmd_data *pos, *data = NULL;
696 /* We get called from drivers/char/misc.c with misc_mtx hold, and we
697 call misc_register() from fschmd_probe() with watchdog_data_mutex
698 hold, as misc_register() takes the misc_mtx lock, this is a possible
699 deadlock, so we use mutex_trylock here. */
700 if (!mutex_trylock(&watchdog_data_mutex))
701 return -ERESTARTSYS;
702 list_for_each_entry(pos, &watchdog_data_list, list) {
703 if (pos->watchdog_miscdev.minor == iminor(inode)) {
704 data = pos;
705 break;
708 /* Note we can never not have found data, so we don't check for this */
709 kref_get(&data->kref);
710 mutex_unlock(&watchdog_data_mutex);
712 if (test_and_set_bit(0, &data->watchdog_is_open))
713 return -EBUSY;
715 /* Start the watchdog */
716 watchdog_trigger(data);
717 filp->private_data = data;
719 return nonseekable_open(inode, filp);
722 static int watchdog_release(struct inode *inode, struct file *filp)
724 struct fschmd_data *data = filp->private_data;
726 if (data->watchdog_expect_close) {
727 watchdog_stop(data);
728 data->watchdog_expect_close = 0;
729 } else {
730 watchdog_trigger(data);
731 dev_crit(&data->client->dev,
732 "unexpected close, not stopping watchdog!\n");
735 clear_bit(0, &data->watchdog_is_open);
737 mutex_lock(&watchdog_data_mutex);
738 kref_put(&data->kref, fschmd_release_resources);
739 mutex_unlock(&watchdog_data_mutex);
741 return 0;
744 static ssize_t watchdog_write(struct file *filp, const char __user *buf,
745 size_t count, loff_t *offset)
747 size_t ret;
748 struct fschmd_data *data = filp->private_data;
750 if (count) {
751 if (!nowayout) {
752 size_t i;
754 /* Clear it in case it was set with a previous write */
755 data->watchdog_expect_close = 0;
757 for (i = 0; i != count; i++) {
758 char c;
759 if (get_user(c, buf + i))
760 return -EFAULT;
761 if (c == 'V')
762 data->watchdog_expect_close = 1;
765 ret = watchdog_trigger(data);
766 if (ret < 0)
767 return ret;
769 return count;
772 static int watchdog_ioctl(struct inode *inode, struct file *filp,
773 unsigned int cmd, unsigned long arg)
775 static struct watchdog_info ident = {
776 .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
777 WDIOF_CARDRESET,
778 .identity = "FSC watchdog"
780 int i, ret = 0;
781 struct fschmd_data *data = filp->private_data;
783 switch (cmd) {
784 case WDIOC_GETSUPPORT:
785 ident.firmware_version = data->revision;
786 if (!nowayout)
787 ident.options |= WDIOF_MAGICCLOSE;
788 if (copy_to_user((void __user *)arg, &ident, sizeof(ident)))
789 ret = -EFAULT;
790 break;
792 case WDIOC_GETSTATUS:
793 ret = put_user(0, (int __user *)arg);
794 break;
796 case WDIOC_GETBOOTSTATUS:
797 if (data->watchdog_state & FSCHMD_WDOG_STATE_CARDRESET)
798 ret = put_user(WDIOF_CARDRESET, (int __user *)arg);
799 else
800 ret = put_user(0, (int __user *)arg);
801 break;
803 case WDIOC_KEEPALIVE:
804 ret = watchdog_trigger(data);
805 break;
807 case WDIOC_GETTIMEOUT:
808 i = watchdog_get_timeout(data);
809 ret = put_user(i, (int __user *)arg);
810 break;
812 case WDIOC_SETTIMEOUT:
813 if (get_user(i, (int __user *)arg)) {
814 ret = -EFAULT;
815 break;
817 ret = watchdog_set_timeout(data, i);
818 if (ret > 0)
819 ret = put_user(ret, (int __user *)arg);
820 break;
822 case WDIOC_SETOPTIONS:
823 if (get_user(i, (int __user *)arg)) {
824 ret = -EFAULT;
825 break;
828 if (i & WDIOS_DISABLECARD)
829 ret = watchdog_stop(data);
830 else if (i & WDIOS_ENABLECARD)
831 ret = watchdog_trigger(data);
832 else
833 ret = -EINVAL;
835 break;
836 default:
837 ret = -ENOTTY;
840 return ret;
843 static struct file_operations watchdog_fops = {
844 .owner = THIS_MODULE,
845 .llseek = no_llseek,
846 .open = watchdog_open,
847 .release = watchdog_release,
848 .write = watchdog_write,
849 .ioctl = watchdog_ioctl,
854 * Detect, register, unregister and update device functions
857 /* DMI decode routine to read voltage scaling factors from special DMI tables,
858 which are available on FSC machines with an fscher or later chip. */
859 static void fschmd_dmi_decode(const struct dmi_header *header)
861 int i, mult[3] = { 0 }, offset[3] = { 0 }, vref = 0, found = 0;
863 /* dmi code ugliness, we get passed the address of the contents of
864 a complete DMI record, but in the form of a dmi_header pointer, in
865 reality this address holds header->length bytes of which the header
866 are the first 4 bytes */
867 u8 *dmi_data = (u8 *)header;
869 /* We are looking for OEM-specific type 185 */
870 if (header->type != 185)
871 return;
873 /* we are looking for what Siemens calls "subtype" 19, the subtype
874 is stored in byte 5 of the dmi block */
875 if (header->length < 5 || dmi_data[4] != 19)
876 return;
878 /* After the subtype comes 1 unknown byte and then blocks of 5 bytes,
879 consisting of what Siemens calls an "Entity" number, followed by
880 2 16-bit words in LSB first order */
881 for (i = 6; (i + 4) < header->length; i += 5) {
882 /* entity 1 - 3: voltage multiplier and offset */
883 if (dmi_data[i] >= 1 && dmi_data[i] <= 3) {
884 /* Our in sensors order and the DMI order differ */
885 const int shuffle[3] = { 1, 0, 2 };
886 int in = shuffle[dmi_data[i] - 1];
888 /* Check for twice the same entity */
889 if (found & (1 << in))
890 return;
892 mult[in] = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
893 offset[in] = dmi_data[i + 3] | (dmi_data[i + 4] << 8);
895 found |= 1 << in;
898 /* entity 7: reference voltage */
899 if (dmi_data[i] == 7) {
900 /* Check for twice the same entity */
901 if (found & 0x08)
902 return;
904 vref = dmi_data[i + 1] | (dmi_data[i + 2] << 8);
906 found |= 0x08;
910 if (found == 0x0F) {
911 for (i = 0; i < 3; i++) {
912 dmi_mult[i] = mult[i] * 10;
913 dmi_offset[i] = offset[i] * 10;
915 dmi_vref = vref;
919 static int fschmd_detect(struct i2c_client *client, int kind,
920 struct i2c_board_info *info)
922 struct i2c_adapter *adapter = client->adapter;
923 const char * const client_names[5] = { "fscpos", "fscher", "fscscy",
924 "fschrc", "fschmd" };
926 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
927 return -ENODEV;
929 /* Detect & Identify the chip */
930 if (kind <= 0) {
931 char id[4];
933 id[0] = i2c_smbus_read_byte_data(client,
934 FSCHMD_REG_IDENT_0);
935 id[1] = i2c_smbus_read_byte_data(client,
936 FSCHMD_REG_IDENT_1);
937 id[2] = i2c_smbus_read_byte_data(client,
938 FSCHMD_REG_IDENT_2);
939 id[3] = '\0';
941 if (!strcmp(id, "PEG"))
942 kind = fscpos;
943 else if (!strcmp(id, "HER"))
944 kind = fscher;
945 else if (!strcmp(id, "SCY"))
946 kind = fscscy;
947 else if (!strcmp(id, "HRC"))
948 kind = fschrc;
949 else if (!strcmp(id, "HMD"))
950 kind = fschmd;
951 else
952 return -ENODEV;
955 strlcpy(info->type, client_names[kind - 1], I2C_NAME_SIZE);
957 return 0;
960 static int fschmd_probe(struct i2c_client *client,
961 const struct i2c_device_id *id)
963 struct fschmd_data *data;
964 const char * const names[5] = { "Poseidon", "Hermes", "Scylla",
965 "Heracles", "Heimdall" };
966 const int watchdog_minors[] = { WATCHDOG_MINOR, 212, 213, 214, 215 };
967 int i, err;
968 enum chips kind = id->driver_data;
970 data = kzalloc(sizeof(struct fschmd_data), GFP_KERNEL);
971 if (!data)
972 return -ENOMEM;
974 i2c_set_clientdata(client, data);
975 mutex_init(&data->update_lock);
976 mutex_init(&data->watchdog_lock);
977 INIT_LIST_HEAD(&data->list);
978 kref_init(&data->kref);
979 /* Store client pointer in our data struct for watchdog usage
980 (where the client is found through a data ptr instead of the
981 otherway around) */
982 data->client = client;
984 if (kind == fscpos) {
985 /* The Poseidon has hardwired temp limits, fill these
986 in for the alarm resetting code */
987 data->temp_max[0] = 70 + 128;
988 data->temp_max[1] = 50 + 128;
989 data->temp_max[2] = 50 + 128;
992 /* Read the special DMI table for fscher and newer chips */
993 if ((kind == fscher || kind >= fschrc) && dmi_vref == -1) {
994 dmi_walk(fschmd_dmi_decode);
995 if (dmi_vref == -1) {
996 dev_warn(&client->dev,
997 "Couldn't get voltage scaling factors from "
998 "BIOS DMI table, using builtin defaults\n");
999 dmi_vref = 33;
1003 /* Read in some never changing registers */
1004 data->revision = i2c_smbus_read_byte_data(client, FSCHMD_REG_REVISION);
1005 data->global_control = i2c_smbus_read_byte_data(client,
1006 FSCHMD_REG_CONTROL);
1007 data->watchdog_control = i2c_smbus_read_byte_data(client,
1008 FSCHMD_REG_WDOG_CONTROL);
1009 data->watchdog_state = i2c_smbus_read_byte_data(client,
1010 FSCHMD_REG_WDOG_STATE);
1011 data->watchdog_preset = i2c_smbus_read_byte_data(client,
1012 FSCHMD_REG_WDOG_PRESET);
1014 /* i2c kind goes from 1-5, we want from 0-4 to address arrays */
1015 data->kind = kind - 1;
1017 for (i = 0; i < ARRAY_SIZE(fschmd_attr); i++) {
1018 err = device_create_file(&client->dev,
1019 &fschmd_attr[i].dev_attr);
1020 if (err)
1021 goto exit_detach;
1024 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++) {
1025 /* Poseidon doesn't have TEMP_LIMIT registers */
1026 if (kind == fscpos && fschmd_temp_attr[i].dev_attr.show ==
1027 show_temp_max)
1028 continue;
1030 err = device_create_file(&client->dev,
1031 &fschmd_temp_attr[i].dev_attr);
1032 if (err)
1033 goto exit_detach;
1036 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++) {
1037 /* Poseidon doesn't have a FAN_MIN register for its 3rd fan */
1038 if (kind == fscpos &&
1039 !strcmp(fschmd_fan_attr[i].dev_attr.attr.name,
1040 "pwm3_auto_point1_pwm"))
1041 continue;
1043 err = device_create_file(&client->dev,
1044 &fschmd_fan_attr[i].dev_attr);
1045 if (err)
1046 goto exit_detach;
1049 data->hwmon_dev = hwmon_device_register(&client->dev);
1050 if (IS_ERR(data->hwmon_dev)) {
1051 err = PTR_ERR(data->hwmon_dev);
1052 data->hwmon_dev = NULL;
1053 goto exit_detach;
1056 /* We take the data_mutex lock early so that watchdog_open() cannot
1057 run when misc_register() has completed, but we've not yet added
1058 our data to the watchdog_data_list (and set the default timeout) */
1059 mutex_lock(&watchdog_data_mutex);
1060 for (i = 0; i < ARRAY_SIZE(watchdog_minors); i++) {
1061 /* Register our watchdog part */
1062 snprintf(data->watchdog_name, sizeof(data->watchdog_name),
1063 "watchdog%c", (i == 0) ? '\0' : ('0' + i));
1064 data->watchdog_miscdev.name = data->watchdog_name;
1065 data->watchdog_miscdev.fops = &watchdog_fops;
1066 data->watchdog_miscdev.minor = watchdog_minors[i];
1067 err = misc_register(&data->watchdog_miscdev);
1068 if (err == -EBUSY)
1069 continue;
1070 if (err) {
1071 data->watchdog_miscdev.minor = 0;
1072 dev_err(&client->dev,
1073 "Registering watchdog chardev: %d\n", err);
1074 break;
1077 list_add(&data->list, &watchdog_data_list);
1078 watchdog_set_timeout(data, 60);
1079 dev_info(&client->dev,
1080 "Registered watchdog chardev major 10, minor: %d\n",
1081 watchdog_minors[i]);
1082 break;
1084 if (i == ARRAY_SIZE(watchdog_minors)) {
1085 data->watchdog_miscdev.minor = 0;
1086 dev_warn(&client->dev, "Couldn't register watchdog chardev "
1087 "(due to no free minor)\n");
1089 mutex_unlock(&watchdog_data_mutex);
1091 dev_info(&client->dev, "Detected FSC %s chip, revision: %d\n",
1092 names[data->kind], (int) data->revision);
1094 return 0;
1096 exit_detach:
1097 fschmd_remove(client); /* will also free data for us */
1098 return err;
1101 static int fschmd_remove(struct i2c_client *client)
1103 struct fschmd_data *data = i2c_get_clientdata(client);
1104 int i;
1106 /* Unregister the watchdog (if registered) */
1107 if (data->watchdog_miscdev.minor) {
1108 misc_deregister(&data->watchdog_miscdev);
1109 if (data->watchdog_is_open) {
1110 dev_warn(&client->dev,
1111 "i2c client detached with watchdog open! "
1112 "Stopping watchdog.\n");
1113 watchdog_stop(data);
1115 mutex_lock(&watchdog_data_mutex);
1116 list_del(&data->list);
1117 mutex_unlock(&watchdog_data_mutex);
1118 /* Tell the watchdog code the client is gone */
1119 mutex_lock(&data->watchdog_lock);
1120 data->client = NULL;
1121 mutex_unlock(&data->watchdog_lock);
1124 /* Check if registered in case we're called from fschmd_detect
1125 to cleanup after an error */
1126 if (data->hwmon_dev)
1127 hwmon_device_unregister(data->hwmon_dev);
1129 for (i = 0; i < ARRAY_SIZE(fschmd_attr); i++)
1130 device_remove_file(&client->dev, &fschmd_attr[i].dev_attr);
1131 for (i = 0; i < (FSCHMD_NO_TEMP_SENSORS[data->kind] * 4); i++)
1132 device_remove_file(&client->dev,
1133 &fschmd_temp_attr[i].dev_attr);
1134 for (i = 0; i < (FSCHMD_NO_FAN_SENSORS[data->kind] * 5); i++)
1135 device_remove_file(&client->dev,
1136 &fschmd_fan_attr[i].dev_attr);
1138 mutex_lock(&watchdog_data_mutex);
1139 kref_put(&data->kref, fschmd_release_resources);
1140 mutex_unlock(&watchdog_data_mutex);
1142 return 0;
1145 static struct fschmd_data *fschmd_update_device(struct device *dev)
1147 struct i2c_client *client = to_i2c_client(dev);
1148 struct fschmd_data *data = i2c_get_clientdata(client);
1149 int i;
1151 mutex_lock(&data->update_lock);
1153 if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
1155 for (i = 0; i < FSCHMD_NO_TEMP_SENSORS[data->kind]; i++) {
1156 data->temp_act[i] = i2c_smbus_read_byte_data(client,
1157 FSCHMD_REG_TEMP_ACT[data->kind][i]);
1158 data->temp_status[i] = i2c_smbus_read_byte_data(client,
1159 FSCHMD_REG_TEMP_STATE[data->kind][i]);
1161 /* The fscpos doesn't have TEMP_LIMIT registers */
1162 if (FSCHMD_REG_TEMP_LIMIT[data->kind][i])
1163 data->temp_max[i] = i2c_smbus_read_byte_data(
1164 client,
1165 FSCHMD_REG_TEMP_LIMIT[data->kind][i]);
1167 /* reset alarm if the alarm condition is gone,
1168 the chip doesn't do this itself */
1169 if ((data->temp_status[i] & FSCHMD_TEMP_ALARM_MASK) ==
1170 FSCHMD_TEMP_ALARM_MASK &&
1171 data->temp_act[i] < data->temp_max[i])
1172 i2c_smbus_write_byte_data(client,
1173 FSCHMD_REG_TEMP_STATE[data->kind][i],
1174 FSCHMD_TEMP_ALERT);
1177 for (i = 0; i < FSCHMD_NO_FAN_SENSORS[data->kind]; i++) {
1178 data->fan_act[i] = i2c_smbus_read_byte_data(client,
1179 FSCHMD_REG_FAN_ACT[data->kind][i]);
1180 data->fan_status[i] = i2c_smbus_read_byte_data(client,
1181 FSCHMD_REG_FAN_STATE[data->kind][i]);
1182 data->fan_ripple[i] = i2c_smbus_read_byte_data(client,
1183 FSCHMD_REG_FAN_RIPPLE[data->kind][i]);
1185 /* The fscpos third fan doesn't have a fan_min */
1186 if (FSCHMD_REG_FAN_MIN[data->kind][i])
1187 data->fan_min[i] = i2c_smbus_read_byte_data(
1188 client,
1189 FSCHMD_REG_FAN_MIN[data->kind][i]);
1191 /* reset fan status if speed is back to > 0 */
1192 if ((data->fan_status[i] & FSCHMD_FAN_ALARM) &&
1193 data->fan_act[i])
1194 i2c_smbus_write_byte_data(client,
1195 FSCHMD_REG_FAN_STATE[data->kind][i],
1196 FSCHMD_FAN_ALARM);
1199 for (i = 0; i < 3; i++)
1200 data->volt[i] = i2c_smbus_read_byte_data(client,
1201 FSCHMD_REG_VOLT[i]);
1203 data->last_updated = jiffies;
1204 data->valid = 1;
1207 mutex_unlock(&data->update_lock);
1209 return data;
1212 static int __init fschmd_init(void)
1214 return i2c_add_driver(&fschmd_driver);
1217 static void __exit fschmd_exit(void)
1219 i2c_del_driver(&fschmd_driver);
1222 MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
1223 MODULE_DESCRIPTION("FSC Poseidon, Hermes, Scylla, Heracles and "
1224 "Heimdall driver");
1225 MODULE_LICENSE("GPL");
1227 module_init(fschmd_init);
1228 module_exit(fschmd_exit);