linux/drivers/hwmon/sis5595.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * sis5595.c - Part of lm_sensors, Linux kernel modules
   4 *             for hardware monitoring
   5 *
   6 * Copyright (C) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
   7 *                           Kyösti Mälkki <kmalkki@cc.hut.fi>, and
   8 *                           Mark D. Studebaker <mdsxyz123@yahoo.com>
   9 * Ported to Linux 2.6 by Aurelien Jarno <aurelien@aurel32.net> with
  10 * the help of Jean Delvare <jdelvare@suse.de>
  11 */
  12
  13/*
  14 * SiS southbridge has a LM78-like chip integrated on the same IC.
  15 * This driver is a customized copy of lm78.c
  16 *
  17 * Supports following revisions:
  18 *      Version         PCI ID          PCI Revision
  19 *      1               1039/0008       AF or less
  20 *      2               1039/0008       B0 or greater
  21 *
  22 *  Note: these chips contain a 0008 device which is incompatible with the
  23 *       5595. We recognize these by the presence of the listed
  24 *       "blacklist" PCI ID and refuse to load.
  25 *
  26 * NOT SUPPORTED        PCI ID          BLACKLIST PCI ID
  27 *       540            0008            0540
  28 *       550            0008            0550
  29 *      5513            0008            5511
  30 *      5581            0008            5597
  31 *      5582            0008            5597
  32 *      5597            0008            5597
  33 *      5598            0008            5597/5598
  34 *       630            0008            0630
  35 *       645            0008            0645
  36 *       730            0008            0730
  37 *       735            0008            0735
  38 */
  39
  40#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  41
  42#include <linux/module.h>
  43#include <linux/slab.h>
  44#include <linux/ioport.h>
  45#include <linux/pci.h>
  46#include <linux/platform_device.h>
  47#include <linux/hwmon.h>
  48#include <linux/hwmon-sysfs.h>
  49#include <linux/err.h>
  50#include <linux/init.h>
  51#include <linux/jiffies.h>
  52#include <linux/mutex.h>
  53#include <linux/sysfs.h>
  54#include <linux/acpi.h>
  55#include <linux/io.h>
  56
  57/*
  58 * If force_addr is set to anything different from 0, we forcibly enable
  59 * the device at the given address.
  60 */
  61static u16 force_addr;
  62module_param(force_addr, ushort, 0);
  63MODULE_PARM_DESC(force_addr,
  64                 "Initialize the base address of the sensors");
  65
  66static struct platform_device *pdev;
  67
  68/* Many SIS5595 constants specified below */
  69
  70/* Length of ISA address segment */
  71#define SIS5595_EXTENT 8
  72/* PCI Config Registers */
  73#define SIS5595_BASE_REG 0x68
  74#define SIS5595_PIN_REG 0x7A
  75#define SIS5595_ENABLE_REG 0x7B
  76
  77/* Where are the ISA address/data registers relative to the base address */
  78#define SIS5595_ADDR_REG_OFFSET 5
  79#define SIS5595_DATA_REG_OFFSET 6
  80
  81/* The SIS5595 registers */
  82#define SIS5595_REG_IN_MAX(nr) (0x2b + (nr) * 2)
  83#define SIS5595_REG_IN_MIN(nr) (0x2c + (nr) * 2)
  84#define SIS5595_REG_IN(nr) (0x20 + (nr))
  85
  86#define SIS5595_REG_FAN_MIN(nr) (0x3b + (nr))
  87#define SIS5595_REG_FAN(nr) (0x28 + (nr))
  88
  89/*
  90 * On the first version of the chip, the temp registers are separate.
  91 * On the second version,
  92 * TEMP pin is shared with IN4, configured in PCI register 0x7A.
  93 * The registers are the same as well.
  94 * OVER and HYST are really MAX and MIN.
  95 */
  96
  97#define REV2MIN 0xb0
  98#define SIS5595_REG_TEMP        (((data->revision) >= REV2MIN) ? \
  99                                        SIS5595_REG_IN(4) : 0x27)
 100#define SIS5595_REG_TEMP_OVER   (((data->revision) >= REV2MIN) ? \
 101                                        SIS5595_REG_IN_MAX(4) : 0x39)
 102#define SIS5595_REG_TEMP_HYST   (((data->revision) >= REV2MIN) ? \
 103                                        SIS5595_REG_IN_MIN(4) : 0x3a)
 104
 105#define SIS5595_REG_CONFIG 0x40
 106#define SIS5595_REG_ALARM1 0x41
 107#define SIS5595_REG_ALARM2 0x42
 108#define SIS5595_REG_FANDIV 0x47
 109
 110/*
 111 * Conversions. Limit checking is only done on the TO_REG
 112 * variants.
 113 */
 114
 115/*
 116 * IN: mV, (0V to 4.08V)
 117 * REG: 16mV/bit
 118 */
 119static inline u8 IN_TO_REG(unsigned long val)
 120{
 121        unsigned long nval = clamp_val(val, 0, 4080);
 122        return (nval + 8) / 16;
 123}
 124#define IN_FROM_REG(val) ((val) *  16)
 125
 126static inline u8 FAN_TO_REG(long rpm, int div)
 127{
 128        if (rpm <= 0)
 129                return 255;
 130        if (rpm > 1350000)
 131                return 1;
 132        return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
 133}
 134
 135static inline int FAN_FROM_REG(u8 val, int div)
 136{
 137        return val == 0 ? -1 : val == 255 ? 0 : 1350000 / (val * div);
 138}
 139
 140/*
 141 * TEMP: mC (-54.12C to +157.53C)
 142 * REG: 0.83C/bit + 52.12, two's complement
 143 */
 144static inline int TEMP_FROM_REG(s8 val)
 145{
 146        return val * 830 + 52120;
 147}
 148static inline s8 TEMP_TO_REG(long val)
 149{
 150        int nval = clamp_val(val, -54120, 157530) ;
 151        return nval < 0 ? (nval - 5212 - 415) / 830 : (nval - 5212 + 415) / 830;
 152}
 153
 154/*
 155 * FAN DIV: 1, 2, 4, or 8 (defaults to 2)
 156 * REG: 0, 1, 2, or 3 (respectively) (defaults to 1)
 157 */
 158static inline u8 DIV_TO_REG(int val)
 159{
 160        return val == 8 ? 3 : val == 4 ? 2 : val == 1 ? 0 : 1;
 161}
 162#define DIV_FROM_REG(val) (1 << (val))
 163
 164/*
 165 * For each registered chip, we need to keep some data in memory.
 166 * The structure is dynamically allocated.
 167 */
 168struct sis5595_data {
 169        unsigned short addr;
 170        const char *name;
 171        struct device *hwmon_dev;
 172        struct mutex lock;
 173
 174        struct mutex update_lock;
 175        char valid;             /* !=0 if following fields are valid */
 176        unsigned long last_updated;     /* In jiffies */
 177        char maxins;            /* == 3 if temp enabled, otherwise == 4 */
 178        u8 revision;            /* Reg. value */
 179
 180        u8 in[5];               /* Register value */
 181        u8 in_max[5];           /* Register value */
 182        u8 in_min[5];           /* Register value */
 183        u8 fan[2];              /* Register value */
 184        u8 fan_min[2];          /* Register value */
 185        s8 temp;                /* Register value */
 186        s8 temp_over;           /* Register value */
 187        s8 temp_hyst;           /* Register value */
 188        u8 fan_div[2];          /* Register encoding, shifted right */
 189        u16 alarms;             /* Register encoding, combined */
 190};
 191
 192static struct pci_dev *s_bridge;        /* pointer to the (only) sis5595 */
 193
 194static int sis5595_probe(struct platform_device *pdev);
 195static int sis5595_remove(struct platform_device *pdev);
 196
 197static int sis5595_read_value(struct sis5595_data *data, u8 reg);
 198static void sis5595_write_value(struct sis5595_data *data, u8 reg, u8 value);
 199static struct sis5595_data *sis5595_update_device(struct device *dev);
 200static void sis5595_init_device(struct sis5595_data *data);
 201
 202static struct platform_driver sis5595_driver = {
 203        .driver = {
 204                .name   = "sis5595",
 205        },
 206        .probe          = sis5595_probe,
 207        .remove         = sis5595_remove,
 208};
 209
 210/* 4 Voltages */
 211static ssize_t in_show(struct device *dev, struct device_attribute *da,
 212                       char *buf)
 213{
 214        struct sis5595_data *data = sis5595_update_device(dev);
 215        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 216        int nr = attr->index;
 217        return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
 218}
 219
 220static ssize_t in_min_show(struct device *dev, struct device_attribute *da,
 221                           char *buf)
 222{
 223        struct sis5595_data *data = sis5595_update_device(dev);
 224        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 225        int nr = attr->index;
 226        return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
 227}
 228
 229static ssize_t in_max_show(struct device *dev, struct device_attribute *da,
 230                           char *buf)
 231{
 232        struct sis5595_data *data = sis5595_update_device(dev);
 233        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 234        int nr = attr->index;
 235        return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
 236}
 237
 238static ssize_t in_min_store(struct device *dev, struct device_attribute *da,
 239                            const char *buf, size_t count)
 240{
 241        struct sis5595_data *data = dev_get_drvdata(dev);
 242        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 243        int nr = attr->index;
 244        unsigned long val;
 245        int err;
 246
 247        err = kstrtoul(buf, 10, &val);
 248        if (err)
 249                return err;
 250
 251        mutex_lock(&data->update_lock);
 252        data->in_min[nr] = IN_TO_REG(val);
 253        sis5595_write_value(data, SIS5595_REG_IN_MIN(nr), data->in_min[nr]);
 254        mutex_unlock(&data->update_lock);
 255        return count;
 256}
 257
 258static ssize_t in_max_store(struct device *dev, struct device_attribute *da,
 259                            const char *buf, size_t count)
 260{
 261        struct sis5595_data *data = dev_get_drvdata(dev);
 262        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 263        int nr = attr->index;
 264        unsigned long val;
 265        int err;
 266
 267        err = kstrtoul(buf, 10, &val);
 268        if (err)
 269                return err;
 270
 271        mutex_lock(&data->update_lock);
 272        data->in_max[nr] = IN_TO_REG(val);
 273        sis5595_write_value(data, SIS5595_REG_IN_MAX(nr), data->in_max[nr]);
 274        mutex_unlock(&data->update_lock);
 275        return count;
 276}
 277
 278static SENSOR_DEVICE_ATTR_RO(in0_input, in, 0);
 279static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
 280static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
 281static SENSOR_DEVICE_ATTR_RO(in1_input, in, 1);
 282static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
 283static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
 284static SENSOR_DEVICE_ATTR_RO(in2_input, in, 2);
 285static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
 286static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
 287static SENSOR_DEVICE_ATTR_RO(in3_input, in, 3);
 288static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
 289static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
 290static SENSOR_DEVICE_ATTR_RO(in4_input, in, 4);
 291static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
 292static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
 293
 294/* Temperature */
 295static ssize_t temp1_input_show(struct device *dev,
 296                                struct device_attribute *attr, char *buf)
 297{
 298        struct sis5595_data *data = sis5595_update_device(dev);
 299        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
 300}
 301
 302static ssize_t temp1_max_show(struct device *dev, struct device_attribute *attr,
 303                              char *buf)
 304{
 305        struct sis5595_data *data = sis5595_update_device(dev);
 306        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
 307}
 308
 309static ssize_t temp1_max_store(struct device *dev,
 310                               struct device_attribute *attr, const char *buf,
 311                               size_t count)
 312{
 313        struct sis5595_data *data = dev_get_drvdata(dev);
 314        long val;
 315        int err;
 316
 317        err = kstrtol(buf, 10, &val);
 318        if (err)
 319                return err;
 320
 321        mutex_lock(&data->update_lock);
 322        data->temp_over = TEMP_TO_REG(val);
 323        sis5595_write_value(data, SIS5595_REG_TEMP_OVER, data->temp_over);
 324        mutex_unlock(&data->update_lock);
 325        return count;
 326}
 327
 328static ssize_t temp1_max_hyst_show(struct device *dev,
 329                                   struct device_attribute *attr, char *buf)
 330{
 331        struct sis5595_data *data = sis5595_update_device(dev);
 332        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
 333}
 334
 335static ssize_t temp1_max_hyst_store(struct device *dev,
 336                                    struct device_attribute *attr,
 337                                    const char *buf, size_t count)
 338{
 339        struct sis5595_data *data = dev_get_drvdata(dev);
 340        long val;
 341        int err;
 342
 343        err = kstrtol(buf, 10, &val);
 344        if (err)
 345                return err;
 346
 347        mutex_lock(&data->update_lock);
 348        data->temp_hyst = TEMP_TO_REG(val);
 349        sis5595_write_value(data, SIS5595_REG_TEMP_HYST, data->temp_hyst);
 350        mutex_unlock(&data->update_lock);
 351        return count;
 352}
 353
 354static DEVICE_ATTR_RO(temp1_input);
 355static DEVICE_ATTR_RW(temp1_max);
 356static DEVICE_ATTR_RW(temp1_max_hyst);
 357
 358/* 2 Fans */
 359static ssize_t fan_show(struct device *dev, struct device_attribute *da,
 360                        char *buf)
 361{
 362        struct sis5595_data *data = sis5595_update_device(dev);
 363        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 364        int nr = attr->index;
 365        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
 366                DIV_FROM_REG(data->fan_div[nr])));
 367}
 368
 369static ssize_t fan_min_show(struct device *dev, struct device_attribute *da,
 370                            char *buf)
 371{
 372        struct sis5595_data *data = sis5595_update_device(dev);
 373        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 374        int nr = attr->index;
 375        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr],
 376                DIV_FROM_REG(data->fan_div[nr])));
 377}
 378
 379static ssize_t fan_min_store(struct device *dev, struct device_attribute *da,
 380                             const char *buf, size_t count)
 381{
 382        struct sis5595_data *data = dev_get_drvdata(dev);
 383        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 384        int nr = attr->index;
 385        unsigned long val;
 386        int err;
 387
 388        err = kstrtoul(buf, 10, &val);
 389        if (err)
 390                return err;
 391
 392        mutex_lock(&data->update_lock);
 393        data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 394        sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
 395        mutex_unlock(&data->update_lock);
 396        return count;
 397}
 398
 399static ssize_t fan_div_show(struct device *dev, struct device_attribute *da,
 400                            char *buf)
 401{
 402        struct sis5595_data *data = sis5595_update_device(dev);
 403        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 404        int nr = attr->index;
 405        return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
 406}
 407
 408/*
 409 * Note: we save and restore the fan minimum here, because its value is
 410 * determined in part by the fan divisor.  This follows the principle of
 411 * least surprise; the user doesn't expect the fan minimum to change just
 412 * because the divisor changed.
 413 */
 414static ssize_t fan_div_store(struct device *dev, struct device_attribute *da,
 415                             const char *buf, size_t count)
 416{
 417        struct sis5595_data *data = dev_get_drvdata(dev);
 418        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 419        int nr = attr->index;
 420        unsigned long min;
 421        int reg;
 422        unsigned long val;
 423        int err;
 424
 425        err = kstrtoul(buf, 10, &val);
 426        if (err)
 427                return err;
 428
 429        mutex_lock(&data->update_lock);
 430        min = FAN_FROM_REG(data->fan_min[nr],
 431                        DIV_FROM_REG(data->fan_div[nr]));
 432        reg = sis5595_read_value(data, SIS5595_REG_FANDIV);
 433
 434        switch (val) {
 435        case 1:
 436                data->fan_div[nr] = 0;
 437                break;
 438        case 2:
 439                data->fan_div[nr] = 1;
 440                break;
 441        case 4:
 442                data->fan_div[nr] = 2;
 443                break;
 444        case 8:
 445                data->fan_div[nr] = 3;
 446                break;
 447        default:
 448                dev_err(dev,
 449                        "fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n",
 450                        val);
 451                mutex_unlock(&data->update_lock);
 452                return -EINVAL;
 453        }
 454
 455        switch (nr) {
 456        case 0:
 457                reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
 458                break;
 459        case 1:
 460                reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
 461                break;
 462        }
 463        sis5595_write_value(data, SIS5595_REG_FANDIV, reg);
 464        data->fan_min[nr] =
 465                FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
 466        sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
 467        mutex_unlock(&data->update_lock);
 468        return count;
 469}
 470
 471static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
 472static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
 473static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
 474static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
 475static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
 476static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
 477
 478/* Alarms */
 479static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
 480                           char *buf)
 481{
 482        struct sis5595_data *data = sis5595_update_device(dev);
 483        return sprintf(buf, "%d\n", data->alarms);
 484}
 485static DEVICE_ATTR_RO(alarms);
 486
 487static ssize_t alarm_show(struct device *dev, struct device_attribute *da,
 488                          char *buf)
 489{
 490        struct sis5595_data *data = sis5595_update_device(dev);
 491        int nr = to_sensor_dev_attr(da)->index;
 492        return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
 493}
 494static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0);
 495static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1);
 496static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2);
 497static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
 498static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 15);
 499static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 6);
 500static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 7);
 501static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 15);
 502
 503static ssize_t name_show(struct device *dev, struct device_attribute *attr,
 504                         char *buf)
 505{
 506        struct sis5595_data *data = dev_get_drvdata(dev);
 507        return sprintf(buf, "%s\n", data->name);
 508}
 509static DEVICE_ATTR_RO(name);
 510
 511static struct attribute *sis5595_attributes[] = {
 512        &sensor_dev_attr_in0_input.dev_attr.attr,
 513        &sensor_dev_attr_in0_min.dev_attr.attr,
 514        &sensor_dev_attr_in0_max.dev_attr.attr,
 515        &sensor_dev_attr_in0_alarm.dev_attr.attr,
 516        &sensor_dev_attr_in1_input.dev_attr.attr,
 517        &sensor_dev_attr_in1_min.dev_attr.attr,
 518        &sensor_dev_attr_in1_max.dev_attr.attr,
 519        &sensor_dev_attr_in1_alarm.dev_attr.attr,
 520        &sensor_dev_attr_in2_input.dev_attr.attr,
 521        &sensor_dev_attr_in2_min.dev_attr.attr,
 522        &sensor_dev_attr_in2_max.dev_attr.attr,
 523        &sensor_dev_attr_in2_alarm.dev_attr.attr,
 524        &sensor_dev_attr_in3_input.dev_attr.attr,
 525        &sensor_dev_attr_in3_min.dev_attr.attr,
 526        &sensor_dev_attr_in3_max.dev_attr.attr,
 527        &sensor_dev_attr_in3_alarm.dev_attr.attr,
 528
 529        &sensor_dev_attr_fan1_input.dev_attr.attr,
 530        &sensor_dev_attr_fan1_min.dev_attr.attr,
 531        &sensor_dev_attr_fan1_div.dev_attr.attr,
 532        &sensor_dev_attr_fan1_alarm.dev_attr.attr,
 533        &sensor_dev_attr_fan2_input.dev_attr.attr,
 534        &sensor_dev_attr_fan2_min.dev_attr.attr,
 535        &sensor_dev_attr_fan2_div.dev_attr.attr,
 536        &sensor_dev_attr_fan2_alarm.dev_attr.attr,
 537
 538        &dev_attr_alarms.attr,
 539        &dev_attr_name.attr,
 540        NULL
 541};
 542
 543static const struct attribute_group sis5595_group = {
 544        .attrs = sis5595_attributes,
 545};
 546
 547static struct attribute *sis5595_attributes_in4[] = {
 548        &sensor_dev_attr_in4_input.dev_attr.attr,
 549        &sensor_dev_attr_in4_min.dev_attr.attr,
 550        &sensor_dev_attr_in4_max.dev_attr.attr,
 551        &sensor_dev_attr_in4_alarm.dev_attr.attr,
 552        NULL
 553};
 554
 555static const struct attribute_group sis5595_group_in4 = {
 556        .attrs = sis5595_attributes_in4,
 557};
 558
 559static struct attribute *sis5595_attributes_temp1[] = {
 560        &dev_attr_temp1_input.attr,
 561        &dev_attr_temp1_max.attr,
 562        &dev_attr_temp1_max_hyst.attr,
 563        &sensor_dev_attr_temp1_alarm.dev_attr.attr,
 564        NULL
 565};
 566
 567static const struct attribute_group sis5595_group_temp1 = {
 568        .attrs = sis5595_attributes_temp1,
 569};
 570
 571/* This is called when the module is loaded */
 572static int sis5595_probe(struct platform_device *pdev)
 573{
 574        int err = 0;
 575        int i;
 576        struct sis5595_data *data;
 577        struct resource *res;
 578        char val;
 579
 580        /* Reserve the ISA region */
 581        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 582        if (!devm_request_region(&pdev->dev, res->start, SIS5595_EXTENT,
 583                                 sis5595_driver.driver.name))
 584                return -EBUSY;
 585
 586        data = devm_kzalloc(&pdev->dev, sizeof(struct sis5595_data),
 587                            GFP_KERNEL);
 588        if (!data)
 589                return -ENOMEM;
 590
 591        mutex_init(&data->lock);
 592        mutex_init(&data->update_lock);
 593        data->addr = res->start;
 594        data->name = "sis5595";
 595        platform_set_drvdata(pdev, data);
 596
 597        /*
 598         * Check revision and pin registers to determine whether 4 or 5 voltages
 599         */
 600        data->revision = s_bridge->revision;
 601        /* 4 voltages, 1 temp */
 602        data->maxins = 3;
 603        if (data->revision >= REV2MIN) {
 604                pci_read_config_byte(s_bridge, SIS5595_PIN_REG, &val);
 605                if (!(val & 0x80))
 606                        /* 5 voltages, no temps */
 607                        data->maxins = 4;
 608        }
 609
 610        /* Initialize the SIS5595 chip */
 611        sis5595_init_device(data);
 612
 613        /* A few vars need to be filled upon startup */
 614        for (i = 0; i < 2; i++) {
 615                data->fan_min[i] = sis5595_read_value(data,
 616                                        SIS5595_REG_FAN_MIN(i));
 617        }
 618
 619        /* Register sysfs hooks */
 620        err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group);
 621        if (err)
 622                return err;
 623        if (data->maxins == 4) {
 624                err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group_in4);
 625                if (err)
 626                        goto exit_remove_files;
 627        } else {
 628                err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group_temp1);
 629                if (err)
 630                        goto exit_remove_files;
 631        }
 632
 633        data->hwmon_dev = hwmon_device_register(&pdev->dev);
 634        if (IS_ERR(data->hwmon_dev)) {
 635                err = PTR_ERR(data->hwmon_dev);
 636                goto exit_remove_files;
 637        }
 638
 639        return 0;
 640
 641exit_remove_files:
 642        sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
 643        sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
 644        sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
 645        return err;
 646}
 647
 648static int sis5595_remove(struct platform_device *pdev)
 649{
 650        struct sis5595_data *data = platform_get_drvdata(pdev);
 651
 652        hwmon_device_unregister(data->hwmon_dev);
 653        sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
 654        sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
 655        sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
 656
 657        return 0;
 658}
 659
 660/* ISA access must be locked explicitly. */
 661static int sis5595_read_value(struct sis5595_data *data, u8 reg)
 662{
 663        int res;
 664
 665        mutex_lock(&data->lock);
 666        outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
 667        res = inb_p(data->addr + SIS5595_DATA_REG_OFFSET);
 668        mutex_unlock(&data->lock);
 669        return res;
 670}
 671
 672static void sis5595_write_value(struct sis5595_data *data, u8 reg, u8 value)
 673{
 674        mutex_lock(&data->lock);
 675        outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
 676        outb_p(value, data->addr + SIS5595_DATA_REG_OFFSET);
 677        mutex_unlock(&data->lock);
 678}
 679
 680/* Called when we have found a new SIS5595. */
 681static void sis5595_init_device(struct sis5595_data *data)
 682{
 683        u8 config = sis5595_read_value(data, SIS5595_REG_CONFIG);
 684        if (!(config & 0x01))
 685                sis5595_write_value(data, SIS5595_REG_CONFIG,
 686                                (config & 0xf7) | 0x01);
 687}
 688
 689static struct sis5595_data *sis5595_update_device(struct device *dev)
 690{
 691        struct sis5595_data *data = dev_get_drvdata(dev);
 692        int i;
 693
 694        mutex_lock(&data->update_lock);
 695
 696        if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
 697            || !data->valid) {
 698
 699                for (i = 0; i <= data->maxins; i++) {
 700                        data->in[i] =
 701                            sis5595_read_value(data, SIS5595_REG_IN(i));
 702                        data->in_min[i] =
 703                            sis5595_read_value(data,
 704                                               SIS5595_REG_IN_MIN(i));
 705                        data->in_max[i] =
 706                            sis5595_read_value(data,
 707                                               SIS5595_REG_IN_MAX(i));
 708                }
 709                for (i = 0; i < 2; i++) {
 710                        data->fan[i] =
 711                            sis5595_read_value(data, SIS5595_REG_FAN(i));
 712                        data->fan_min[i] =
 713                            sis5595_read_value(data,
 714                                               SIS5595_REG_FAN_MIN(i));
 715                }
 716                if (data->maxins == 3) {
 717                        data->temp =
 718                            sis5595_read_value(data, SIS5595_REG_TEMP);
 719                        data->temp_over =
 720                            sis5595_read_value(data, SIS5595_REG_TEMP_OVER);
 721                        data->temp_hyst =
 722                            sis5595_read_value(data, SIS5595_REG_TEMP_HYST);
 723                }
 724                i = sis5595_read_value(data, SIS5595_REG_FANDIV);
 725                data->fan_div[0] = (i >> 4) & 0x03;
 726                data->fan_div[1] = i >> 6;
 727                data->alarms =
 728                    sis5595_read_value(data, SIS5595_REG_ALARM1) |
 729                    (sis5595_read_value(data, SIS5595_REG_ALARM2) << 8);
 730                data->last_updated = jiffies;
 731                data->valid = 1;
 732        }
 733
 734        mutex_unlock(&data->update_lock);
 735
 736        return data;
 737}
 738
 739static const struct pci_device_id sis5595_pci_ids[] = {
 740        { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) },
 741        { 0, }
 742};
 743
 744MODULE_DEVICE_TABLE(pci, sis5595_pci_ids);
 745
 746static int blacklist[] = {
 747        PCI_DEVICE_ID_SI_540,
 748        PCI_DEVICE_ID_SI_550,
 749        PCI_DEVICE_ID_SI_630,
 750        PCI_DEVICE_ID_SI_645,
 751        PCI_DEVICE_ID_SI_730,
 752        PCI_DEVICE_ID_SI_735,
 753        PCI_DEVICE_ID_SI_5511, /*
 754                                * 5513 chip has the 0008 device but
 755                                * that ID shows up in other chips so we
 756                                * use the 5511 ID for recognition
 757                                */
 758        PCI_DEVICE_ID_SI_5597,
 759        PCI_DEVICE_ID_SI_5598,
 760        0 };
 761
 762static int sis5595_device_add(unsigned short address)
 763{
 764        struct resource res = {
 765                .start  = address,
 766                .end    = address + SIS5595_EXTENT - 1,
 767                .name   = "sis5595",
 768                .flags  = IORESOURCE_IO,
 769        };
 770        int err;
 771
 772        err = acpi_check_resource_conflict(&res);
 773        if (err)
 774                goto exit;
 775
 776        pdev = platform_device_alloc("sis5595", address);
 777        if (!pdev) {
 778                err = -ENOMEM;
 779                pr_err("Device allocation failed\n");
 780                goto exit;
 781        }
 782
 783        err = platform_device_add_resources(pdev, &res, 1);
 784        if (err) {
 785                pr_err("Device resource addition failed (%d)\n", err);
 786                goto exit_device_put;
 787        }
 788
 789        err = platform_device_add(pdev);
 790        if (err) {
 791                pr_err("Device addition failed (%d)\n", err);
 792                goto exit_device_put;
 793        }
 794
 795        return 0;
 796
 797exit_device_put:
 798        platform_device_put(pdev);
 799exit:
 800        return err;
 801}
 802
 803static int sis5595_pci_probe(struct pci_dev *dev,
 804                                       const struct pci_device_id *id)
 805{
 806        u16 address;
 807        u8 enable;
 808        int *i;
 809
 810        for (i = blacklist; *i != 0; i++) {
 811                struct pci_dev *d;
 812                d = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL);
 813                if (d) {
 814                        dev_err(&d->dev,
 815                                "Looked for SIS5595 but found unsupported device %.4x\n",
 816                                *i);
 817                        pci_dev_put(d);
 818                        return -ENODEV;
 819                }
 820        }
 821
 822        force_addr &= ~(SIS5595_EXTENT - 1);
 823        if (force_addr) {
 824                dev_warn(&dev->dev, "Forcing ISA address 0x%x\n", force_addr);
 825                pci_write_config_word(dev, SIS5595_BASE_REG, force_addr);
 826        }
 827
 828        if (PCIBIOS_SUCCESSFUL !=
 829            pci_read_config_word(dev, SIS5595_BASE_REG, &address)) {
 830                dev_err(&dev->dev, "Failed to read ISA address\n");
 831                return -ENODEV;
 832        }
 833
 834        address &= ~(SIS5595_EXTENT - 1);
 835        if (!address) {
 836                dev_err(&dev->dev,
 837                        "Base address not set - upgrade BIOS or use force_addr=0xaddr\n");
 838                return -ENODEV;
 839        }
 840        if (force_addr && address != force_addr) {
 841                /* doesn't work for some chips? */
 842                dev_err(&dev->dev, "Failed to force ISA address\n");
 843                return -ENODEV;
 844        }
 845
 846        if (PCIBIOS_SUCCESSFUL !=
 847            pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable)) {
 848                dev_err(&dev->dev, "Failed to read enable register\n");
 849                return -ENODEV;
 850        }
 851        if (!(enable & 0x80)) {
 852                if ((PCIBIOS_SUCCESSFUL !=
 853                     pci_write_config_byte(dev, SIS5595_ENABLE_REG,
 854                                           enable | 0x80))
 855                 || (PCIBIOS_SUCCESSFUL !=
 856                     pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable))
 857                 || (!(enable & 0x80))) {
 858                        /* doesn't work for some chips! */
 859                        dev_err(&dev->dev, "Failed to enable HWM device\n");
 860                        return -ENODEV;
 861                }
 862        }
 863
 864        if (platform_driver_register(&sis5595_driver)) {
 865                dev_dbg(&dev->dev, "Failed to register sis5595 driver\n");
 866                goto exit;
 867        }
 868
 869        s_bridge = pci_dev_get(dev);
 870        /* Sets global pdev as a side effect */
 871        if (sis5595_device_add(address))
 872                goto exit_unregister;
 873
 874        /*
 875         * Always return failure here.  This is to allow other drivers to bind
 876         * to this pci device.  We don't really want to have control over the
 877         * pci device, we only wanted to read as few register values from it.
 878         */
 879        return -ENODEV;
 880
 881exit_unregister:
 882        pci_dev_put(dev);
 883        platform_driver_unregister(&sis5595_driver);
 884exit:
 885        return -ENODEV;
 886}
 887
 888static struct pci_driver sis5595_pci_driver = {
 889        .name            = "sis5595",
 890        .id_table        = sis5595_pci_ids,
 891        .probe           = sis5595_pci_probe,
 892};
 893
 894static int __init sm_sis5595_init(void)
 895{
 896        return pci_register_driver(&sis5595_pci_driver);
 897}
 898
 899static void __exit sm_sis5595_exit(void)
 900{
 901        pci_unregister_driver(&sis5595_pci_driver);
 902        if (s_bridge != NULL) {
 903                platform_device_unregister(pdev);
 904                platform_driver_unregister(&sis5595_driver);
 905                pci_dev_put(s_bridge);
 906                s_bridge = NULL;
 907        }
 908}
 909
 910MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
 911MODULE_DESCRIPTION("SiS 5595 Sensor device");
 912MODULE_LICENSE("GPL");
 913
 914module_init(sm_sis5595_init);
 915module_exit(sm_sis5595_exit);
 916