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