drivers/video/backlight/jornada720_*.c: make needlessly global symbols static
[deliverable/linux.git] / drivers / hwmon / f71882fg.c
1 /***************************************************************************
2 * Copyright (C) 2006 by Hans Edgington <hans@edgington.nl> *
3 * Copyright (C) 2007-2011 Hans de Goede <hdegoede@redhat.com> *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20
21 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
22
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>
32 #include <linux/io.h>
33 #include <linux/acpi.h>
34
35 #define DRVNAME "f71882fg"
36
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 */
41
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) */
48
49 #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */
50 #define SIO_F71808E_ID 0x0901 /* Chipset ID */
51 #define SIO_F71858_ID 0x0507 /* Chipset ID */
52 #define SIO_F71862_ID 0x0601 /* Chipset ID */
53 #define SIO_F71869_ID 0x0814 /* Chipset ID */
54 #define SIO_F71882_ID 0x0541 /* Chipset ID */
55 #define SIO_F71889_ID 0x0723 /* Chipset ID */
56 #define SIO_F71889E_ID 0x0909 /* Chipset ID */
57 #define SIO_F8000_ID 0x0581 /* Chipset ID */
58
59 #define REGION_LENGTH 8
60 #define ADDR_REG_OFFSET 5
61 #define DATA_REG_OFFSET 6
62
63 #define F71882FG_REG_IN_STATUS 0x12 /* f7188x only */
64 #define F71882FG_REG_IN_BEEP 0x13 /* f7188x only */
65 #define F71882FG_REG_IN(nr) (0x20 + (nr))
66 #define F71882FG_REG_IN1_HIGH 0x32 /* f7188x only */
67
68 #define F71882FG_REG_FAN(nr) (0xA0 + (16 * (nr)))
69 #define F71882FG_REG_FAN_TARGET(nr) (0xA2 + (16 * (nr)))
70 #define F71882FG_REG_FAN_FULL_SPEED(nr) (0xA4 + (16 * (nr)))
71 #define F71882FG_REG_FAN_STATUS 0x92
72 #define F71882FG_REG_FAN_BEEP 0x93
73
74 #define F71882FG_REG_TEMP(nr) (0x70 + 2 * (nr))
75 #define F71882FG_REG_TEMP_OVT(nr) (0x80 + 2 * (nr))
76 #define F71882FG_REG_TEMP_HIGH(nr) (0x81 + 2 * (nr))
77 #define F71882FG_REG_TEMP_STATUS 0x62
78 #define F71882FG_REG_TEMP_BEEP 0x63
79 #define F71882FG_REG_TEMP_CONFIG 0x69
80 #define F71882FG_REG_TEMP_HYST(nr) (0x6C + (nr))
81 #define F71882FG_REG_TEMP_TYPE 0x6B
82 #define F71882FG_REG_TEMP_DIODE_OPEN 0x6F
83
84 #define F71882FG_REG_PWM(nr) (0xA3 + (16 * (nr)))
85 #define F71882FG_REG_PWM_TYPE 0x94
86 #define F71882FG_REG_PWM_ENABLE 0x96
87
88 #define F71882FG_REG_FAN_HYST(nr) (0x98 + (nr))
89
90 #define F71882FG_REG_FAN_FAULT_T 0x9F
91 #define F71882FG_FAN_NEG_TEMP_EN 0x20
92 #define F71882FG_FAN_PROG_SEL 0x80
93
94 #define F71882FG_REG_POINT_PWM(pwm, point) (0xAA + (point) + (16 * (pwm)))
95 #define F71882FG_REG_POINT_TEMP(pwm, point) (0xA6 + (point) + (16 * (pwm)))
96 #define F71882FG_REG_POINT_MAPPING(nr) (0xAF + 16 * (nr))
97
98 #define F71882FG_REG_START 0x01
99
100 #define F71882FG_MAX_INS 9
101
102 #define FAN_MIN_DETECT 366 /* Lowest detectable fanspeed */
103
104 static unsigned short force_id;
105 module_param(force_id, ushort, 0);
106 MODULE_PARM_DESC(force_id, "Override the detected device ID");
107
108 enum chips { f71808e, f71858fg, f71862fg, f71869, f71882fg, f71889fg,
109 f71889ed, f8000 };
110
111 static const char *f71882fg_names[] = {
112 "f71808e",
113 "f71858fg",
114 "f71862fg",
115 "f71869", /* Both f71869f and f71869e, reg. compatible and same id */
116 "f71882fg",
117 "f71889fg",
118 "f71889ed",
119 "f8000",
120 };
121
122 static const char f71882fg_has_in[8][F71882FG_MAX_INS] = {
123 { 1, 1, 1, 1, 1, 1, 0, 1, 1 }, /* f71808e */
124 { 1, 1, 1, 0, 0, 0, 0, 0, 0 }, /* f71858fg */
125 { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71862fg */
126 { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71869 */
127 { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71882fg */
128 { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71889fg */
129 { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71889ed */
130 { 1, 1, 1, 0, 0, 0, 0, 0, 0 }, /* f8000 */
131 };
132
133 static const char f71882fg_has_in1_alarm[8] = {
134 0, /* f71808e */
135 0, /* f71858fg */
136 0, /* f71862fg */
137 0, /* f71869 */
138 1, /* f71882fg */
139 1, /* f71889fg */
140 1, /* f71889ed */
141 0, /* f8000 */
142 };
143
144 static const char f71882fg_has_beep[8] = {
145 0, /* f71808e */
146 0, /* f71858fg */
147 1, /* f71862fg */
148 1, /* f71869 */
149 1, /* f71882fg */
150 1, /* f71889fg */
151 1, /* f71889ed */
152 0, /* f8000 */
153 };
154
155 static struct platform_device *f71882fg_pdev;
156
157 /* Super-I/O Function prototypes */
158 static inline int superio_inb(int base, int reg);
159 static inline int superio_inw(int base, int reg);
160 static inline int superio_enter(int base);
161 static inline void superio_select(int base, int ld);
162 static inline void superio_exit(int base);
163
164 struct f71882fg_sio_data {
165 enum chips type;
166 };
167
168 struct f71882fg_data {
169 unsigned short addr;
170 enum chips type;
171 struct device *hwmon_dev;
172
173 struct mutex update_lock;
174 int temp_start; /* temp numbering start (0 or 1) */
175 char valid; /* !=0 if following fields are valid */
176 char auto_point_temp_signed;
177 unsigned long last_updated; /* In jiffies */
178 unsigned long last_limits; /* In jiffies */
179
180 /* Register Values */
181 u8 in[F71882FG_MAX_INS];
182 u8 in1_max;
183 u8 in_status;
184 u8 in_beep;
185 u16 fan[4];
186 u16 fan_target[4];
187 u16 fan_full_speed[4];
188 u8 fan_status;
189 u8 fan_beep;
190 /* Note: all models have max 3 temperature channels, but on some
191 they are addressed as 0-2 and on others as 1-3, so for coding
192 convenience we reserve space for 4 channels */
193 u16 temp[4];
194 u8 temp_ovt[4];
195 u8 temp_high[4];
196 u8 temp_hyst[2]; /* 2 hysts stored per reg */
197 u8 temp_type[4];
198 u8 temp_status;
199 u8 temp_beep;
200 u8 temp_diode_open;
201 u8 temp_config;
202 u8 pwm[4];
203 u8 pwm_enable;
204 u8 pwm_auto_point_hyst[2];
205 u8 pwm_auto_point_mapping[4];
206 u8 pwm_auto_point_pwm[4][5];
207 s8 pwm_auto_point_temp[4][4];
208 };
209
210 /* Sysfs in */
211 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
212 char *buf);
213 static ssize_t show_in_max(struct device *dev, struct device_attribute
214 *devattr, char *buf);
215 static ssize_t store_in_max(struct device *dev, struct device_attribute
216 *devattr, const char *buf, size_t count);
217 static ssize_t show_in_beep(struct device *dev, struct device_attribute
218 *devattr, char *buf);
219 static ssize_t store_in_beep(struct device *dev, struct device_attribute
220 *devattr, const char *buf, size_t count);
221 static ssize_t show_in_alarm(struct device *dev, struct device_attribute
222 *devattr, char *buf);
223 /* Sysfs Fan */
224 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
225 char *buf);
226 static ssize_t show_fan_full_speed(struct device *dev,
227 struct device_attribute *devattr, char *buf);
228 static ssize_t store_fan_full_speed(struct device *dev,
229 struct device_attribute *devattr, const char *buf, size_t count);
230 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
231 *devattr, char *buf);
232 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
233 *devattr, const char *buf, size_t count);
234 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
235 *devattr, char *buf);
236 /* Sysfs Temp */
237 static ssize_t show_temp(struct device *dev, struct device_attribute
238 *devattr, char *buf);
239 static ssize_t show_temp_max(struct device *dev, struct device_attribute
240 *devattr, char *buf);
241 static ssize_t store_temp_max(struct device *dev, struct device_attribute
242 *devattr, const char *buf, size_t count);
243 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
244 *devattr, char *buf);
245 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
246 *devattr, const char *buf, size_t count);
247 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
248 *devattr, char *buf);
249 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
250 *devattr, const char *buf, size_t count);
251 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
252 *devattr, char *buf);
253 static ssize_t show_temp_type(struct device *dev, struct device_attribute
254 *devattr, char *buf);
255 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
256 *devattr, char *buf);
257 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
258 *devattr, const char *buf, size_t count);
259 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
260 *devattr, char *buf);
261 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
262 *devattr, char *buf);
263 /* PWM and Auto point control */
264 static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
265 char *buf);
266 static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
267 const char *buf, size_t count);
268 static ssize_t show_pwm_enable(struct device *dev,
269 struct device_attribute *devattr, char *buf);
270 static ssize_t store_pwm_enable(struct device *dev,
271 struct device_attribute *devattr, const char *buf, size_t count);
272 static ssize_t show_pwm_interpolate(struct device *dev,
273 struct device_attribute *devattr, char *buf);
274 static ssize_t store_pwm_interpolate(struct device *dev,
275 struct device_attribute *devattr, const char *buf, size_t count);
276 static ssize_t show_pwm_auto_point_channel(struct device *dev,
277 struct device_attribute *devattr, char *buf);
278 static ssize_t store_pwm_auto_point_channel(struct device *dev,
279 struct device_attribute *devattr, const char *buf, size_t count);
280 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
281 struct device_attribute *devattr, char *buf);
282 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
283 struct device_attribute *devattr, const char *buf, size_t count);
284 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
285 struct device_attribute *devattr, char *buf);
286 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
287 struct device_attribute *devattr, const char *buf, size_t count);
288 static ssize_t show_pwm_auto_point_temp(struct device *dev,
289 struct device_attribute *devattr, char *buf);
290 static ssize_t store_pwm_auto_point_temp(struct device *dev,
291 struct device_attribute *devattr, const char *buf, size_t count);
292 /* Sysfs misc */
293 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
294 char *buf);
295
296 static int __devinit f71882fg_probe(struct platform_device * pdev);
297 static int f71882fg_remove(struct platform_device *pdev);
298
299 static struct platform_driver f71882fg_driver = {
300 .driver = {
301 .owner = THIS_MODULE,
302 .name = DRVNAME,
303 },
304 .probe = f71882fg_probe,
305 .remove = f71882fg_remove,
306 };
307
308 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
309
310 /* Temp attr for the f71858fg, the f71858fg is special as it has its
311 temperature indexes start at 0 (the others start at 1) */
312 static struct sensor_device_attribute_2 f71858fg_temp_attr[] = {
313 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
314 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
315 store_temp_max, 0, 0),
316 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
317 store_temp_max_hyst, 0, 0),
318 SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 0),
319 SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
320 store_temp_crit, 0, 0),
321 SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
322 0, 0),
323 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
324 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
325 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
326 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
327 store_temp_max, 0, 1),
328 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
329 store_temp_max_hyst, 0, 1),
330 SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
331 SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
332 store_temp_crit, 0, 1),
333 SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
334 0, 1),
335 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
336 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
337 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
338 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
339 store_temp_max, 0, 2),
340 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
341 store_temp_max_hyst, 0, 2),
342 SENSOR_ATTR_2(temp3_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
343 SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
344 store_temp_crit, 0, 2),
345 SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
346 0, 2),
347 SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
348 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
349 };
350
351 /* Temp attr for the standard models */
352 static struct sensor_device_attribute_2 fxxxx_temp_attr[3][9] = { {
353 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
354 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
355 store_temp_max, 0, 1),
356 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
357 store_temp_max_hyst, 0, 1),
358 /* Should really be temp1_max_alarm, but older versions did not handle
359 the max and crit alarms separately and lm_sensors v2 depends on the
360 presence of temp#_alarm files. The same goes for temp2/3 _alarm. */
361 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
362 SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
363 store_temp_crit, 0, 1),
364 SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
365 0, 1),
366 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
367 SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1),
368 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
369 }, {
370 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2),
371 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
372 store_temp_max, 0, 2),
373 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
374 store_temp_max_hyst, 0, 2),
375 /* Should be temp2_max_alarm, see temp1_alarm note */
376 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
377 SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
378 store_temp_crit, 0, 2),
379 SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
380 0, 2),
381 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
382 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
383 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
384 }, {
385 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
386 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
387 store_temp_max, 0, 3),
388 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
389 store_temp_max_hyst, 0, 3),
390 /* Should be temp3_max_alarm, see temp1_alarm note */
391 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3),
392 SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
393 store_temp_crit, 0, 3),
394 SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
395 0, 3),
396 SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 7),
397 SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3),
398 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3),
399 } };
400
401 /* Temp attr for models which can beep on temp alarm */
402 static struct sensor_device_attribute_2 fxxxx_temp_beep_attr[3][2] = { {
403 SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
404 store_temp_beep, 0, 1),
405 SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
406 store_temp_beep, 0, 5),
407 }, {
408 SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
409 store_temp_beep, 0, 2),
410 SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
411 store_temp_beep, 0, 6),
412 }, {
413 SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
414 store_temp_beep, 0, 3),
415 SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
416 store_temp_beep, 0, 7),
417 } };
418
419 /* Temp attr for the f8000
420 Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max)
421 is used as hysteresis value to clear alarms
422 Also like the f71858fg its temperature indexes start at 0
423 */
424 static struct sensor_device_attribute_2 f8000_temp_attr[] = {
425 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
426 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_crit,
427 store_temp_crit, 0, 0),
428 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
429 store_temp_max, 0, 0),
430 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
431 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
432 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
433 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_crit,
434 store_temp_crit, 0, 1),
435 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
436 store_temp_max, 0, 1),
437 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
438 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
439 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
440 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_crit,
441 store_temp_crit, 0, 2),
442 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
443 store_temp_max, 0, 2),
444 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
445 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
446 };
447
448 /* in attr for all models */
449 static struct sensor_device_attribute_2 fxxxx_in_attr[] = {
450 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
451 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
452 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
453 SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3),
454 SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4),
455 SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5),
456 SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
457 SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
458 SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
459 };
460
461 /* For models with in1 alarm capability */
462 static struct sensor_device_attribute_2 fxxxx_in1_alarm_attr[] = {
463 SENSOR_ATTR_2(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max,
464 0, 1),
465 SENSOR_ATTR_2(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep,
466 0, 1),
467 SENSOR_ATTR_2(in1_alarm, S_IRUGO, show_in_alarm, NULL, 0, 1),
468 };
469
470 /* Fan / PWM attr common to all models */
471 static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { {
472 SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0),
473 SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR,
474 show_fan_full_speed,
475 store_fan_full_speed, 0, 0),
476 SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0),
477 SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0),
478 SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
479 store_pwm_enable, 0, 0),
480 SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR,
481 show_pwm_interpolate, store_pwm_interpolate, 0, 0),
482 }, {
483 SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
484 SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
485 show_fan_full_speed,
486 store_fan_full_speed, 0, 1),
487 SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
488 SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1),
489 SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
490 store_pwm_enable, 0, 1),
491 SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR,
492 show_pwm_interpolate, store_pwm_interpolate, 0, 1),
493 }, {
494 SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
495 SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
496 show_fan_full_speed,
497 store_fan_full_speed, 0, 2),
498 SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
499 SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
500 SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
501 store_pwm_enable, 0, 2),
502 SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR,
503 show_pwm_interpolate, store_pwm_interpolate, 0, 2),
504 }, {
505 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
506 SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
507 show_fan_full_speed,
508 store_fan_full_speed, 0, 3),
509 SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
510 SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
511 SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
512 store_pwm_enable, 0, 3),
513 SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
514 show_pwm_interpolate, store_pwm_interpolate, 0, 3),
515 } };
516
517 /* Attr for models which can beep on Fan alarm */
518 static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = {
519 SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
520 store_fan_beep, 0, 0),
521 SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
522 store_fan_beep, 0, 1),
523 SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
524 store_fan_beep, 0, 2),
525 SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
526 store_fan_beep, 0, 3),
527 };
528
529 /* PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the
530 standard models */
531 static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[] = {
532 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
533 show_pwm_auto_point_channel,
534 store_pwm_auto_point_channel, 0, 0),
535 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
536 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
537 1, 0),
538 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
539 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
540 4, 0),
541 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
542 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
543 0, 0),
544 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
545 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
546 3, 0),
547 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
548 show_pwm_auto_point_temp_hyst,
549 store_pwm_auto_point_temp_hyst,
550 0, 0),
551 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
552 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
553
554 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
555 show_pwm_auto_point_channel,
556 store_pwm_auto_point_channel, 0, 1),
557 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
558 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
559 1, 1),
560 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
561 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
562 4, 1),
563 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
564 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
565 0, 1),
566 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
567 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
568 3, 1),
569 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
570 show_pwm_auto_point_temp_hyst,
571 store_pwm_auto_point_temp_hyst,
572 0, 1),
573 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
574 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
575
576 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
577 show_pwm_auto_point_channel,
578 store_pwm_auto_point_channel, 0, 2),
579 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
580 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
581 1, 2),
582 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
583 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
584 4, 2),
585 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
586 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
587 0, 2),
588 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
589 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
590 3, 2),
591 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
592 show_pwm_auto_point_temp_hyst,
593 store_pwm_auto_point_temp_hyst,
594 0, 2),
595 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
596 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
597 };
598
599 /* PWM attr for the f71808e/f71869, almost identical to the f71862fg, but the
600 pwm setting when the temperature is above the pwmX_auto_point1_temp can be
601 programmed instead of being hardcoded to 0xff */
602 static struct sensor_device_attribute_2 f71869_auto_pwm_attr[] = {
603 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
604 show_pwm_auto_point_channel,
605 store_pwm_auto_point_channel, 0, 0),
606 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
607 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
608 0, 0),
609 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
610 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
611 1, 0),
612 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
613 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
614 4, 0),
615 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
616 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
617 0, 0),
618 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
619 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
620 3, 0),
621 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
622 show_pwm_auto_point_temp_hyst,
623 store_pwm_auto_point_temp_hyst,
624 0, 0),
625 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
626 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
627
628 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
629 show_pwm_auto_point_channel,
630 store_pwm_auto_point_channel, 0, 1),
631 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
632 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
633 0, 1),
634 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
635 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
636 1, 1),
637 SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
638 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
639 4, 1),
640 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
641 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
642 0, 1),
643 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
644 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
645 3, 1),
646 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
647 show_pwm_auto_point_temp_hyst,
648 store_pwm_auto_point_temp_hyst,
649 0, 1),
650 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
651 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
652
653 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
654 show_pwm_auto_point_channel,
655 store_pwm_auto_point_channel, 0, 2),
656 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
657 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
658 0, 2),
659 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
660 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
661 1, 2),
662 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
663 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
664 4, 2),
665 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
666 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
667 0, 2),
668 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
669 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
670 3, 2),
671 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
672 show_pwm_auto_point_temp_hyst,
673 store_pwm_auto_point_temp_hyst,
674 0, 2),
675 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
676 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
677 };
678
679 /* PWM attr for the standard models */
680 static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { {
681 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
682 show_pwm_auto_point_channel,
683 store_pwm_auto_point_channel, 0, 0),
684 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
685 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
686 0, 0),
687 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
688 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
689 1, 0),
690 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
691 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
692 2, 0),
693 SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR,
694 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
695 3, 0),
696 SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR,
697 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
698 4, 0),
699 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
700 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
701 0, 0),
702 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
703 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
704 1, 0),
705 SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR,
706 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
707 2, 0),
708 SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR,
709 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
710 3, 0),
711 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
712 show_pwm_auto_point_temp_hyst,
713 store_pwm_auto_point_temp_hyst,
714 0, 0),
715 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
716 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
717 SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO,
718 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
719 SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
720 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
721 }, {
722 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
723 show_pwm_auto_point_channel,
724 store_pwm_auto_point_channel, 0, 1),
725 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
726 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
727 0, 1),
728 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
729 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
730 1, 1),
731 SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
732 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
733 2, 1),
734 SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR,
735 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
736 3, 1),
737 SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR,
738 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
739 4, 1),
740 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
741 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
742 0, 1),
743 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
744 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
745 1, 1),
746 SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR,
747 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
748 2, 1),
749 SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR,
750 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
751 3, 1),
752 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
753 show_pwm_auto_point_temp_hyst,
754 store_pwm_auto_point_temp_hyst,
755 0, 1),
756 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
757 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
758 SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO,
759 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
760 SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
761 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
762 }, {
763 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
764 show_pwm_auto_point_channel,
765 store_pwm_auto_point_channel, 0, 2),
766 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
767 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
768 0, 2),
769 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
770 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
771 1, 2),
772 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
773 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
774 2, 2),
775 SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR,
776 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
777 3, 2),
778 SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR,
779 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
780 4, 2),
781 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
782 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
783 0, 2),
784 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
785 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
786 1, 2),
787 SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR,
788 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
789 2, 2),
790 SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR,
791 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
792 3, 2),
793 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
794 show_pwm_auto_point_temp_hyst,
795 store_pwm_auto_point_temp_hyst,
796 0, 2),
797 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
798 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
799 SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO,
800 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
801 SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
802 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
803 }, {
804 SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
805 show_pwm_auto_point_channel,
806 store_pwm_auto_point_channel, 0, 3),
807 SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR,
808 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
809 0, 3),
810 SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR,
811 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
812 1, 3),
813 SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR,
814 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
815 2, 3),
816 SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR,
817 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
818 3, 3),
819 SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR,
820 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
821 4, 3),
822 SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR,
823 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
824 0, 3),
825 SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR,
826 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
827 1, 3),
828 SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR,
829 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
830 2, 3),
831 SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR,
832 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
833 3, 3),
834 SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
835 show_pwm_auto_point_temp_hyst,
836 store_pwm_auto_point_temp_hyst,
837 0, 3),
838 SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO,
839 show_pwm_auto_point_temp_hyst, NULL, 1, 3),
840 SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO,
841 show_pwm_auto_point_temp_hyst, NULL, 2, 3),
842 SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
843 show_pwm_auto_point_temp_hyst, NULL, 3, 3),
844 } };
845
846 /* Fan attr specific to the f8000 (4th fan input can only measure speed) */
847 static struct sensor_device_attribute_2 f8000_fan_attr[] = {
848 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
849 };
850
851 /* PWM attr for the f8000, zones mapped to temp instead of to pwm!
852 Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
853 F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0 */
854 static struct sensor_device_attribute_2 f8000_auto_pwm_attr[] = {
855 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
856 show_pwm_auto_point_channel,
857 store_pwm_auto_point_channel, 0, 0),
858 SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR,
859 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
860 0, 2),
861 SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR,
862 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
863 1, 2),
864 SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR,
865 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
866 2, 2),
867 SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR,
868 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
869 3, 2),
870 SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR,
871 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
872 4, 2),
873 SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR,
874 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
875 0, 2),
876 SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR,
877 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
878 1, 2),
879 SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR,
880 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
881 2, 2),
882 SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR,
883 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
884 3, 2),
885 SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
886 show_pwm_auto_point_temp_hyst,
887 store_pwm_auto_point_temp_hyst,
888 0, 2),
889 SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO,
890 show_pwm_auto_point_temp_hyst, NULL, 1, 2),
891 SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO,
892 show_pwm_auto_point_temp_hyst, NULL, 2, 2),
893 SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO,
894 show_pwm_auto_point_temp_hyst, NULL, 3, 2),
895
896 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
897 show_pwm_auto_point_channel,
898 store_pwm_auto_point_channel, 0, 1),
899 SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR,
900 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
901 0, 0),
902 SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR,
903 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
904 1, 0),
905 SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR,
906 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
907 2, 0),
908 SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR,
909 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
910 3, 0),
911 SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR,
912 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
913 4, 0),
914 SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR,
915 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
916 0, 0),
917 SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR,
918 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
919 1, 0),
920 SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR,
921 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
922 2, 0),
923 SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR,
924 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
925 3, 0),
926 SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
927 show_pwm_auto_point_temp_hyst,
928 store_pwm_auto_point_temp_hyst,
929 0, 0),
930 SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO,
931 show_pwm_auto_point_temp_hyst, NULL, 1, 0),
932 SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO,
933 show_pwm_auto_point_temp_hyst, NULL, 2, 0),
934 SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO,
935 show_pwm_auto_point_temp_hyst, NULL, 3, 0),
936
937 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
938 show_pwm_auto_point_channel,
939 store_pwm_auto_point_channel, 0, 2),
940 SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR,
941 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
942 0, 1),
943 SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR,
944 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
945 1, 1),
946 SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR,
947 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
948 2, 1),
949 SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR,
950 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
951 3, 1),
952 SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR,
953 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
954 4, 1),
955 SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR,
956 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
957 0, 1),
958 SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR,
959 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
960 1, 1),
961 SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR,
962 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
963 2, 1),
964 SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR,
965 show_pwm_auto_point_temp, store_pwm_auto_point_temp,
966 3, 1),
967 SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
968 show_pwm_auto_point_temp_hyst,
969 store_pwm_auto_point_temp_hyst,
970 0, 1),
971 SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO,
972 show_pwm_auto_point_temp_hyst, NULL, 1, 1),
973 SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO,
974 show_pwm_auto_point_temp_hyst, NULL, 2, 1),
975 SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO,
976 show_pwm_auto_point_temp_hyst, NULL, 3, 1),
977 };
978
979 /* Super I/O functions */
980 static inline int superio_inb(int base, int reg)
981 {
982 outb(reg, base);
983 return inb(base + 1);
984 }
985
986 static int superio_inw(int base, int reg)
987 {
988 int val;
989 val = superio_inb(base, reg) << 8;
990 val |= superio_inb(base, reg + 1);
991 return val;
992 }
993
994 static inline int superio_enter(int base)
995 {
996 /* Don't step on other drivers' I/O space by accident */
997 if (!request_muxed_region(base, 2, DRVNAME)) {
998 pr_err("I/O address 0x%04x already in use\n", base);
999 return -EBUSY;
1000 }
1001
1002 /* according to the datasheet the key must be send twice! */
1003 outb(SIO_UNLOCK_KEY, base);
1004 outb(SIO_UNLOCK_KEY, base);
1005
1006 return 0;
1007 }
1008
1009 static inline void superio_select(int base, int ld)
1010 {
1011 outb(SIO_REG_LDSEL, base);
1012 outb(ld, base + 1);
1013 }
1014
1015 static inline void superio_exit(int base)
1016 {
1017 outb(SIO_LOCK_KEY, base);
1018 release_region(base, 2);
1019 }
1020
1021 static inline int fan_from_reg(u16 reg)
1022 {
1023 return reg ? (1500000 / reg) : 0;
1024 }
1025
1026 static inline u16 fan_to_reg(int fan)
1027 {
1028 return fan ? (1500000 / fan) : 0;
1029 }
1030
1031 static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
1032 {
1033 u8 val;
1034
1035 outb(reg, data->addr + ADDR_REG_OFFSET);
1036 val = inb(data->addr + DATA_REG_OFFSET);
1037
1038 return val;
1039 }
1040
1041 static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
1042 {
1043 u16 val;
1044
1045 val = f71882fg_read8(data, reg) << 8;
1046 val |= f71882fg_read8(data, reg + 1);
1047
1048 return val;
1049 }
1050
1051 static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
1052 {
1053 outb(reg, data->addr + ADDR_REG_OFFSET);
1054 outb(val, data->addr + DATA_REG_OFFSET);
1055 }
1056
1057 static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
1058 {
1059 f71882fg_write8(data, reg, val >> 8);
1060 f71882fg_write8(data, reg + 1, val & 0xff);
1061 }
1062
1063 static u16 f71882fg_read_temp(struct f71882fg_data *data, int nr)
1064 {
1065 if (data->type == f71858fg)
1066 return f71882fg_read16(data, F71882FG_REG_TEMP(nr));
1067 else
1068 return f71882fg_read8(data, F71882FG_REG_TEMP(nr));
1069 }
1070
1071 static struct f71882fg_data *f71882fg_update_device(struct device *dev)
1072 {
1073 struct f71882fg_data *data = dev_get_drvdata(dev);
1074 int nr, reg, point;
1075 int nr_fans = (data->type == f71882fg) ? 4 : 3;
1076 int nr_temps = (data->type == f71808e) ? 2 : 3;
1077
1078 mutex_lock(&data->update_lock);
1079
1080 /* Update once every 60 seconds */
1081 if (time_after(jiffies, data->last_limits + 60 * HZ) ||
1082 !data->valid) {
1083 if (f71882fg_has_in1_alarm[data->type]) {
1084 data->in1_max =
1085 f71882fg_read8(data, F71882FG_REG_IN1_HIGH);
1086 data->in_beep =
1087 f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1088 }
1089
1090 /* Get High & boundary temps*/
1091 for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1092 nr++) {
1093 data->temp_ovt[nr] = f71882fg_read8(data,
1094 F71882FG_REG_TEMP_OVT(nr));
1095 data->temp_high[nr] = f71882fg_read8(data,
1096 F71882FG_REG_TEMP_HIGH(nr));
1097 }
1098
1099 if (data->type != f8000) {
1100 data->temp_hyst[0] = f71882fg_read8(data,
1101 F71882FG_REG_TEMP_HYST(0));
1102 data->temp_hyst[1] = f71882fg_read8(data,
1103 F71882FG_REG_TEMP_HYST(1));
1104 }
1105 /* All but the f71858fg / f8000 have this register */
1106 if ((data->type != f71858fg) && (data->type != f8000)) {
1107 reg = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
1108 data->temp_type[1] = (reg & 0x02) ? 2 : 4;
1109 data->temp_type[2] = (reg & 0x04) ? 2 : 4;
1110 data->temp_type[3] = (reg & 0x08) ? 2 : 4;
1111 }
1112
1113 if (f71882fg_has_beep[data->type]) {
1114 data->fan_beep = f71882fg_read8(data,
1115 F71882FG_REG_FAN_BEEP);
1116 data->temp_beep = f71882fg_read8(data,
1117 F71882FG_REG_TEMP_BEEP);
1118 }
1119
1120 data->pwm_enable = f71882fg_read8(data,
1121 F71882FG_REG_PWM_ENABLE);
1122 data->pwm_auto_point_hyst[0] =
1123 f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
1124 data->pwm_auto_point_hyst[1] =
1125 f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
1126
1127 for (nr = 0; nr < nr_fans; nr++) {
1128 data->pwm_auto_point_mapping[nr] =
1129 f71882fg_read8(data,
1130 F71882FG_REG_POINT_MAPPING(nr));
1131
1132 switch (data->type) {
1133 default:
1134 for (point = 0; point < 5; point++) {
1135 data->pwm_auto_point_pwm[nr][point] =
1136 f71882fg_read8(data,
1137 F71882FG_REG_POINT_PWM
1138 (nr, point));
1139 }
1140 for (point = 0; point < 4; point++) {
1141 data->pwm_auto_point_temp[nr][point] =
1142 f71882fg_read8(data,
1143 F71882FG_REG_POINT_TEMP
1144 (nr, point));
1145 }
1146 break;
1147 case f71808e:
1148 case f71869:
1149 data->pwm_auto_point_pwm[nr][0] =
1150 f71882fg_read8(data,
1151 F71882FG_REG_POINT_PWM(nr, 0));
1152 /* Fall through */
1153 case f71862fg:
1154 data->pwm_auto_point_pwm[nr][1] =
1155 f71882fg_read8(data,
1156 F71882FG_REG_POINT_PWM
1157 (nr, 1));
1158 data->pwm_auto_point_pwm[nr][4] =
1159 f71882fg_read8(data,
1160 F71882FG_REG_POINT_PWM
1161 (nr, 4));
1162 data->pwm_auto_point_temp[nr][0] =
1163 f71882fg_read8(data,
1164 F71882FG_REG_POINT_TEMP
1165 (nr, 0));
1166 data->pwm_auto_point_temp[nr][3] =
1167 f71882fg_read8(data,
1168 F71882FG_REG_POINT_TEMP
1169 (nr, 3));
1170 break;
1171 }
1172 }
1173 data->last_limits = jiffies;
1174 }
1175
1176 /* Update every second */
1177 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
1178 data->temp_status = f71882fg_read8(data,
1179 F71882FG_REG_TEMP_STATUS);
1180 data->temp_diode_open = f71882fg_read8(data,
1181 F71882FG_REG_TEMP_DIODE_OPEN);
1182 for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1183 nr++)
1184 data->temp[nr] = f71882fg_read_temp(data, nr);
1185
1186 data->fan_status = f71882fg_read8(data,
1187 F71882FG_REG_FAN_STATUS);
1188 for (nr = 0; nr < nr_fans; nr++) {
1189 data->fan[nr] = f71882fg_read16(data,
1190 F71882FG_REG_FAN(nr));
1191 data->fan_target[nr] =
1192 f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
1193 data->fan_full_speed[nr] =
1194 f71882fg_read16(data,
1195 F71882FG_REG_FAN_FULL_SPEED(nr));
1196 data->pwm[nr] =
1197 f71882fg_read8(data, F71882FG_REG_PWM(nr));
1198 }
1199 /* The f8000 can monitor 1 more fan, but has no pwm for it */
1200 if (data->type == f8000)
1201 data->fan[3] = f71882fg_read16(data,
1202 F71882FG_REG_FAN(3));
1203
1204 if (f71882fg_has_in1_alarm[data->type])
1205 data->in_status = f71882fg_read8(data,
1206 F71882FG_REG_IN_STATUS);
1207 for (nr = 0; nr < F71882FG_MAX_INS; nr++)
1208 if (f71882fg_has_in[data->type][nr])
1209 data->in[nr] = f71882fg_read8(data,
1210 F71882FG_REG_IN(nr));
1211
1212 data->last_updated = jiffies;
1213 data->valid = 1;
1214 }
1215
1216 mutex_unlock(&data->update_lock);
1217
1218 return data;
1219 }
1220
1221 /* Sysfs Interface */
1222 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
1223 char *buf)
1224 {
1225 struct f71882fg_data *data = f71882fg_update_device(dev);
1226 int nr = to_sensor_dev_attr_2(devattr)->index;
1227 int speed = fan_from_reg(data->fan[nr]);
1228
1229 if (speed == FAN_MIN_DETECT)
1230 speed = 0;
1231
1232 return sprintf(buf, "%d\n", speed);
1233 }
1234
1235 static ssize_t show_fan_full_speed(struct device *dev,
1236 struct device_attribute *devattr, char *buf)
1237 {
1238 struct f71882fg_data *data = f71882fg_update_device(dev);
1239 int nr = to_sensor_dev_attr_2(devattr)->index;
1240 int speed = fan_from_reg(data->fan_full_speed[nr]);
1241 return sprintf(buf, "%d\n", speed);
1242 }
1243
1244 static ssize_t store_fan_full_speed(struct device *dev,
1245 struct device_attribute *devattr,
1246 const char *buf, size_t count)
1247 {
1248 struct f71882fg_data *data = dev_get_drvdata(dev);
1249 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1250 long val;
1251
1252 err = strict_strtol(buf, 10, &val);
1253 if (err)
1254 return err;
1255
1256 val = SENSORS_LIMIT(val, 23, 1500000);
1257 val = fan_to_reg(val);
1258
1259 mutex_lock(&data->update_lock);
1260 f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1261 data->fan_full_speed[nr] = val;
1262 mutex_unlock(&data->update_lock);
1263
1264 return count;
1265 }
1266
1267 static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1268 *devattr, char *buf)
1269 {
1270 struct f71882fg_data *data = f71882fg_update_device(dev);
1271 int nr = to_sensor_dev_attr_2(devattr)->index;
1272
1273 if (data->fan_beep & (1 << nr))
1274 return sprintf(buf, "1\n");
1275 else
1276 return sprintf(buf, "0\n");
1277 }
1278
1279 static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1280 *devattr, const char *buf, size_t count)
1281 {
1282 struct f71882fg_data *data = dev_get_drvdata(dev);
1283 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1284 unsigned long val;
1285
1286 err = strict_strtoul(buf, 10, &val);
1287 if (err)
1288 return err;
1289
1290 mutex_lock(&data->update_lock);
1291 data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1292 if (val)
1293 data->fan_beep |= 1 << nr;
1294 else
1295 data->fan_beep &= ~(1 << nr);
1296
1297 f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1298 mutex_unlock(&data->update_lock);
1299
1300 return count;
1301 }
1302
1303 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1304 *devattr, char *buf)
1305 {
1306 struct f71882fg_data *data = f71882fg_update_device(dev);
1307 int nr = to_sensor_dev_attr_2(devattr)->index;
1308
1309 if (data->fan_status & (1 << nr))
1310 return sprintf(buf, "1\n");
1311 else
1312 return sprintf(buf, "0\n");
1313 }
1314
1315 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1316 char *buf)
1317 {
1318 struct f71882fg_data *data = f71882fg_update_device(dev);
1319 int nr = to_sensor_dev_attr_2(devattr)->index;
1320
1321 return sprintf(buf, "%d\n", data->in[nr] * 8);
1322 }
1323
1324 static ssize_t show_in_max(struct device *dev, struct device_attribute
1325 *devattr, char *buf)
1326 {
1327 struct f71882fg_data *data = f71882fg_update_device(dev);
1328
1329 return sprintf(buf, "%d\n", data->in1_max * 8);
1330 }
1331
1332 static ssize_t store_in_max(struct device *dev, struct device_attribute
1333 *devattr, const char *buf, size_t count)
1334 {
1335 struct f71882fg_data *data = dev_get_drvdata(dev);
1336 int err;
1337 long val;
1338
1339 err = strict_strtol(buf, 10, &val);
1340 if (err)
1341 return err;
1342
1343 val /= 8;
1344 val = SENSORS_LIMIT(val, 0, 255);
1345
1346 mutex_lock(&data->update_lock);
1347 f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
1348 data->in1_max = val;
1349 mutex_unlock(&data->update_lock);
1350
1351 return count;
1352 }
1353
1354 static ssize_t show_in_beep(struct device *dev, struct device_attribute
1355 *devattr, char *buf)
1356 {
1357 struct f71882fg_data *data = f71882fg_update_device(dev);
1358 int nr = to_sensor_dev_attr_2(devattr)->index;
1359
1360 if (data->in_beep & (1 << nr))
1361 return sprintf(buf, "1\n");
1362 else
1363 return sprintf(buf, "0\n");
1364 }
1365
1366 static ssize_t store_in_beep(struct device *dev, struct device_attribute
1367 *devattr, const char *buf, size_t count)
1368 {
1369 struct f71882fg_data *data = dev_get_drvdata(dev);
1370 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1371 unsigned long val;
1372
1373 err = strict_strtoul(buf, 10, &val);
1374 if (err)
1375 return err;
1376
1377 mutex_lock(&data->update_lock);
1378 data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1379 if (val)
1380 data->in_beep |= 1 << nr;
1381 else
1382 data->in_beep &= ~(1 << nr);
1383
1384 f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
1385 mutex_unlock(&data->update_lock);
1386
1387 return count;
1388 }
1389
1390 static ssize_t show_in_alarm(struct device *dev, struct device_attribute
1391 *devattr, char *buf)
1392 {
1393 struct f71882fg_data *data = f71882fg_update_device(dev);
1394 int nr = to_sensor_dev_attr_2(devattr)->index;
1395
1396 if (data->in_status & (1 << nr))
1397 return sprintf(buf, "1\n");
1398 else
1399 return sprintf(buf, "0\n");
1400 }
1401
1402 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1403 char *buf)
1404 {
1405 struct f71882fg_data *data = f71882fg_update_device(dev);
1406 int nr = to_sensor_dev_attr_2(devattr)->index;
1407 int sign, temp;
1408
1409 if (data->type == f71858fg) {
1410 /* TEMP_TABLE_SEL 1 or 3 ? */
1411 if (data->temp_config & 1) {
1412 sign = data->temp[nr] & 0x0001;
1413 temp = (data->temp[nr] >> 5) & 0x7ff;
1414 } else {
1415 sign = data->temp[nr] & 0x8000;
1416 temp = (data->temp[nr] >> 5) & 0x3ff;
1417 }
1418 temp *= 125;
1419 if (sign)
1420 temp -= 128000;
1421 } else
1422 temp = data->temp[nr] * 1000;
1423
1424 return sprintf(buf, "%d\n", temp);
1425 }
1426
1427 static ssize_t show_temp_max(struct device *dev, struct device_attribute
1428 *devattr, char *buf)
1429 {
1430 struct f71882fg_data *data = f71882fg_update_device(dev);
1431 int nr = to_sensor_dev_attr_2(devattr)->index;
1432
1433 return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1434 }
1435
1436 static ssize_t store_temp_max(struct device *dev, struct device_attribute
1437 *devattr, const char *buf, size_t count)
1438 {
1439 struct f71882fg_data *data = dev_get_drvdata(dev);
1440 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1441 long val;
1442
1443 err = strict_strtol(buf, 10, &val);
1444 if (err)
1445 return err;
1446
1447 val /= 1000;
1448 val = SENSORS_LIMIT(val, 0, 255);
1449
1450 mutex_lock(&data->update_lock);
1451 f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1452 data->temp_high[nr] = val;
1453 mutex_unlock(&data->update_lock);
1454
1455 return count;
1456 }
1457
1458 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1459 *devattr, char *buf)
1460 {
1461 struct f71882fg_data *data = f71882fg_update_device(dev);
1462 int nr = to_sensor_dev_attr_2(devattr)->index;
1463 int temp_max_hyst;
1464
1465 mutex_lock(&data->update_lock);
1466 if (nr & 1)
1467 temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1468 else
1469 temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1470 temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1471 mutex_unlock(&data->update_lock);
1472
1473 return sprintf(buf, "%d\n", temp_max_hyst);
1474 }
1475
1476 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1477 *devattr, const char *buf, size_t count)
1478 {
1479 struct f71882fg_data *data = dev_get_drvdata(dev);
1480 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1481 ssize_t ret = count;
1482 u8 reg;
1483 long val;
1484
1485 err = strict_strtol(buf, 10, &val);
1486 if (err)
1487 return err;
1488
1489 val /= 1000;
1490
1491 mutex_lock(&data->update_lock);
1492
1493 /* convert abs to relative and check */
1494 data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1495 val = SENSORS_LIMIT(val, data->temp_high[nr] - 15,
1496 data->temp_high[nr]);
1497 val = data->temp_high[nr] - val;
1498
1499 /* convert value to register contents */
1500 reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1501 if (nr & 1)
1502 reg = (reg & 0x0f) | (val << 4);
1503 else
1504 reg = (reg & 0xf0) | val;
1505 f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1506 data->temp_hyst[nr / 2] = reg;
1507
1508 mutex_unlock(&data->update_lock);
1509 return ret;
1510 }
1511
1512 static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1513 *devattr, char *buf)
1514 {
1515 struct f71882fg_data *data = f71882fg_update_device(dev);
1516 int nr = to_sensor_dev_attr_2(devattr)->index;
1517
1518 return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1519 }
1520
1521 static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1522 *devattr, const char *buf, size_t count)
1523 {
1524 struct f71882fg_data *data = dev_get_drvdata(dev);
1525 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1526 long val;
1527
1528 err = strict_strtol(buf, 10, &val);
1529 if (err)
1530 return err;
1531
1532 val /= 1000;
1533 val = SENSORS_LIMIT(val, 0, 255);
1534
1535 mutex_lock(&data->update_lock);
1536 f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1537 data->temp_ovt[nr] = val;
1538 mutex_unlock(&data->update_lock);
1539
1540 return count;
1541 }
1542
1543 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1544 *devattr, char *buf)
1545 {
1546 struct f71882fg_data *data = f71882fg_update_device(dev);
1547 int nr = to_sensor_dev_attr_2(devattr)->index;
1548 int temp_crit_hyst;
1549
1550 mutex_lock(&data->update_lock);
1551 if (nr & 1)
1552 temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1553 else
1554 temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1555 temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1556 mutex_unlock(&data->update_lock);
1557
1558 return sprintf(buf, "%d\n", temp_crit_hyst);
1559 }
1560
1561 static ssize_t show_temp_type(struct device *dev, struct device_attribute
1562 *devattr, char *buf)
1563 {
1564 struct f71882fg_data *data = f71882fg_update_device(dev);
1565 int nr = to_sensor_dev_attr_2(devattr)->index;
1566
1567 return sprintf(buf, "%d\n", data->temp_type[nr]);
1568 }
1569
1570 static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1571 *devattr, char *buf)
1572 {
1573 struct f71882fg_data *data = f71882fg_update_device(dev);
1574 int nr = to_sensor_dev_attr_2(devattr)->index;
1575
1576 if (data->temp_beep & (1 << nr))
1577 return sprintf(buf, "1\n");
1578 else
1579 return sprintf(buf, "0\n");
1580 }
1581
1582 static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1583 *devattr, const char *buf, size_t count)
1584 {
1585 struct f71882fg_data *data = dev_get_drvdata(dev);
1586 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1587 unsigned long val;
1588
1589 err = strict_strtoul(buf, 10, &val);
1590 if (err)
1591 return err;
1592
1593 mutex_lock(&data->update_lock);
1594 data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1595 if (val)
1596 data->temp_beep |= 1 << nr;
1597 else
1598 data->temp_beep &= ~(1 << nr);
1599
1600 f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1601 mutex_unlock(&data->update_lock);
1602
1603 return count;
1604 }
1605
1606 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1607 *devattr, char *buf)
1608 {
1609 struct f71882fg_data *data = f71882fg_update_device(dev);
1610 int nr = to_sensor_dev_attr_2(devattr)->index;
1611
1612 if (data->temp_status & (1 << nr))
1613 return sprintf(buf, "1\n");
1614 else
1615 return sprintf(buf, "0\n");
1616 }
1617
1618 static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1619 *devattr, char *buf)
1620 {
1621 struct f71882fg_data *data = f71882fg_update_device(dev);
1622 int nr = to_sensor_dev_attr_2(devattr)->index;
1623
1624 if (data->temp_diode_open & (1 << nr))
1625 return sprintf(buf, "1\n");
1626 else
1627 return sprintf(buf, "0\n");
1628 }
1629
1630 static ssize_t show_pwm(struct device *dev,
1631 struct device_attribute *devattr, char *buf)
1632 {
1633 struct f71882fg_data *data = f71882fg_update_device(dev);
1634 int val, nr = to_sensor_dev_attr_2(devattr)->index;
1635 mutex_lock(&data->update_lock);
1636 if (data->pwm_enable & (1 << (2 * nr)))
1637 /* PWM mode */
1638 val = data->pwm[nr];
1639 else {
1640 /* RPM mode */
1641 val = 255 * fan_from_reg(data->fan_target[nr])
1642 / fan_from_reg(data->fan_full_speed[nr]);
1643 }
1644 mutex_unlock(&data->update_lock);
1645 return sprintf(buf, "%d\n", val);
1646 }
1647
1648 static ssize_t store_pwm(struct device *dev,
1649 struct device_attribute *devattr, const char *buf,
1650 size_t count)
1651 {
1652 struct f71882fg_data *data = dev_get_drvdata(dev);
1653 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1654 long val;
1655
1656 err = strict_strtol(buf, 10, &val);
1657 if (err)
1658 return err;
1659
1660 val = SENSORS_LIMIT(val, 0, 255);
1661
1662 mutex_lock(&data->update_lock);
1663 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1664 if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1665 (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1666 count = -EROFS;
1667 goto leave;
1668 }
1669 if (data->pwm_enable & (1 << (2 * nr))) {
1670 /* PWM mode */
1671 f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1672 data->pwm[nr] = val;
1673 } else {
1674 /* RPM mode */
1675 int target, full_speed;
1676 full_speed = f71882fg_read16(data,
1677 F71882FG_REG_FAN_FULL_SPEED(nr));
1678 target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1679 f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1680 data->fan_target[nr] = target;
1681 data->fan_full_speed[nr] = full_speed;
1682 }
1683 leave:
1684 mutex_unlock(&data->update_lock);
1685
1686 return count;
1687 }
1688
1689 static ssize_t show_pwm_enable(struct device *dev,
1690 struct device_attribute *devattr, char *buf)
1691 {
1692 int result = 0;
1693 struct f71882fg_data *data = f71882fg_update_device(dev);
1694 int nr = to_sensor_dev_attr_2(devattr)->index;
1695
1696 switch ((data->pwm_enable >> 2 * nr) & 3) {
1697 case 0:
1698 case 1:
1699 result = 2; /* Normal auto mode */
1700 break;
1701 case 2:
1702 result = 1; /* Manual mode */
1703 break;
1704 case 3:
1705 if (data->type == f8000)
1706 result = 3; /* Thermostat mode */
1707 else
1708 result = 1; /* Manual mode */
1709 break;
1710 }
1711
1712 return sprintf(buf, "%d\n", result);
1713 }
1714
1715 static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1716 *devattr, const char *buf, size_t count)
1717 {
1718 struct f71882fg_data *data = dev_get_drvdata(dev);
1719 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1720 long val;
1721
1722 err = strict_strtol(buf, 10, &val);
1723 if (err)
1724 return err;
1725
1726 /* Special case for F8000 pwm channel 3 which only does auto mode */
1727 if (data->type == f8000 && nr == 2 && val != 2)
1728 return -EINVAL;
1729
1730 mutex_lock(&data->update_lock);
1731 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1732 /* Special case for F8000 auto PWM mode / Thermostat mode */
1733 if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1734 switch (val) {
1735 case 2:
1736 data->pwm_enable &= ~(2 << (2 * nr));
1737 break; /* Normal auto mode */
1738 case 3:
1739 data->pwm_enable |= 2 << (2 * nr);
1740 break; /* Thermostat mode */
1741 default:
1742 count = -EINVAL;
1743 goto leave;
1744 }
1745 } else {
1746 switch (val) {
1747 case 1:
1748 /* The f71858fg does not support manual RPM mode */
1749 if (data->type == f71858fg &&
1750 ((data->pwm_enable >> (2 * nr)) & 1)) {
1751 count = -EINVAL;
1752 goto leave;
1753 }
1754 data->pwm_enable |= 2 << (2 * nr);
1755 break; /* Manual */
1756 case 2:
1757 data->pwm_enable &= ~(2 << (2 * nr));
1758 break; /* Normal auto mode */
1759 default:
1760 count = -EINVAL;
1761 goto leave;
1762 }
1763 }
1764 f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1765 leave:
1766 mutex_unlock(&data->update_lock);
1767
1768 return count;
1769 }
1770
1771 static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1772 struct device_attribute *devattr,
1773 char *buf)
1774 {
1775 int result;
1776 struct f71882fg_data *data = f71882fg_update_device(dev);
1777 int pwm = to_sensor_dev_attr_2(devattr)->index;
1778 int point = to_sensor_dev_attr_2(devattr)->nr;
1779
1780 mutex_lock(&data->update_lock);
1781 if (data->pwm_enable & (1 << (2 * pwm))) {
1782 /* PWM mode */
1783 result = data->pwm_auto_point_pwm[pwm][point];
1784 } else {
1785 /* RPM mode */
1786 result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1787 }
1788 mutex_unlock(&data->update_lock);
1789
1790 return sprintf(buf, "%d\n", result);
1791 }
1792
1793 static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1794 struct device_attribute *devattr,
1795 const char *buf, size_t count)
1796 {
1797 struct f71882fg_data *data = dev_get_drvdata(dev);
1798 int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1799 int point = to_sensor_dev_attr_2(devattr)->nr;
1800 long val;
1801
1802 err = strict_strtol(buf, 10, &val);
1803 if (err)
1804 return err;
1805
1806 val = SENSORS_LIMIT(val, 0, 255);
1807
1808 mutex_lock(&data->update_lock);
1809 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1810 if (data->pwm_enable & (1 << (2 * pwm))) {
1811 /* PWM mode */
1812 } else {
1813 /* RPM mode */
1814 if (val < 29) /* Prevent negative numbers */
1815 val = 255;
1816 else
1817 val = (255 - val) * 32 / val;
1818 }
1819 f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
1820 data->pwm_auto_point_pwm[pwm][point] = val;
1821 mutex_unlock(&data->update_lock);
1822
1823 return count;
1824 }
1825
1826 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
1827 struct device_attribute *devattr,
1828 char *buf)
1829 {
1830 int result = 0;
1831 struct f71882fg_data *data = f71882fg_update_device(dev);
1832 int nr = to_sensor_dev_attr_2(devattr)->index;
1833 int point = to_sensor_dev_attr_2(devattr)->nr;
1834
1835 mutex_lock(&data->update_lock);
1836 if (nr & 1)
1837 result = data->pwm_auto_point_hyst[nr / 2] >> 4;
1838 else
1839 result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
1840 result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
1841 mutex_unlock(&data->update_lock);
1842
1843 return sprintf(buf, "%d\n", result);
1844 }
1845
1846 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
1847 struct device_attribute *devattr,
1848 const char *buf, size_t count)
1849 {
1850 struct f71882fg_data *data = dev_get_drvdata(dev);
1851 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1852 int point = to_sensor_dev_attr_2(devattr)->nr;
1853 u8 reg;
1854 long val;
1855
1856 err = strict_strtol(buf, 10, &val);
1857 if (err)
1858 return err;
1859
1860 val /= 1000;
1861
1862 mutex_lock(&data->update_lock);
1863 data->pwm_auto_point_temp[nr][point] =
1864 f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
1865 val = SENSORS_LIMIT(val, data->pwm_auto_point_temp[nr][point] - 15,
1866 data->pwm_auto_point_temp[nr][point]);
1867 val = data->pwm_auto_point_temp[nr][point] - val;
1868
1869 reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
1870 if (nr & 1)
1871 reg = (reg & 0x0f) | (val << 4);
1872 else
1873 reg = (reg & 0xf0) | val;
1874
1875 f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
1876 data->pwm_auto_point_hyst[nr / 2] = reg;
1877 mutex_unlock(&data->update_lock);
1878
1879 return count;
1880 }
1881
1882 static ssize_t show_pwm_interpolate(struct device *dev,
1883 struct device_attribute *devattr, char *buf)
1884 {
1885 int result;
1886 struct f71882fg_data *data = f71882fg_update_device(dev);
1887 int nr = to_sensor_dev_attr_2(devattr)->index;
1888
1889 result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
1890
1891 return sprintf(buf, "%d\n", result);
1892 }
1893
1894 static ssize_t store_pwm_interpolate(struct device *dev,
1895 struct device_attribute *devattr,
1896 const char *buf, size_t count)
1897 {
1898 struct f71882fg_data *data = dev_get_drvdata(dev);
1899 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1900 unsigned long val;
1901
1902 err = strict_strtoul(buf, 10, &val);
1903 if (err)
1904 return err;
1905
1906 mutex_lock(&data->update_lock);
1907 data->pwm_auto_point_mapping[nr] =
1908 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1909 if (val)
1910 val = data->pwm_auto_point_mapping[nr] | (1 << 4);
1911 else
1912 val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
1913 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1914 data->pwm_auto_point_mapping[nr] = val;
1915 mutex_unlock(&data->update_lock);
1916
1917 return count;
1918 }
1919
1920 static ssize_t show_pwm_auto_point_channel(struct device *dev,
1921 struct device_attribute *devattr,
1922 char *buf)
1923 {
1924 int result;
1925 struct f71882fg_data *data = f71882fg_update_device(dev);
1926 int nr = to_sensor_dev_attr_2(devattr)->index;
1927
1928 result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) -
1929 data->temp_start);
1930
1931 return sprintf(buf, "%d\n", result);
1932 }
1933
1934 static ssize_t store_pwm_auto_point_channel(struct device *dev,
1935 struct device_attribute *devattr,
1936 const char *buf, size_t count)
1937 {
1938 struct f71882fg_data *data = dev_get_drvdata(dev);
1939 int err, nr = to_sensor_dev_attr_2(devattr)->index;
1940 long val;
1941
1942 err = strict_strtol(buf, 10, &val);
1943 if (err)
1944 return err;
1945
1946 switch (val) {
1947 case 1:
1948 val = 0;
1949 break;
1950 case 2:
1951 val = 1;
1952 break;
1953 case 4:
1954 val = 2;
1955 break;
1956 default:
1957 return -EINVAL;
1958 }
1959 val += data->temp_start;
1960 mutex_lock(&data->update_lock);
1961 data->pwm_auto_point_mapping[nr] =
1962 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
1963 val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
1964 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
1965 data->pwm_auto_point_mapping[nr] = val;
1966 mutex_unlock(&data->update_lock);
1967
1968 return count;
1969 }
1970
1971 static ssize_t show_pwm_auto_point_temp(struct device *dev,
1972 struct device_attribute *devattr,
1973 char *buf)
1974 {
1975 int result;
1976 struct f71882fg_data *data = f71882fg_update_device(dev);
1977 int pwm = to_sensor_dev_attr_2(devattr)->index;
1978 int point = to_sensor_dev_attr_2(devattr)->nr;
1979
1980 result = data->pwm_auto_point_temp[pwm][point];
1981 return sprintf(buf, "%d\n", 1000 * result);
1982 }
1983
1984 static ssize_t store_pwm_auto_point_temp(struct device *dev,
1985 struct device_attribute *devattr,
1986 const char *buf, size_t count)
1987 {
1988 struct f71882fg_data *data = dev_get_drvdata(dev);
1989 int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1990 int point = to_sensor_dev_attr_2(devattr)->nr;
1991 long val;
1992
1993 err = strict_strtol(buf, 10, &val);
1994 if (err)
1995 return err;
1996
1997 val /= 1000;
1998
1999 if (data->auto_point_temp_signed)
2000 val = SENSORS_LIMIT(val, -128, 127);
2001 else
2002 val = SENSORS_LIMIT(val, 0, 127);
2003
2004 mutex_lock(&data->update_lock);
2005 f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
2006 data->pwm_auto_point_temp[pwm][point] = val;
2007 mutex_unlock(&data->update_lock);
2008
2009 return count;
2010 }
2011
2012 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
2013 char *buf)
2014 {
2015 struct f71882fg_data *data = dev_get_drvdata(dev);
2016 return sprintf(buf, "%s\n", f71882fg_names[data->type]);
2017 }
2018
2019 static int __devinit f71882fg_create_sysfs_files(struct platform_device *pdev,
2020 struct sensor_device_attribute_2 *attr, int count)
2021 {
2022 int err, i;
2023
2024 for (i = 0; i < count; i++) {
2025 err = device_create_file(&pdev->dev, &attr[i].dev_attr);
2026 if (err)
2027 return err;
2028 }
2029 return 0;
2030 }
2031
2032 static void f71882fg_remove_sysfs_files(struct platform_device *pdev,
2033 struct sensor_device_attribute_2 *attr, int count)
2034 {
2035 int i;
2036
2037 for (i = 0; i < count; i++)
2038 device_remove_file(&pdev->dev, &attr[i].dev_attr);
2039 }
2040
2041 static int __devinit f71882fg_probe(struct platform_device *pdev)
2042 {
2043 struct f71882fg_data *data;
2044 struct f71882fg_sio_data *sio_data = pdev->dev.platform_data;
2045 int err, i, nr_fans = (sio_data->type == f71882fg) ? 4 : 3;
2046 int nr_temps = (sio_data->type == f71808e) ? 2 : 3;
2047 u8 start_reg, reg;
2048
2049 data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL);
2050 if (!data)
2051 return -ENOMEM;
2052
2053 data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
2054 data->type = sio_data->type;
2055 data->temp_start =
2056 (data->type == f71858fg || data->type == f8000) ? 0 : 1;
2057 mutex_init(&data->update_lock);
2058 platform_set_drvdata(pdev, data);
2059
2060 start_reg = f71882fg_read8(data, F71882FG_REG_START);
2061 if (start_reg & 0x04) {
2062 dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
2063 err = -ENODEV;
2064 goto exit_free;
2065 }
2066 if (!(start_reg & 0x03)) {
2067 dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
2068 err = -ENODEV;
2069 goto exit_free;
2070 }
2071
2072 /* Register sysfs interface files */
2073 err = device_create_file(&pdev->dev, &dev_attr_name);
2074 if (err)
2075 goto exit_unregister_sysfs;
2076
2077 if (start_reg & 0x01) {
2078 switch (data->type) {
2079 case f71858fg:
2080 data->temp_config =
2081 f71882fg_read8(data, F71882FG_REG_TEMP_CONFIG);
2082 if (data->temp_config & 0x10)
2083 /* The f71858fg temperature alarms behave as
2084 the f8000 alarms in this mode */
2085 err = f71882fg_create_sysfs_files(pdev,
2086 f8000_temp_attr,
2087 ARRAY_SIZE(f8000_temp_attr));
2088 else
2089 err = f71882fg_create_sysfs_files(pdev,
2090 f71858fg_temp_attr,
2091 ARRAY_SIZE(f71858fg_temp_attr));
2092 break;
2093 case f8000:
2094 err = f71882fg_create_sysfs_files(pdev,
2095 f8000_temp_attr,
2096 ARRAY_SIZE(f8000_temp_attr));
2097 break;
2098 default:
2099 err = f71882fg_create_sysfs_files(pdev,
2100 &fxxxx_temp_attr[0][0],
2101 ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2102 }
2103 if (err)
2104 goto exit_unregister_sysfs;
2105
2106 if (f71882fg_has_beep[data->type]) {
2107 err = f71882fg_create_sysfs_files(pdev,
2108 &fxxxx_temp_beep_attr[0][0],
2109 ARRAY_SIZE(fxxxx_temp_beep_attr[0])
2110 * nr_temps);
2111 if (err)
2112 goto exit_unregister_sysfs;
2113 }
2114
2115 for (i = 0; i < F71882FG_MAX_INS; i++) {
2116 if (f71882fg_has_in[data->type][i]) {
2117 err = device_create_file(&pdev->dev,
2118 &fxxxx_in_attr[i].dev_attr);
2119 if (err)
2120 goto exit_unregister_sysfs;
2121 }
2122 }
2123 if (f71882fg_has_in1_alarm[data->type]) {
2124 err = f71882fg_create_sysfs_files(pdev,
2125 fxxxx_in1_alarm_attr,
2126 ARRAY_SIZE(fxxxx_in1_alarm_attr));
2127 if (err)
2128 goto exit_unregister_sysfs;
2129 }
2130 }
2131
2132 if (start_reg & 0x02) {
2133 switch (data->type) {
2134 case f71808e:
2135 case f71869:
2136 /* These always have signed auto point temps */
2137 data->auto_point_temp_signed = 1;
2138 /* Fall through to select correct fan/pwm reg bank! */
2139 case f71889fg:
2140 case f71889ed:
2141 reg = f71882fg_read8(data, F71882FG_REG_FAN_FAULT_T);
2142 if (reg & F71882FG_FAN_NEG_TEMP_EN)
2143 data->auto_point_temp_signed = 1;
2144 /* Ensure banked pwm registers point to right bank */
2145 reg &= ~F71882FG_FAN_PROG_SEL;
2146 f71882fg_write8(data, F71882FG_REG_FAN_FAULT_T, reg);
2147 break;
2148 default:
2149 break;
2150 }
2151
2152 data->pwm_enable =
2153 f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
2154
2155 /* Sanity check the pwm settings */
2156 switch (data->type) {
2157 case f71858fg:
2158 err = 0;
2159 for (i = 0; i < nr_fans; i++)
2160 if (((data->pwm_enable >> (i * 2)) & 3) == 3)
2161 err = 1;
2162 break;
2163 case f71862fg:
2164 err = (data->pwm_enable & 0x15) != 0x15;
2165 break;
2166 case f71808e:
2167 case f71869:
2168 case f71882fg:
2169 case f71889fg:
2170 case f71889ed:
2171 err = 0;
2172 break;
2173 case f8000:
2174 err = data->pwm_enable & 0x20;
2175 break;
2176 }
2177 if (err) {
2178 dev_err(&pdev->dev,
2179 "Invalid (reserved) pwm settings: 0x%02x\n",
2180 (unsigned int)data->pwm_enable);
2181 err = -ENODEV;
2182 goto exit_unregister_sysfs;
2183 }
2184
2185 err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2186 ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2187 if (err)
2188 goto exit_unregister_sysfs;
2189
2190 if (f71882fg_has_beep[data->type]) {
2191 err = f71882fg_create_sysfs_files(pdev,
2192 fxxxx_fan_beep_attr, nr_fans);
2193 if (err)
2194 goto exit_unregister_sysfs;
2195 }
2196
2197 switch (data->type) {
2198 case f71808e:
2199 case f71869:
2200 case f71889fg:
2201 case f71889ed:
2202 for (i = 0; i < nr_fans; i++) {
2203 data->pwm_auto_point_mapping[i] =
2204 f71882fg_read8(data,
2205 F71882FG_REG_POINT_MAPPING(i));
2206 if ((data->pwm_auto_point_mapping[i] & 0x80) ||
2207 (data->pwm_auto_point_mapping[i] & 3) == 0)
2208 break;
2209 }
2210 if (i != nr_fans) {
2211 dev_warn(&pdev->dev,
2212 "Auto pwm controlled by raw digital "
2213 "data, disabling pwm auto_point "
2214 "sysfs attributes\n");
2215 goto no_pwm_auto_point;
2216 }
2217 break;
2218 default:
2219 break;
2220 }
2221
2222 switch (data->type) {
2223 case f71862fg:
2224 err = f71882fg_create_sysfs_files(pdev,
2225 f71862fg_auto_pwm_attr,
2226 ARRAY_SIZE(f71862fg_auto_pwm_attr));
2227 break;
2228 case f71808e:
2229 case f71869:
2230 err = f71882fg_create_sysfs_files(pdev,
2231 f71869_auto_pwm_attr,
2232 ARRAY_SIZE(f71869_auto_pwm_attr));
2233 break;
2234 case f8000:
2235 err = f71882fg_create_sysfs_files(pdev,
2236 f8000_fan_attr,
2237 ARRAY_SIZE(f8000_fan_attr));
2238 if (err)
2239 goto exit_unregister_sysfs;
2240 err = f71882fg_create_sysfs_files(pdev,
2241 f8000_auto_pwm_attr,
2242 ARRAY_SIZE(f8000_auto_pwm_attr));
2243 break;
2244 default:
2245 err = f71882fg_create_sysfs_files(pdev,
2246 &fxxxx_auto_pwm_attr[0][0],
2247 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2248 }
2249 if (err)
2250 goto exit_unregister_sysfs;
2251
2252 no_pwm_auto_point:
2253 for (i = 0; i < nr_fans; i++)
2254 dev_info(&pdev->dev, "Fan: %d is in %s mode\n", i + 1,
2255 (data->pwm_enable & (1 << 2 * i)) ?
2256 "duty-cycle" : "RPM");
2257 }
2258
2259 data->hwmon_dev = hwmon_device_register(&pdev->dev);
2260 if (IS_ERR(data->hwmon_dev)) {
2261 err = PTR_ERR(data->hwmon_dev);
2262 data->hwmon_dev = NULL;
2263 goto exit_unregister_sysfs;
2264 }
2265
2266 return 0;
2267
2268 exit_unregister_sysfs:
2269 f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
2270 return err; /* f71882fg_remove() also frees our data */
2271 exit_free:
2272 kfree(data);
2273 return err;
2274 }
2275
2276 static int f71882fg_remove(struct platform_device *pdev)
2277 {
2278 struct f71882fg_data *data = platform_get_drvdata(pdev);
2279 int i, nr_fans = (data->type == f71882fg) ? 4 : 3;
2280 int nr_temps = (data->type == f71808e) ? 2 : 3;
2281 u8 start_reg = f71882fg_read8(data, F71882FG_REG_START);
2282
2283 if (data->hwmon_dev)
2284 hwmon_device_unregister(data->hwmon_dev);
2285
2286 device_remove_file(&pdev->dev, &dev_attr_name);
2287
2288 if (start_reg & 0x01) {
2289 switch (data->type) {
2290 case f71858fg:
2291 if (data->temp_config & 0x10)
2292 f71882fg_remove_sysfs_files(pdev,
2293 f8000_temp_attr,
2294 ARRAY_SIZE(f8000_temp_attr));
2295 else
2296 f71882fg_remove_sysfs_files(pdev,
2297 f71858fg_temp_attr,
2298 ARRAY_SIZE(f71858fg_temp_attr));
2299 break;
2300 case f8000:
2301 f71882fg_remove_sysfs_files(pdev,
2302 f8000_temp_attr,
2303 ARRAY_SIZE(f8000_temp_attr));
2304 break;
2305 default:
2306 f71882fg_remove_sysfs_files(pdev,
2307 &fxxxx_temp_attr[0][0],
2308 ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2309 }
2310 if (f71882fg_has_beep[data->type]) {
2311 f71882fg_remove_sysfs_files(pdev,
2312 &fxxxx_temp_beep_attr[0][0],
2313 ARRAY_SIZE(fxxxx_temp_beep_attr[0]) * nr_temps);
2314 }
2315
2316 for (i = 0; i < F71882FG_MAX_INS; i++) {
2317 if (f71882fg_has_in[data->type][i]) {
2318 device_remove_file(&pdev->dev,
2319 &fxxxx_in_attr[i].dev_attr);
2320 }
2321 }
2322 if (f71882fg_has_in1_alarm[data->type]) {
2323 f71882fg_remove_sysfs_files(pdev,
2324 fxxxx_in1_alarm_attr,
2325 ARRAY_SIZE(fxxxx_in1_alarm_attr));
2326 }
2327 }
2328
2329 if (start_reg & 0x02) {
2330 f71882fg_remove_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2331 ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2332
2333 if (f71882fg_has_beep[data->type]) {
2334 f71882fg_remove_sysfs_files(pdev,
2335 fxxxx_fan_beep_attr, nr_fans);
2336 }
2337
2338 switch (data->type) {
2339 case f71862fg:
2340 f71882fg_remove_sysfs_files(pdev,
2341 f71862fg_auto_pwm_attr,
2342 ARRAY_SIZE(f71862fg_auto_pwm_attr));
2343 break;
2344 case f71808e:
2345 case f71869:
2346 f71882fg_remove_sysfs_files(pdev,
2347 f71869_auto_pwm_attr,
2348 ARRAY_SIZE(f71869_auto_pwm_attr));
2349 break;
2350 case f8000:
2351 f71882fg_remove_sysfs_files(pdev,
2352 f8000_fan_attr,
2353 ARRAY_SIZE(f8000_fan_attr));
2354 f71882fg_remove_sysfs_files(pdev,
2355 f8000_auto_pwm_attr,
2356 ARRAY_SIZE(f8000_auto_pwm_attr));
2357 break;
2358 default:
2359 f71882fg_remove_sysfs_files(pdev,
2360 &fxxxx_auto_pwm_attr[0][0],
2361 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2362 }
2363 }
2364
2365 platform_set_drvdata(pdev, NULL);
2366 kfree(data);
2367
2368 return 0;
2369 }
2370
2371 static int __init f71882fg_find(int sioaddr, unsigned short *address,
2372 struct f71882fg_sio_data *sio_data)
2373 {
2374 u16 devid;
2375 int err = superio_enter(sioaddr);
2376 if (err)
2377 return err;
2378
2379 devid = superio_inw(sioaddr, SIO_REG_MANID);
2380 if (devid != SIO_FINTEK_ID) {
2381 pr_debug("Not a Fintek device\n");
2382 err = -ENODEV;
2383 goto exit;
2384 }
2385
2386 devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
2387 switch (devid) {
2388 case SIO_F71808E_ID:
2389 sio_data->type = f71808e;
2390 break;
2391 case SIO_F71858_ID:
2392 sio_data->type = f71858fg;
2393 break;
2394 case SIO_F71862_ID:
2395 sio_data->type = f71862fg;
2396 break;
2397 case SIO_F71869_ID:
2398 sio_data->type = f71869;
2399 break;
2400 case SIO_F71882_ID:
2401 sio_data->type = f71882fg;
2402 break;
2403 case SIO_F71889_ID:
2404 sio_data->type = f71889fg;
2405 break;
2406 case SIO_F71889E_ID:
2407 sio_data->type = f71889ed;
2408 break;
2409 case SIO_F8000_ID:
2410 sio_data->type = f8000;
2411 break;
2412 default:
2413 pr_info("Unsupported Fintek device: %04x\n",
2414 (unsigned int)devid);
2415 err = -ENODEV;
2416 goto exit;
2417 }
2418
2419 if (sio_data->type == f71858fg)
2420 superio_select(sioaddr, SIO_F71858FG_LD_HWM);
2421 else
2422 superio_select(sioaddr, SIO_F71882FG_LD_HWM);
2423
2424 if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
2425 pr_warn("Device not activated\n");
2426 err = -ENODEV;
2427 goto exit;
2428 }
2429
2430 *address = superio_inw(sioaddr, SIO_REG_ADDR);
2431 if (*address == 0) {
2432 pr_warn("Base address not set\n");
2433 err = -ENODEV;
2434 goto exit;
2435 }
2436 *address &= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */
2437
2438 err = 0;
2439 pr_info("Found %s chip at %#x, revision %d\n",
2440 f71882fg_names[sio_data->type], (unsigned int)*address,
2441 (int)superio_inb(sioaddr, SIO_REG_DEVREV));
2442 exit:
2443 superio_exit(sioaddr);
2444 return err;
2445 }
2446
2447 static int __init f71882fg_device_add(unsigned short address,
2448 const struct f71882fg_sio_data *sio_data)
2449 {
2450 struct resource res = {
2451 .start = address,
2452 .end = address + REGION_LENGTH - 1,
2453 .flags = IORESOURCE_IO,
2454 };
2455 int err;
2456
2457 f71882fg_pdev = platform_device_alloc(DRVNAME, address);
2458 if (!f71882fg_pdev)
2459 return -ENOMEM;
2460
2461 res.name = f71882fg_pdev->name;
2462 err = acpi_check_resource_conflict(&res);
2463 if (err)
2464 goto exit_device_put;
2465
2466 err = platform_device_add_resources(f71882fg_pdev, &res, 1);
2467 if (err) {
2468 pr_err("Device resource addition failed\n");
2469 goto exit_device_put;
2470 }
2471
2472 err = platform_device_add_data(f71882fg_pdev, sio_data,
2473 sizeof(struct f71882fg_sio_data));
2474 if (err) {
2475 pr_err("Platform data allocation failed\n");
2476 goto exit_device_put;
2477 }
2478
2479 err = platform_device_add(f71882fg_pdev);
2480 if (err) {
2481 pr_err("Device addition failed\n");
2482 goto exit_device_put;
2483 }
2484
2485 return 0;
2486
2487 exit_device_put:
2488 platform_device_put(f71882fg_pdev);
2489
2490 return err;
2491 }
2492
2493 static int __init f71882fg_init(void)
2494 {
2495 int err = -ENODEV;
2496 unsigned short address;
2497 struct f71882fg_sio_data sio_data;
2498
2499 memset(&sio_data, 0, sizeof(sio_data));
2500
2501 if (f71882fg_find(0x2e, &address, &sio_data) &&
2502 f71882fg_find(0x4e, &address, &sio_data))
2503 goto exit;
2504
2505 err = platform_driver_register(&f71882fg_driver);
2506 if (err)
2507 goto exit;
2508
2509 err = f71882fg_device_add(address, &sio_data);
2510 if (err)
2511 goto exit_driver;
2512
2513 return 0;
2514
2515 exit_driver:
2516 platform_driver_unregister(&f71882fg_driver);
2517 exit:
2518 return err;
2519 }
2520
2521 static void __exit f71882fg_exit(void)
2522 {
2523 platform_device_unregister(f71882fg_pdev);
2524 platform_driver_unregister(&f71882fg_driver);
2525 }
2526
2527 MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
2528 MODULE_AUTHOR("Hans Edgington, Hans de Goede (hdegoede@redhat.com)");
2529 MODULE_LICENSE("GPL");
2530
2531 module_init(f71882fg_init);
2532 module_exit(f71882fg_exit);
This page took 0.12287 seconds and 5 git commands to generate.