Linux Audio

Check our new training course

Loading...
v6.13.7
  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 */
 43static unsigned short force_addr;
 44module_param(force_addr, ushort, 0);
 45MODULE_PARM_DESC(force_addr,
 46		 "Initialize the base address of the sensors");
 47
 48static 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 */
 73static const u8 VIA686A_REG_TEMP[]	= { 0x20, 0x21, 0x1f };
 74static const u8 VIA686A_REG_TEMP_OVER[]	= { 0x39, 0x3d, 0x1d };
 75static 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 */
116static 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
136static 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 */
159static 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 */
204static 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 */
252static 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 */
273static 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 */
283static 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 */
304struct 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
324static struct pci_dev *s_bridge;	/* pointer to the (only) via686a */
325
 
 
 
326static inline int via686a_read_value(struct via686a_data *data, u8 reg)
327{
328	return inb_p(data->addr + reg);
329}
330
331static inline void via686a_write_value(struct via686a_data *data, u8 reg,
332				       u8 value)
333{
334	outb_p(value, data->addr + reg);
335}
336
337static void via686a_update_fan_div(struct via686a_data *data)
338{
339	int reg = via686a_read_value(data, VIA686A_REG_FANDIV);
340	data->fan_div[0] = (reg >> 4) & 0x03;
341	data->fan_div[1] = reg >> 6;
342}
343
344static struct via686a_data *via686a_update_device(struct device *dev)
345{
346	struct via686a_data *data = dev_get_drvdata(dev);
347	int i;
348
349	mutex_lock(&data->update_lock);
350
351	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
352	    || !data->valid) {
353		for (i = 0; i <= 4; i++) {
354			data->in[i] =
355			    via686a_read_value(data, VIA686A_REG_IN(i));
356			data->in_min[i] = via686a_read_value(data,
357							     VIA686A_REG_IN_MIN
358							     (i));
359			data->in_max[i] =
360			    via686a_read_value(data, VIA686A_REG_IN_MAX(i));
361		}
362		for (i = 1; i <= 2; i++) {
363			data->fan[i - 1] =
364			    via686a_read_value(data, VIA686A_REG_FAN(i));
365			data->fan_min[i - 1] = via686a_read_value(data,
366						     VIA686A_REG_FAN_MIN(i));
367		}
368		for (i = 0; i <= 2; i++) {
369			data->temp[i] = via686a_read_value(data,
370						 VIA686A_REG_TEMP[i]) << 2;
371			data->temp_over[i] =
372			    via686a_read_value(data,
373					       VIA686A_REG_TEMP_OVER[i]);
374			data->temp_hyst[i] =
375			    via686a_read_value(data,
376					       VIA686A_REG_TEMP_HYST[i]);
377		}
378		/*
379		 * add in lower 2 bits
380		 * temp1 uses bits 7-6 of VIA686A_REG_TEMP_LOW1
381		 * temp2 uses bits 5-4 of VIA686A_REG_TEMP_LOW23
382		 * temp3 uses bits 7-6 of VIA686A_REG_TEMP_LOW23
383		 */
384		data->temp[0] |= (via686a_read_value(data,
385						     VIA686A_REG_TEMP_LOW1)
386				  & 0xc0) >> 6;
387		data->temp[1] |=
388		    (via686a_read_value(data, VIA686A_REG_TEMP_LOW23) &
389		     0x30) >> 4;
390		data->temp[2] |=
391		    (via686a_read_value(data, VIA686A_REG_TEMP_LOW23) &
392		     0xc0) >> 6;
393
394		via686a_update_fan_div(data);
395		data->alarms =
396		    via686a_read_value(data,
397				       VIA686A_REG_ALARM1) |
398		    (via686a_read_value(data, VIA686A_REG_ALARM2) << 8);
399		data->last_updated = jiffies;
400		data->valid = true;
401	}
402
403	mutex_unlock(&data->update_lock);
404
405	return data;
406}
407
408/* following are the sysfs callback functions */
409
410/* 7 voltage sensors */
411static ssize_t in_show(struct device *dev, struct device_attribute *da,
412		       char *buf) {
413	struct via686a_data *data = via686a_update_device(dev);
414	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
415	int nr = attr->index;
416	return sprintf(buf, "%ld\n", IN_FROM_REG(data->in[nr], nr));
417}
418
419static ssize_t in_min_show(struct device *dev, struct device_attribute *da,
420			   char *buf) {
421	struct via686a_data *data = via686a_update_device(dev);
422	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
423	int nr = attr->index;
424	return sprintf(buf, "%ld\n", IN_FROM_REG(data->in_min[nr], nr));
425}
426
427static ssize_t in_max_show(struct device *dev, struct device_attribute *da,
428			   char *buf) {
429	struct via686a_data *data = via686a_update_device(dev);
430	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
431	int nr = attr->index;
432	return sprintf(buf, "%ld\n", IN_FROM_REG(data->in_max[nr], nr));
433}
434
435static ssize_t in_min_store(struct device *dev, struct device_attribute *da,
436			    const char *buf, size_t count) {
437	struct via686a_data *data = dev_get_drvdata(dev);
438	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
439	int nr = attr->index;
440	unsigned long val;
441	int err;
442
443	err = kstrtoul(buf, 10, &val);
444	if (err)
445		return err;
446
447	mutex_lock(&data->update_lock);
448	data->in_min[nr] = IN_TO_REG(val, nr);
449	via686a_write_value(data, VIA686A_REG_IN_MIN(nr),
450			data->in_min[nr]);
451	mutex_unlock(&data->update_lock);
452	return count;
453}
454static ssize_t in_max_store(struct device *dev, struct device_attribute *da,
455			    const char *buf, size_t count) {
456	struct via686a_data *data = dev_get_drvdata(dev);
457	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
458	int nr = attr->index;
459	unsigned long val;
460	int err;
461
462	err = kstrtoul(buf, 10, &val);
463	if (err)
464		return err;
465
466	mutex_lock(&data->update_lock);
467	data->in_max[nr] = IN_TO_REG(val, nr);
468	via686a_write_value(data, VIA686A_REG_IN_MAX(nr),
469			data->in_max[nr]);
470	mutex_unlock(&data->update_lock);
471	return count;
472}
473
474static SENSOR_DEVICE_ATTR_RO(in0_input, in, 0);
475static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
476static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
477static SENSOR_DEVICE_ATTR_RO(in1_input, in, 1);
478static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
479static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
480static SENSOR_DEVICE_ATTR_RO(in2_input, in, 2);
481static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
482static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
483static SENSOR_DEVICE_ATTR_RO(in3_input, in, 3);
484static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
485static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
486static SENSOR_DEVICE_ATTR_RO(in4_input, in, 4);
487static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
488static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
489
490/* 3 temperatures */
491static ssize_t temp_show(struct device *dev, struct device_attribute *da,
492			 char *buf) {
493	struct via686a_data *data = via686a_update_device(dev);
494	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
495	int nr = attr->index;
496	return sprintf(buf, "%ld\n", TEMP_FROM_REG10(data->temp[nr]));
497}
498static ssize_t temp_over_show(struct device *dev, struct device_attribute *da,
499			      char *buf) {
500	struct via686a_data *data = via686a_update_device(dev);
501	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
502	int nr = attr->index;
503	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_over[nr]));
504}
505static ssize_t temp_hyst_show(struct device *dev, struct device_attribute *da,
506			      char *buf) {
507	struct via686a_data *data = via686a_update_device(dev);
508	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
509	int nr = attr->index;
510	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_hyst[nr]));
511}
512static ssize_t temp_over_store(struct device *dev,
513			       struct device_attribute *da, const char *buf,
514			       size_t count) {
515	struct via686a_data *data = dev_get_drvdata(dev);
516	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
517	int nr = attr->index;
518	long val;
519	int err;
520
521	err = kstrtol(buf, 10, &val);
522	if (err)
523		return err;
524
525	mutex_lock(&data->update_lock);
526	data->temp_over[nr] = TEMP_TO_REG(val);
527	via686a_write_value(data, VIA686A_REG_TEMP_OVER[nr],
528			    data->temp_over[nr]);
529	mutex_unlock(&data->update_lock);
530	return count;
531}
532static ssize_t temp_hyst_store(struct device *dev,
533			       struct device_attribute *da, const char *buf,
534			       size_t count) {
535	struct via686a_data *data = dev_get_drvdata(dev);
536	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
537	int nr = attr->index;
538	long val;
539	int err;
540
541	err = kstrtol(buf, 10, &val);
542	if (err)
543		return err;
544
545	mutex_lock(&data->update_lock);
546	data->temp_hyst[nr] = TEMP_TO_REG(val);
547	via686a_write_value(data, VIA686A_REG_TEMP_HYST[nr],
548			    data->temp_hyst[nr]);
549	mutex_unlock(&data->update_lock);
550	return count;
551}
552
553static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0);
554static SENSOR_DEVICE_ATTR_RW(temp1_max, temp_over, 0);
555static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst, temp_hyst, 0);
556static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1);
557static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_over, 1);
558static SENSOR_DEVICE_ATTR_RW(temp2_max_hyst, temp_hyst, 1);
559static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2);
560static SENSOR_DEVICE_ATTR_RW(temp3_max, temp_over, 2);
561static SENSOR_DEVICE_ATTR_RW(temp3_max_hyst, temp_hyst, 2);
 
562
563/* 2 Fans */
564static ssize_t fan_show(struct device *dev, struct device_attribute *da,
565			char *buf) {
566	struct via686a_data *data = via686a_update_device(dev);
567	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
568	int nr = attr->index;
569	return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
570				DIV_FROM_REG(data->fan_div[nr])));
571}
572static ssize_t fan_min_show(struct device *dev, struct device_attribute *da,
573			    char *buf) {
574	struct via686a_data *data = via686a_update_device(dev);
575	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
576	int nr = attr->index;
577	return sprintf(buf, "%d\n",
578		FAN_FROM_REG(data->fan_min[nr],
579			     DIV_FROM_REG(data->fan_div[nr])));
580}
581static ssize_t fan_div_show(struct device *dev, struct device_attribute *da,
582			    char *buf) {
583	struct via686a_data *data = via686a_update_device(dev);
584	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
585	int nr = attr->index;
586	return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
587}
588static ssize_t fan_min_store(struct device *dev, struct device_attribute *da,
589			     const char *buf, size_t count) {
590	struct via686a_data *data = dev_get_drvdata(dev);
591	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
592	int nr = attr->index;
593	unsigned long val;
594	int err;
595
596	err = kstrtoul(buf, 10, &val);
597	if (err)
598		return err;
599
600	mutex_lock(&data->update_lock);
601	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
602	via686a_write_value(data, VIA686A_REG_FAN_MIN(nr+1), data->fan_min[nr]);
603	mutex_unlock(&data->update_lock);
604	return count;
605}
606static ssize_t fan_div_store(struct device *dev, struct device_attribute *da,
607			     const char *buf, size_t count) {
608	struct via686a_data *data = dev_get_drvdata(dev);
609	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
610	int nr = attr->index;
611	int old;
612	unsigned long val;
613	int err;
614
615	err = kstrtoul(buf, 10, &val);
616	if (err)
617		return err;
618
619	mutex_lock(&data->update_lock);
620	old = via686a_read_value(data, VIA686A_REG_FANDIV);
621	data->fan_div[nr] = DIV_TO_REG(val);
622	old = (old & 0x0f) | (data->fan_div[1] << 6) | (data->fan_div[0] << 4);
623	via686a_write_value(data, VIA686A_REG_FANDIV, old);
624	mutex_unlock(&data->update_lock);
625	return count;
626}
627
628static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
629static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
630static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
631static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
632static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
633static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
 
 
 
 
634
635/* Alarms */
636static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
637			   char *buf)
638{
639	struct via686a_data *data = via686a_update_device(dev);
640	return sprintf(buf, "%u\n", data->alarms);
641}
642
643static DEVICE_ATTR_RO(alarms);
644
645static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
646			  char *buf)
647{
648	int bitnr = to_sensor_dev_attr(attr)->index;
649	struct via686a_data *data = via686a_update_device(dev);
650	return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
651}
652static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0);
653static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1);
654static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2);
655static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
656static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 8);
657static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 4);
658static SENSOR_DEVICE_ATTR_RO(temp2_alarm, alarm, 11);
659static SENSOR_DEVICE_ATTR_RO(temp3_alarm, alarm, 15);
660static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 6);
661static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 7);
662
663static ssize_t name_show(struct device *dev, struct device_attribute
664			 *devattr, char *buf)
665{
666	struct via686a_data *data = dev_get_drvdata(dev);
667	return sprintf(buf, "%s\n", data->name);
668}
669static DEVICE_ATTR_RO(name);
670
671static struct attribute *via686a_attributes[] = {
672	&sensor_dev_attr_in0_input.dev_attr.attr,
673	&sensor_dev_attr_in1_input.dev_attr.attr,
674	&sensor_dev_attr_in2_input.dev_attr.attr,
675	&sensor_dev_attr_in3_input.dev_attr.attr,
676	&sensor_dev_attr_in4_input.dev_attr.attr,
677	&sensor_dev_attr_in0_min.dev_attr.attr,
678	&sensor_dev_attr_in1_min.dev_attr.attr,
679	&sensor_dev_attr_in2_min.dev_attr.attr,
680	&sensor_dev_attr_in3_min.dev_attr.attr,
681	&sensor_dev_attr_in4_min.dev_attr.attr,
682	&sensor_dev_attr_in0_max.dev_attr.attr,
683	&sensor_dev_attr_in1_max.dev_attr.attr,
684	&sensor_dev_attr_in2_max.dev_attr.attr,
685	&sensor_dev_attr_in3_max.dev_attr.attr,
686	&sensor_dev_attr_in4_max.dev_attr.attr,
687	&sensor_dev_attr_in0_alarm.dev_attr.attr,
688	&sensor_dev_attr_in1_alarm.dev_attr.attr,
689	&sensor_dev_attr_in2_alarm.dev_attr.attr,
690	&sensor_dev_attr_in3_alarm.dev_attr.attr,
691	&sensor_dev_attr_in4_alarm.dev_attr.attr,
692
693	&sensor_dev_attr_temp1_input.dev_attr.attr,
694	&sensor_dev_attr_temp2_input.dev_attr.attr,
695	&sensor_dev_attr_temp3_input.dev_attr.attr,
696	&sensor_dev_attr_temp1_max.dev_attr.attr,
697	&sensor_dev_attr_temp2_max.dev_attr.attr,
698	&sensor_dev_attr_temp3_max.dev_attr.attr,
699	&sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
700	&sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
701	&sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
702	&sensor_dev_attr_temp1_alarm.dev_attr.attr,
703	&sensor_dev_attr_temp2_alarm.dev_attr.attr,
704	&sensor_dev_attr_temp3_alarm.dev_attr.attr,
705
706	&sensor_dev_attr_fan1_input.dev_attr.attr,
707	&sensor_dev_attr_fan2_input.dev_attr.attr,
708	&sensor_dev_attr_fan1_min.dev_attr.attr,
709	&sensor_dev_attr_fan2_min.dev_attr.attr,
710	&sensor_dev_attr_fan1_div.dev_attr.attr,
711	&sensor_dev_attr_fan2_div.dev_attr.attr,
712	&sensor_dev_attr_fan1_alarm.dev_attr.attr,
713	&sensor_dev_attr_fan2_alarm.dev_attr.attr,
714
715	&dev_attr_alarms.attr,
716	&dev_attr_name.attr,
717	NULL
718};
719
720static const struct attribute_group via686a_group = {
721	.attrs = via686a_attributes,
722};
723
724static void via686a_init_device(struct via686a_data *data)
725{
726	u8 reg;
727
728	/* Start monitoring */
729	reg = via686a_read_value(data, VIA686A_REG_CONFIG);
730	via686a_write_value(data, VIA686A_REG_CONFIG, (reg | 0x01) & 0x7F);
731
732	/* Configure temp interrupt mode for continuous-interrupt operation */
733	reg = via686a_read_value(data, VIA686A_REG_TEMP_MODE);
734	via686a_write_value(data, VIA686A_REG_TEMP_MODE,
735			    (reg & ~VIA686A_TEMP_MODE_MASK)
736			    | VIA686A_TEMP_MODE_CONTINUOUS);
737
738	/* Pre-read fan clock divisor values */
739	via686a_update_fan_div(data);
740}
741
742/* This is called when the module is loaded */
743static int via686a_probe(struct platform_device *pdev)
744{
745	struct via686a_data *data;
746	struct resource *res;
747	int err;
748
749	/* Reserve the ISA region */
750	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
751	if (!devm_request_region(&pdev->dev, res->start, VIA686A_EXTENT,
752				 DRIVER_NAME)) {
753		dev_err(&pdev->dev, "Region 0x%lx-0x%lx already in use!\n",
754			(unsigned long)res->start, (unsigned long)res->end);
755		return -ENODEV;
756	}
757
758	data = devm_kzalloc(&pdev->dev, sizeof(struct via686a_data),
759			    GFP_KERNEL);
760	if (!data)
761		return -ENOMEM;
762
763	platform_set_drvdata(pdev, data);
764	data->addr = res->start;
765	data->name = DRIVER_NAME;
766	mutex_init(&data->update_lock);
767
768	/* Initialize the VIA686A chip */
769	via686a_init_device(data);
770
771	/* Register sysfs hooks */
772	err = sysfs_create_group(&pdev->dev.kobj, &via686a_group);
773	if (err)
774		return err;
775
776	data->hwmon_dev = hwmon_device_register(&pdev->dev);
777	if (IS_ERR(data->hwmon_dev)) {
778		err = PTR_ERR(data->hwmon_dev);
779		goto exit_remove_files;
780	}
781
782	return 0;
783
784exit_remove_files:
785	sysfs_remove_group(&pdev->dev.kobj, &via686a_group);
786	return err;
787}
788
789static void via686a_remove(struct platform_device *pdev)
790{
791	struct via686a_data *data = platform_get_drvdata(pdev);
792
793	hwmon_device_unregister(data->hwmon_dev);
794	sysfs_remove_group(&pdev->dev.kobj, &via686a_group);
 
 
795}
796
797static struct platform_driver via686a_driver = {
798	.driver = {
799		.name	= DRIVER_NAME,
800	},
801	.probe		= via686a_probe,
802	.remove		= via686a_remove,
803};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
804
805static const struct pci_device_id via686a_pci_ids[] = {
806	{ PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4) },
807	{ }
808};
809MODULE_DEVICE_TABLE(pci, via686a_pci_ids);
810
811static int via686a_device_add(unsigned short address)
812{
813	struct resource res = {
814		.start	= address,
815		.end	= address + VIA686A_EXTENT - 1,
816		.name	= DRIVER_NAME,
817		.flags	= IORESOURCE_IO,
818	};
819	int err;
820
821	err = acpi_check_resource_conflict(&res);
822	if (err)
823		goto exit;
824
825	pdev = platform_device_alloc(DRIVER_NAME, address);
826	if (!pdev) {
827		err = -ENOMEM;
828		pr_err("Device allocation failed\n");
829		goto exit;
830	}
831
832	err = platform_device_add_resources(pdev, &res, 1);
833	if (err) {
834		pr_err("Device resource addition failed (%d)\n", err);
835		goto exit_device_put;
836	}
837
838	err = platform_device_add(pdev);
839	if (err) {
840		pr_err("Device addition failed (%d)\n", err);
841		goto exit_device_put;
842	}
843
844	return 0;
845
846exit_device_put:
847	platform_device_put(pdev);
848exit:
849	return err;
850}
851
852static int via686a_pci_probe(struct pci_dev *dev,
853				       const struct pci_device_id *id)
854{
855	u16 address, val;
856	int ret;
857
858	if (force_addr) {
859		address = force_addr & ~(VIA686A_EXTENT - 1);
860		dev_warn(&dev->dev, "Forcing ISA address 0x%x\n", address);
861		ret = pci_write_config_word(dev, VIA686A_BASE_REG, address | 1);
862		if (ret != PCIBIOS_SUCCESSFUL)
863			return -ENODEV;
864	}
865	ret = pci_read_config_word(dev, VIA686A_BASE_REG, &val);
866	if (ret != PCIBIOS_SUCCESSFUL)
867		return -ENODEV;
868
869	address = val & ~(VIA686A_EXTENT - 1);
870	if (address == 0) {
871		dev_err(&dev->dev,
872			"base address not set - upgrade BIOS or use force_addr=0xaddr\n");
873		return -ENODEV;
874	}
875
876	ret = pci_read_config_word(dev, VIA686A_ENABLE_REG, &val);
877	if (ret != PCIBIOS_SUCCESSFUL)
878		return -ENODEV;
879	if (!(val & 0x0001)) {
880		if (!force_addr) {
881			dev_warn(&dev->dev,
882				 "Sensors disabled, enable with force_addr=0x%x\n",
883				 address);
884			return -ENODEV;
885		}
886
887		dev_warn(&dev->dev, "Enabling sensors\n");
888		ret = pci_write_config_word(dev, VIA686A_ENABLE_REG, val | 0x1);
889		if (ret != PCIBIOS_SUCCESSFUL)
 
890			return -ENODEV;
891	}
892
893	if (platform_driver_register(&via686a_driver))
894		goto exit;
895
896	/* Sets global pdev as a side effect */
897	if (via686a_device_add(address))
898		goto exit_unregister;
899
900	/*
901	 * Always return failure here.  This is to allow other drivers to bind
902	 * to this pci device.  We don't really want to have control over the
903	 * pci device, we only wanted to read as few register values from it.
904	 */
905	s_bridge = pci_dev_get(dev);
906	return -ENODEV;
907
908exit_unregister:
909	platform_driver_unregister(&via686a_driver);
910exit:
911	return -ENODEV;
912}
913
914static struct pci_driver via686a_pci_driver = {
915	.name		= DRIVER_NAME,
916	.id_table	= via686a_pci_ids,
917	.probe		= via686a_pci_probe,
918};
919
920static int __init sm_via686a_init(void)
921{
922	return pci_register_driver(&via686a_pci_driver);
923}
924
925static void __exit sm_via686a_exit(void)
926{
927	pci_unregister_driver(&via686a_pci_driver);
928	if (s_bridge != NULL) {
929		platform_device_unregister(pdev);
930		platform_driver_unregister(&via686a_driver);
931		pci_dev_put(s_bridge);
932		s_bridge = NULL;
933	}
934}
935
936MODULE_AUTHOR("Kyösti Mälkki <kmalkki@cc.hut.fi>, "
937	      "Mark Studebaker <mdsxyz123@yahoo.com> "
938	      "and Bob Dougherty <bobd@stanford.edu>");
939MODULE_DESCRIPTION("VIA 686A Sensor device");
940MODULE_LICENSE("GPL");
941
942module_init(sm_via686a_init);
943module_exit(sm_via686a_exit);
v4.6
 
  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 */
 55static unsigned short force_addr;
 56module_param(force_addr, ushort, 0);
 57MODULE_PARM_DESC(force_addr,
 58		 "Initialize the base address of the sensors");
 59
 60static 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 */
 85static const u8 VIA686A_REG_TEMP[]	= { 0x20, 0x21, 0x1f };
 86static const u8 VIA686A_REG_TEMP_OVER[]	= { 0x39, 0x3d, 0x1d };
 87static 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 */
128static 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
148static 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 */
171static 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 */
216static 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 */
264static 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 */
285static 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 */
295static 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 */
316struct 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
336static struct pci_dev *s_bridge;	/* pointer to the (only) via686a */
337
338static int via686a_probe(struct platform_device *pdev);
339static int via686a_remove(struct platform_device *pdev);
340
341static inline int via686a_read_value(struct via686a_data *data, u8 reg)
342{
343	return inb_p(data->addr + reg);
344}
345
346static inline void via686a_write_value(struct via686a_data *data, u8 reg,
347				       u8 value)
348{
349	outb_p(value, data->addr + reg);
350}
351
352static struct via686a_data *via686a_update_device(struct device *dev);
353static void via686a_init_device(struct via686a_data *data);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
354
355/* following are the sysfs callback functions */
356
357/* 7 voltage sensors */
358static 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
366static 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
374static 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
382static 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}
401static 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)					\
421static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO,		\
422		show_in, NULL, offset);				\
423static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,	\
424		show_in_min, set_in_min, offset);		\
425static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,	\
426		show_in_max, set_in_max, offset);
427
428show_in_offset(0);
429show_in_offset(1);
430show_in_offset(2);
431show_in_offset(3);
432show_in_offset(4);
 
 
 
433
434/* 3 temperatures */
435static 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}
442static 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}
449static 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}
456static 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}
475static 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)					\
495static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO,		\
496		show_temp, NULL, offset - 1);				\
497static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR,	\
498		show_temp_over, set_temp_over, offset - 1);		\
499static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR,	\
500		show_temp_hyst, set_temp_hyst, offset - 1);
501
502show_temp_offset(1);
503show_temp_offset(2);
504show_temp_offset(3);
505
506/* 2 Fans */
507static 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}
515static 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}
524static 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}
531static 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}
549static 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)						\
572static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,			\
573		show_fan, NULL, offset - 1);				\
574static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,		\
575		show_fan_min, set_fan_min, offset - 1);			\
576static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR,		\
577		show_fan_div, set_fan_div, offset - 1);
578
579show_fan_offset(1);
580show_fan_offset(2);
581
582/* Alarms */
583static ssize_t show_alarms(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
590static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
591
592static 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}
599static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
600static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
601static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
602static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
603static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
604static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
605static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 11);
606static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 15);
607static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
608static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
609
610static ssize_t show_name(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}
616static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
617
618static 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
667static const struct attribute_group via686a_group = {
668	.attrs = via686a_attributes,
669};
670
671static 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 */
681static 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
722exit_remove_files:
723	sysfs_remove_group(&pdev->dev.kobj, &via686a_group);
724	return err;
725}
726
727static 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
737static 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
744static 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
762static 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
826static const struct pci_device_id via686a_pci_ids[] = {
827	{ PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4) },
828	{ }
829};
830MODULE_DEVICE_TABLE(pci, via686a_pci_ids);
831
832static 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
867exit_device_put:
868	platform_device_put(pdev);
869exit:
870	return err;
871}
872
873static 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
929exit_unregister:
930	platform_driver_unregister(&via686a_driver);
931exit:
932	return -ENODEV;
933}
934
935static struct pci_driver via686a_pci_driver = {
936	.name		= "via686a",
937	.id_table	= via686a_pci_ids,
938	.probe		= via686a_pci_probe,
939};
940
941static int __init sm_via686a_init(void)
942{
943	return pci_register_driver(&via686a_pci_driver);
944}
945
946static 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
957MODULE_AUTHOR("Kyösti Mälkki <kmalkki@cc.hut.fi>, "
958	      "Mark Studebaker <mdsxyz123@yahoo.com> "
959	      "and Bob Dougherty <bobd@stanford.edu>");
960MODULE_DESCRIPTION("VIA 686A Sensor device");
961MODULE_LICENSE("GPL");
962
963module_init(sm_via686a_init);
964module_exit(sm_via686a_exit);