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),
453 /* Fan / PWM attr for the f71882fg */
454 static struct sensor_device_attribute_2 f71882fg_fan_attr[] = {
455 SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
456 store_fan_beep, 0, 0),
457 SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
458 store_fan_beep, 0, 1),
459 SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
460 store_fan_beep, 0, 2),
461 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
462 SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
464 store_fan_full_speed, 0, 3),
465 SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
466 store_fan_beep, 0, 3),
467 SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
469 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
470 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
472 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
473 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
475 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
476 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
478 SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR,
479 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
481 SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR,
482 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
484 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
485 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
487 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
488 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
490 SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR,
491 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
493 SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR,
494 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
496 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
497 show_pwm_auto_point_temp_hyst,
498 store_pwm_auto_point_temp_hyst,
500 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
501 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
502 SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO,
503 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
504 SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
505 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
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_point3_pwm, S_IRUGO|S_IWUSR,
514 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
516 SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR,
517 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
519 SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR,
520 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
522 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
523 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
525 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
526 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
528 SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR,
529 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
531 SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR,
532 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
534 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
535 show_pwm_auto_point_temp_hyst,
536 store_pwm_auto_point_temp_hyst,
538 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
539 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
540 SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO,
541 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
542 SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
543 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
545 SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
546 SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
547 store_pwm_enable, 0, 2),
548 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
549 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
551 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
552 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
554 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
555 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
557 SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR,
558 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
560 SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR,
561 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
563 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
564 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
566 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
567 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
569 SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR,
570 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
572 SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR,
573 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
575 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
576 show_pwm_auto_point_temp_hyst,
577 store_pwm_auto_point_temp_hyst,
579 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
580 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
581 SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO,
582 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
583 SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
584 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
586 SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
587 SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
588 store_pwm_enable, 0, 3),
589 SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
590 show_pwm_interpolate, store_pwm_interpolate, 0, 3),
591 SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
592 show_pwm_auto_point_channel,
593 store_pwm_auto_point_channel, 0, 3),
594 SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR,
595 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
597 SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR,
598 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
600 SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR,
601 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
603 SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR,
604 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
606 SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR,
607 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
609 SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR,
610 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
612 SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR,
613 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
615 SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR,
616 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
618 SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR,
619 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
621 SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
622 show_pwm_auto_point_temp_hyst,
623 store_pwm_auto_point_temp_hyst,
625 SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO,
626 show_pwm_auto_point_temp_hyst, NULL, 1, 3),
627 SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO,
628 show_pwm_auto_point_temp_hyst, NULL, 2, 3),
629 SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
630 show_pwm_auto_point_temp_hyst, NULL, 3, 3),
633 /* Fan / PWM attr for the f8000, zones mapped to temp instead of to pwm!
634 Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
635 F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0 */
636 static struct sensor_device_attribute_2 f8000_fan_attr[] = {
637 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
639 SENSOR_ATTR_2(pwm3, S_IRUGO, show_pwm, NULL, 0, 2),
641 SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR,
642 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
644 SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR,
645 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
647 SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR,
648 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
650 SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR,
651 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
653 SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR,
654 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
656 SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR,
657 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
659 SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR,
660 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
662 SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR,
663 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
665 SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR,
666 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
668 SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
669 show_pwm_auto_point_temp_hyst,
670 store_pwm_auto_point_temp_hyst,
672 SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO,
673 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
674 SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO,
675 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
676 SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO,
677 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
679 SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR,
680 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
682 SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR,
683 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
685 SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR,
686 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
688 SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR,
689 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
691 SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR,
692 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
694 SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR,
695 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
697 SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR,
698 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
700 SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR,
701 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
703 SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR,
704 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
706 SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
707 show_pwm_auto_point_temp_hyst,
708 store_pwm_auto_point_temp_hyst,
710 SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO,
711 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
712 SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO,
713 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
714 SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO,
715 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
717 SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR,
718 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
720 SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR,
721 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
723 SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR,
724 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
726 SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR,
727 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
729 SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR,
730 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
732 SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR,
733 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
735 SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR,
736 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
738 SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR,
739 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
741 SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR,
742 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
744 SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
745 show_pwm_auto_point_temp_hyst,
746 store_pwm_auto_point_temp_hyst,
748 SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO,
749 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
750 SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO,
751 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
752 SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO,
753 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
756 /* Super I/O functions */
757 static inline int superio_inb(int base, int reg)
760 return inb(base + 1);
763 static int superio_inw(int base, int reg)
767 val = inb(base + 1) << 8;
769 val |= inb(base + 1);
773 static inline void superio_enter(int base)
775 /* according to the datasheet the key must be send twice! */
776 outb( SIO_UNLOCK_KEY, base);
777 outb( SIO_UNLOCK_KEY, base);
780 static inline void superio_select( int base, int ld)
782 outb(SIO_REG_LDSEL, base);
786 static inline void superio_exit(int base)
788 outb(SIO_LOCK_KEY, base);
791 static inline u16 fan_from_reg(u16 reg)
793 return reg ? (1500000 / reg) : 0;
796 static inline u16 fan_to_reg(u16 fan)
798 return fan ? (1500000 / fan) : 0;
801 static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
805 outb(reg, data->addr + ADDR_REG_OFFSET);
806 val = inb(data->addr + DATA_REG_OFFSET);
811 static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
815 outb(reg++, data->addr + ADDR_REG_OFFSET);
816 val = inb(data->addr + DATA_REG_OFFSET) << 8;
817 outb(reg, data->addr + ADDR_REG_OFFSET);
818 val |= inb(data->addr + DATA_REG_OFFSET);
823 static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
825 outb(reg, data->addr + ADDR_REG_OFFSET);
826 outb(val, data->addr + DATA_REG_OFFSET);
829 static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
831 outb(reg++, data->addr + ADDR_REG_OFFSET);
832 outb(val >> 8, data->addr + DATA_REG_OFFSET);
833 outb(reg, data->addr + ADDR_REG_OFFSET);
834 outb(val & 255, data->addr + DATA_REG_OFFSET);
837 static struct f71882fg_data *f71882fg_update_device(struct device *dev)
839 struct f71882fg_data *data = dev_get_drvdata(dev);
840 int nr, reg = 0, reg2;
841 int nr_fans = (data->type == f71882fg) ? 4 : 3;
842 int nr_ins = (data->type == f8000) ? 3 : 9;
843 int temp_start = (data->type == f8000) ? 0 : 1;
845 mutex_lock(&data->update_lock);
847 /* Update once every 60 seconds */
848 if ( time_after(jiffies, data->last_limits + 60 * HZ ) ||
850 if (data->type == f71882fg) {
852 f71882fg_read8(data, F71882FG_REG_IN1_HIGH);
854 f71882fg_read8(data, F71882FG_REG_IN_BEEP);
857 /* Get High & boundary temps*/
858 for (nr = temp_start; nr < 3 + temp_start; nr++) {
859 data->temp_ovt[nr] = f71882fg_read8(data,
860 F71882FG_REG_TEMP_OVT(nr));
861 data->temp_high[nr] = f71882fg_read8(data,
862 F71882FG_REG_TEMP_HIGH(nr));
865 if (data->type != f8000) {
866 data->fan_beep = f71882fg_read8(data,
867 F71882FG_REG_FAN_BEEP);
868 data->temp_beep = f71882fg_read8(data,
869 F71882FG_REG_TEMP_BEEP);
870 data->temp_hyst[0] = f71882fg_read8(data,
871 F71882FG_REG_TEMP_HYST(0));
872 data->temp_hyst[1] = f71882fg_read8(data,
873 F71882FG_REG_TEMP_HYST(1));
874 /* Have to hardcode type, because temp1 is special */
875 reg = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
876 data->temp_type[2] = (reg & 0x04) ? 2 : 4;
877 data->temp_type[3] = (reg & 0x08) ? 2 : 4;
879 reg2 = f71882fg_read8(data, F71882FG_REG_PECI);
880 if ((reg2 & 0x03) == 0x01)
881 data->temp_type[1] = 6 /* PECI */;
882 else if ((reg2 & 0x03) == 0x02)
883 data->temp_type[1] = 5 /* AMDSI */;
884 else if (data->type != f8000)
885 data->temp_type[1] = (reg & 0x02) ? 2 : 4;
887 data->temp_type[1] = 2; /* F8000 only supports BJT */
889 data->pwm_enable = f71882fg_read8(data,
890 F71882FG_REG_PWM_ENABLE);
891 data->pwm_auto_point_hyst[0] =
892 f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
893 data->pwm_auto_point_hyst[1] =
894 f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
896 for (nr = 0; nr < nr_fans; nr++) {
897 data->pwm_auto_point_mapping[nr] =
899 F71882FG_REG_POINT_MAPPING(nr));
901 if (data->type != f71862fg) {
903 for (point = 0; point < 5; point++) {
904 data->pwm_auto_point_pwm[nr][point] =
906 F71882FG_REG_POINT_PWM
909 for (point = 0; point < 4; point++) {
910 data->pwm_auto_point_temp[nr][point] =
912 F71882FG_REG_POINT_TEMP
916 data->pwm_auto_point_pwm[nr][1] =
918 F71882FG_REG_POINT_PWM
920 data->pwm_auto_point_pwm[nr][4] =
922 F71882FG_REG_POINT_PWM
924 data->pwm_auto_point_temp[nr][0] =
926 F71882FG_REG_POINT_TEMP
928 data->pwm_auto_point_temp[nr][3] =
930 F71882FG_REG_POINT_TEMP
934 data->last_limits = jiffies;
937 /* Update every second */
938 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
939 data->temp_status = f71882fg_read8(data,
940 F71882FG_REG_TEMP_STATUS);
941 data->temp_diode_open = f71882fg_read8(data,
942 F71882FG_REG_TEMP_DIODE_OPEN);
943 for (nr = temp_start; nr < 3 + temp_start; nr++)
944 data->temp[nr] = f71882fg_read8(data,
945 F71882FG_REG_TEMP(nr));
947 data->fan_status = f71882fg_read8(data,
948 F71882FG_REG_FAN_STATUS);
949 for (nr = 0; nr < nr_fans; nr++) {
950 data->fan[nr] = f71882fg_read16(data,
951 F71882FG_REG_FAN(nr));
952 data->fan_target[nr] =
953 f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
954 data->fan_full_speed[nr] =
955 f71882fg_read16(data,
956 F71882FG_REG_FAN_FULL_SPEED(nr));
958 f71882fg_read8(data, F71882FG_REG_PWM(nr));
961 /* The f8000 can monitor 1 more fan, but has no pwm for it */
962 if (data->type == f8000)
963 data->fan[3] = f71882fg_read16(data,
964 F71882FG_REG_FAN(3));
965 if (data->type == f71882fg)
966 data->in_status = f71882fg_read8(data,
967 F71882FG_REG_IN_STATUS);
968 for (nr = 0; nr < nr_ins; nr++)
969 data->in[nr] = f71882fg_read8(data,
970 F71882FG_REG_IN(nr));
972 data->last_updated = jiffies;
976 mutex_unlock(&data->update_lock);
981 /* Sysfs Interface */
982 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
985 struct f71882fg_data *data = f71882fg_update_device(dev);
986 int nr = to_sensor_dev_attr_2(devattr)->index;
987 int speed = fan_from_reg(data->fan[nr]);
989 if (speed == FAN_MIN_DETECT)
992 return sprintf(buf, "%d\n", speed);
995 static ssize_t show_fan_full_speed(struct device *dev,
996 struct device_attribute *devattr, char *buf)
998 struct f71882fg_data *data = f71882fg_update_device(dev);
999 int nr = to_sensor_dev_attr_2(devattr)->index;
1000 int speed = fan_from_reg(data->fan_full_speed[nr]);
1001 return sprintf(buf, "%d\n", speed);
1004 static ssize_t store_fan_full_speed(struct device *dev,
1005 struct device_attribute *devattr,
1006 const char *buf, size_t count)
1008 struct f71882fg_data *data = dev_get_drvdata(dev);
1009 int nr = to_sensor_dev_attr_2(devattr)->index;
1010 long val = simple_strtol(buf, NULL, 10);
1012 val = SENSORS_LIMIT(val, 23, 1500000);
1013 val = fan_to_reg(val);
1015 mutex_lock(&data->update_lock);
1016 f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1017 data->fan_full_speed[nr] = val;
1018 mutex_unlock(&data->update_lock);
1023 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1024 *devattr, char *buf)
1026 struct f71882fg_data *data = f71882fg_update_device(dev);
1027 int nr = to_sensor_dev_attr_2(devattr)->index;
1029 if (data->fan_beep & (1 << nr))
1030 return sprintf(buf, "1\n");
1032 return sprintf(buf, "0\n");
1035 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1036 *devattr, const char *buf, size_t count)
1038 struct f71882fg_data *data = dev_get_drvdata(dev);
1039 int nr = to_sensor_dev_attr_2(devattr)->index;
1040 unsigned long val = simple_strtoul(buf, NULL, 10);
1042 mutex_lock(&data->update_lock);
1043 data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1045 data->fan_beep |= 1 << nr;
1047 data->fan_beep &= ~(1 << nr);
1049 f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1050 mutex_unlock(&data->update_lock);
1055 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1056 *devattr, char *buf)
1058 struct f71882fg_data *data = f71882fg_update_device(dev);
1059 int nr = to_sensor_dev_attr_2(devattr)->index;
1061 if (data->fan_status & (1 << nr))
1062 return sprintf(buf, "1\n");
1064 return sprintf(buf, "0\n");
1067 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1070 struct f71882fg_data *data = f71882fg_update_device(dev);
1071 int nr = to_sensor_dev_attr_2(devattr)->index;
1073 return sprintf(buf, "%d\n", data->in[nr] * 8);
1076 static ssize_t show_in_max(struct device *dev, struct device_attribute
1077 *devattr, char *buf)
1079 struct f71882fg_data *data = f71882fg_update_device(dev);
1081 return sprintf(buf, "%d\n", data->in1_max * 8);
1084 static ssize_t store_in_max(struct device *dev, struct device_attribute
1085 *devattr, const char *buf, size_t count)
1087 struct f71882fg_data *data = dev_get_drvdata(dev);
1088 long val = simple_strtol(buf, NULL, 10) / 8;
1089 val = SENSORS_LIMIT(val, 0, 255);
1091 mutex_lock(&data->update_lock);
1092 f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
1093 data->in1_max = val;
1094 mutex_unlock(&data->update_lock);
1099 static ssize_t show_in_beep(struct device *dev, struct device_attribute
1100 *devattr, char *buf)
1102 struct f71882fg_data *data = f71882fg_update_device(dev);
1103 int nr = to_sensor_dev_attr_2(devattr)->index;
1105 if (data->in_beep & (1 << nr))
1106 return sprintf(buf, "1\n");
1108 return sprintf(buf, "0\n");
1111 static ssize_t store_in_beep(struct device *dev, struct device_attribute
1112 *devattr, const char *buf, size_t count)
1114 struct f71882fg_data *data = dev_get_drvdata(dev);
1115 int nr = to_sensor_dev_attr_2(devattr)->index;
1116 unsigned long val = simple_strtoul(buf, NULL, 10);
1118 mutex_lock(&data->update_lock);
1119 data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1121 data->in_beep |= 1 << nr;
1123 data->in_beep &= ~(1 << nr);
1125 f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
1126 mutex_unlock(&data->update_lock);
1131 static ssize_t show_in_alarm(struct device *dev, struct device_attribute
1132 *devattr, char *buf)
1134 struct f71882fg_data *data = f71882fg_update_device(dev);
1135 int nr = to_sensor_dev_attr_2(devattr)->index;
1137 if (data->in_status & (1 << nr))
1138 return sprintf(buf, "1\n");
1140 return sprintf(buf, "0\n");
1143 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1146 struct f71882fg_data *data = f71882fg_update_device(dev);
1147 int nr = to_sensor_dev_attr_2(devattr)->index;
1149 return sprintf(buf, "%d\n", data->temp[nr] * 1000);
1152 static ssize_t show_temp_max(struct device *dev, struct device_attribute
1153 *devattr, char *buf)
1155 struct f71882fg_data *data = f71882fg_update_device(dev);
1156 int nr = to_sensor_dev_attr_2(devattr)->index;
1158 return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1161 static ssize_t store_temp_max(struct device *dev, struct device_attribute
1162 *devattr, const char *buf, size_t count)
1164 struct f71882fg_data *data = dev_get_drvdata(dev);
1165 int nr = to_sensor_dev_attr_2(devattr)->index;
1166 long val = simple_strtol(buf, NULL, 10) / 1000;
1167 val = SENSORS_LIMIT(val, 0, 255);
1169 mutex_lock(&data->update_lock);
1170 f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1171 data->temp_high[nr] = val;
1172 mutex_unlock(&data->update_lock);
1177 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1178 *devattr, char *buf)
1180 struct f71882fg_data *data = f71882fg_update_device(dev);
1181 int nr = to_sensor_dev_attr_2(devattr)->index;
1184 mutex_lock(&data->update_lock);
1186 temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1188 temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1189 temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1190 mutex_unlock(&data->update_lock);
1192 return sprintf(buf, "%d\n", temp_max_hyst);
1195 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1196 *devattr, const char *buf, size_t count)
1198 struct f71882fg_data *data = dev_get_drvdata(dev);
1199 int nr = to_sensor_dev_attr_2(devattr)->index;
1200 long val = simple_strtol(buf, NULL, 10) / 1000;
1201 ssize_t ret = count;
1204 mutex_lock(&data->update_lock);
1206 /* convert abs to relative and check */
1207 data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1208 val = SENSORS_LIMIT(val, data->temp_high[nr] - 15,
1209 data->temp_high[nr]);
1210 val = data->temp_high[nr] - val;
1212 /* convert value to register contents */
1213 reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1215 reg = (reg & 0x0f) | (val << 4);
1217 reg = (reg & 0xf0) | val;
1218 f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1219 data->temp_hyst[nr / 2] = reg;
1221 mutex_unlock(&data->update_lock);
1225 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1226 *devattr, char *buf)
1228 struct f71882fg_data *data = f71882fg_update_device(dev);
1229 int nr = to_sensor_dev_attr_2(devattr)->index;
1231 return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1234 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1235 *devattr, const char *buf, size_t count)
1237 struct f71882fg_data *data = dev_get_drvdata(dev);
1238 int nr = to_sensor_dev_attr_2(devattr)->index;
1239 long val = simple_strtol(buf, NULL, 10) / 1000;
1240 val = SENSORS_LIMIT(val, 0, 255);
1242 mutex_lock(&data->update_lock);
1243 f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1244 data->temp_ovt[nr] = val;
1245 mutex_unlock(&data->update_lock);
1250 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1251 *devattr, char *buf)
1253 struct f71882fg_data *data = f71882fg_update_device(dev);
1254 int nr = to_sensor_dev_attr_2(devattr)->index;
1257 mutex_lock(&data->update_lock);
1259 temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1261 temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1262 temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1263 mutex_unlock(&data->update_lock);
1265 return sprintf(buf, "%d\n", temp_crit_hyst);
1268 static ssize_t show_temp_type(struct device *dev, struct device_attribute
1269 *devattr, char *buf)
1271 struct f71882fg_data *data = f71882fg_update_device(dev);
1272 int nr = to_sensor_dev_attr_2(devattr)->index;
1274 return sprintf(buf, "%d\n", data->temp_type[nr]);
1277 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1278 *devattr, char *buf)
1280 struct f71882fg_data *data = f71882fg_update_device(dev);
1281 int nr = to_sensor_dev_attr_2(devattr)->index;
1283 if (data->temp_beep & (1 << nr))
1284 return sprintf(buf, "1\n");
1286 return sprintf(buf, "0\n");
1289 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1290 *devattr, const char *buf, size_t count)
1292 struct f71882fg_data *data = dev_get_drvdata(dev);
1293 int nr = to_sensor_dev_attr_2(devattr)->index;
1294 unsigned long val = simple_strtoul(buf, NULL, 10);
1296 mutex_lock(&data->update_lock);
1297 data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1299 data->temp_beep |= 1 << nr;
1301 data->temp_beep &= ~(1 << nr);
1303 f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1304 mutex_unlock(&data->update_lock);
1309 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1310 *devattr, char *buf)
1312 struct f71882fg_data *data = f71882fg_update_device(dev);
1313 int nr = to_sensor_dev_attr_2(devattr)->index;
1315 if (data->temp_status & (1 << nr))
1316 return sprintf(buf, "1\n");
1318 return sprintf(buf, "0\n");
1321 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1322 *devattr, char *buf)
1324 struct f71882fg_data *data = f71882fg_update_device(dev);
1325 int nr = to_sensor_dev_attr_2(devattr)->index;
1327 if (data->temp_diode_open & (1 << nr))
1328 return sprintf(buf, "1\n");
1330 return sprintf(buf, "0\n");
1333 static ssize_t show_pwm(struct device *dev,
1334 struct device_attribute *devattr, char *buf)
1336 struct f71882fg_data *data = f71882fg_update_device(dev);
1337 int val, nr = to_sensor_dev_attr_2(devattr)->index;
1338 mutex_lock(&data->update_lock);
1339 if (data->pwm_enable & (1 << (2 * nr)))
1341 val = data->pwm[nr];
1344 val = 255 * fan_from_reg(data->fan_target[nr])
1345 / fan_from_reg(data->fan_full_speed[nr]);
1347 mutex_unlock(&data->update_lock);
1348 return sprintf(buf, "%d\n", val);
1351 static ssize_t store_pwm(struct device *dev,
1352 struct device_attribute *devattr, const char *buf,
1355 struct f71882fg_data *data = dev_get_drvdata(dev);
1356 int nr = to_sensor_dev_attr_2(devattr)->index;
1357 long val = simple_strtol(buf, NULL, 10);
1358 val = SENSORS_LIMIT(val, 0, 255);
1360 mutex_lock(&data->update_lock);
1361 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1362 if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1363 (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1367 if (data->pwm_enable & (1 << (2 * nr))) {
1369 f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1370 data->pwm[nr] = val;
1373 int target, full_speed;
1374 full_speed = f71882fg_read16(data,
1375 F71882FG_REG_FAN_FULL_SPEED(nr));
1376 target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1377 f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1378 data->fan_target[nr] = target;
1379 data->fan_full_speed[nr] = full_speed;
1382 mutex_unlock(&data->update_lock);
1387 static ssize_t show_pwm_enable(struct device *dev,
1388 struct device_attribute *devattr, char *buf)
1391 struct f71882fg_data *data = f71882fg_update_device(dev);
1392 int nr = to_sensor_dev_attr_2(devattr)->index;
1394 switch ((data->pwm_enable >> 2 * nr) & 3) {
1397 result = 2; /* Normal auto mode */
1400 result = 1; /* Manual mode */
1403 if (data->type == f8000)
1404 result = 3; /* Thermostat mode */
1406 result = 1; /* Manual mode */
1410 return sprintf(buf, "%d\n", result);
1413 static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1414 *devattr, const char *buf, size_t count)
1416 struct f71882fg_data *data = dev_get_drvdata(dev);
1417 int nr = to_sensor_dev_attr_2(devattr)->index;
1418 long val = simple_strtol(buf, NULL, 10);
1420 mutex_lock(&data->update_lock);
1421 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1422 /* Special case for F8000 auto PWM mode / Thermostat mode */
1423 if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1426 data->pwm_enable &= ~(2 << (2 * nr));
1427 break; /* Normal auto mode */
1429 data->pwm_enable |= 2 << (2 * nr);
1430 break; /* Thermostat mode */
1438 data->pwm_enable |= 2 << (2 * nr);
1441 data->pwm_enable &= ~(2 << (2 * nr));
1442 break; /* Normal auto mode */
1448 f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1450 mutex_unlock(&data->update_lock);
1455 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1456 struct device_attribute *devattr,
1460 struct f71882fg_data *data = f71882fg_update_device(dev);
1461 int pwm = to_sensor_dev_attr_2(devattr)->index;
1462 int point = to_sensor_dev_attr_2(devattr)->nr;
1464 mutex_lock(&data->update_lock);
1465 if (data->pwm_enable & (1 << (2 * pwm))) {
1467 result = data->pwm_auto_point_pwm[pwm][point];
1470 result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1472 mutex_unlock(&data->update_lock);
1474 return sprintf(buf, "%d\n", result);
1477 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1478 struct device_attribute *devattr,
1479 const char *buf, size_t count)
1481 struct f71882fg_data *data = dev_get_drvdata(dev);
1482 int pwm = to_sensor_dev_attr_2(devattr)->index;
1483 int point = to_sensor_dev_attr_2(devattr)->nr;
1484 long val = simple_strtol(buf, NULL, 10);
1485 val = SENSORS_LIMIT(val, 0, 255);
1487 mutex_lock(&data->update_lock);
1488 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1489 if (data->pwm_enable & (1 << (2 * pwm))) {
1493 if (val < 29) /* Prevent negative numbers */
1496 val = (255 - val) * 32 / val;
1498 f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
1499 data->pwm_auto_point_pwm[pwm][point] = val;
1500 mutex_unlock(&data->update_lock);
1505 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
1506 struct device_attribute *devattr,
1510 struct f71882fg_data *data = f71882fg_update_device(dev);
1511 int nr = to_sensor_dev_attr_2(devattr)->index;
1512 int point = to_sensor_dev_attr_2(devattr)->nr;
1514 mutex_lock(&data->update_lock);
1516 result = data->pwm_auto_point_hyst[nr / 2] >> 4;
1518 result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
1519 result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
1520 mutex_unlock(&data->update_lock);
1522 return sprintf(buf, "%d\n", result);
1525 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
1526 struct device_attribute *devattr,
1527 const char *buf, size_t count)
1529 struct f71882fg_data *data = dev_get_drvdata(dev);
1530 int nr = to_sensor_dev_attr_2(devattr)->index;
1531 int point = to_sensor_dev_attr_2(devattr)->nr;
1532 long val = simple_strtol(buf, NULL, 10) / 1000;
1535 mutex_lock(&data->update_lock);
1536 data->pwm_auto_point_temp[nr][point] =
1537 f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
1538 val = SENSORS_LIMIT(val, data->pwm_auto_point_temp[nr][point] - 15,
1539 data->pwm_auto_point_temp[nr][point]);
1540 val = data->pwm_auto_point_temp[nr][point] - val;
1542 reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
1544 reg = (reg & 0x0f) | (val << 4);
1546 reg = (reg & 0xf0) | val;
1548 f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
1549 data->pwm_auto_point_hyst[nr / 2] = reg;
1550 mutex_unlock(&data->update_lock);
1555 static ssize_t show_pwm_interpolate(struct device *dev,
1556 struct device_attribute *devattr, char *buf)
1559 struct f71882fg_data *data = f71882fg_update_device(dev);
1560 int nr = to_sensor_dev_attr_2(devattr)->index;
1562 result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
1564 return sprintf(buf, "%d\n", result);
1567 static ssize_t store_pwm_interpolate(struct device *dev,
1568 struct device_attribute *devattr,
1569 const char *buf, size_t count)
1571 struct f71882fg_data *data = dev_get_drvdata(dev);
1572 int nr = to_sensor_dev_attr_2(devattr)->index;
1573 unsigned long val = simple_strtoul(buf, NULL, 10);
1575 mutex_lock(&data->update_lock);
1576 data->pwm_auto_point_mapping[nr] =
1577 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1579 val = data->pwm_auto_point_mapping[nr] | (1 << 4);
1581 val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
1582 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1583 data->pwm_auto_point_mapping[nr] = val;
1584 mutex_unlock(&data->update_lock);
1589 static ssize_t show_pwm_auto_point_channel(struct device *dev,
1590 struct device_attribute *devattr,
1594 struct f71882fg_data *data = f71882fg_update_device(dev);
1595 int nr = to_sensor_dev_attr_2(devattr)->index;
1597 result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) - 1);
1599 return sprintf(buf, "%d\n", result);
1602 static ssize_t store_pwm_auto_point_channel(struct device *dev,
1603 struct device_attribute *devattr,
1604 const char *buf, size_t count)
1606 struct f71882fg_data *data = dev_get_drvdata(dev);
1607 int nr = to_sensor_dev_attr_2(devattr)->index;
1608 long val = simple_strtol(buf, NULL, 10);
1622 mutex_lock(&data->update_lock);
1623 data->pwm_auto_point_mapping[nr] =
1624 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1625 val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
1626 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1627 data->pwm_auto_point_mapping[nr] = val;
1628 mutex_unlock(&data->update_lock);
1633 static ssize_t show_pwm_auto_point_temp(struct device *dev,
1634 struct device_attribute *devattr,
1638 struct f71882fg_data *data = f71882fg_update_device(dev);
1639 int pwm = to_sensor_dev_attr_2(devattr)->index;
1640 int point = to_sensor_dev_attr_2(devattr)->nr;
1642 result = data->pwm_auto_point_temp[pwm][point];
1643 return sprintf(buf, "%d\n", 1000 * result);
1646 static ssize_t store_pwm_auto_point_temp(struct device *dev,
1647 struct device_attribute *devattr,
1648 const char *buf, size_t count)
1650 struct f71882fg_data *data = dev_get_drvdata(dev);
1651 int pwm = to_sensor_dev_attr_2(devattr)->index;
1652 int point = to_sensor_dev_attr_2(devattr)->nr;
1653 long val = simple_strtol(buf, NULL, 10) / 1000;
1654 val = SENSORS_LIMIT(val, 0, 255);
1656 mutex_lock(&data->update_lock);
1657 f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
1658 data->pwm_auto_point_temp[pwm][point] = val;
1659 mutex_unlock(&data->update_lock);
1664 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
1667 struct f71882fg_data *data = dev_get_drvdata(dev);
1668 return sprintf(buf, "%s\n", f71882fg_names[data->type]);
1671 static int __devinit f71882fg_create_sysfs_files(struct platform_device *pdev,
1672 struct sensor_device_attribute_2 *attr, int count)
1676 for (i = 0; i < count; i++) {
1677 err = device_create_file(&pdev->dev, &attr[i].dev_attr);
1684 static int __devinit f71882fg_probe(struct platform_device *pdev)
1686 struct f71882fg_data *data;
1687 struct f71882fg_sio_data *sio_data = pdev->dev.platform_data;
1691 data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL);
1695 data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
1696 data->type = sio_data->type;
1697 mutex_init(&data->update_lock);
1698 platform_set_drvdata(pdev, data);
1700 start_reg = f71882fg_read8(data, F71882FG_REG_START);
1701 if (start_reg & 0x04) {
1702 dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
1706 if (!(start_reg & 0x03)) {
1707 dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
1712 /* If it is a 71862 and the fan / pwm part is enabled sanity check
1714 if (data->type == f71862fg && (start_reg & 0x02)) {
1715 u8 reg = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1716 if ((reg & 0x15) != 0x15) {
1718 "Invalid (reserved) pwm settings: 0x%02x\n",
1725 /* Register sysfs interface files */
1726 err = device_create_file(&pdev->dev, &dev_attr_name);
1728 goto exit_unregister_sysfs;
1730 if (start_reg & 0x01) {
1731 switch (data->type) {
1733 err = f71882fg_create_sysfs_files(pdev,
1734 f71882fg_in_temp_attr,
1735 ARRAY_SIZE(f71882fg_in_temp_attr));
1737 goto exit_unregister_sysfs;
1740 err = f71882fg_create_sysfs_files(pdev,
1741 f718x2fg_in_temp_attr,
1742 ARRAY_SIZE(f718x2fg_in_temp_attr));
1745 err = f71882fg_create_sysfs_files(pdev,
1747 ARRAY_SIZE(f8000_in_temp_attr));
1751 goto exit_unregister_sysfs;
1754 if (start_reg & 0x02) {
1755 err = f71882fg_create_sysfs_files(pdev, fxxxx_fan_attr,
1756 ARRAY_SIZE(fxxxx_fan_attr));
1758 goto exit_unregister_sysfs;
1760 switch (data->type) {
1762 err = f71882fg_create_sysfs_files(pdev,
1764 ARRAY_SIZE(f71862fg_fan_attr));
1767 err = f71882fg_create_sysfs_files(pdev,
1769 ARRAY_SIZE(f71882fg_fan_attr));
1772 err = f71882fg_create_sysfs_files(pdev,
1774 ARRAY_SIZE(f8000_fan_attr));
1778 goto exit_unregister_sysfs;
1781 data->hwmon_dev = hwmon_device_register(&pdev->dev);
1782 if (IS_ERR(data->hwmon_dev)) {
1783 err = PTR_ERR(data->hwmon_dev);
1784 data->hwmon_dev = NULL;
1785 goto exit_unregister_sysfs;
1790 exit_unregister_sysfs:
1791 f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
1792 return err; /* f71882fg_remove() also frees our data */
1798 static int f71882fg_remove(struct platform_device *pdev)
1801 struct f71882fg_data *data = platform_get_drvdata(pdev);
1803 platform_set_drvdata(pdev, NULL);
1804 if (data->hwmon_dev)
1805 hwmon_device_unregister(data->hwmon_dev);
1807 /* Note we are not looping over all attr arrays we have as the ones
1808 below are supersets of the ones skipped. */
1809 device_remove_file(&pdev->dev, &dev_attr_name);
1811 for (i = 0; i < ARRAY_SIZE(f718x2fg_in_temp_attr); i++)
1812 device_remove_file(&pdev->dev,
1813 &f718x2fg_in_temp_attr[i].dev_attr);
1815 for (i = 0; i < ARRAY_SIZE(f71882fg_in_temp_attr); i++)
1816 device_remove_file(&pdev->dev,
1817 &f71882fg_in_temp_attr[i].dev_attr);
1819 for (i = 0; i < ARRAY_SIZE(fxxxx_fan_attr); i++)
1820 device_remove_file(&pdev->dev, &fxxxx_fan_attr[i].dev_attr);
1822 for (i = 0; i < ARRAY_SIZE(f71882fg_fan_attr); i++)
1823 device_remove_file(&pdev->dev, &f71882fg_fan_attr[i].dev_attr);
1825 for (i = 0; i < ARRAY_SIZE(f8000_fan_attr); i++)
1826 device_remove_file(&pdev->dev, &f8000_fan_attr[i].dev_attr);
1833 static int __init f71882fg_find(int sioaddr, unsigned short *address,
1834 struct f71882fg_sio_data *sio_data)
1839 superio_enter(sioaddr);
1841 devid = superio_inw(sioaddr, SIO_REG_MANID);
1842 if (devid != SIO_FINTEK_ID) {
1843 printk(KERN_INFO DRVNAME ": Not a Fintek device\n");
1847 devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
1850 sio_data->type = f71862fg;
1853 sio_data->type = f71882fg;
1856 sio_data->type = f8000;
1859 printk(KERN_INFO DRVNAME ": Unsupported Fintek device\n");
1863 superio_select(sioaddr, SIO_F71882FG_LD_HWM);
1864 if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
1865 printk(KERN_WARNING DRVNAME ": Device not activated\n");
1869 *address = superio_inw(sioaddr, SIO_REG_ADDR);
1872 printk(KERN_WARNING DRVNAME ": Base address not set\n");
1875 *address &= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */
1878 printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %d\n",
1879 f71882fg_names[sio_data->type], (unsigned int)*address,
1880 (int)superio_inb(sioaddr, SIO_REG_DEVREV));
1882 superio_exit(sioaddr);
1886 static int __init f71882fg_device_add(unsigned short address,
1887 const struct f71882fg_sio_data *sio_data)
1889 struct resource res = {
1891 .end = address + REGION_LENGTH - 1,
1892 .flags = IORESOURCE_IO,
1896 f71882fg_pdev = platform_device_alloc(DRVNAME, address);
1900 res.name = f71882fg_pdev->name;
1901 err = platform_device_add_resources(f71882fg_pdev, &res, 1);
1903 printk(KERN_ERR DRVNAME ": Device resource addition failed\n");
1904 goto exit_device_put;
1907 err = platform_device_add_data(f71882fg_pdev, sio_data,
1908 sizeof(struct f71882fg_sio_data));
1910 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
1911 goto exit_device_put;
1914 err = platform_device_add(f71882fg_pdev);
1916 printk(KERN_ERR DRVNAME ": Device addition failed\n");
1917 goto exit_device_put;
1923 platform_device_put(f71882fg_pdev);
1928 static int __init f71882fg_init(void)
1931 unsigned short address;
1932 struct f71882fg_sio_data sio_data;
1934 memset(&sio_data, 0, sizeof(sio_data));
1936 if (f71882fg_find(0x2e, &address, &sio_data) &&
1937 f71882fg_find(0x4e, &address, &sio_data))
1940 err = platform_driver_register(&f71882fg_driver);
1944 err = f71882fg_device_add(address, &sio_data);
1951 platform_driver_unregister(&f71882fg_driver);
1956 static void __exit f71882fg_exit(void)
1958 platform_device_unregister(f71882fg_pdev);
1959 platform_driver_unregister(&f71882fg_driver);
1962 MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
1963 MODULE_AUTHOR("Hans Edgington, Hans de Goede (hdegoede@redhat.com)");
1964 MODULE_LICENSE("GPL");
1966 module_init(f71882fg_init);
1967 module_exit(f71882fg_exit);