linux/drivers/hwmon/via686a.c
<<
>>
Prefs
   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 alarms_show(struct device *dev, struct device_attribute *attr,
 584                           char *buf)
 585{
 586        struct via686a_data *data = via686a_update_device(dev);
 587        return sprintf(buf, "%u\n", data->alarms);
 588}
 589
 590static DEVICE_ATTR_RO(alarms);
 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 name_show(struct device *dev, struct device_attribute
 611                         *devattr, char *buf)
 612{
 613        struct via686a_data *data = dev_get_drvdata(dev);
 614        return sprintf(buf, "%s\n", data->name);
 615}
 616static DEVICE_ATTR_RO(name);
 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);
 965