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