1 /***************************************************************************
2 * Copyright (C) 2006 by Hans Edgington <hans@edgington.nl> *
3 * Copyright (C) 2007-2011 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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/slab.h>
26 #include <linux/jiffies.h>
27 #include <linux/platform_device.h>
28 #include <linux/hwmon.h>
29 #include <linux/hwmon-sysfs.h>
30 #include <linux/err.h>
31 #include <linux/mutex.h>
33 #include <linux/acpi.h>
35 #define DRVNAME "f71882fg"
37 #define SIO_F71858FG_LD_HWM 0x02 /* Hardware monitor logical device */
38 #define SIO_F71882FG_LD_HWM 0x04 /* Hardware monitor logical device */
39 #define SIO_UNLOCK_KEY 0x87 /* Key to enable Super-I/O */
40 #define SIO_LOCK_KEY 0xAA /* Key to disable Super-I/O */
42 #define SIO_REG_LDSEL 0x07 /* Logical device select */
43 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
44 #define SIO_REG_DEVREV 0x22 /* Device revision */
45 #define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */
46 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
47 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
49 #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */
50 #define SIO_F71858_ID 0x0507 /* Chipset ID */
51 #define SIO_F71862_ID 0x0601 /* Chipset ID */
52 #define SIO_F71882_ID 0x0541 /* Chipset ID */
53 #define SIO_F71889_ID 0x0723 /* Chipset ID */
54 #define SIO_F8000_ID 0x0581 /* Chipset ID */
56 #define REGION_LENGTH 8
57 #define ADDR_REG_OFFSET 5
58 #define DATA_REG_OFFSET 6
60 #define F71882FG_REG_IN_STATUS 0x12 /* f71882fg only */
61 #define F71882FG_REG_IN_BEEP 0x13 /* f71882fg only */
62 #define F71882FG_REG_IN(nr) (0x20 + (nr))
63 #define F71882FG_REG_IN1_HIGH 0x32 /* f71882fg only */
65 #define F71882FG_REG_FAN(nr) (0xA0 + (16 * (nr)))
66 #define F71882FG_REG_FAN_TARGET(nr) (0xA2 + (16 * (nr)))
67 #define F71882FG_REG_FAN_FULL_SPEED(nr) (0xA4 + (16 * (nr)))
68 #define F71882FG_REG_FAN_STATUS 0x92
69 #define F71882FG_REG_FAN_BEEP 0x93
71 #define F71882FG_REG_TEMP(nr) (0x70 + 2 * (nr))
72 #define F71882FG_REG_TEMP_OVT(nr) (0x80 + 2 * (nr))
73 #define F71882FG_REG_TEMP_HIGH(nr) (0x81 + 2 * (nr))
74 #define F71882FG_REG_TEMP_STATUS 0x62
75 #define F71882FG_REG_TEMP_BEEP 0x63
76 #define F71882FG_REG_TEMP_CONFIG 0x69
77 #define F71882FG_REG_TEMP_HYST(nr) (0x6C + (nr))
78 #define F71882FG_REG_TEMP_TYPE 0x6B
79 #define F71882FG_REG_TEMP_DIODE_OPEN 0x6F
81 #define F71882FG_REG_PWM(nr) (0xA3 + (16 * (nr)))
82 #define F71882FG_REG_PWM_TYPE 0x94
83 #define F71882FG_REG_PWM_ENABLE 0x96
85 #define F71882FG_REG_FAN_HYST(nr) (0x98 + (nr))
87 #define F71882FG_REG_POINT_PWM(pwm, point) (0xAA + (point) + (16 * (pwm)))
88 #define F71882FG_REG_POINT_TEMP(pwm, point) (0xA6 + (point) + (16 * (pwm)))
89 #define F71882FG_REG_POINT_MAPPING(nr) (0xAF + 16 * (nr))
91 #define F71882FG_REG_START 0x01
93 #define FAN_MIN_DETECT 366 /* Lowest detectable fanspeed */
95 static unsigned short force_id;
96 module_param(force_id, ushort, 0);
97 MODULE_PARM_DESC(force_id, "Override the detected device ID");
99 enum chips { f71858fg, f71862fg, f71882fg, f71889fg, f8000 };
101 static const char *f71882fg_names[] = {
109 static struct platform_device *f71882fg_pdev;
111 /* Super-I/O Function prototypes */
112 static inline int superio_inb(int base, int reg);
113 static inline int superio_inw(int base, int reg);
114 static inline int superio_enter(int base);
115 static inline void superio_select(int base, int ld);
116 static inline void superio_exit(int base);
118 struct f71882fg_sio_data {
122 struct f71882fg_data {
125 struct device *hwmon_dev;
127 struct mutex update_lock;
128 int temp_start; /* temp numbering start (0 or 1) */
129 char valid; /* !=0 if following fields are valid */
130 unsigned long last_updated; /* In jiffies */
131 unsigned long last_limits; /* In jiffies */
133 /* Register Values */
140 u16 fan_full_speed[4];
143 /* Note: all models have only 3 temperature channels, but on some
144 they are addressed as 0-2 and on others as 1-3, so for coding
145 convenience we reserve space for 4 channels */
149 u8 temp_hyst[2]; /* 2 hysts stored per reg */
157 u8 pwm_auto_point_hyst[2];
158 u8 pwm_auto_point_mapping[4];
159 u8 pwm_auto_point_pwm[4][5];
160 s8 pwm_auto_point_temp[4][4];
164 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
166 static ssize_t show_in_max(struct device *dev, struct device_attribute
167 *devattr, char *buf);
168 static ssize_t store_in_max(struct device *dev, struct device_attribute
169 *devattr, const char *buf, size_t count);
170 static ssize_t show_in_beep(struct device *dev, struct device_attribute
171 *devattr, char *buf);
172 static ssize_t store_in_beep(struct device *dev, struct device_attribute
173 *devattr, const char *buf, size_t count);
174 static ssize_t show_in_alarm(struct device *dev, struct device_attribute
175 *devattr, char *buf);
177 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
179 static ssize_t show_fan_full_speed(struct device *dev,
180 struct device_attribute *devattr, char *buf);
181 static ssize_t store_fan_full_speed(struct device *dev,
182 struct device_attribute *devattr, const char *buf, size_t count);
183 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
184 *devattr, char *buf);
185 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
186 *devattr, const char *buf, size_t count);
187 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
188 *devattr, char *buf);
190 static ssize_t show_temp(struct device *dev, struct device_attribute
191 *devattr, char *buf);
192 static ssize_t show_temp_max(struct device *dev, struct device_attribute
193 *devattr, char *buf);
194 static ssize_t store_temp_max(struct device *dev, struct device_attribute
195 *devattr, const char *buf, size_t count);
196 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
197 *devattr, char *buf);
198 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
199 *devattr, const char *buf, size_t count);
200 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
201 *devattr, char *buf);
202 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
203 *devattr, const char *buf, size_t count);
204 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
205 *devattr, char *buf);
206 static ssize_t show_temp_type(struct device *dev, struct device_attribute
207 *devattr, char *buf);
208 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
209 *devattr, char *buf);
210 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
211 *devattr, const char *buf, size_t count);
212 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
213 *devattr, char *buf);
214 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
215 *devattr, char *buf);
216 /* PWM and Auto point control */
217 static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
219 static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
220 const char *buf, size_t count);
221 static ssize_t show_pwm_enable(struct device *dev,
222 struct device_attribute *devattr, char *buf);
223 static ssize_t store_pwm_enable(struct device *dev,
224 struct device_attribute *devattr, const char *buf, size_t count);
225 static ssize_t show_pwm_interpolate(struct device *dev,
226 struct device_attribute *devattr, char *buf);
227 static ssize_t store_pwm_interpolate(struct device *dev,
228 struct device_attribute *devattr, const char *buf, size_t count);
229 static ssize_t show_pwm_auto_point_channel(struct device *dev,
230 struct device_attribute *devattr, char *buf);
231 static ssize_t store_pwm_auto_point_channel(struct device *dev,
232 struct device_attribute *devattr, const char *buf, size_t count);
233 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
234 struct device_attribute *devattr, char *buf);
235 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
236 struct device_attribute *devattr, const char *buf, size_t count);
237 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
238 struct device_attribute *devattr, char *buf);
239 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
240 struct device_attribute *devattr, const char *buf, size_t count);
241 static ssize_t show_pwm_auto_point_temp(struct device *dev,
242 struct device_attribute *devattr, char *buf);
243 static ssize_t store_pwm_auto_point_temp(struct device *dev,
244 struct device_attribute *devattr, const char *buf, size_t count);
246 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
249 static int __devinit f71882fg_probe(struct platform_device * pdev);
250 static int f71882fg_remove(struct platform_device *pdev);
252 static struct platform_driver f71882fg_driver = {
254 .owner = THIS_MODULE,
257 .probe = f71882fg_probe,
258 .remove = f71882fg_remove,
261 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
263 /* Temp and in attr for the f71858fg, the f71858fg is special as it
264 has its temperature indexes start at 0 (the others start at 1) and
265 it only has 3 voltage inputs */
266 static struct sensor_device_attribute_2 f71858fg_in_temp_attr[] = {
267 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
268 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
269 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
270 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
271 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
272 store_temp_max, 0, 0),
273 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
274 store_temp_max_hyst, 0, 0),
275 SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 0),
276 SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
277 store_temp_crit, 0, 0),
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, 4),
281 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
282 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
283 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
284 store_temp_max, 0, 1),
285 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
286 store_temp_max_hyst, 0, 1),
287 SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
288 SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
289 store_temp_crit, 0, 1),
290 SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
292 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
293 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 1),
294 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
295 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
296 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
297 store_temp_max, 0, 2),
298 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
299 store_temp_max_hyst, 0, 2),
300 SENSOR_ATTR_2(temp3_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
301 SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
302 store_temp_crit, 0, 2),
303 SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
305 SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
306 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
309 /* Temp and in attr common to the f71862fg, f71882fg and f71889fg */
310 static struct sensor_device_attribute_2 fxxxx_in_temp_attr[] = {
311 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
312 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
313 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
314 SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3),
315 SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4),
316 SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5),
317 SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
318 SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
319 SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
320 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
321 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
322 store_temp_max, 0, 1),
323 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
324 store_temp_max_hyst, 0, 1),
325 /* Should really be temp1_max_alarm, but older versions did not handle
326 the max and crit alarms separately and lm_sensors v2 depends on the
327 presence of temp#_alarm files. The same goes for temp2/3 _alarm. */
328 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
329 SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
330 store_temp_beep, 0, 1),
331 SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
332 store_temp_crit, 0, 1),
333 SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
335 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
336 SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
337 store_temp_beep, 0, 5),
338 SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1),
339 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
340 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2),
341 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
342 store_temp_max, 0, 2),
343 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
344 store_temp_max_hyst, 0, 2),
345 /* Should be temp2_max_alarm, see temp1_alarm note */
346 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
347 SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
348 store_temp_beep, 0, 2),
349 SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
350 store_temp_crit, 0, 2),
351 SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
353 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
354 SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
355 store_temp_beep, 0, 6),
356 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
357 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
358 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
359 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
360 store_temp_max, 0, 3),
361 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
362 store_temp_max_hyst, 0, 3),
363 /* Should be temp3_max_alarm, see temp1_alarm note */
364 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3),
365 SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
366 store_temp_beep, 0, 3),
367 SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
368 store_temp_crit, 0, 3),
369 SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
371 SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 7),
372 SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
373 store_temp_beep, 0, 7),
374 SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3),
375 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3),
378 /* For models with in1 alarm capability */
379 static struct sensor_device_attribute_2 fxxxx_in1_alarm_attr[] = {
380 SENSOR_ATTR_2(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max,
382 SENSOR_ATTR_2(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep,
384 SENSOR_ATTR_2(in1_alarm, S_IRUGO, show_in_alarm, NULL, 0, 1),
387 /* Temp and in attr for the f8000
388 Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max)
389 is used as hysteresis value to clear alarms
390 Also like the f71858fg its temperature indexes start at 0
392 static struct sensor_device_attribute_2 f8000_in_temp_attr[] = {
393 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
394 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
395 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
396 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
397 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_crit,
398 store_temp_crit, 0, 0),
399 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
400 store_temp_max, 0, 0),
401 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
402 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
403 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
404 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_crit,
405 store_temp_crit, 0, 1),
406 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
407 store_temp_max, 0, 1),
408 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
409 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 1),
410 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
411 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
412 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_crit,
413 store_temp_crit, 0, 2),
414 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
415 store_temp_max, 0, 2),
416 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
417 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
420 /* Fan / PWM attr common to all models */
421 static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { {
422 SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0),
423 SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR,
425 store_fan_full_speed, 0, 0),
426 SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0),
427 SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0),
428 SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
429 store_pwm_enable, 0, 0),
430 SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR,
431 show_pwm_interpolate, store_pwm_interpolate, 0, 0),
433 SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
434 SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
436 store_fan_full_speed, 0, 1),
437 SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
438 SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1),
439 SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
440 store_pwm_enable, 0, 1),
441 SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR,
442 show_pwm_interpolate, store_pwm_interpolate, 0, 1),
444 SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
445 SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
447 store_fan_full_speed, 0, 2),
448 SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
449 SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
450 SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
451 store_pwm_enable, 0, 2),
452 SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR,
453 show_pwm_interpolate, store_pwm_interpolate, 0, 2),
455 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
456 SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
458 store_fan_full_speed, 0, 3),
459 SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
460 SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
461 SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
462 store_pwm_enable, 0, 3),
463 SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
464 show_pwm_interpolate, store_pwm_interpolate, 0, 3),
467 /* Attr for models which can beep on Fan alarm */
468 static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = {
469 SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
470 store_fan_beep, 0, 0),
471 SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
472 store_fan_beep, 0, 1),
473 SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
474 store_fan_beep, 0, 2),
475 SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
476 store_fan_beep, 0, 3),
479 /* PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the
480 f71858fg / f71882fg / f71889fg */
481 static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[] = {
482 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
483 show_pwm_auto_point_channel,
484 store_pwm_auto_point_channel, 0, 0),
485 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
486 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
488 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
489 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
491 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
492 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
494 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
495 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
497 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
498 show_pwm_auto_point_temp_hyst,
499 store_pwm_auto_point_temp_hyst,
501 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
502 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
504 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
505 show_pwm_auto_point_channel,
506 store_pwm_auto_point_channel, 0, 1),
507 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
508 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
510 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
511 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
513 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
514 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
516 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
517 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
519 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
520 show_pwm_auto_point_temp_hyst,
521 store_pwm_auto_point_temp_hyst,
523 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
524 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
526 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
527 show_pwm_auto_point_channel,
528 store_pwm_auto_point_channel, 0, 2),
529 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
530 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
532 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
533 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
535 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
536 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
538 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
539 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
541 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
542 show_pwm_auto_point_temp_hyst,
543 store_pwm_auto_point_temp_hyst,
545 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
546 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
549 /* PWM attr common to the f71858fg, f71882fg and f71889fg */
550 static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { {
551 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
552 show_pwm_auto_point_channel,
553 store_pwm_auto_point_channel, 0, 0),
554 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
555 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
557 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
558 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
560 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
561 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
563 SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR,
564 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
566 SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR,
567 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
569 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
570 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
572 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
573 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
575 SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR,
576 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
578 SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR,
579 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
581 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
582 show_pwm_auto_point_temp_hyst,
583 store_pwm_auto_point_temp_hyst,
585 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
586 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
587 SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO,
588 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
589 SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
590 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
592 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
593 show_pwm_auto_point_channel,
594 store_pwm_auto_point_channel, 0, 1),
595 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
596 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
598 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
599 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
601 SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
602 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
604 SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR,
605 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
607 SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR,
608 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
610 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
611 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
613 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
614 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
616 SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR,
617 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
619 SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR,
620 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
622 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
623 show_pwm_auto_point_temp_hyst,
624 store_pwm_auto_point_temp_hyst,
626 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
627 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
628 SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO,
629 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
630 SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
631 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
633 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
634 show_pwm_auto_point_channel,
635 store_pwm_auto_point_channel, 0, 2),
636 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
637 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
639 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
640 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
642 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
643 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
645 SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR,
646 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
648 SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR,
649 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
651 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
652 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
654 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
655 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
657 SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR,
658 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
660 SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR,
661 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
663 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
664 show_pwm_auto_point_temp_hyst,
665 store_pwm_auto_point_temp_hyst,
667 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
668 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
669 SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO,
670 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
671 SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
672 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
674 SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
675 show_pwm_auto_point_channel,
676 store_pwm_auto_point_channel, 0, 3),
677 SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR,
678 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
680 SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR,
681 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
683 SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR,
684 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
686 SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR,
687 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
689 SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR,
690 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
692 SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR,
693 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
695 SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR,
696 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
698 SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR,
699 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
701 SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR,
702 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
704 SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
705 show_pwm_auto_point_temp_hyst,
706 store_pwm_auto_point_temp_hyst,
708 SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO,
709 show_pwm_auto_point_temp_hyst, NULL, 1, 3),
710 SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO,
711 show_pwm_auto_point_temp_hyst, NULL, 2, 3),
712 SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
713 show_pwm_auto_point_temp_hyst, NULL, 3, 3),
716 /* Fan attr specific to the f8000 (4th fan input can only measure speed) */
717 static struct sensor_device_attribute_2 f8000_fan_attr[] = {
718 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
721 /* PWM attr for the f8000, zones mapped to temp instead of to pwm!
722 Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
723 F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0 */
724 static struct sensor_device_attribute_2 f8000_auto_pwm_attr[] = {
725 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
726 show_pwm_auto_point_channel,
727 store_pwm_auto_point_channel, 0, 0),
728 SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR,
729 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
731 SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR,
732 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
734 SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR,
735 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
737 SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR,
738 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
740 SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR,
741 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
743 SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR,
744 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
746 SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR,
747 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
749 SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR,
750 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
752 SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR,
753 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
755 SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
756 show_pwm_auto_point_temp_hyst,
757 store_pwm_auto_point_temp_hyst,
759 SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO,
760 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
761 SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO,
762 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
763 SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO,
764 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
766 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
767 show_pwm_auto_point_channel,
768 store_pwm_auto_point_channel, 0, 1),
769 SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR,
770 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
772 SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR,
773 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
775 SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR,
776 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
778 SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR,
779 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
781 SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR,
782 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
784 SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR,
785 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
787 SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR,
788 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
790 SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR,
791 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
793 SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR,
794 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
796 SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
797 show_pwm_auto_point_temp_hyst,
798 store_pwm_auto_point_temp_hyst,
800 SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO,
801 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
802 SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO,
803 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
804 SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO,
805 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
807 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
808 show_pwm_auto_point_channel,
809 store_pwm_auto_point_channel, 0, 2),
810 SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR,
811 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
813 SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR,
814 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
816 SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR,
817 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
819 SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR,
820 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
822 SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR,
823 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
825 SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR,
826 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
828 SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR,
829 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
831 SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR,
832 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
834 SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR,
835 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
837 SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
838 show_pwm_auto_point_temp_hyst,
839 store_pwm_auto_point_temp_hyst,
841 SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO,
842 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
843 SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO,
844 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
845 SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO,
846 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
849 /* Super I/O functions */
850 static inline int superio_inb(int base, int reg)
853 return inb(base + 1);
856 static int superio_inw(int base, int reg)
859 val = superio_inb(base, reg) << 8;
860 val |= superio_inb(base, reg + 1);
864 static inline int superio_enter(int base)
866 /* Don't step on other drivers' I/O space by accident */
867 if (!request_muxed_region(base, 2, DRVNAME)) {
868 pr_err("I/O address 0x%04x already in use\n", base);
872 /* according to the datasheet the key must be send twice! */
873 outb(SIO_UNLOCK_KEY, base);
874 outb(SIO_UNLOCK_KEY, base);
879 static inline void superio_select(int base, int ld)
881 outb(SIO_REG_LDSEL, base);
885 static inline void superio_exit(int base)
887 outb(SIO_LOCK_KEY, base);
888 release_region(base, 2);
891 static inline int fan_from_reg(u16 reg)
893 return reg ? (1500000 / reg) : 0;
896 static inline u16 fan_to_reg(int fan)
898 return fan ? (1500000 / fan) : 0;
901 static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
905 outb(reg, data->addr + ADDR_REG_OFFSET);
906 val = inb(data->addr + DATA_REG_OFFSET);
911 static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
915 val = f71882fg_read8(data, reg) << 8;
916 val |= f71882fg_read8(data, reg + 1);
921 static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
923 outb(reg, data->addr + ADDR_REG_OFFSET);
924 outb(val, data->addr + DATA_REG_OFFSET);
927 static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
929 f71882fg_write8(data, reg, val >> 8);
930 f71882fg_write8(data, reg + 1, val & 0xff);
933 static u16 f71882fg_read_temp(struct f71882fg_data *data, int nr)
935 if (data->type == f71858fg)
936 return f71882fg_read16(data, F71882FG_REG_TEMP(nr));
938 return f71882fg_read8(data, F71882FG_REG_TEMP(nr));
941 static struct f71882fg_data *f71882fg_update_device(struct device *dev)
943 struct f71882fg_data *data = dev_get_drvdata(dev);
945 int nr_fans = (data->type == f71882fg) ? 4 : 3;
946 int nr_ins = (data->type == f71858fg || data->type == f8000) ? 3 : 9;
948 mutex_lock(&data->update_lock);
950 /* Update once every 60 seconds */
951 if (time_after(jiffies, data->last_limits + 60 * HZ) ||
953 if (data->type == f71882fg || data->type == f71889fg) {
955 f71882fg_read8(data, F71882FG_REG_IN1_HIGH);
957 f71882fg_read8(data, F71882FG_REG_IN_BEEP);
960 /* Get High & boundary temps*/
961 for (nr = data->temp_start; nr < 3 + data->temp_start; nr++) {
962 data->temp_ovt[nr] = f71882fg_read8(data,
963 F71882FG_REG_TEMP_OVT(nr));
964 data->temp_high[nr] = f71882fg_read8(data,
965 F71882FG_REG_TEMP_HIGH(nr));
968 if (data->type != f8000) {
969 data->temp_hyst[0] = f71882fg_read8(data,
970 F71882FG_REG_TEMP_HYST(0));
971 data->temp_hyst[1] = f71882fg_read8(data,
972 F71882FG_REG_TEMP_HYST(1));
975 if (data->type == f71862fg || data->type == f71882fg ||
976 data->type == f71889fg) {
977 data->fan_beep = f71882fg_read8(data,
978 F71882FG_REG_FAN_BEEP);
979 data->temp_beep = f71882fg_read8(data,
980 F71882FG_REG_TEMP_BEEP);
981 reg = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
982 data->temp_type[1] = (reg & 0x02) ? 2 : 4;
983 data->temp_type[2] = (reg & 0x04) ? 2 : 4;
984 data->temp_type[3] = (reg & 0x08) ? 2 : 4;
987 data->pwm_enable = f71882fg_read8(data,
988 F71882FG_REG_PWM_ENABLE);
989 data->pwm_auto_point_hyst[0] =
990 f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
991 data->pwm_auto_point_hyst[1] =
992 f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
994 for (nr = 0; nr < nr_fans; nr++) {
995 data->pwm_auto_point_mapping[nr] =
997 F71882FG_REG_POINT_MAPPING(nr));
999 if (data->type != f71862fg) {
1001 for (point = 0; point < 5; point++) {
1002 data->pwm_auto_point_pwm[nr][point] =
1003 f71882fg_read8(data,
1004 F71882FG_REG_POINT_PWM
1007 for (point = 0; point < 4; point++) {
1008 data->pwm_auto_point_temp[nr][point] =
1009 f71882fg_read8(data,
1010 F71882FG_REG_POINT_TEMP
1014 data->pwm_auto_point_pwm[nr][1] =
1015 f71882fg_read8(data,
1016 F71882FG_REG_POINT_PWM
1018 data->pwm_auto_point_pwm[nr][4] =
1019 f71882fg_read8(data,
1020 F71882FG_REG_POINT_PWM
1022 data->pwm_auto_point_temp[nr][0] =
1023 f71882fg_read8(data,
1024 F71882FG_REG_POINT_TEMP
1026 data->pwm_auto_point_temp[nr][3] =
1027 f71882fg_read8(data,
1028 F71882FG_REG_POINT_TEMP
1032 data->last_limits = jiffies;
1035 /* Update every second */
1036 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
1037 data->temp_status = f71882fg_read8(data,
1038 F71882FG_REG_TEMP_STATUS);
1039 data->temp_diode_open = f71882fg_read8(data,
1040 F71882FG_REG_TEMP_DIODE_OPEN);
1041 for (nr = data->temp_start; nr < 3 + data->temp_start; nr++)
1042 data->temp[nr] = f71882fg_read_temp(data, nr);
1044 data->fan_status = f71882fg_read8(data,
1045 F71882FG_REG_FAN_STATUS);
1046 for (nr = 0; nr < nr_fans; nr++) {
1047 data->fan[nr] = f71882fg_read16(data,
1048 F71882FG_REG_FAN(nr));
1049 data->fan_target[nr] =
1050 f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
1051 data->fan_full_speed[nr] =
1052 f71882fg_read16(data,
1053 F71882FG_REG_FAN_FULL_SPEED(nr));
1055 f71882fg_read8(data, F71882FG_REG_PWM(nr));
1058 /* The f8000 can monitor 1 more fan, but has no pwm for it */
1059 if (data->type == f8000)
1060 data->fan[3] = f71882fg_read16(data,
1061 F71882FG_REG_FAN(3));
1062 if (data->type == f71882fg || data->type == f71889fg)
1063 data->in_status = f71882fg_read8(data,
1064 F71882FG_REG_IN_STATUS);
1065 for (nr = 0; nr < nr_ins; nr++)
1066 data->in[nr] = f71882fg_read8(data,
1067 F71882FG_REG_IN(nr));
1069 data->last_updated = jiffies;
1073 mutex_unlock(&data->update_lock);
1078 /* Sysfs Interface */
1079 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
1082 struct f71882fg_data *data = f71882fg_update_device(dev);
1083 int nr = to_sensor_dev_attr_2(devattr)->index;
1084 int speed = fan_from_reg(data->fan[nr]);
1086 if (speed == FAN_MIN_DETECT)
1089 return sprintf(buf, "%d\n", speed);
1092 static ssize_t show_fan_full_speed(struct device *dev,
1093 struct device_attribute *devattr, char *buf)
1095 struct f71882fg_data *data = f71882fg_update_device(dev);
1096 int nr = to_sensor_dev_attr_2(devattr)->index;
1097 int speed = fan_from_reg(data->fan_full_speed[nr]);
1098 return sprintf(buf, "%d\n", speed);
1101 static ssize_t store_fan_full_speed(struct device *dev,
1102 struct device_attribute *devattr,
1103 const char *buf, size_t count)
1105 struct f71882fg_data *data = dev_get_drvdata(dev);
1106 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1109 err = strict_strtol(buf, 10, &val);
1113 val = SENSORS_LIMIT(val, 23, 1500000);
1114 val = fan_to_reg(val);
1116 mutex_lock(&data->update_lock);
1117 f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1118 data->fan_full_speed[nr] = val;
1119 mutex_unlock(&data->update_lock);
1124 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1125 *devattr, char *buf)
1127 struct f71882fg_data *data = f71882fg_update_device(dev);
1128 int nr = to_sensor_dev_attr_2(devattr)->index;
1130 if (data->fan_beep & (1 << nr))
1131 return sprintf(buf, "1\n");
1133 return sprintf(buf, "0\n");
1136 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1137 *devattr, const char *buf, size_t count)
1139 struct f71882fg_data *data = dev_get_drvdata(dev);
1140 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1143 err = strict_strtoul(buf, 10, &val);
1147 mutex_lock(&data->update_lock);
1148 data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1150 data->fan_beep |= 1 << nr;
1152 data->fan_beep &= ~(1 << nr);
1154 f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1155 mutex_unlock(&data->update_lock);
1160 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1161 *devattr, char *buf)
1163 struct f71882fg_data *data = f71882fg_update_device(dev);
1164 int nr = to_sensor_dev_attr_2(devattr)->index;
1166 if (data->fan_status & (1 << nr))
1167 return sprintf(buf, "1\n");
1169 return sprintf(buf, "0\n");
1172 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1175 struct f71882fg_data *data = f71882fg_update_device(dev);
1176 int nr = to_sensor_dev_attr_2(devattr)->index;
1178 return sprintf(buf, "%d\n", data->in[nr] * 8);
1181 static ssize_t show_in_max(struct device *dev, struct device_attribute
1182 *devattr, char *buf)
1184 struct f71882fg_data *data = f71882fg_update_device(dev);
1186 return sprintf(buf, "%d\n", data->in1_max * 8);
1189 static ssize_t store_in_max(struct device *dev, struct device_attribute
1190 *devattr, const char *buf, size_t count)
1192 struct f71882fg_data *data = dev_get_drvdata(dev);
1196 err = strict_strtol(buf, 10, &val);
1201 val = SENSORS_LIMIT(val, 0, 255);
1203 mutex_lock(&data->update_lock);
1204 f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
1205 data->in1_max = val;
1206 mutex_unlock(&data->update_lock);
1211 static ssize_t show_in_beep(struct device *dev, struct device_attribute
1212 *devattr, char *buf)
1214 struct f71882fg_data *data = f71882fg_update_device(dev);
1215 int nr = to_sensor_dev_attr_2(devattr)->index;
1217 if (data->in_beep & (1 << nr))
1218 return sprintf(buf, "1\n");
1220 return sprintf(buf, "0\n");
1223 static ssize_t store_in_beep(struct device *dev, struct device_attribute
1224 *devattr, const char *buf, size_t count)
1226 struct f71882fg_data *data = dev_get_drvdata(dev);
1227 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1230 err = strict_strtoul(buf, 10, &val);
1234 mutex_lock(&data->update_lock);
1235 data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1237 data->in_beep |= 1 << nr;
1239 data->in_beep &= ~(1 << nr);
1241 f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
1242 mutex_unlock(&data->update_lock);
1247 static ssize_t show_in_alarm(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 if (data->in_status & (1 << nr))
1254 return sprintf(buf, "1\n");
1256 return sprintf(buf, "0\n");
1259 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1262 struct f71882fg_data *data = f71882fg_update_device(dev);
1263 int nr = to_sensor_dev_attr_2(devattr)->index;
1266 if (data->type == f71858fg) {
1267 /* TEMP_TABLE_SEL 1 or 3 ? */
1268 if (data->temp_config & 1) {
1269 sign = data->temp[nr] & 0x0001;
1270 temp = (data->temp[nr] >> 5) & 0x7ff;
1272 sign = data->temp[nr] & 0x8000;
1273 temp = (data->temp[nr] >> 5) & 0x3ff;
1279 temp = data->temp[nr] * 1000;
1281 return sprintf(buf, "%d\n", temp);
1284 static ssize_t show_temp_max(struct device *dev, struct device_attribute
1285 *devattr, char *buf)
1287 struct f71882fg_data *data = f71882fg_update_device(dev);
1288 int nr = to_sensor_dev_attr_2(devattr)->index;
1290 return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1293 static ssize_t store_temp_max(struct device *dev, struct device_attribute
1294 *devattr, const char *buf, size_t count)
1296 struct f71882fg_data *data = dev_get_drvdata(dev);
1297 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1300 err = strict_strtol(buf, 10, &val);
1305 val = SENSORS_LIMIT(val, 0, 255);
1307 mutex_lock(&data->update_lock);
1308 f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1309 data->temp_high[nr] = val;
1310 mutex_unlock(&data->update_lock);
1315 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1316 *devattr, char *buf)
1318 struct f71882fg_data *data = f71882fg_update_device(dev);
1319 int nr = to_sensor_dev_attr_2(devattr)->index;
1322 mutex_lock(&data->update_lock);
1324 temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1326 temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1327 temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1328 mutex_unlock(&data->update_lock);
1330 return sprintf(buf, "%d\n", temp_max_hyst);
1333 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1334 *devattr, const char *buf, size_t count)
1336 struct f71882fg_data *data = dev_get_drvdata(dev);
1337 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1338 ssize_t ret = count;
1342 err = strict_strtol(buf, 10, &val);
1348 mutex_lock(&data->update_lock);
1350 /* convert abs to relative and check */
1351 data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1352 val = SENSORS_LIMIT(val, data->temp_high[nr] - 15,
1353 data->temp_high[nr]);
1354 val = data->temp_high[nr] - val;
1356 /* convert value to register contents */
1357 reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1359 reg = (reg & 0x0f) | (val << 4);
1361 reg = (reg & 0xf0) | val;
1362 f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1363 data->temp_hyst[nr / 2] = reg;
1365 mutex_unlock(&data->update_lock);
1369 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1370 *devattr, char *buf)
1372 struct f71882fg_data *data = f71882fg_update_device(dev);
1373 int nr = to_sensor_dev_attr_2(devattr)->index;
1375 return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1378 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1379 *devattr, const char *buf, size_t count)
1381 struct f71882fg_data *data = dev_get_drvdata(dev);
1382 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1385 err = strict_strtol(buf, 10, &val);
1390 val = SENSORS_LIMIT(val, 0, 255);
1392 mutex_lock(&data->update_lock);
1393 f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1394 data->temp_ovt[nr] = val;
1395 mutex_unlock(&data->update_lock);
1400 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1401 *devattr, char *buf)
1403 struct f71882fg_data *data = f71882fg_update_device(dev);
1404 int nr = to_sensor_dev_attr_2(devattr)->index;
1407 mutex_lock(&data->update_lock);
1409 temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1411 temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1412 temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1413 mutex_unlock(&data->update_lock);
1415 return sprintf(buf, "%d\n", temp_crit_hyst);
1418 static ssize_t show_temp_type(struct device *dev, struct device_attribute
1419 *devattr, char *buf)
1421 struct f71882fg_data *data = f71882fg_update_device(dev);
1422 int nr = to_sensor_dev_attr_2(devattr)->index;
1424 return sprintf(buf, "%d\n", data->temp_type[nr]);
1427 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1428 *devattr, char *buf)
1430 struct f71882fg_data *data = f71882fg_update_device(dev);
1431 int nr = to_sensor_dev_attr_2(devattr)->index;
1433 if (data->temp_beep & (1 << nr))
1434 return sprintf(buf, "1\n");
1436 return sprintf(buf, "0\n");
1439 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1440 *devattr, const char *buf, size_t count)
1442 struct f71882fg_data *data = dev_get_drvdata(dev);
1443 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1446 err = strict_strtoul(buf, 10, &val);
1450 mutex_lock(&data->update_lock);
1451 data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1453 data->temp_beep |= 1 << nr;
1455 data->temp_beep &= ~(1 << nr);
1457 f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1458 mutex_unlock(&data->update_lock);
1463 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1464 *devattr, char *buf)
1466 struct f71882fg_data *data = f71882fg_update_device(dev);
1467 int nr = to_sensor_dev_attr_2(devattr)->index;
1469 if (data->temp_status & (1 << nr))
1470 return sprintf(buf, "1\n");
1472 return sprintf(buf, "0\n");
1475 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1476 *devattr, char *buf)
1478 struct f71882fg_data *data = f71882fg_update_device(dev);
1479 int nr = to_sensor_dev_attr_2(devattr)->index;
1481 if (data->temp_diode_open & (1 << nr))
1482 return sprintf(buf, "1\n");
1484 return sprintf(buf, "0\n");
1487 static ssize_t show_pwm(struct device *dev,
1488 struct device_attribute *devattr, char *buf)
1490 struct f71882fg_data *data = f71882fg_update_device(dev);
1491 int val, nr = to_sensor_dev_attr_2(devattr)->index;
1492 mutex_lock(&data->update_lock);
1493 if (data->pwm_enable & (1 << (2 * nr)))
1495 val = data->pwm[nr];
1498 val = 255 * fan_from_reg(data->fan_target[nr])
1499 / fan_from_reg(data->fan_full_speed[nr]);
1501 mutex_unlock(&data->update_lock);
1502 return sprintf(buf, "%d\n", val);
1505 static ssize_t store_pwm(struct device *dev,
1506 struct device_attribute *devattr, const char *buf,
1509 struct f71882fg_data *data = dev_get_drvdata(dev);
1510 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1513 err = strict_strtol(buf, 10, &val);
1517 val = SENSORS_LIMIT(val, 0, 255);
1519 mutex_lock(&data->update_lock);
1520 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1521 if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1522 (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1526 if (data->pwm_enable & (1 << (2 * nr))) {
1528 f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1529 data->pwm[nr] = val;
1532 int target, full_speed;
1533 full_speed = f71882fg_read16(data,
1534 F71882FG_REG_FAN_FULL_SPEED(nr));
1535 target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1536 f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1537 data->fan_target[nr] = target;
1538 data->fan_full_speed[nr] = full_speed;
1541 mutex_unlock(&data->update_lock);
1546 static ssize_t show_pwm_enable(struct device *dev,
1547 struct device_attribute *devattr, char *buf)
1550 struct f71882fg_data *data = f71882fg_update_device(dev);
1551 int nr = to_sensor_dev_attr_2(devattr)->index;
1553 switch ((data->pwm_enable >> 2 * nr) & 3) {
1556 result = 2; /* Normal auto mode */
1559 result = 1; /* Manual mode */
1562 if (data->type == f8000)
1563 result = 3; /* Thermostat mode */
1565 result = 1; /* Manual mode */
1569 return sprintf(buf, "%d\n", result);
1572 static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1573 *devattr, const char *buf, size_t count)
1575 struct f71882fg_data *data = dev_get_drvdata(dev);
1576 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1579 err = strict_strtol(buf, 10, &val);
1583 /* Special case for F8000 pwm channel 3 which only does auto mode */
1584 if (data->type == f8000 && nr == 2 && val != 2)
1587 mutex_lock(&data->update_lock);
1588 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1589 /* Special case for F8000 auto PWM mode / Thermostat mode */
1590 if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1593 data->pwm_enable &= ~(2 << (2 * nr));
1594 break; /* Normal auto mode */
1596 data->pwm_enable |= 2 << (2 * nr);
1597 break; /* Thermostat mode */
1605 /* The f71858fg does not support manual RPM mode */
1606 if (data->type == f71858fg &&
1607 ((data->pwm_enable >> (2 * nr)) & 1)) {
1611 data->pwm_enable |= 2 << (2 * nr);
1614 data->pwm_enable &= ~(2 << (2 * nr));
1615 break; /* Normal auto mode */
1621 f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1623 mutex_unlock(&data->update_lock);
1628 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1629 struct device_attribute *devattr,
1633 struct f71882fg_data *data = f71882fg_update_device(dev);
1634 int pwm = to_sensor_dev_attr_2(devattr)->index;
1635 int point = to_sensor_dev_attr_2(devattr)->nr;
1637 mutex_lock(&data->update_lock);
1638 if (data->pwm_enable & (1 << (2 * pwm))) {
1640 result = data->pwm_auto_point_pwm[pwm][point];
1643 result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1645 mutex_unlock(&data->update_lock);
1647 return sprintf(buf, "%d\n", result);
1650 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1651 struct device_attribute *devattr,
1652 const char *buf, size_t count)
1654 struct f71882fg_data *data = dev_get_drvdata(dev);
1655 int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1656 int point = to_sensor_dev_attr_2(devattr)->nr;
1659 err = strict_strtol(buf, 10, &val);
1663 val = SENSORS_LIMIT(val, 0, 255);
1665 mutex_lock(&data->update_lock);
1666 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1667 if (data->pwm_enable & (1 << (2 * pwm))) {
1671 if (val < 29) /* Prevent negative numbers */
1674 val = (255 - val) * 32 / val;
1676 f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
1677 data->pwm_auto_point_pwm[pwm][point] = val;
1678 mutex_unlock(&data->update_lock);
1683 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
1684 struct device_attribute *devattr,
1688 struct f71882fg_data *data = f71882fg_update_device(dev);
1689 int nr = to_sensor_dev_attr_2(devattr)->index;
1690 int point = to_sensor_dev_attr_2(devattr)->nr;
1692 mutex_lock(&data->update_lock);
1694 result = data->pwm_auto_point_hyst[nr / 2] >> 4;
1696 result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
1697 result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
1698 mutex_unlock(&data->update_lock);
1700 return sprintf(buf, "%d\n", result);
1703 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
1704 struct device_attribute *devattr,
1705 const char *buf, size_t count)
1707 struct f71882fg_data *data = dev_get_drvdata(dev);
1708 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1709 int point = to_sensor_dev_attr_2(devattr)->nr;
1713 err = strict_strtol(buf, 10, &val);
1719 mutex_lock(&data->update_lock);
1720 data->pwm_auto_point_temp[nr][point] =
1721 f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
1722 val = SENSORS_LIMIT(val, data->pwm_auto_point_temp[nr][point] - 15,
1723 data->pwm_auto_point_temp[nr][point]);
1724 val = data->pwm_auto_point_temp[nr][point] - val;
1726 reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
1728 reg = (reg & 0x0f) | (val << 4);
1730 reg = (reg & 0xf0) | val;
1732 f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
1733 data->pwm_auto_point_hyst[nr / 2] = reg;
1734 mutex_unlock(&data->update_lock);
1739 static ssize_t show_pwm_interpolate(struct device *dev,
1740 struct device_attribute *devattr, char *buf)
1743 struct f71882fg_data *data = f71882fg_update_device(dev);
1744 int nr = to_sensor_dev_attr_2(devattr)->index;
1746 result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
1748 return sprintf(buf, "%d\n", result);
1751 static ssize_t store_pwm_interpolate(struct device *dev,
1752 struct device_attribute *devattr,
1753 const char *buf, size_t count)
1755 struct f71882fg_data *data = dev_get_drvdata(dev);
1756 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1759 err = strict_strtoul(buf, 10, &val);
1763 mutex_lock(&data->update_lock);
1764 data->pwm_auto_point_mapping[nr] =
1765 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1767 val = data->pwm_auto_point_mapping[nr] | (1 << 4);
1769 val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
1770 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1771 data->pwm_auto_point_mapping[nr] = val;
1772 mutex_unlock(&data->update_lock);
1777 static ssize_t show_pwm_auto_point_channel(struct device *dev,
1778 struct device_attribute *devattr,
1782 struct f71882fg_data *data = f71882fg_update_device(dev);
1783 int nr = to_sensor_dev_attr_2(devattr)->index;
1785 result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) -
1788 return sprintf(buf, "%d\n", result);
1791 static ssize_t store_pwm_auto_point_channel(struct device *dev,
1792 struct device_attribute *devattr,
1793 const char *buf, size_t count)
1795 struct f71882fg_data *data = dev_get_drvdata(dev);
1796 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1799 err = strict_strtol(buf, 10, &val);
1816 val += data->temp_start;
1817 mutex_lock(&data->update_lock);
1818 data->pwm_auto_point_mapping[nr] =
1819 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1820 val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
1821 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1822 data->pwm_auto_point_mapping[nr] = val;
1823 mutex_unlock(&data->update_lock);
1828 static ssize_t show_pwm_auto_point_temp(struct device *dev,
1829 struct device_attribute *devattr,
1833 struct f71882fg_data *data = f71882fg_update_device(dev);
1834 int pwm = to_sensor_dev_attr_2(devattr)->index;
1835 int point = to_sensor_dev_attr_2(devattr)->nr;
1837 result = data->pwm_auto_point_temp[pwm][point];
1838 return sprintf(buf, "%d\n", 1000 * result);
1841 static ssize_t store_pwm_auto_point_temp(struct device *dev,
1842 struct device_attribute *devattr,
1843 const char *buf, size_t count)
1845 struct f71882fg_data *data = dev_get_drvdata(dev);
1846 int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1847 int point = to_sensor_dev_attr_2(devattr)->nr;
1850 err = strict_strtol(buf, 10, &val);
1856 if (data->type == f71889fg)
1857 val = SENSORS_LIMIT(val, -128, 127);
1859 val = SENSORS_LIMIT(val, 0, 127);
1861 mutex_lock(&data->update_lock);
1862 f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
1863 data->pwm_auto_point_temp[pwm][point] = val;
1864 mutex_unlock(&data->update_lock);
1869 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
1872 struct f71882fg_data *data = dev_get_drvdata(dev);
1873 return sprintf(buf, "%s\n", f71882fg_names[data->type]);
1876 static int __devinit f71882fg_create_sysfs_files(struct platform_device *pdev,
1877 struct sensor_device_attribute_2 *attr, int count)
1881 for (i = 0; i < count; i++) {
1882 err = device_create_file(&pdev->dev, &attr[i].dev_attr);
1889 static void f71882fg_remove_sysfs_files(struct platform_device *pdev,
1890 struct sensor_device_attribute_2 *attr, int count)
1894 for (i = 0; i < count; i++)
1895 device_remove_file(&pdev->dev, &attr[i].dev_attr);
1898 static int __devinit f71882fg_probe(struct platform_device *pdev)
1900 struct f71882fg_data *data;
1901 struct f71882fg_sio_data *sio_data = pdev->dev.platform_data;
1902 int err, i, nr_fans = (sio_data->type == f71882fg) ? 4 : 3;
1905 data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL);
1909 data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
1910 data->type = sio_data->type;
1912 (data->type == f71858fg || data->type == f8000) ? 0 : 1;
1913 mutex_init(&data->update_lock);
1914 platform_set_drvdata(pdev, data);
1916 start_reg = f71882fg_read8(data, F71882FG_REG_START);
1917 if (start_reg & 0x04) {
1918 dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
1922 if (!(start_reg & 0x03)) {
1923 dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
1928 /* Register sysfs interface files */
1929 err = device_create_file(&pdev->dev, &dev_attr_name);
1931 goto exit_unregister_sysfs;
1933 if (start_reg & 0x01) {
1934 switch (data->type) {
1937 f71882fg_read8(data, F71882FG_REG_TEMP_CONFIG);
1938 if (data->temp_config & 0x10)
1939 /* The f71858fg temperature alarms behave as
1940 the f8000 alarms in this mode */
1941 err = f71882fg_create_sysfs_files(pdev,
1943 ARRAY_SIZE(f8000_in_temp_attr));
1945 err = f71882fg_create_sysfs_files(pdev,
1946 f71858fg_in_temp_attr,
1947 ARRAY_SIZE(f71858fg_in_temp_attr));
1951 err = f71882fg_create_sysfs_files(pdev,
1952 fxxxx_in1_alarm_attr,
1953 ARRAY_SIZE(fxxxx_in1_alarm_attr));
1955 goto exit_unregister_sysfs;
1958 err = f71882fg_create_sysfs_files(pdev,
1960 ARRAY_SIZE(fxxxx_in_temp_attr));
1963 err = f71882fg_create_sysfs_files(pdev,
1965 ARRAY_SIZE(f8000_in_temp_attr));
1969 goto exit_unregister_sysfs;
1972 if (start_reg & 0x02) {
1974 f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1976 /* Sanity check the pwm settings */
1977 switch (data->type) {
1980 for (i = 0; i < nr_fans; i++)
1981 if (((data->pwm_enable >> (i * 2)) & 3) == 3)
1985 err = (data->pwm_enable & 0x15) != 0x15;
1992 err = data->pwm_enable & 0x20;
1997 "Invalid (reserved) pwm settings: 0x%02x\n",
1998 (unsigned int)data->pwm_enable);
2000 goto exit_unregister_sysfs;
2003 err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2004 ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2006 goto exit_unregister_sysfs;
2008 if (data->type == f71862fg || data->type == f71882fg ||
2009 data->type == f71889fg) {
2010 err = f71882fg_create_sysfs_files(pdev,
2011 fxxxx_fan_beep_attr, nr_fans);
2013 goto exit_unregister_sysfs;
2016 switch (data->type) {
2018 err = f71882fg_create_sysfs_files(pdev,
2019 f71862fg_auto_pwm_attr,
2020 ARRAY_SIZE(f71862fg_auto_pwm_attr));
2023 err = f71882fg_create_sysfs_files(pdev,
2025 ARRAY_SIZE(f8000_fan_attr));
2027 goto exit_unregister_sysfs;
2028 err = f71882fg_create_sysfs_files(pdev,
2029 f8000_auto_pwm_attr,
2030 ARRAY_SIZE(f8000_auto_pwm_attr));
2033 for (i = 0; i < nr_fans; i++) {
2034 data->pwm_auto_point_mapping[i] =
2035 f71882fg_read8(data,
2036 F71882FG_REG_POINT_MAPPING(i));
2037 if (data->pwm_auto_point_mapping[i] & 0x80)
2041 dev_warn(&pdev->dev,
2042 "Auto pwm controlled by raw digital "
2043 "data, disabling pwm auto_point "
2044 "sysfs attributes\n");
2048 default: /* f71858fg / f71882fg */
2049 err = f71882fg_create_sysfs_files(pdev,
2050 &fxxxx_auto_pwm_attr[0][0],
2051 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2054 goto exit_unregister_sysfs;
2056 for (i = 0; i < nr_fans; i++)
2057 dev_info(&pdev->dev, "Fan: %d is in %s mode\n", i + 1,
2058 (data->pwm_enable & (1 << 2 * i)) ?
2059 "duty-cycle" : "RPM");
2062 data->hwmon_dev = hwmon_device_register(&pdev->dev);
2063 if (IS_ERR(data->hwmon_dev)) {
2064 err = PTR_ERR(data->hwmon_dev);
2065 data->hwmon_dev = NULL;
2066 goto exit_unregister_sysfs;
2071 exit_unregister_sysfs:
2072 f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
2073 return err; /* f71882fg_remove() also frees our data */
2079 static int f71882fg_remove(struct platform_device *pdev)
2081 struct f71882fg_data *data = platform_get_drvdata(pdev);
2082 int nr_fans = (data->type == f71882fg) ? 4 : 3;
2083 u8 start_reg = f71882fg_read8(data, F71882FG_REG_START);
2085 if (data->hwmon_dev)
2086 hwmon_device_unregister(data->hwmon_dev);
2088 device_remove_file(&pdev->dev, &dev_attr_name);
2090 if (start_reg & 0x01) {
2091 switch (data->type) {
2093 if (data->temp_config & 0x10)
2094 f71882fg_remove_sysfs_files(pdev,
2096 ARRAY_SIZE(f8000_in_temp_attr));
2098 f71882fg_remove_sysfs_files(pdev,
2099 f71858fg_in_temp_attr,
2100 ARRAY_SIZE(f71858fg_in_temp_attr));
2104 f71882fg_remove_sysfs_files(pdev,
2105 fxxxx_in1_alarm_attr,
2106 ARRAY_SIZE(fxxxx_in1_alarm_attr));
2109 f71882fg_remove_sysfs_files(pdev,
2111 ARRAY_SIZE(fxxxx_in_temp_attr));
2114 f71882fg_remove_sysfs_files(pdev,
2116 ARRAY_SIZE(f8000_in_temp_attr));
2121 if (start_reg & 0x02) {
2122 f71882fg_remove_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2123 ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2125 if (data->type == f71862fg || data->type == f71882fg ||
2126 data->type == f71889fg)
2127 f71882fg_remove_sysfs_files(pdev,
2128 fxxxx_fan_beep_attr, nr_fans);
2130 switch (data->type) {
2132 f71882fg_remove_sysfs_files(pdev,
2133 f71862fg_auto_pwm_attr,
2134 ARRAY_SIZE(f71862fg_auto_pwm_attr));
2137 f71882fg_remove_sysfs_files(pdev,
2139 ARRAY_SIZE(f8000_fan_attr));
2140 f71882fg_remove_sysfs_files(pdev,
2141 f8000_auto_pwm_attr,
2142 ARRAY_SIZE(f8000_auto_pwm_attr));
2144 default: /* f71858fg / f71882fg / f71889fg */
2145 f71882fg_remove_sysfs_files(pdev,
2146 &fxxxx_auto_pwm_attr[0][0],
2147 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2151 platform_set_drvdata(pdev, NULL);
2157 static int __init f71882fg_find(int sioaddr, unsigned short *address,
2158 struct f71882fg_sio_data *sio_data)
2161 int err = superio_enter(sioaddr);
2165 devid = superio_inw(sioaddr, SIO_REG_MANID);
2166 if (devid != SIO_FINTEK_ID) {
2167 pr_debug("Not a Fintek device\n");
2172 devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
2175 sio_data->type = f71858fg;
2178 sio_data->type = f71862fg;
2181 sio_data->type = f71882fg;
2184 sio_data->type = f71889fg;
2187 sio_data->type = f8000;
2190 pr_info("Unsupported Fintek device: %04x\n",
2191 (unsigned int)devid);
2196 if (sio_data->type == f71858fg)
2197 superio_select(sioaddr, SIO_F71858FG_LD_HWM);
2199 superio_select(sioaddr, SIO_F71882FG_LD_HWM);
2201 if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
2202 pr_warn("Device not activated\n");
2207 *address = superio_inw(sioaddr, SIO_REG_ADDR);
2208 if (*address == 0) {
2209 pr_warn("Base address not set\n");
2213 *address &= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */
2216 pr_info("Found %s chip at %#x, revision %d\n",
2217 f71882fg_names[sio_data->type], (unsigned int)*address,
2218 (int)superio_inb(sioaddr, SIO_REG_DEVREV));
2220 superio_exit(sioaddr);
2224 static int __init f71882fg_device_add(unsigned short address,
2225 const struct f71882fg_sio_data *sio_data)
2227 struct resource res = {
2229 .end = address + REGION_LENGTH - 1,
2230 .flags = IORESOURCE_IO,
2234 f71882fg_pdev = platform_device_alloc(DRVNAME, address);
2238 res.name = f71882fg_pdev->name;
2239 err = acpi_check_resource_conflict(&res);
2241 goto exit_device_put;
2243 err = platform_device_add_resources(f71882fg_pdev, &res, 1);
2245 pr_err("Device resource addition failed\n");
2246 goto exit_device_put;
2249 err = platform_device_add_data(f71882fg_pdev, sio_data,
2250 sizeof(struct f71882fg_sio_data));
2252 pr_err("Platform data allocation failed\n");
2253 goto exit_device_put;
2256 err = platform_device_add(f71882fg_pdev);
2258 pr_err("Device addition failed\n");
2259 goto exit_device_put;
2265 platform_device_put(f71882fg_pdev);
2270 static int __init f71882fg_init(void)
2273 unsigned short address;
2274 struct f71882fg_sio_data sio_data;
2276 memset(&sio_data, 0, sizeof(sio_data));
2278 if (f71882fg_find(0x2e, &address, &sio_data) &&
2279 f71882fg_find(0x4e, &address, &sio_data))
2282 err = platform_driver_register(&f71882fg_driver);
2286 err = f71882fg_device_add(address, &sio_data);
2293 platform_driver_unregister(&f71882fg_driver);
2298 static void __exit f71882fg_exit(void)
2300 platform_device_unregister(f71882fg_pdev);
2301 platform_driver_unregister(&f71882fg_driver);
2304 MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
2305 MODULE_AUTHOR("Hans Edgington, Hans de Goede (hdegoede@redhat.com)");
2306 MODULE_LICENSE("GPL");
2308 module_init(f71882fg_init);
2309 module_exit(f71882fg_exit);