cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

via686a.c (31218B)


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