xref: /openbmc/linux/drivers/hwmon/via686a.c (revision 50e52c1fc5cecfac52287a2227d8883b32963876)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * via686a.c - Part of lm_sensors, Linux kernel modules
4  *	       for hardware monitoring
5  *
6  * Copyright (c) 1998 - 2002  Frodo Looijaard <frodol@dds.nl>,
7  *			      Kyösti Mälkki <kmalkki@cc.hut.fi>,
8  *			      Mark Studebaker <mdsxyz123@yahoo.com>,
9  *			      and Bob Dougherty <bobd@stanford.edu>
10  *
11  * (Some conversion-factor data were contributed by Jonathan Teh Soon Yew
12  * <j.teh@iname.com> and Alex van Kaam <darkside@chello.nl>.)
13  */
14 
15 /*
16  * Supports the Via VT82C686A, VT82C686B south bridges.
17  * Reports all as a 686A.
18  * Warning - only supports a single device.
19  */
20 
21 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
22 
23 #include <linux/module.h>
24 #include <linux/slab.h>
25 #include <linux/pci.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/init.h>
32 #include <linux/mutex.h>
33 #include <linux/sysfs.h>
34 #include <linux/acpi.h>
35 #include <linux/io.h>
36 
37 #define DRIVER_NAME "via686a"
38 
39 /*
40  * If force_addr is set to anything different from 0, we forcibly enable
41  * the device at the given address.
42  */
43 static unsigned short force_addr;
44 module_param(force_addr, ushort, 0);
45 MODULE_PARM_DESC(force_addr,
46 		 "Initialize the base address of the sensors");
47 
48 static struct platform_device *pdev;
49 
50 /*
51  * The Via 686a southbridge has a LM78-like chip integrated on the same IC.
52  * This driver is a customized copy of lm78.c
53  */
54 
55 /* Many VIA686A constants specified below */
56 
57 /* Length of ISA address segment */
58 #define VIA686A_EXTENT		0x80
59 #define VIA686A_BASE_REG	0x70
60 #define VIA686A_ENABLE_REG	0x74
61 
62 /* The VIA686A registers */
63 /* ins numbered 0-4 */
64 #define VIA686A_REG_IN_MAX(nr)	(0x2b + ((nr) * 2))
65 #define VIA686A_REG_IN_MIN(nr)	(0x2c + ((nr) * 2))
66 #define VIA686A_REG_IN(nr)	(0x22 + (nr))
67 
68 /* fans numbered 1-2 */
69 #define VIA686A_REG_FAN_MIN(nr)	(0x3a + (nr))
70 #define VIA686A_REG_FAN(nr)	(0x28 + (nr))
71 
72 /* temps numbered 1-3 */
73 static const u8 VIA686A_REG_TEMP[]	= { 0x20, 0x21, 0x1f };
74 static const u8 VIA686A_REG_TEMP_OVER[]	= { 0x39, 0x3d, 0x1d };
75 static const u8 VIA686A_REG_TEMP_HYST[]	= { 0x3a, 0x3e, 0x1e };
76 /* bits 7-6 */
77 #define VIA686A_REG_TEMP_LOW1	0x4b
78 /* 2 = bits 5-4, 3 = bits 7-6 */
79 #define VIA686A_REG_TEMP_LOW23	0x49
80 
81 #define VIA686A_REG_ALARM1	0x41
82 #define VIA686A_REG_ALARM2	0x42
83 #define VIA686A_REG_FANDIV	0x47
84 #define VIA686A_REG_CONFIG	0x40
85 /*
86  * The following register sets temp interrupt mode (bits 1-0 for temp1,
87  * 3-2 for temp2, 5-4 for temp3).  Modes are:
88  * 00 interrupt stays as long as value is out-of-range
89  * 01 interrupt is cleared once register is read (default)
90  * 10 comparator mode- like 00, but ignores hysteresis
91  * 11 same as 00
92  */
93 #define VIA686A_REG_TEMP_MODE		0x4b
94 /* We'll just assume that you want to set all 3 simultaneously: */
95 #define VIA686A_TEMP_MODE_MASK		0x3F
96 #define VIA686A_TEMP_MODE_CONTINUOUS	0x00
97 
98 /*
99  * Conversions. Limit checking is only done on the TO_REG
100  * variants.
101  *
102  ******** VOLTAGE CONVERSIONS (Bob Dougherty) ********
103  * From HWMon.cpp (Copyright 1998-2000 Jonathan Teh Soon Yew):
104  * voltagefactor[0]=1.25/2628; (2628/1.25=2102.4)   // Vccp
105  * voltagefactor[1]=1.25/2628; (2628/1.25=2102.4)   // +2.5V
106  * voltagefactor[2]=1.67/2628; (2628/1.67=1573.7)   // +3.3V
107  * voltagefactor[3]=2.6/2628;  (2628/2.60=1010.8)   // +5V
108  * voltagefactor[4]=6.3/2628;  (2628/6.30=417.14)   // +12V
109  * in[i]=(data[i+2]*25.0+133)*voltagefactor[i];
110  * That is:
111  * volts = (25*regVal+133)*factor
112  * regVal = (volts/factor-133)/25
113  * (These conversions were contributed by Jonathan Teh Soon Yew
114  * <j.teh@iname.com>)
115  */
116 static inline u8 IN_TO_REG(long val, int in_num)
117 {
118 	/*
119 	 * To avoid floating point, we multiply constants by 10 (100 for +12V).
120 	 * Rounding is done (120500 is actually 133000 - 12500).
121 	 * Remember that val is expressed in 0.001V/bit, which is why we divide
122 	 * by an additional 10000 (100000 for +12V): 1000 for val and 10 (100)
123 	 * for the constants.
124 	 */
125 	if (in_num <= 1)
126 		return (u8) clamp_val((val * 21024 - 1205000) / 250000, 0, 255);
127 	else if (in_num == 2)
128 		return (u8) clamp_val((val * 15737 - 1205000) / 250000, 0, 255);
129 	else if (in_num == 3)
130 		return (u8) clamp_val((val * 10108 - 1205000) / 250000, 0, 255);
131 	else
132 		return (u8) clamp_val((val * 41714 - 12050000) / 2500000, 0,
133 				      255);
134 }
135 
136 static inline long IN_FROM_REG(u8 val, int in_num)
137 {
138 	/*
139 	 * To avoid floating point, we multiply constants by 10 (100 for +12V).
140 	 * We also multiply them by 1000 because we want 0.001V/bit for the
141 	 * output value. Rounding is done.
142 	 */
143 	if (in_num <= 1)
144 		return (long) ((250000 * val + 1330000 + 21024 / 2) / 21024);
145 	else if (in_num == 2)
146 		return (long) ((250000 * val + 1330000 + 15737 / 2) / 15737);
147 	else if (in_num == 3)
148 		return (long) ((250000 * val + 1330000 + 10108 / 2) / 10108);
149 	else
150 		return (long) ((2500000 * val + 13300000 + 41714 / 2) / 41714);
151 }
152 
153 /********* FAN RPM CONVERSIONS ********/
154 /*
155  * Higher register values = slower fans (the fan's strobe gates a counter).
156  * But this chip saturates back at 0, not at 255 like all the other chips.
157  * So, 0 means 0 RPM
158  */
159 static inline u8 FAN_TO_REG(long rpm, int div)
160 {
161 	if (rpm == 0)
162 		return 0;
163 	rpm = clamp_val(rpm, 1, 1000000);
164 	return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 255);
165 }
166 
167 #define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : (val) == 255 ? 0 : 1350000 / \
168 				((val) * (div)))
169 
170 /******** TEMP CONVERSIONS (Bob Dougherty) *********/
171 /*
172  * linear fits from HWMon.cpp (Copyright 1998-2000 Jonathan Teh Soon Yew)
173  *	if(temp<169)
174  *		return double(temp)*0.427-32.08;
175  *	else if(temp>=169 && temp<=202)
176  *		return double(temp)*0.582-58.16;
177  *	else
178  *		return double(temp)*0.924-127.33;
179  *
180  * A fifth-order polynomial fits the unofficial data (provided by Alex van
181  * Kaam <darkside@chello.nl>) a bit better.  It also give more reasonable
182  * numbers on my machine (ie. they agree with what my BIOS tells me).
183  * Here's the fifth-order fit to the 8-bit data:
184  * temp = 1.625093e-10*val^5 - 1.001632e-07*val^4 + 2.457653e-05*val^3 -
185  *	2.967619e-03*val^2 + 2.175144e-01*val - 7.090067e+0.
186  *
187  * (2000-10-25- RFD: thanks to Uwe Andersen <uandersen@mayah.com> for
188  * finding my typos in this formula!)
189  *
190  * Alas, none of the elegant function-fit solutions will work because we
191  * aren't allowed to use floating point in the kernel and doing it with
192  * integers doesn't provide enough precision.  So we'll do boring old
193  * look-up table stuff.  The unofficial data (see below) have effectively
194  * 7-bit resolution (they are rounded to the nearest degree).  I'm assuming
195  * that the transfer function of the device is monotonic and smooth, so a
196  * smooth function fit to the data will allow us to get better precision.
197  * I used the 5th-order poly fit described above and solved for
198  * VIA register values 0-255.  I *10 before rounding, so we get tenth-degree
199  * precision.  (I could have done all 1024 values for our 10-bit readings,
200  * but the function is very linear in the useful range (0-80 deg C), so
201  * we'll just use linear interpolation for 10-bit readings.)  So, temp_lut
202  * is the temp at via register values 0-255:
203  */
204 static const s16 temp_lut[] = {
205 	-709, -688, -667, -646, -627, -607, -589, -570, -553, -536, -519,
206 	-503, -487, -471, -456, -442, -428, -414, -400, -387, -375,
207 	-362, -350, -339, -327, -316, -305, -295, -285, -275, -265,
208 	-255, -246, -237, -229, -220, -212, -204, -196, -188, -180,
209 	-173, -166, -159, -152, -145, -139, -132, -126, -120, -114,
210 	-108, -102, -96, -91, -85, -80, -74, -69, -64, -59, -54, -49,
211 	-44, -39, -34, -29, -25, -20, -15, -11, -6, -2, 3, 7, 12, 16,
212 	20, 25, 29, 33, 37, 42, 46, 50, 54, 59, 63, 67, 71, 75, 79, 84,
213 	88, 92, 96, 100, 104, 109, 113, 117, 121, 125, 130, 134, 138,
214 	142, 146, 151, 155, 159, 163, 168, 172, 176, 181, 185, 189,
215 	193, 198, 202, 206, 211, 215, 219, 224, 228, 232, 237, 241,
216 	245, 250, 254, 259, 263, 267, 272, 276, 281, 285, 290, 294,
217 	299, 303, 307, 312, 316, 321, 325, 330, 334, 339, 344, 348,
218 	353, 357, 362, 366, 371, 376, 380, 385, 390, 395, 399, 404,
219 	409, 414, 419, 423, 428, 433, 438, 443, 449, 454, 459, 464,
220 	469, 475, 480, 486, 491, 497, 502, 508, 514, 520, 526, 532,
221 	538, 544, 551, 557, 564, 571, 578, 584, 592, 599, 606, 614,
222 	621, 629, 637, 645, 654, 662, 671, 680, 689, 698, 708, 718,
223 	728, 738, 749, 759, 770, 782, 793, 805, 818, 830, 843, 856,
224 	870, 883, 898, 912, 927, 943, 958, 975, 991, 1008, 1026, 1044,
225 	1062, 1081, 1101, 1121, 1141, 1162, 1184, 1206, 1229, 1252,
226 	1276, 1301, 1326, 1352, 1378, 1406, 1434, 1462
227 };
228 
229 /*
230  * the original LUT values from Alex van Kaam <darkside@chello.nl>
231  * (for via register values 12-240):
232  * {-50,-49,-47,-45,-43,-41,-39,-38,-37,-35,-34,-33,-32,-31,
233  * -30,-29,-28,-27,-26,-25,-24,-24,-23,-22,-21,-20,-20,-19,-18,-17,-17,-16,-15,
234  * -15,-14,-14,-13,-12,-12,-11,-11,-10,-9,-9,-8,-8,-7,-7,-6,-6,-5,-5,-4,-4,-3,
235  * -3,-2,-2,-1,-1,0,0,1,1,1,3,3,3,4,4,4,5,5,5,6,6,7,7,8,8,9,9,9,10,10,11,11,12,
236  * 12,12,13,13,13,14,14,15,15,16,16,16,17,17,18,18,19,19,20,20,21,21,21,22,22,
237  * 22,23,23,24,24,25,25,26,26,26,27,27,27,28,28,29,29,30,30,30,31,31,32,32,33,
238  * 33,34,34,35,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,
239  * 45,46,46,47,48,48,49,49,50,51,51,52,52,53,53,54,55,55,56,57,57,58,59,59,60,
240  * 61,62,62,63,64,65,66,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,83,84,
241  * 85,86,88,89,91,92,94,96,97,99,101,103,105,107,109,110};
242  *
243  *
244  * Here's the reverse LUT.  I got it by doing a 6-th order poly fit (needed
245  * an extra term for a good fit to these inverse data!) and then
246  * solving for each temp value from -50 to 110 (the useable range for
247  * this chip).  Here's the fit:
248  * viaRegVal = -1.160370e-10*val^6 +3.193693e-08*val^5 - 1.464447e-06*val^4
249  * - 2.525453e-04*val^3 + 1.424593e-02*val^2 + 2.148941e+00*val +7.275808e+01)
250  * Note that n=161:
251  */
252 static const u8 via_lut[] = {
253 	12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 23,
254 	23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40,
255 	41, 43, 45, 46, 48, 49, 51, 53, 55, 57, 59, 60, 62, 64, 66,
256 	69, 71, 73, 75, 77, 79, 82, 84, 86, 88, 91, 93, 95, 98, 100,
257 	103, 105, 107, 110, 112, 115, 117, 119, 122, 124, 126, 129,
258 	131, 134, 136, 138, 140, 143, 145, 147, 150, 152, 154, 156,
259 	158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180,
260 	182, 183, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199,
261 	200, 202, 203, 205, 206, 207, 208, 209, 210, 211, 212, 213,
262 	214, 215, 216, 217, 218, 219, 220, 221, 222, 222, 223, 224,
263 	225, 226, 226, 227, 228, 228, 229, 230, 230, 231, 232, 232,
264 	233, 233, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239,
265 	239, 240
266 };
267 
268 /*
269  * Converting temps to (8-bit) hyst and over registers
270  * No interpolation here.
271  * The +50 is because the temps start at -50
272  */
273 static inline u8 TEMP_TO_REG(long val)
274 {
275 	return via_lut[val <= -50000 ? 0 : val >= 110000 ? 160 :
276 		      (val < 0 ? val - 500 : val + 500) / 1000 + 50];
277 }
278 
279 /* for 8-bit temperature hyst and over registers */
280 #define TEMP_FROM_REG(val)	((long)temp_lut[val] * 100)
281 
282 /* for 10-bit temperature readings */
283 static inline long TEMP_FROM_REG10(u16 val)
284 {
285 	u16 eight_bits = val >> 2;
286 	u16 two_bits = val & 3;
287 
288 	/* no interpolation for these */
289 	if (two_bits == 0 || eight_bits == 255)
290 		return TEMP_FROM_REG(eight_bits);
291 
292 	/* do some linear interpolation */
293 	return (temp_lut[eight_bits] * (4 - two_bits) +
294 		temp_lut[eight_bits + 1] * two_bits) * 25;
295 }
296 
297 #define DIV_FROM_REG(val) (1 << (val))
298 #define DIV_TO_REG(val) ((val) == 8 ? 3 : (val) == 4 ? 2 : (val) == 1 ? 0 : 1)
299 
300 /*
301  * For each registered chip, we need to keep some data in memory.
302  * The structure is dynamically allocated.
303  */
304 struct via686a_data {
305 	unsigned short addr;
306 	const char *name;
307 	struct device *hwmon_dev;
308 	struct mutex update_lock;
309 	bool valid;		/* true if following fields are valid */
310 	unsigned long last_updated;	/* In jiffies */
311 
312 	u8 in[5];		/* Register value */
313 	u8 in_max[5];		/* Register value */
314 	u8 in_min[5];		/* Register value */
315 	u8 fan[2];		/* Register value */
316 	u8 fan_min[2];		/* Register value */
317 	u16 temp[3];		/* Register value 10 bit */
318 	u8 temp_over[3];	/* Register value */
319 	u8 temp_hyst[3];	/* Register value */
320 	u8 fan_div[2];		/* Register encoding, shifted right */
321 	u16 alarms;		/* Register encoding, combined */
322 };
323 
324 static struct pci_dev *s_bridge;	/* pointer to the (only) via686a */
325 
326 static int via686a_probe(struct platform_device *pdev);
327 static int via686a_remove(struct platform_device *pdev);
328 
329 static inline int via686a_read_value(struct via686a_data *data, u8 reg)
330 {
331 	return inb_p(data->addr + reg);
332 }
333 
334 static inline void via686a_write_value(struct via686a_data *data, u8 reg,
335 				       u8 value)
336 {
337 	outb_p(value, data->addr + reg);
338 }
339 
340 static struct via686a_data *via686a_update_device(struct device *dev);
341 static void via686a_init_device(struct via686a_data *data);
342 
343 /* following are the sysfs callback functions */
344 
345 /* 7 voltage sensors */
346 static ssize_t in_show(struct device *dev, struct device_attribute *da,
347 		       char *buf) {
348 	struct via686a_data *data = via686a_update_device(dev);
349 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
350 	int nr = attr->index;
351 	return sprintf(buf, "%ld\n", IN_FROM_REG(data->in[nr], nr));
352 }
353 
354 static ssize_t in_min_show(struct device *dev, struct device_attribute *da,
355 			   char *buf) {
356 	struct via686a_data *data = via686a_update_device(dev);
357 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
358 	int nr = attr->index;
359 	return sprintf(buf, "%ld\n", IN_FROM_REG(data->in_min[nr], nr));
360 }
361 
362 static ssize_t in_max_show(struct device *dev, struct device_attribute *da,
363 			   char *buf) {
364 	struct via686a_data *data = via686a_update_device(dev);
365 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
366 	int nr = attr->index;
367 	return sprintf(buf, "%ld\n", IN_FROM_REG(data->in_max[nr], nr));
368 }
369 
370 static ssize_t in_min_store(struct device *dev, struct device_attribute *da,
371 			    const char *buf, size_t count) {
372 	struct via686a_data *data = dev_get_drvdata(dev);
373 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
374 	int nr = attr->index;
375 	unsigned long val;
376 	int err;
377 
378 	err = kstrtoul(buf, 10, &val);
379 	if (err)
380 		return err;
381 
382 	mutex_lock(&data->update_lock);
383 	data->in_min[nr] = IN_TO_REG(val, nr);
384 	via686a_write_value(data, VIA686A_REG_IN_MIN(nr),
385 			data->in_min[nr]);
386 	mutex_unlock(&data->update_lock);
387 	return count;
388 }
389 static ssize_t in_max_store(struct device *dev, struct device_attribute *da,
390 			    const char *buf, size_t count) {
391 	struct via686a_data *data = dev_get_drvdata(dev);
392 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
393 	int nr = attr->index;
394 	unsigned long val;
395 	int err;
396 
397 	err = kstrtoul(buf, 10, &val);
398 	if (err)
399 		return err;
400 
401 	mutex_lock(&data->update_lock);
402 	data->in_max[nr] = IN_TO_REG(val, nr);
403 	via686a_write_value(data, VIA686A_REG_IN_MAX(nr),
404 			data->in_max[nr]);
405 	mutex_unlock(&data->update_lock);
406 	return count;
407 }
408 
409 static SENSOR_DEVICE_ATTR_RO(in0_input, in, 0);
410 static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
411 static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
412 static SENSOR_DEVICE_ATTR_RO(in1_input, in, 1);
413 static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
414 static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
415 static SENSOR_DEVICE_ATTR_RO(in2_input, in, 2);
416 static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
417 static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
418 static SENSOR_DEVICE_ATTR_RO(in3_input, in, 3);
419 static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
420 static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
421 static SENSOR_DEVICE_ATTR_RO(in4_input, in, 4);
422 static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
423 static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
424 
425 /* 3 temperatures */
426 static ssize_t temp_show(struct device *dev, struct device_attribute *da,
427 			 char *buf) {
428 	struct via686a_data *data = via686a_update_device(dev);
429 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
430 	int nr = attr->index;
431 	return sprintf(buf, "%ld\n", TEMP_FROM_REG10(data->temp[nr]));
432 }
433 static ssize_t temp_over_show(struct device *dev, struct device_attribute *da,
434 			      char *buf) {
435 	struct via686a_data *data = via686a_update_device(dev);
436 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
437 	int nr = attr->index;
438 	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_over[nr]));
439 }
440 static ssize_t temp_hyst_show(struct device *dev, struct device_attribute *da,
441 			      char *buf) {
442 	struct via686a_data *data = via686a_update_device(dev);
443 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
444 	int nr = attr->index;
445 	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_hyst[nr]));
446 }
447 static ssize_t temp_over_store(struct device *dev,
448 			       struct device_attribute *da, const char *buf,
449 			       size_t count) {
450 	struct via686a_data *data = dev_get_drvdata(dev);
451 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
452 	int nr = attr->index;
453 	long val;
454 	int err;
455 
456 	err = kstrtol(buf, 10, &val);
457 	if (err)
458 		return err;
459 
460 	mutex_lock(&data->update_lock);
461 	data->temp_over[nr] = TEMP_TO_REG(val);
462 	via686a_write_value(data, VIA686A_REG_TEMP_OVER[nr],
463 			    data->temp_over[nr]);
464 	mutex_unlock(&data->update_lock);
465 	return count;
466 }
467 static ssize_t temp_hyst_store(struct device *dev,
468 			       struct device_attribute *da, const char *buf,
469 			       size_t count) {
470 	struct via686a_data *data = dev_get_drvdata(dev);
471 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
472 	int nr = attr->index;
473 	long val;
474 	int err;
475 
476 	err = kstrtol(buf, 10, &val);
477 	if (err)
478 		return err;
479 
480 	mutex_lock(&data->update_lock);
481 	data->temp_hyst[nr] = TEMP_TO_REG(val);
482 	via686a_write_value(data, VIA686A_REG_TEMP_HYST[nr],
483 			    data->temp_hyst[nr]);
484 	mutex_unlock(&data->update_lock);
485 	return count;
486 }
487 
488 static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0);
489 static SENSOR_DEVICE_ATTR_RW(temp1_max, temp_over, 0);
490 static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst, temp_hyst, 0);
491 static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1);
492 static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_over, 1);
493 static SENSOR_DEVICE_ATTR_RW(temp2_max_hyst, temp_hyst, 1);
494 static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2);
495 static SENSOR_DEVICE_ATTR_RW(temp3_max, temp_over, 2);
496 static SENSOR_DEVICE_ATTR_RW(temp3_max_hyst, temp_hyst, 2);
497 
498 /* 2 Fans */
499 static ssize_t fan_show(struct device *dev, struct device_attribute *da,
500 			char *buf) {
501 	struct via686a_data *data = via686a_update_device(dev);
502 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
503 	int nr = attr->index;
504 	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
505 				DIV_FROM_REG(data->fan_div[nr])));
506 }
507 static ssize_t fan_min_show(struct device *dev, struct device_attribute *da,
508 			    char *buf) {
509 	struct via686a_data *data = via686a_update_device(dev);
510 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
511 	int nr = attr->index;
512 	return sprintf(buf, "%d\n",
513 		FAN_FROM_REG(data->fan_min[nr],
514 			     DIV_FROM_REG(data->fan_div[nr])));
515 }
516 static ssize_t fan_div_show(struct device *dev, struct device_attribute *da,
517 			    char *buf) {
518 	struct via686a_data *data = via686a_update_device(dev);
519 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
520 	int nr = attr->index;
521 	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
522 }
523 static ssize_t fan_min_store(struct device *dev, struct device_attribute *da,
524 			     const char *buf, size_t count) {
525 	struct via686a_data *data = dev_get_drvdata(dev);
526 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
527 	int nr = attr->index;
528 	unsigned long val;
529 	int err;
530 
531 	err = kstrtoul(buf, 10, &val);
532 	if (err)
533 		return err;
534 
535 	mutex_lock(&data->update_lock);
536 	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
537 	via686a_write_value(data, VIA686A_REG_FAN_MIN(nr+1), data->fan_min[nr]);
538 	mutex_unlock(&data->update_lock);
539 	return count;
540 }
541 static ssize_t fan_div_store(struct device *dev, struct device_attribute *da,
542 			     const char *buf, size_t count) {
543 	struct via686a_data *data = dev_get_drvdata(dev);
544 	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
545 	int nr = attr->index;
546 	int old;
547 	unsigned long val;
548 	int err;
549 
550 	err = kstrtoul(buf, 10, &val);
551 	if (err)
552 		return err;
553 
554 	mutex_lock(&data->update_lock);
555 	old = via686a_read_value(data, VIA686A_REG_FANDIV);
556 	data->fan_div[nr] = DIV_TO_REG(val);
557 	old = (old & 0x0f) | (data->fan_div[1] << 6) | (data->fan_div[0] << 4);
558 	via686a_write_value(data, VIA686A_REG_FANDIV, old);
559 	mutex_unlock(&data->update_lock);
560 	return count;
561 }
562 
563 static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
564 static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
565 static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
566 static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
567 static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
568 static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
569 
570 /* Alarms */
571 static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
572 			   char *buf)
573 {
574 	struct via686a_data *data = via686a_update_device(dev);
575 	return sprintf(buf, "%u\n", data->alarms);
576 }
577 
578 static DEVICE_ATTR_RO(alarms);
579 
580 static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
581 			  char *buf)
582 {
583 	int bitnr = to_sensor_dev_attr(attr)->index;
584 	struct via686a_data *data = via686a_update_device(dev);
585 	return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
586 }
587 static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0);
588 static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1);
589 static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2);
590 static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
591 static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 8);
592 static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 4);
593 static SENSOR_DEVICE_ATTR_RO(temp2_alarm, alarm, 11);
594 static SENSOR_DEVICE_ATTR_RO(temp3_alarm, alarm, 15);
595 static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 6);
596 static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 7);
597 
598 static ssize_t name_show(struct device *dev, struct device_attribute
599 			 *devattr, char *buf)
600 {
601 	struct via686a_data *data = dev_get_drvdata(dev);
602 	return sprintf(buf, "%s\n", data->name);
603 }
604 static DEVICE_ATTR_RO(name);
605 
606 static struct attribute *via686a_attributes[] = {
607 	&sensor_dev_attr_in0_input.dev_attr.attr,
608 	&sensor_dev_attr_in1_input.dev_attr.attr,
609 	&sensor_dev_attr_in2_input.dev_attr.attr,
610 	&sensor_dev_attr_in3_input.dev_attr.attr,
611 	&sensor_dev_attr_in4_input.dev_attr.attr,
612 	&sensor_dev_attr_in0_min.dev_attr.attr,
613 	&sensor_dev_attr_in1_min.dev_attr.attr,
614 	&sensor_dev_attr_in2_min.dev_attr.attr,
615 	&sensor_dev_attr_in3_min.dev_attr.attr,
616 	&sensor_dev_attr_in4_min.dev_attr.attr,
617 	&sensor_dev_attr_in0_max.dev_attr.attr,
618 	&sensor_dev_attr_in1_max.dev_attr.attr,
619 	&sensor_dev_attr_in2_max.dev_attr.attr,
620 	&sensor_dev_attr_in3_max.dev_attr.attr,
621 	&sensor_dev_attr_in4_max.dev_attr.attr,
622 	&sensor_dev_attr_in0_alarm.dev_attr.attr,
623 	&sensor_dev_attr_in1_alarm.dev_attr.attr,
624 	&sensor_dev_attr_in2_alarm.dev_attr.attr,
625 	&sensor_dev_attr_in3_alarm.dev_attr.attr,
626 	&sensor_dev_attr_in4_alarm.dev_attr.attr,
627 
628 	&sensor_dev_attr_temp1_input.dev_attr.attr,
629 	&sensor_dev_attr_temp2_input.dev_attr.attr,
630 	&sensor_dev_attr_temp3_input.dev_attr.attr,
631 	&sensor_dev_attr_temp1_max.dev_attr.attr,
632 	&sensor_dev_attr_temp2_max.dev_attr.attr,
633 	&sensor_dev_attr_temp3_max.dev_attr.attr,
634 	&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
635 	&sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
636 	&sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
637 	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
638 	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
639 	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
640 
641 	&sensor_dev_attr_fan1_input.dev_attr.attr,
642 	&sensor_dev_attr_fan2_input.dev_attr.attr,
643 	&sensor_dev_attr_fan1_min.dev_attr.attr,
644 	&sensor_dev_attr_fan2_min.dev_attr.attr,
645 	&sensor_dev_attr_fan1_div.dev_attr.attr,
646 	&sensor_dev_attr_fan2_div.dev_attr.attr,
647 	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
648 	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
649 
650 	&dev_attr_alarms.attr,
651 	&dev_attr_name.attr,
652 	NULL
653 };
654 
655 static const struct attribute_group via686a_group = {
656 	.attrs = via686a_attributes,
657 };
658 
659 static struct platform_driver via686a_driver = {
660 	.driver = {
661 		.name	= DRIVER_NAME,
662 	},
663 	.probe		= via686a_probe,
664 	.remove		= via686a_remove,
665 };
666 
667 /* This is called when the module is loaded */
668 static int via686a_probe(struct platform_device *pdev)
669 {
670 	struct via686a_data *data;
671 	struct resource *res;
672 	int err;
673 
674 	/* Reserve the ISA region */
675 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
676 	if (!devm_request_region(&pdev->dev, res->start, VIA686A_EXTENT,
677 				 DRIVER_NAME)) {
678 		dev_err(&pdev->dev, "Region 0x%lx-0x%lx already in use!\n",
679 			(unsigned long)res->start, (unsigned long)res->end);
680 		return -ENODEV;
681 	}
682 
683 	data = devm_kzalloc(&pdev->dev, sizeof(struct via686a_data),
684 			    GFP_KERNEL);
685 	if (!data)
686 		return -ENOMEM;
687 
688 	platform_set_drvdata(pdev, data);
689 	data->addr = res->start;
690 	data->name = DRIVER_NAME;
691 	mutex_init(&data->update_lock);
692 
693 	/* Initialize the VIA686A chip */
694 	via686a_init_device(data);
695 
696 	/* Register sysfs hooks */
697 	err = sysfs_create_group(&pdev->dev.kobj, &via686a_group);
698 	if (err)
699 		return err;
700 
701 	data->hwmon_dev = hwmon_device_register(&pdev->dev);
702 	if (IS_ERR(data->hwmon_dev)) {
703 		err = PTR_ERR(data->hwmon_dev);
704 		goto exit_remove_files;
705 	}
706 
707 	return 0;
708 
709 exit_remove_files:
710 	sysfs_remove_group(&pdev->dev.kobj, &via686a_group);
711 	return err;
712 }
713 
714 static int via686a_remove(struct platform_device *pdev)
715 {
716 	struct via686a_data *data = platform_get_drvdata(pdev);
717 
718 	hwmon_device_unregister(data->hwmon_dev);
719 	sysfs_remove_group(&pdev->dev.kobj, &via686a_group);
720 
721 	return 0;
722 }
723 
724 static void via686a_update_fan_div(struct via686a_data *data)
725 {
726 	int reg = via686a_read_value(data, VIA686A_REG_FANDIV);
727 	data->fan_div[0] = (reg >> 4) & 0x03;
728 	data->fan_div[1] = reg >> 6;
729 }
730 
731 static void via686a_init_device(struct via686a_data *data)
732 {
733 	u8 reg;
734 
735 	/* Start monitoring */
736 	reg = via686a_read_value(data, VIA686A_REG_CONFIG);
737 	via686a_write_value(data, VIA686A_REG_CONFIG, (reg | 0x01) & 0x7F);
738 
739 	/* Configure temp interrupt mode for continuous-interrupt operation */
740 	reg = via686a_read_value(data, VIA686A_REG_TEMP_MODE);
741 	via686a_write_value(data, VIA686A_REG_TEMP_MODE,
742 			    (reg & ~VIA686A_TEMP_MODE_MASK)
743 			    | VIA686A_TEMP_MODE_CONTINUOUS);
744 
745 	/* Pre-read fan clock divisor values */
746 	via686a_update_fan_div(data);
747 }
748 
749 static struct via686a_data *via686a_update_device(struct device *dev)
750 {
751 	struct via686a_data *data = dev_get_drvdata(dev);
752 	int i;
753 
754 	mutex_lock(&data->update_lock);
755 
756 	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
757 	    || !data->valid) {
758 		for (i = 0; i <= 4; i++) {
759 			data->in[i] =
760 			    via686a_read_value(data, VIA686A_REG_IN(i));
761 			data->in_min[i] = via686a_read_value(data,
762 							     VIA686A_REG_IN_MIN
763 							     (i));
764 			data->in_max[i] =
765 			    via686a_read_value(data, VIA686A_REG_IN_MAX(i));
766 		}
767 		for (i = 1; i <= 2; i++) {
768 			data->fan[i - 1] =
769 			    via686a_read_value(data, VIA686A_REG_FAN(i));
770 			data->fan_min[i - 1] = via686a_read_value(data,
771 						     VIA686A_REG_FAN_MIN(i));
772 		}
773 		for (i = 0; i <= 2; i++) {
774 			data->temp[i] = via686a_read_value(data,
775 						 VIA686A_REG_TEMP[i]) << 2;
776 			data->temp_over[i] =
777 			    via686a_read_value(data,
778 					       VIA686A_REG_TEMP_OVER[i]);
779 			data->temp_hyst[i] =
780 			    via686a_read_value(data,
781 					       VIA686A_REG_TEMP_HYST[i]);
782 		}
783 		/*
784 		 * add in lower 2 bits
785 		 * temp1 uses bits 7-6 of VIA686A_REG_TEMP_LOW1
786 		 * temp2 uses bits 5-4 of VIA686A_REG_TEMP_LOW23
787 		 * temp3 uses bits 7-6 of VIA686A_REG_TEMP_LOW23
788 		 */
789 		data->temp[0] |= (via686a_read_value(data,
790 						     VIA686A_REG_TEMP_LOW1)
791 				  & 0xc0) >> 6;
792 		data->temp[1] |=
793 		    (via686a_read_value(data, VIA686A_REG_TEMP_LOW23) &
794 		     0x30) >> 4;
795 		data->temp[2] |=
796 		    (via686a_read_value(data, VIA686A_REG_TEMP_LOW23) &
797 		     0xc0) >> 6;
798 
799 		via686a_update_fan_div(data);
800 		data->alarms =
801 		    via686a_read_value(data,
802 				       VIA686A_REG_ALARM1) |
803 		    (via686a_read_value(data, VIA686A_REG_ALARM2) << 8);
804 		data->last_updated = jiffies;
805 		data->valid = true;
806 	}
807 
808 	mutex_unlock(&data->update_lock);
809 
810 	return data;
811 }
812 
813 static const struct pci_device_id via686a_pci_ids[] = {
814 	{ PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4) },
815 	{ }
816 };
817 MODULE_DEVICE_TABLE(pci, via686a_pci_ids);
818 
819 static int via686a_device_add(unsigned short address)
820 {
821 	struct resource res = {
822 		.start	= address,
823 		.end	= address + VIA686A_EXTENT - 1,
824 		.name	= DRIVER_NAME,
825 		.flags	= IORESOURCE_IO,
826 	};
827 	int err;
828 
829 	err = acpi_check_resource_conflict(&res);
830 	if (err)
831 		goto exit;
832 
833 	pdev = platform_device_alloc(DRIVER_NAME, address);
834 	if (!pdev) {
835 		err = -ENOMEM;
836 		pr_err("Device allocation failed\n");
837 		goto exit;
838 	}
839 
840 	err = platform_device_add_resources(pdev, &res, 1);
841 	if (err) {
842 		pr_err("Device resource addition failed (%d)\n", err);
843 		goto exit_device_put;
844 	}
845 
846 	err = platform_device_add(pdev);
847 	if (err) {
848 		pr_err("Device addition failed (%d)\n", err);
849 		goto exit_device_put;
850 	}
851 
852 	return 0;
853 
854 exit_device_put:
855 	platform_device_put(pdev);
856 exit:
857 	return err;
858 }
859 
860 static int via686a_pci_probe(struct pci_dev *dev,
861 				       const struct pci_device_id *id)
862 {
863 	u16 address, val;
864 
865 	if (force_addr) {
866 		address = force_addr & ~(VIA686A_EXTENT - 1);
867 		dev_warn(&dev->dev, "Forcing ISA address 0x%x\n", address);
868 		if (PCIBIOS_SUCCESSFUL !=
869 		    pci_write_config_word(dev, VIA686A_BASE_REG, address | 1))
870 			return -ENODEV;
871 	}
872 	if (PCIBIOS_SUCCESSFUL !=
873 	    pci_read_config_word(dev, VIA686A_BASE_REG, &val))
874 		return -ENODEV;
875 
876 	address = val & ~(VIA686A_EXTENT - 1);
877 	if (address == 0) {
878 		dev_err(&dev->dev,
879 			"base address not set - upgrade BIOS or use force_addr=0xaddr\n");
880 		return -ENODEV;
881 	}
882 
883 	if (PCIBIOS_SUCCESSFUL !=
884 	    pci_read_config_word(dev, VIA686A_ENABLE_REG, &val))
885 		return -ENODEV;
886 	if (!(val & 0x0001)) {
887 		if (!force_addr) {
888 			dev_warn(&dev->dev,
889 				 "Sensors disabled, enable with force_addr=0x%x\n",
890 				 address);
891 			return -ENODEV;
892 		}
893 
894 		dev_warn(&dev->dev, "Enabling sensors\n");
895 		if (PCIBIOS_SUCCESSFUL !=
896 		    pci_write_config_word(dev, VIA686A_ENABLE_REG,
897 					  val | 0x0001))
898 			return -ENODEV;
899 	}
900 
901 	if (platform_driver_register(&via686a_driver))
902 		goto exit;
903 
904 	/* Sets global pdev as a side effect */
905 	if (via686a_device_add(address))
906 		goto exit_unregister;
907 
908 	/*
909 	 * Always return failure here.  This is to allow other drivers to bind
910 	 * to this pci device.  We don't really want to have control over the
911 	 * pci device, we only wanted to read as few register values from it.
912 	 */
913 	s_bridge = pci_dev_get(dev);
914 	return -ENODEV;
915 
916 exit_unregister:
917 	platform_driver_unregister(&via686a_driver);
918 exit:
919 	return -ENODEV;
920 }
921 
922 static struct pci_driver via686a_pci_driver = {
923 	.name		= DRIVER_NAME,
924 	.id_table	= via686a_pci_ids,
925 	.probe		= via686a_pci_probe,
926 };
927 
928 static int __init sm_via686a_init(void)
929 {
930 	return pci_register_driver(&via686a_pci_driver);
931 }
932 
933 static void __exit sm_via686a_exit(void)
934 {
935 	pci_unregister_driver(&via686a_pci_driver);
936 	if (s_bridge != NULL) {
937 		platform_device_unregister(pdev);
938 		platform_driver_unregister(&via686a_driver);
939 		pci_dev_put(s_bridge);
940 		s_bridge = NULL;
941 	}
942 }
943 
944 MODULE_AUTHOR("Kyösti Mälkki <kmalkki@cc.hut.fi>, "
945 	      "Mark Studebaker <mdsxyz123@yahoo.com> "
946 	      "and Bob Dougherty <bobd@stanford.edu>");
947 MODULE_DESCRIPTION("VIA 686A Sensor device");
948 MODULE_LICENSE("GPL");
949 
950 module_init(sm_via686a_init);
951 module_exit(sm_via686a_exit);
952