1 /***************************************************************************
2 * Copyright (C) 2006 by Hans Edgington <hans@edgington.nl> *
3 * Copyright (C) 2007,2008 by 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 *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include <linux/module.h>
22 #include <linux/init.h>
23 #include <linux/slab.h>
24 #include <linux/jiffies.h>
25 #include <linux/platform_device.h>
26 #include <linux/hwmon.h>
27 #include <linux/hwmon-sysfs.h>
28 #include <linux/err.h>
29 #include <linux/mutex.h>
32 #define DRVNAME "f71882fg"
34 #define SIO_F71882FG_LD_HWM 0x04 /* Hardware monitor logical device */
35 #define SIO_UNLOCK_KEY 0x87 /* Key to enable Super-I/O */
36 #define SIO_LOCK_KEY 0xAA /* Key to diasble Super-I/O */
38 #define SIO_REG_LDSEL 0x07 /* Logical device select */
39 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
40 #define SIO_REG_DEVREV 0x22 /* Device revision */
41 #define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */
42 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
43 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
45 #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */
46 #define SIO_F71862_ID 0x0601 /* Chipset ID */
47 #define SIO_F71882_ID 0x0541 /* Chipset ID */
48 #define SIO_F8000_ID 0x0581 /* Chipset ID */
50 #define REGION_LENGTH 8
51 #define ADDR_REG_OFFSET 5
52 #define DATA_REG_OFFSET 6
54 #define F71882FG_REG_PECI 0x0A
56 #define F71882FG_REG_IN_STATUS 0x12 /* f71882fg only */
57 #define F71882FG_REG_IN_BEEP 0x13 /* f71882fg only */
58 #define F71882FG_REG_IN(nr) (0x20 + (nr))
59 #define F71882FG_REG_IN1_HIGH 0x32 /* f71882fg only */
61 #define F71882FG_REG_FAN(nr) (0xA0 + (16 * (nr)))
62 #define F71882FG_REG_FAN_TARGET(nr) (0xA2 + (16 * (nr)))
63 #define F71882FG_REG_FAN_FULL_SPEED(nr) (0xA4 + (16 * (nr)))
64 #define F71882FG_REG_FAN_STATUS 0x92
65 #define F71882FG_REG_FAN_BEEP 0x93
67 #define F71882FG_REG_TEMP(nr) (0x70 + 2 * (nr))
68 #define F71882FG_REG_TEMP_OVT(nr) (0x80 + 2 * (nr))
69 #define F71882FG_REG_TEMP_HIGH(nr) (0x81 + 2 * (nr))
70 #define F71882FG_REG_TEMP_STATUS 0x62
71 #define F71882FG_REG_TEMP_BEEP 0x63
72 #define F71882FG_REG_TEMP_HYST(nr) (0x6C + (nr))
73 #define F71882FG_REG_TEMP_TYPE 0x6B
74 #define F71882FG_REG_TEMP_DIODE_OPEN 0x6F
76 #define F71882FG_REG_PWM(nr) (0xA3 + (16 * (nr)))
77 #define F71882FG_REG_PWM_TYPE 0x94
78 #define F71882FG_REG_PWM_ENABLE 0x96
80 #define F71882FG_REG_FAN_HYST(nr) (0x98 + (nr))
82 #define F71882FG_REG_POINT_PWM(pwm, point) (0xAA + (point) + (16 * (pwm)))
83 #define F71882FG_REG_POINT_TEMP(pwm, point) (0xA6 + (point) + (16 * (pwm)))
84 #define F71882FG_REG_POINT_MAPPING(nr) (0xAF + 16 * (nr))
86 #define F71882FG_REG_START 0x01
88 #define FAN_MIN_DETECT 366 /* Lowest detectable fanspeed */
90 static unsigned short force_id;
91 module_param(force_id, ushort, 0);
92 MODULE_PARM_DESC(force_id, "Override the detected device ID");
94 enum chips { f71862fg, f71882fg, f8000 };
96 static const char *f71882fg_names[] = {
102 static struct platform_device *f71882fg_pdev;
104 /* Super-I/O Function prototypes */
105 static inline int superio_inb(int base, int reg);
106 static inline int superio_inw(int base, int reg);
107 static inline void superio_enter(int base);
108 static inline void superio_select(int base, int ld);
109 static inline void superio_exit(int base);
111 struct f71882fg_sio_data {
115 struct f71882fg_data {
118 struct device *hwmon_dev;
120 struct mutex update_lock;
121 char valid; /* !=0 if following fields are valid */
122 unsigned long last_updated; /* In jiffies */
123 unsigned long last_limits; /* In jiffies */
125 /* Register Values */
132 u16 fan_full_speed[4];
135 /* Note: all models have only 3 temperature channels, but on some
136 they are addressed as 0-2 and on others as 1-3, so for coding
137 convenience we reserve space for 4 channels */
141 u8 temp_hyst[2]; /* 2 hysts stored per reg */
148 u8 pwm_auto_point_hyst[2];
149 u8 pwm_auto_point_mapping[4];
150 u8 pwm_auto_point_pwm[4][5];
151 u8 pwm_auto_point_temp[4][4];
155 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
157 static ssize_t show_in_max(struct device *dev, struct device_attribute
158 *devattr, char *buf);
159 static ssize_t store_in_max(struct device *dev, struct device_attribute
160 *devattr, const char *buf, size_t count);
161 static ssize_t show_in_beep(struct device *dev, struct device_attribute
162 *devattr, char *buf);
163 static ssize_t store_in_beep(struct device *dev, struct device_attribute
164 *devattr, const char *buf, size_t count);
165 static ssize_t show_in_alarm(struct device *dev, struct device_attribute
166 *devattr, char *buf);
168 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
170 static ssize_t show_fan_full_speed(struct device *dev,
171 struct device_attribute *devattr, char *buf);
172 static ssize_t store_fan_full_speed(struct device *dev,
173 struct device_attribute *devattr, const char *buf, size_t count);
174 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
175 *devattr, char *buf);
176 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
177 *devattr, const char *buf, size_t count);
178 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
179 *devattr, char *buf);
181 static ssize_t show_temp(struct device *dev, struct device_attribute
182 *devattr, char *buf);
183 static ssize_t show_temp_max(struct device *dev, struct device_attribute
184 *devattr, char *buf);
185 static ssize_t store_temp_max(struct device *dev, struct device_attribute
186 *devattr, const char *buf, size_t count);
187 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
188 *devattr, char *buf);
189 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
190 *devattr, const char *buf, size_t count);
191 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
192 *devattr, char *buf);
193 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
194 *devattr, const char *buf, size_t count);
195 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
196 *devattr, char *buf);
197 static ssize_t show_temp_type(struct device *dev, struct device_attribute
198 *devattr, char *buf);
199 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
200 *devattr, char *buf);
201 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
202 *devattr, const char *buf, size_t count);
203 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
204 *devattr, char *buf);
205 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
206 *devattr, char *buf);
207 /* PWM and Auto point control */
208 static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
210 static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
211 const char *buf, size_t count);
212 static ssize_t show_pwm_enable(struct device *dev,
213 struct device_attribute *devattr, char *buf);
214 static ssize_t store_pwm_enable(struct device *dev,
215 struct device_attribute *devattr, const char *buf, size_t count);
216 static ssize_t show_pwm_interpolate(struct device *dev,
217 struct device_attribute *devattr, char *buf);
218 static ssize_t store_pwm_interpolate(struct device *dev,
219 struct device_attribute *devattr, const char *buf, size_t count);
220 static ssize_t show_pwm_auto_point_channel(struct device *dev,
221 struct device_attribute *devattr, char *buf);
222 static ssize_t store_pwm_auto_point_channel(struct device *dev,
223 struct device_attribute *devattr, const char *buf, size_t count);
224 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
225 struct device_attribute *devattr, char *buf);
226 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
227 struct device_attribute *devattr, const char *buf, size_t count);
228 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
229 struct device_attribute *devattr, char *buf);
230 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
231 struct device_attribute *devattr, const char *buf, size_t count);
232 static ssize_t show_pwm_auto_point_temp(struct device *dev,
233 struct device_attribute *devattr, char *buf);
234 static ssize_t store_pwm_auto_point_temp(struct device *dev,
235 struct device_attribute *devattr, const char *buf, size_t count);
237 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
240 static int __devinit f71882fg_probe(struct platform_device * pdev);
241 static int f71882fg_remove(struct platform_device *pdev);
243 static struct platform_driver f71882fg_driver = {
245 .owner = THIS_MODULE,
248 .probe = f71882fg_probe,
249 .remove = __devexit_p(f71882fg_remove),
252 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
254 /* Temp and in attr common to both the f71862fg and f71882fg */
255 static struct sensor_device_attribute_2 f718x2fg_in_temp_attr[] = {
256 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
257 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
258 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
259 SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3),
260 SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4),
261 SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5),
262 SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
263 SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
264 SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
265 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
266 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
267 store_temp_max, 0, 1),
268 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
269 store_temp_max_hyst, 0, 1),
270 /* Should really be temp1_max_alarm, but older versions did not handle
271 the max and crit alarms separately and lm_sensors v2 depends on the
272 presence of temp#_alarm files. The same goes for temp2/3 _alarm. */
273 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
274 SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
275 store_temp_beep, 0, 1),
276 SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
277 store_temp_crit, 0, 1),
278 SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
280 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
281 SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
282 store_temp_beep, 0, 5),
283 SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1),
284 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
285 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2),
286 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
287 store_temp_max, 0, 2),
288 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
289 store_temp_max_hyst, 0, 2),
290 /* Should be temp2_max_alarm, see temp1_alarm note */
291 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
292 SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
293 store_temp_beep, 0, 2),
294 SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
295 store_temp_crit, 0, 2),
296 SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
298 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
299 SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
300 store_temp_beep, 0, 6),
301 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
302 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
303 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
304 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
305 store_temp_max, 0, 3),
306 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
307 store_temp_max_hyst, 0, 3),
308 /* Should be temp3_max_alarm, see temp1_alarm note */
309 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3),
310 SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
311 store_temp_beep, 0, 3),
312 SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
313 store_temp_crit, 0, 3),
314 SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
316 SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 7),
317 SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
318 store_temp_beep, 0, 7),
319 SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3),
320 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3),
323 /* Temp and in attr found only on the f71882fg */
324 static struct sensor_device_attribute_2 f71882fg_in_temp_attr[] = {
325 SENSOR_ATTR_2(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max,
327 SENSOR_ATTR_2(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep,
329 SENSOR_ATTR_2(in1_alarm, S_IRUGO, show_in_alarm, NULL, 0, 1),
332 /* Temp and in attr for the f8000
333 Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max)
334 is used as hysteresis value to clear alarms
336 static struct sensor_device_attribute_2 f8000_in_temp_attr[] = {
337 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
338 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
339 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
340 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
341 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_crit,
342 store_temp_crit, 0, 0),
343 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
344 store_temp_max, 0, 0),
345 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
346 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
347 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_crit,
348 store_temp_crit, 0, 1),
349 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
350 store_temp_max, 0, 1),
351 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
352 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 1),
353 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
354 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_crit,
355 store_temp_crit, 0, 2),
356 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
357 store_temp_max, 0, 2),
358 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
361 /* Fan / PWM attr common to all models */
362 static struct sensor_device_attribute_2 fxxxx_fan_attr[] = {
363 SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0),
364 SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR,
366 store_fan_full_speed, 0, 0),
367 SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0),
368 SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
369 SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
371 store_fan_full_speed, 0, 1),
372 SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
373 SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
374 SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
376 store_fan_full_speed, 0, 2),
377 SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
379 SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0),
380 SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
381 store_pwm_enable, 0, 0),
382 SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR,
383 show_pwm_interpolate, store_pwm_interpolate, 0, 0),
384 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
385 show_pwm_auto_point_channel,
386 store_pwm_auto_point_channel, 0, 0),
388 SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1),
389 SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
390 store_pwm_enable, 0, 1),
391 SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR,
392 show_pwm_interpolate, store_pwm_interpolate, 0, 1),
393 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
394 show_pwm_auto_point_channel,
395 store_pwm_auto_point_channel, 0, 1),
397 SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR,
398 show_pwm_interpolate, store_pwm_interpolate, 0, 2),
399 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
400 show_pwm_auto_point_channel,
401 store_pwm_auto_point_channel, 0, 2),
404 /* Fan / PWM attr for the f71862fg, less pwms and less zones per pwm than the
406 static struct sensor_device_attribute_2 f71862fg_fan_attr[] = {
407 SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
408 store_fan_beep, 0, 0),
409 SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
410 store_fan_beep, 0, 1),
411 SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
412 store_fan_beep, 0, 2),
414 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
415 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
417 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
418 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
420 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
421 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
423 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
424 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
426 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
427 show_pwm_auto_point_temp_hyst,
428 store_pwm_auto_point_temp_hyst,
430 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
431 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
433 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
434 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
436 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
437 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
439 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
440 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
442 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
443 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
445 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
446 show_pwm_auto_point_temp_hyst,
447 store_pwm_auto_point_temp_hyst,
449 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
450 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
452 SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
453 SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
454 store_pwm_enable, 0, 2),
455 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
456 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
458 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
459 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
461 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
462 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
464 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
465 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
467 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
468 show_pwm_auto_point_temp_hyst,
469 store_pwm_auto_point_temp_hyst,
471 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
472 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
475 /* Fan / PWM attr for the f71882fg */
476 static struct sensor_device_attribute_2 f71882fg_fan_attr[] = {
477 SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
478 store_fan_beep, 0, 0),
479 SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
480 store_fan_beep, 0, 1),
481 SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
482 store_fan_beep, 0, 2),
483 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
484 SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
486 store_fan_full_speed, 0, 3),
487 SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
488 store_fan_beep, 0, 3),
489 SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
491 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
492 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
494 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
495 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
497 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
498 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
500 SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR,
501 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
503 SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR,
504 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
506 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
507 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
509 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
510 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
512 SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR,
513 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
515 SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR,
516 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
518 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
519 show_pwm_auto_point_temp_hyst,
520 store_pwm_auto_point_temp_hyst,
522 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
523 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
524 SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO,
525 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
526 SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
527 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
529 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
530 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
532 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
533 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
535 SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
536 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
538 SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR,
539 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
541 SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR,
542 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
544 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
545 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
547 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
548 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
550 SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR,
551 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
553 SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR,
554 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
556 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
557 show_pwm_auto_point_temp_hyst,
558 store_pwm_auto_point_temp_hyst,
560 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
561 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
562 SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO,
563 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
564 SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
565 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
567 SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
568 SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
569 store_pwm_enable, 0, 2),
570 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
571 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
573 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
574 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
576 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
577 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
579 SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR,
580 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
582 SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR,
583 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
585 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
586 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
588 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
589 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
591 SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR,
592 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
594 SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR,
595 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
597 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
598 show_pwm_auto_point_temp_hyst,
599 store_pwm_auto_point_temp_hyst,
601 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
602 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
603 SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO,
604 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
605 SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
606 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
608 SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
609 SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
610 store_pwm_enable, 0, 3),
611 SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
612 show_pwm_interpolate, store_pwm_interpolate, 0, 3),
613 SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
614 show_pwm_auto_point_channel,
615 store_pwm_auto_point_channel, 0, 3),
616 SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR,
617 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
619 SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR,
620 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
622 SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR,
623 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
625 SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR,
626 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
628 SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR,
629 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
631 SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR,
632 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
634 SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR,
635 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
637 SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR,
638 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
640 SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR,
641 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
643 SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
644 show_pwm_auto_point_temp_hyst,
645 store_pwm_auto_point_temp_hyst,
647 SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO,
648 show_pwm_auto_point_temp_hyst, NULL, 1, 3),
649 SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO,
650 show_pwm_auto_point_temp_hyst, NULL, 2, 3),
651 SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
652 show_pwm_auto_point_temp_hyst, NULL, 3, 3),
655 /* Fan / PWM attr for the f8000, zones mapped to temp instead of to pwm!
656 Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
657 F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0 */
658 static struct sensor_device_attribute_2 f8000_fan_attr[] = {
659 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
661 SENSOR_ATTR_2(pwm3, S_IRUGO, show_pwm, NULL, 0, 2),
663 SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR,
664 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
666 SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR,
667 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
669 SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR,
670 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
672 SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR,
673 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
675 SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR,
676 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
678 SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR,
679 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
681 SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR,
682 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
684 SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR,
685 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
687 SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR,
688 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
690 SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
691 show_pwm_auto_point_temp_hyst,
692 store_pwm_auto_point_temp_hyst,
694 SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO,
695 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
696 SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO,
697 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
698 SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO,
699 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
701 SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR,
702 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
704 SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR,
705 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
707 SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR,
708 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
710 SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR,
711 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
713 SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR,
714 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
716 SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR,
717 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
719 SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR,
720 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
722 SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR,
723 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
725 SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR,
726 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
728 SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
729 show_pwm_auto_point_temp_hyst,
730 store_pwm_auto_point_temp_hyst,
732 SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO,
733 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
734 SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO,
735 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
736 SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO,
737 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
739 SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR,
740 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
742 SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR,
743 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
745 SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR,
746 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
748 SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR,
749 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
751 SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR,
752 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
754 SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR,
755 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
757 SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR,
758 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
760 SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR,
761 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
763 SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR,
764 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
766 SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
767 show_pwm_auto_point_temp_hyst,
768 store_pwm_auto_point_temp_hyst,
770 SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO,
771 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
772 SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO,
773 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
774 SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO,
775 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
778 /* Super I/O functions */
779 static inline int superio_inb(int base, int reg)
782 return inb(base + 1);
785 static int superio_inw(int base, int reg)
789 val = inb(base + 1) << 8;
791 val |= inb(base + 1);
795 static inline void superio_enter(int base)
797 /* according to the datasheet the key must be send twice! */
798 outb( SIO_UNLOCK_KEY, base);
799 outb( SIO_UNLOCK_KEY, base);
802 static inline void superio_select( int base, int ld)
804 outb(SIO_REG_LDSEL, base);
808 static inline void superio_exit(int base)
810 outb(SIO_LOCK_KEY, base);
813 static inline u16 fan_from_reg(u16 reg)
815 return reg ? (1500000 / reg) : 0;
818 static inline u16 fan_to_reg(u16 fan)
820 return fan ? (1500000 / fan) : 0;
823 static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
827 outb(reg, data->addr + ADDR_REG_OFFSET);
828 val = inb(data->addr + DATA_REG_OFFSET);
833 static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
837 outb(reg++, data->addr + ADDR_REG_OFFSET);
838 val = inb(data->addr + DATA_REG_OFFSET) << 8;
839 outb(reg, data->addr + ADDR_REG_OFFSET);
840 val |= inb(data->addr + DATA_REG_OFFSET);
845 static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
847 outb(reg, data->addr + ADDR_REG_OFFSET);
848 outb(val, data->addr + DATA_REG_OFFSET);
851 static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
853 outb(reg++, data->addr + ADDR_REG_OFFSET);
854 outb(val >> 8, data->addr + DATA_REG_OFFSET);
855 outb(reg, data->addr + ADDR_REG_OFFSET);
856 outb(val & 255, data->addr + DATA_REG_OFFSET);
859 static struct f71882fg_data *f71882fg_update_device(struct device *dev)
861 struct f71882fg_data *data = dev_get_drvdata(dev);
862 int nr, reg = 0, reg2;
863 int nr_fans = (data->type == f71882fg) ? 4 : 3;
864 int nr_ins = (data->type == f8000) ? 3 : 9;
865 int temp_start = (data->type == f8000) ? 0 : 1;
867 mutex_lock(&data->update_lock);
869 /* Update once every 60 seconds */
870 if ( time_after(jiffies, data->last_limits + 60 * HZ ) ||
872 if (data->type == f71882fg) {
874 f71882fg_read8(data, F71882FG_REG_IN1_HIGH);
876 f71882fg_read8(data, F71882FG_REG_IN_BEEP);
879 /* Get High & boundary temps*/
880 for (nr = temp_start; nr < 3 + temp_start; nr++) {
881 data->temp_ovt[nr] = f71882fg_read8(data,
882 F71882FG_REG_TEMP_OVT(nr));
883 data->temp_high[nr] = f71882fg_read8(data,
884 F71882FG_REG_TEMP_HIGH(nr));
887 if (data->type != f8000) {
888 data->fan_beep = f71882fg_read8(data,
889 F71882FG_REG_FAN_BEEP);
890 data->temp_beep = f71882fg_read8(data,
891 F71882FG_REG_TEMP_BEEP);
892 data->temp_hyst[0] = f71882fg_read8(data,
893 F71882FG_REG_TEMP_HYST(0));
894 data->temp_hyst[1] = f71882fg_read8(data,
895 F71882FG_REG_TEMP_HYST(1));
896 /* Have to hardcode type, because temp1 is special */
897 reg = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
898 data->temp_type[2] = (reg & 0x04) ? 2 : 4;
899 data->temp_type[3] = (reg & 0x08) ? 2 : 4;
901 reg2 = f71882fg_read8(data, F71882FG_REG_PECI);
902 if ((reg2 & 0x03) == 0x01)
903 data->temp_type[1] = 6 /* PECI */;
904 else if ((reg2 & 0x03) == 0x02)
905 data->temp_type[1] = 5 /* AMDSI */;
906 else if (data->type != f8000)
907 data->temp_type[1] = (reg & 0x02) ? 2 : 4;
909 data->temp_type[1] = 2; /* F8000 only supports BJT */
911 data->pwm_enable = f71882fg_read8(data,
912 F71882FG_REG_PWM_ENABLE);
913 data->pwm_auto_point_hyst[0] =
914 f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
915 data->pwm_auto_point_hyst[1] =
916 f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
918 for (nr = 0; nr < nr_fans; nr++) {
919 data->pwm_auto_point_mapping[nr] =
921 F71882FG_REG_POINT_MAPPING(nr));
923 if (data->type != f71862fg) {
925 for (point = 0; point < 5; point++) {
926 data->pwm_auto_point_pwm[nr][point] =
928 F71882FG_REG_POINT_PWM
931 for (point = 0; point < 4; point++) {
932 data->pwm_auto_point_temp[nr][point] =
934 F71882FG_REG_POINT_TEMP
938 data->pwm_auto_point_pwm[nr][1] =
940 F71882FG_REG_POINT_PWM
942 data->pwm_auto_point_pwm[nr][4] =
944 F71882FG_REG_POINT_PWM
946 data->pwm_auto_point_temp[nr][0] =
948 F71882FG_REG_POINT_TEMP
950 data->pwm_auto_point_temp[nr][3] =
952 F71882FG_REG_POINT_TEMP
956 data->last_limits = jiffies;
959 /* Update every second */
960 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
961 data->temp_status = f71882fg_read8(data,
962 F71882FG_REG_TEMP_STATUS);
963 data->temp_diode_open = f71882fg_read8(data,
964 F71882FG_REG_TEMP_DIODE_OPEN);
965 for (nr = temp_start; nr < 3 + temp_start; nr++)
966 data->temp[nr] = f71882fg_read8(data,
967 F71882FG_REG_TEMP(nr));
969 data->fan_status = f71882fg_read8(data,
970 F71882FG_REG_FAN_STATUS);
971 for (nr = 0; nr < nr_fans; nr++) {
972 data->fan[nr] = f71882fg_read16(data,
973 F71882FG_REG_FAN(nr));
974 data->fan_target[nr] =
975 f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
976 data->fan_full_speed[nr] =
977 f71882fg_read16(data,
978 F71882FG_REG_FAN_FULL_SPEED(nr));
980 f71882fg_read8(data, F71882FG_REG_PWM(nr));
983 /* The f8000 can monitor 1 more fan, but has no pwm for it */
984 if (data->type == f8000)
985 data->fan[3] = f71882fg_read16(data,
986 F71882FG_REG_FAN(3));
987 if (data->type == f71882fg)
988 data->in_status = f71882fg_read8(data,
989 F71882FG_REG_IN_STATUS);
990 for (nr = 0; nr < nr_ins; nr++)
991 data->in[nr] = f71882fg_read8(data,
992 F71882FG_REG_IN(nr));
994 data->last_updated = jiffies;
998 mutex_unlock(&data->update_lock);
1003 /* Sysfs Interface */
1004 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
1007 struct f71882fg_data *data = f71882fg_update_device(dev);
1008 int nr = to_sensor_dev_attr_2(devattr)->index;
1009 int speed = fan_from_reg(data->fan[nr]);
1011 if (speed == FAN_MIN_DETECT)
1014 return sprintf(buf, "%d\n", speed);
1017 static ssize_t show_fan_full_speed(struct device *dev,
1018 struct device_attribute *devattr, char *buf)
1020 struct f71882fg_data *data = f71882fg_update_device(dev);
1021 int nr = to_sensor_dev_attr_2(devattr)->index;
1022 int speed = fan_from_reg(data->fan_full_speed[nr]);
1023 return sprintf(buf, "%d\n", speed);
1026 static ssize_t store_fan_full_speed(struct device *dev,
1027 struct device_attribute *devattr,
1028 const char *buf, size_t count)
1030 struct f71882fg_data *data = dev_get_drvdata(dev);
1031 int nr = to_sensor_dev_attr_2(devattr)->index;
1032 long val = simple_strtol(buf, NULL, 10);
1034 val = SENSORS_LIMIT(val, 23, 1500000);
1035 val = fan_to_reg(val);
1037 mutex_lock(&data->update_lock);
1038 f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1039 data->fan_full_speed[nr] = val;
1040 mutex_unlock(&data->update_lock);
1045 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1046 *devattr, char *buf)
1048 struct f71882fg_data *data = f71882fg_update_device(dev);
1049 int nr = to_sensor_dev_attr_2(devattr)->index;
1051 if (data->fan_beep & (1 << nr))
1052 return sprintf(buf, "1\n");
1054 return sprintf(buf, "0\n");
1057 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1058 *devattr, const char *buf, size_t count)
1060 struct f71882fg_data *data = dev_get_drvdata(dev);
1061 int nr = to_sensor_dev_attr_2(devattr)->index;
1062 unsigned long val = simple_strtoul(buf, NULL, 10);
1064 mutex_lock(&data->update_lock);
1065 data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1067 data->fan_beep |= 1 << nr;
1069 data->fan_beep &= ~(1 << nr);
1071 f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1072 mutex_unlock(&data->update_lock);
1077 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1078 *devattr, char *buf)
1080 struct f71882fg_data *data = f71882fg_update_device(dev);
1081 int nr = to_sensor_dev_attr_2(devattr)->index;
1083 if (data->fan_status & (1 << nr))
1084 return sprintf(buf, "1\n");
1086 return sprintf(buf, "0\n");
1089 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1092 struct f71882fg_data *data = f71882fg_update_device(dev);
1093 int nr = to_sensor_dev_attr_2(devattr)->index;
1095 return sprintf(buf, "%d\n", data->in[nr] * 8);
1098 static ssize_t show_in_max(struct device *dev, struct device_attribute
1099 *devattr, char *buf)
1101 struct f71882fg_data *data = f71882fg_update_device(dev);
1103 return sprintf(buf, "%d\n", data->in1_max * 8);
1106 static ssize_t store_in_max(struct device *dev, struct device_attribute
1107 *devattr, const char *buf, size_t count)
1109 struct f71882fg_data *data = dev_get_drvdata(dev);
1110 long val = simple_strtol(buf, NULL, 10) / 8;
1111 val = SENSORS_LIMIT(val, 0, 255);
1113 mutex_lock(&data->update_lock);
1114 f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
1115 data->in1_max = val;
1116 mutex_unlock(&data->update_lock);
1121 static ssize_t show_in_beep(struct device *dev, struct device_attribute
1122 *devattr, char *buf)
1124 struct f71882fg_data *data = f71882fg_update_device(dev);
1125 int nr = to_sensor_dev_attr_2(devattr)->index;
1127 if (data->in_beep & (1 << nr))
1128 return sprintf(buf, "1\n");
1130 return sprintf(buf, "0\n");
1133 static ssize_t store_in_beep(struct device *dev, struct device_attribute
1134 *devattr, const char *buf, size_t count)
1136 struct f71882fg_data *data = dev_get_drvdata(dev);
1137 int nr = to_sensor_dev_attr_2(devattr)->index;
1138 unsigned long val = simple_strtoul(buf, NULL, 10);
1140 mutex_lock(&data->update_lock);
1141 data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1143 data->in_beep |= 1 << nr;
1145 data->in_beep &= ~(1 << nr);
1147 f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
1148 mutex_unlock(&data->update_lock);
1153 static ssize_t show_in_alarm(struct device *dev, struct device_attribute
1154 *devattr, char *buf)
1156 struct f71882fg_data *data = f71882fg_update_device(dev);
1157 int nr = to_sensor_dev_attr_2(devattr)->index;
1159 if (data->in_status & (1 << nr))
1160 return sprintf(buf, "1\n");
1162 return sprintf(buf, "0\n");
1165 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1168 struct f71882fg_data *data = f71882fg_update_device(dev);
1169 int nr = to_sensor_dev_attr_2(devattr)->index;
1171 return sprintf(buf, "%d\n", data->temp[nr] * 1000);
1174 static ssize_t show_temp_max(struct device *dev, struct device_attribute
1175 *devattr, char *buf)
1177 struct f71882fg_data *data = f71882fg_update_device(dev);
1178 int nr = to_sensor_dev_attr_2(devattr)->index;
1180 return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1183 static ssize_t store_temp_max(struct device *dev, struct device_attribute
1184 *devattr, const char *buf, size_t count)
1186 struct f71882fg_data *data = dev_get_drvdata(dev);
1187 int nr = to_sensor_dev_attr_2(devattr)->index;
1188 long val = simple_strtol(buf, NULL, 10) / 1000;
1189 val = SENSORS_LIMIT(val, 0, 255);
1191 mutex_lock(&data->update_lock);
1192 f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1193 data->temp_high[nr] = val;
1194 mutex_unlock(&data->update_lock);
1199 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1200 *devattr, char *buf)
1202 struct f71882fg_data *data = f71882fg_update_device(dev);
1203 int nr = to_sensor_dev_attr_2(devattr)->index;
1206 mutex_lock(&data->update_lock);
1208 temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1210 temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1211 temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1212 mutex_unlock(&data->update_lock);
1214 return sprintf(buf, "%d\n", temp_max_hyst);
1217 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1218 *devattr, const char *buf, size_t count)
1220 struct f71882fg_data *data = dev_get_drvdata(dev);
1221 int nr = to_sensor_dev_attr_2(devattr)->index;
1222 long val = simple_strtol(buf, NULL, 10) / 1000;
1223 ssize_t ret = count;
1226 mutex_lock(&data->update_lock);
1228 /* convert abs to relative and check */
1229 data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1230 val = SENSORS_LIMIT(val, data->temp_high[nr] - 15,
1231 data->temp_high[nr]);
1232 val = data->temp_high[nr] - val;
1234 /* convert value to register contents */
1235 reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1237 reg = (reg & 0x0f) | (val << 4);
1239 reg = (reg & 0xf0) | val;
1240 f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1241 data->temp_hyst[nr / 2] = reg;
1243 mutex_unlock(&data->update_lock);
1247 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1248 *devattr, char *buf)
1250 struct f71882fg_data *data = f71882fg_update_device(dev);
1251 int nr = to_sensor_dev_attr_2(devattr)->index;
1253 return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1256 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1257 *devattr, const char *buf, size_t count)
1259 struct f71882fg_data *data = dev_get_drvdata(dev);
1260 int nr = to_sensor_dev_attr_2(devattr)->index;
1261 long val = simple_strtol(buf, NULL, 10) / 1000;
1262 val = SENSORS_LIMIT(val, 0, 255);
1264 mutex_lock(&data->update_lock);
1265 f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1266 data->temp_ovt[nr] = val;
1267 mutex_unlock(&data->update_lock);
1272 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1273 *devattr, char *buf)
1275 struct f71882fg_data *data = f71882fg_update_device(dev);
1276 int nr = to_sensor_dev_attr_2(devattr)->index;
1279 mutex_lock(&data->update_lock);
1281 temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1283 temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1284 temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1285 mutex_unlock(&data->update_lock);
1287 return sprintf(buf, "%d\n", temp_crit_hyst);
1290 static ssize_t show_temp_type(struct device *dev, struct device_attribute
1291 *devattr, char *buf)
1293 struct f71882fg_data *data = f71882fg_update_device(dev);
1294 int nr = to_sensor_dev_attr_2(devattr)->index;
1296 return sprintf(buf, "%d\n", data->temp_type[nr]);
1299 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1300 *devattr, char *buf)
1302 struct f71882fg_data *data = f71882fg_update_device(dev);
1303 int nr = to_sensor_dev_attr_2(devattr)->index;
1305 if (data->temp_beep & (1 << nr))
1306 return sprintf(buf, "1\n");
1308 return sprintf(buf, "0\n");
1311 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1312 *devattr, const char *buf, size_t count)
1314 struct f71882fg_data *data = dev_get_drvdata(dev);
1315 int nr = to_sensor_dev_attr_2(devattr)->index;
1316 unsigned long val = simple_strtoul(buf, NULL, 10);
1318 mutex_lock(&data->update_lock);
1319 data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1321 data->temp_beep |= 1 << nr;
1323 data->temp_beep &= ~(1 << nr);
1325 f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1326 mutex_unlock(&data->update_lock);
1331 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1332 *devattr, char *buf)
1334 struct f71882fg_data *data = f71882fg_update_device(dev);
1335 int nr = to_sensor_dev_attr_2(devattr)->index;
1337 if (data->temp_status & (1 << nr))
1338 return sprintf(buf, "1\n");
1340 return sprintf(buf, "0\n");
1343 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1344 *devattr, char *buf)
1346 struct f71882fg_data *data = f71882fg_update_device(dev);
1347 int nr = to_sensor_dev_attr_2(devattr)->index;
1349 if (data->temp_diode_open & (1 << nr))
1350 return sprintf(buf, "1\n");
1352 return sprintf(buf, "0\n");
1355 static ssize_t show_pwm(struct device *dev,
1356 struct device_attribute *devattr, char *buf)
1358 struct f71882fg_data *data = f71882fg_update_device(dev);
1359 int val, nr = to_sensor_dev_attr_2(devattr)->index;
1360 mutex_lock(&data->update_lock);
1361 if (data->pwm_enable & (1 << (2 * nr)))
1363 val = data->pwm[nr];
1366 val = 255 * fan_from_reg(data->fan_target[nr])
1367 / fan_from_reg(data->fan_full_speed[nr]);
1369 mutex_unlock(&data->update_lock);
1370 return sprintf(buf, "%d\n", val);
1373 static ssize_t store_pwm(struct device *dev,
1374 struct device_attribute *devattr, const char *buf,
1377 struct f71882fg_data *data = dev_get_drvdata(dev);
1378 int nr = to_sensor_dev_attr_2(devattr)->index;
1379 long val = simple_strtol(buf, NULL, 10);
1380 val = SENSORS_LIMIT(val, 0, 255);
1382 mutex_lock(&data->update_lock);
1383 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1384 if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1385 (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1389 if (data->pwm_enable & (1 << (2 * nr))) {
1391 f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1392 data->pwm[nr] = val;
1395 int target, full_speed;
1396 full_speed = f71882fg_read16(data,
1397 F71882FG_REG_FAN_FULL_SPEED(nr));
1398 target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1399 f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1400 data->fan_target[nr] = target;
1401 data->fan_full_speed[nr] = full_speed;
1404 mutex_unlock(&data->update_lock);
1409 static ssize_t show_pwm_enable(struct device *dev,
1410 struct device_attribute *devattr, char *buf)
1413 struct f71882fg_data *data = f71882fg_update_device(dev);
1414 int nr = to_sensor_dev_attr_2(devattr)->index;
1416 switch ((data->pwm_enable >> 2 * nr) & 3) {
1419 result = 2; /* Normal auto mode */
1422 result = 1; /* Manual mode */
1425 if (data->type == f8000)
1426 result = 3; /* Thermostat mode */
1428 result = 1; /* Manual mode */
1432 return sprintf(buf, "%d\n", result);
1435 static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1436 *devattr, const char *buf, size_t count)
1438 struct f71882fg_data *data = dev_get_drvdata(dev);
1439 int nr = to_sensor_dev_attr_2(devattr)->index;
1440 long val = simple_strtol(buf, NULL, 10);
1442 mutex_lock(&data->update_lock);
1443 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1444 /* Special case for F8000 auto PWM mode / Thermostat mode */
1445 if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1448 data->pwm_enable &= ~(2 << (2 * nr));
1449 break; /* Normal auto mode */
1451 data->pwm_enable |= 2 << (2 * nr);
1452 break; /* Thermostat mode */
1460 data->pwm_enable |= 2 << (2 * nr);
1463 data->pwm_enable &= ~(2 << (2 * nr));
1464 break; /* Normal auto mode */
1470 f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1472 mutex_unlock(&data->update_lock);
1477 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1478 struct device_attribute *devattr,
1482 struct f71882fg_data *data = f71882fg_update_device(dev);
1483 int pwm = to_sensor_dev_attr_2(devattr)->index;
1484 int point = to_sensor_dev_attr_2(devattr)->nr;
1486 mutex_lock(&data->update_lock);
1487 if (data->pwm_enable & (1 << (2 * pwm))) {
1489 result = data->pwm_auto_point_pwm[pwm][point];
1492 result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1494 mutex_unlock(&data->update_lock);
1496 return sprintf(buf, "%d\n", result);
1499 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1500 struct device_attribute *devattr,
1501 const char *buf, size_t count)
1503 struct f71882fg_data *data = dev_get_drvdata(dev);
1504 int pwm = to_sensor_dev_attr_2(devattr)->index;
1505 int point = to_sensor_dev_attr_2(devattr)->nr;
1506 long val = simple_strtol(buf, NULL, 10);
1507 val = SENSORS_LIMIT(val, 0, 255);
1509 mutex_lock(&data->update_lock);
1510 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1511 if (data->pwm_enable & (1 << (2 * pwm))) {
1515 if (val < 29) /* Prevent negative numbers */
1518 val = (255 - val) * 32 / val;
1520 f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
1521 data->pwm_auto_point_pwm[pwm][point] = val;
1522 mutex_unlock(&data->update_lock);
1527 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
1528 struct device_attribute *devattr,
1532 struct f71882fg_data *data = f71882fg_update_device(dev);
1533 int nr = to_sensor_dev_attr_2(devattr)->index;
1534 int point = to_sensor_dev_attr_2(devattr)->nr;
1536 mutex_lock(&data->update_lock);
1538 result = data->pwm_auto_point_hyst[nr / 2] >> 4;
1540 result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
1541 result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
1542 mutex_unlock(&data->update_lock);
1544 return sprintf(buf, "%d\n", result);
1547 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
1548 struct device_attribute *devattr,
1549 const char *buf, size_t count)
1551 struct f71882fg_data *data = dev_get_drvdata(dev);
1552 int nr = to_sensor_dev_attr_2(devattr)->index;
1553 int point = to_sensor_dev_attr_2(devattr)->nr;
1554 long val = simple_strtol(buf, NULL, 10) / 1000;
1557 mutex_lock(&data->update_lock);
1558 data->pwm_auto_point_temp[nr][point] =
1559 f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
1560 val = SENSORS_LIMIT(val, data->pwm_auto_point_temp[nr][point] - 15,
1561 data->pwm_auto_point_temp[nr][point]);
1562 val = data->pwm_auto_point_temp[nr][point] - val;
1564 reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
1566 reg = (reg & 0x0f) | (val << 4);
1568 reg = (reg & 0xf0) | val;
1570 f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
1571 data->pwm_auto_point_hyst[nr / 2] = reg;
1572 mutex_unlock(&data->update_lock);
1577 static ssize_t show_pwm_interpolate(struct device *dev,
1578 struct device_attribute *devattr, char *buf)
1581 struct f71882fg_data *data = f71882fg_update_device(dev);
1582 int nr = to_sensor_dev_attr_2(devattr)->index;
1584 result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
1586 return sprintf(buf, "%d\n", result);
1589 static ssize_t store_pwm_interpolate(struct device *dev,
1590 struct device_attribute *devattr,
1591 const char *buf, size_t count)
1593 struct f71882fg_data *data = dev_get_drvdata(dev);
1594 int nr = to_sensor_dev_attr_2(devattr)->index;
1595 unsigned long val = simple_strtoul(buf, NULL, 10);
1597 mutex_lock(&data->update_lock);
1598 data->pwm_auto_point_mapping[nr] =
1599 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1601 val = data->pwm_auto_point_mapping[nr] | (1 << 4);
1603 val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
1604 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1605 data->pwm_auto_point_mapping[nr] = val;
1606 mutex_unlock(&data->update_lock);
1611 static ssize_t show_pwm_auto_point_channel(struct device *dev,
1612 struct device_attribute *devattr,
1616 struct f71882fg_data *data = f71882fg_update_device(dev);
1617 int nr = to_sensor_dev_attr_2(devattr)->index;
1619 result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) - 1);
1621 return sprintf(buf, "%d\n", result);
1624 static ssize_t store_pwm_auto_point_channel(struct device *dev,
1625 struct device_attribute *devattr,
1626 const char *buf, size_t count)
1628 struct f71882fg_data *data = dev_get_drvdata(dev);
1629 int nr = to_sensor_dev_attr_2(devattr)->index;
1630 long val = simple_strtol(buf, NULL, 10);
1644 mutex_lock(&data->update_lock);
1645 data->pwm_auto_point_mapping[nr] =
1646 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1647 val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
1648 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1649 data->pwm_auto_point_mapping[nr] = val;
1650 mutex_unlock(&data->update_lock);
1655 static ssize_t show_pwm_auto_point_temp(struct device *dev,
1656 struct device_attribute *devattr,
1660 struct f71882fg_data *data = f71882fg_update_device(dev);
1661 int pwm = to_sensor_dev_attr_2(devattr)->index;
1662 int point = to_sensor_dev_attr_2(devattr)->nr;
1664 result = data->pwm_auto_point_temp[pwm][point];
1665 return sprintf(buf, "%d\n", 1000 * result);
1668 static ssize_t store_pwm_auto_point_temp(struct device *dev,
1669 struct device_attribute *devattr,
1670 const char *buf, size_t count)
1672 struct f71882fg_data *data = dev_get_drvdata(dev);
1673 int pwm = to_sensor_dev_attr_2(devattr)->index;
1674 int point = to_sensor_dev_attr_2(devattr)->nr;
1675 long val = simple_strtol(buf, NULL, 10) / 1000;
1676 val = SENSORS_LIMIT(val, 0, 255);
1678 mutex_lock(&data->update_lock);
1679 f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
1680 data->pwm_auto_point_temp[pwm][point] = val;
1681 mutex_unlock(&data->update_lock);
1686 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
1689 struct f71882fg_data *data = dev_get_drvdata(dev);
1690 return sprintf(buf, "%s\n", f71882fg_names[data->type]);
1693 static int __devinit f71882fg_create_sysfs_files(struct platform_device *pdev,
1694 struct sensor_device_attribute_2 *attr, int count)
1698 for (i = 0; i < count; i++) {
1699 err = device_create_file(&pdev->dev, &attr[i].dev_attr);
1706 static int __devinit f71882fg_probe(struct platform_device *pdev)
1708 struct f71882fg_data *data;
1709 struct f71882fg_sio_data *sio_data = pdev->dev.platform_data;
1713 data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL);
1717 data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
1718 data->type = sio_data->type;
1719 mutex_init(&data->update_lock);
1720 platform_set_drvdata(pdev, data);
1722 start_reg = f71882fg_read8(data, F71882FG_REG_START);
1723 if (start_reg & 0x04) {
1724 dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
1728 if (!(start_reg & 0x03)) {
1729 dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
1734 /* If it is a 71862 and the fan / pwm part is enabled sanity check
1736 if (data->type == f71862fg && (start_reg & 0x02)) {
1737 u8 reg = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1738 if ((reg & 0x15) != 0x15) {
1740 "Invalid (reserved) pwm settings: 0x%02x\n",
1747 /* Register sysfs interface files */
1748 err = device_create_file(&pdev->dev, &dev_attr_name);
1750 goto exit_unregister_sysfs;
1752 if (start_reg & 0x01) {
1753 switch (data->type) {
1755 err = f71882fg_create_sysfs_files(pdev,
1756 f71882fg_in_temp_attr,
1757 ARRAY_SIZE(f71882fg_in_temp_attr));
1759 goto exit_unregister_sysfs;
1762 err = f71882fg_create_sysfs_files(pdev,
1763 f718x2fg_in_temp_attr,
1764 ARRAY_SIZE(f718x2fg_in_temp_attr));
1767 err = f71882fg_create_sysfs_files(pdev,
1769 ARRAY_SIZE(f8000_in_temp_attr));
1773 goto exit_unregister_sysfs;
1776 if (start_reg & 0x02) {
1777 err = f71882fg_create_sysfs_files(pdev, fxxxx_fan_attr,
1778 ARRAY_SIZE(fxxxx_fan_attr));
1780 goto exit_unregister_sysfs;
1782 switch (data->type) {
1784 err = f71882fg_create_sysfs_files(pdev,
1786 ARRAY_SIZE(f71862fg_fan_attr));
1789 err = f71882fg_create_sysfs_files(pdev,
1791 ARRAY_SIZE(f71882fg_fan_attr));
1794 err = f71882fg_create_sysfs_files(pdev,
1796 ARRAY_SIZE(f8000_fan_attr));
1800 goto exit_unregister_sysfs;
1803 data->hwmon_dev = hwmon_device_register(&pdev->dev);
1804 if (IS_ERR(data->hwmon_dev)) {
1805 err = PTR_ERR(data->hwmon_dev);
1806 data->hwmon_dev = NULL;
1807 goto exit_unregister_sysfs;
1812 exit_unregister_sysfs:
1813 f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
1814 return err; /* f71882fg_remove() also frees our data */
1820 static int f71882fg_remove(struct platform_device *pdev)
1823 struct f71882fg_data *data = platform_get_drvdata(pdev);
1825 platform_set_drvdata(pdev, NULL);
1826 if (data->hwmon_dev)
1827 hwmon_device_unregister(data->hwmon_dev);
1829 /* Note we are not looping over all attr arrays we have as the ones
1830 below are supersets of the ones skipped. */
1831 device_remove_file(&pdev->dev, &dev_attr_name);
1833 for (i = 0; i < ARRAY_SIZE(f718x2fg_in_temp_attr); i++)
1834 device_remove_file(&pdev->dev,
1835 &f718x2fg_in_temp_attr[i].dev_attr);
1837 for (i = 0; i < ARRAY_SIZE(f71882fg_in_temp_attr); i++)
1838 device_remove_file(&pdev->dev,
1839 &f71882fg_in_temp_attr[i].dev_attr);
1841 for (i = 0; i < ARRAY_SIZE(fxxxx_fan_attr); i++)
1842 device_remove_file(&pdev->dev, &fxxxx_fan_attr[i].dev_attr);
1844 for (i = 0; i < ARRAY_SIZE(f71882fg_fan_attr); i++)
1845 device_remove_file(&pdev->dev, &f71882fg_fan_attr[i].dev_attr);
1847 for (i = 0; i < ARRAY_SIZE(f8000_fan_attr); i++)
1848 device_remove_file(&pdev->dev, &f8000_fan_attr[i].dev_attr);
1855 static int __init f71882fg_find(int sioaddr, unsigned short *address,
1856 struct f71882fg_sio_data *sio_data)
1861 superio_enter(sioaddr);
1863 devid = superio_inw(sioaddr, SIO_REG_MANID);
1864 if (devid != SIO_FINTEK_ID) {
1865 printk(KERN_INFO DRVNAME ": Not a Fintek device\n");
1869 devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
1872 sio_data->type = f71862fg;
1875 sio_data->type = f71882fg;
1878 sio_data->type = f8000;
1881 printk(KERN_INFO DRVNAME ": Unsupported Fintek device\n");
1885 superio_select(sioaddr, SIO_F71882FG_LD_HWM);
1886 if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
1887 printk(KERN_WARNING DRVNAME ": Device not activated\n");
1891 *address = superio_inw(sioaddr, SIO_REG_ADDR);
1894 printk(KERN_WARNING DRVNAME ": Base address not set\n");
1897 *address &= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */
1900 printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %d\n",
1901 f71882fg_names[sio_data->type], (unsigned int)*address,
1902 (int)superio_inb(sioaddr, SIO_REG_DEVREV));
1904 superio_exit(sioaddr);
1908 static int __init f71882fg_device_add(unsigned short address,
1909 const struct f71882fg_sio_data *sio_data)
1911 struct resource res = {
1913 .end = address + REGION_LENGTH - 1,
1914 .flags = IORESOURCE_IO,
1918 f71882fg_pdev = platform_device_alloc(DRVNAME, address);
1922 res.name = f71882fg_pdev->name;
1923 err = platform_device_add_resources(f71882fg_pdev, &res, 1);
1925 printk(KERN_ERR DRVNAME ": Device resource addition failed\n");
1926 goto exit_device_put;
1929 err = platform_device_add_data(f71882fg_pdev, sio_data,
1930 sizeof(struct f71882fg_sio_data));
1932 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1933 goto exit_device_put;
1936 err = platform_device_add(f71882fg_pdev);
1938 printk(KERN_ERR DRVNAME ": Device addition failed\n");
1939 goto exit_device_put;
1945 platform_device_put(f71882fg_pdev);
1950 static int __init f71882fg_init(void)
1953 unsigned short address;
1954 struct f71882fg_sio_data sio_data;
1956 memset(&sio_data, 0, sizeof(sio_data));
1958 if (f71882fg_find(0x2e, &address, &sio_data) &&
1959 f71882fg_find(0x4e, &address, &sio_data))
1962 err = platform_driver_register(&f71882fg_driver);
1966 err = f71882fg_device_add(address, &sio_data);
1973 platform_driver_unregister(&f71882fg_driver);
1978 static void __exit f71882fg_exit(void)
1980 platform_device_unregister(f71882fg_pdev);
1981 platform_driver_unregister(&f71882fg_driver);
1984 MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
1985 MODULE_AUTHOR("Hans Edgington, Hans de Goede (hdegoede@redhat.com)");
1986 MODULE_LICENSE("GPL");
1988 module_init(f71882fg_init);
1989 module_exit(f71882fg_exit);