linux/drivers/hwmon/vt1211.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * vt1211.c - driver for the VIA VT1211 Super-I/O chip integrated hardware
   4 *            monitoring features
   5 * Copyright (C) 2006 Juerg Haefliger <juergh@gmail.com>
   6 *
   7 * This driver is based on the driver for kernel 2.4 by Mark D. Studebaker
   8 * and its port to kernel 2.6 by Lars Ekman.
   9 */
  10
  11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  12
  13#include <linux/module.h>
  14#include <linux/init.h>
  15#include <linux/slab.h>
  16#include <linux/jiffies.h>
  17#include <linux/platform_device.h>
  18#include <linux/hwmon.h>
  19#include <linux/hwmon-sysfs.h>
  20#include <linux/hwmon-vid.h>
  21#include <linux/err.h>
  22#include <linux/mutex.h>
  23#include <linux/ioport.h>
  24#include <linux/acpi.h>
  25#include <linux/io.h>
  26
  27static int uch_config = -1;
  28module_param(uch_config, int, 0);
  29MODULE_PARM_DESC(uch_config, "Initialize the universal channel configuration");
  30
  31static int int_mode = -1;
  32module_param(int_mode, int, 0);
  33MODULE_PARM_DESC(int_mode, "Force the temperature interrupt mode");
  34
  35static unsigned short force_id;
  36module_param(force_id, ushort, 0);
  37MODULE_PARM_DESC(force_id, "Override the detected device ID");
  38
  39static struct platform_device *pdev;
  40
  41#define DRVNAME "vt1211"
  42
  43/* ---------------------------------------------------------------------
  44 * Registers
  45 *
  46 * The sensors are defined as follows.
  47 *
  48 * Sensor          Voltage Mode   Temp Mode   Notes (from the datasheet)
  49 * --------        ------------   ---------   --------------------------
  50 * Reading 1                      temp1       Intel thermal diode
  51 * Reading 3                      temp2       Internal thermal diode
  52 * UCH1/Reading2   in0            temp3       NTC type thermistor
  53 * UCH2            in1            temp4       +2.5V
  54 * UCH3            in2            temp5       VccP
  55 * UCH4            in3            temp6       +5V
  56 * UCH5            in4            temp7       +12V
  57 * 3.3V            in5                        Internal VDD (+3.3V)
  58 *
  59 * --------------------------------------------------------------------- */
  60
  61/* Voltages (in) numbered 0-5 (ix) */
  62#define VT1211_REG_IN(ix)               (0x21 + (ix))
  63#define VT1211_REG_IN_MIN(ix)           ((ix) == 0 ? 0x3e : 0x2a + 2 * (ix))
  64#define VT1211_REG_IN_MAX(ix)           ((ix) == 0 ? 0x3d : 0x29 + 2 * (ix))
  65
  66/* Temperatures (temp) numbered 0-6 (ix) */
  67static u8 regtemp[]     = {0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25};
  68static u8 regtempmax[]  = {0x39, 0x1d, 0x3d, 0x2b, 0x2d, 0x2f, 0x31};
  69static u8 regtemphyst[] = {0x3a, 0x1e, 0x3e, 0x2c, 0x2e, 0x30, 0x32};
  70
  71/* Fans numbered 0-1 (ix) */
  72#define VT1211_REG_FAN(ix)              (0x29 + (ix))
  73#define VT1211_REG_FAN_MIN(ix)          (0x3b + (ix))
  74#define VT1211_REG_FAN_DIV               0x47
  75
  76/* PWMs numbered 0-1 (ix) */
  77/* Auto points numbered 0-3 (ap) */
  78#define VT1211_REG_PWM(ix)              (0x60 + (ix))
  79#define VT1211_REG_PWM_CLK               0x50
  80#define VT1211_REG_PWM_CTL               0x51
  81#define VT1211_REG_PWM_AUTO_TEMP(ap)    (0x55 - (ap))
  82#define VT1211_REG_PWM_AUTO_PWM(ix, ap) (0x58 + 2 * (ix) - (ap))
  83
  84/* Miscellaneous registers */
  85#define VT1211_REG_CONFIG               0x40
  86#define VT1211_REG_ALARM1               0x41
  87#define VT1211_REG_ALARM2               0x42
  88#define VT1211_REG_VID                  0x45
  89#define VT1211_REG_UCH_CONFIG           0x4a
  90#define VT1211_REG_TEMP1_CONFIG         0x4b
  91#define VT1211_REG_TEMP2_CONFIG         0x4c
  92
  93/* In, temp & fan alarm bits */
  94static const u8 bitalarmin[]    = {11, 0, 1, 3, 8, 2, 9};
  95static const u8 bitalarmtemp[]  = {4, 15, 11, 0, 1, 3, 8};
  96static const u8 bitalarmfan[]   = {6, 7};
  97
  98/* ---------------------------------------------------------------------
  99 * Data structures and manipulation thereof
 100 * --------------------------------------------------------------------- */
 101
 102struct vt1211_data {
 103        unsigned short addr;
 104        const char *name;
 105        struct device *hwmon_dev;
 106
 107        struct mutex update_lock;
 108        char valid;                     /* !=0 if following fields are valid */
 109        unsigned long last_updated;     /* In jiffies */
 110
 111        /* Register values */
 112        u8  in[6];
 113        u8  in_max[6];
 114        u8  in_min[6];
 115        u8  temp[7];
 116        u8  temp_max[7];
 117        u8  temp_hyst[7];
 118        u8  fan[2];
 119        u8  fan_min[2];
 120        u8  fan_div[2];
 121        u8  fan_ctl;
 122        u8  pwm[2];
 123        u8  pwm_ctl[2];
 124        u8  pwm_clk;
 125        u8  pwm_auto_temp[4];
 126        u8  pwm_auto_pwm[2][4];
 127        u8  vid;                /* Read once at init time */
 128        u8  vrm;
 129        u8  uch_config;         /* Read once at init time */
 130        u16 alarms;
 131};
 132
 133/* ix = [0-5] */
 134#define ISVOLT(ix, uch_config)  ((ix) > 4 ? 1 : \
 135                                 !(((uch_config) >> ((ix) + 2)) & 1))
 136
 137/* ix = [0-6] */
 138#define ISTEMP(ix, uch_config)  ((ix) < 2 ? 1 : \
 139                                 ((uch_config) >> (ix)) & 1)
 140
 141/*
 142 * in5 (ix = 5) is special. It's the internal 3.3V so it's scaled in the
 143 * driver according to the VT1211 BIOS porting guide
 144 */
 145#define IN_FROM_REG(ix, reg)    ((reg) < 3 ? 0 : (ix) == 5 ? \
 146                                 (((reg) - 3) * 15882 + 479) / 958 : \
 147                                 (((reg) - 3) * 10000 + 479) / 958)
 148#define IN_TO_REG(ix, val)      (clamp_val((ix) == 5 ? \
 149                                 ((val) * 958 + 7941) / 15882 + 3 : \
 150                                 ((val) * 958 + 5000) / 10000 + 3, 0, 255))
 151
 152/*
 153 * temp1 (ix = 0) is an intel thermal diode which is scaled in user space.
 154 * temp2 (ix = 1) is the internal temp diode so it's scaled in the driver
 155 * according to some measurements that I took on an EPIA M10000.
 156 * temp3-7 are thermistor based so the driver returns the voltage measured at
 157 * the pin (range 0V - 2.2V).
 158 */
 159#define TEMP_FROM_REG(ix, reg)  ((ix) == 0 ? (reg) * 1000 : \
 160                                 (ix) == 1 ? (reg) < 51 ? 0 : \
 161                                 ((reg) - 51) * 1000 : \
 162                                 ((253 - (reg)) * 2200 + 105) / 210)
 163#define TEMP_TO_REG(ix, val)    clamp_val( \
 164                                 ((ix) == 0 ? ((val) + 500) / 1000 : \
 165                                  (ix) == 1 ? ((val) + 500) / 1000 + 51 : \
 166                                  253 - ((val) * 210 + 1100) / 2200), 0, 255)
 167
 168#define DIV_FROM_REG(reg)       (1 << (reg))
 169
 170#define RPM_FROM_REG(reg, div)  (((reg) == 0) || ((reg) == 255) ? 0 : \
 171                                 1310720 / (reg) / DIV_FROM_REG(div))
 172#define RPM_TO_REG(val, div)    ((val) == 0 ? 255 : \
 173                                 clamp_val((1310720 / (val) / \
 174                                 DIV_FROM_REG(div)), 1, 254))
 175
 176/* ---------------------------------------------------------------------
 177 * Super-I/O constants and functions
 178 * --------------------------------------------------------------------- */
 179
 180/*
 181 * Configuration index port registers
 182 * The vt1211 can live at 2 different addresses so we need to probe both
 183 */
 184#define SIO_REG_CIP1            0x2e
 185#define SIO_REG_CIP2            0x4e
 186
 187/* Configuration registers */
 188#define SIO_VT1211_LDN          0x07    /* logical device number */
 189#define SIO_VT1211_DEVID        0x20    /* device ID */
 190#define SIO_VT1211_DEVREV       0x21    /* device revision */
 191#define SIO_VT1211_ACTIVE       0x30    /* HW monitor active */
 192#define SIO_VT1211_BADDR        0x60    /* base I/O address */
 193#define SIO_VT1211_ID           0x3c    /* VT1211 device ID */
 194
 195/* VT1211 logical device numbers */
 196#define SIO_VT1211_LDN_HWMON    0x0b    /* HW monitor */
 197
 198static inline void superio_outb(int sio_cip, int reg, int val)
 199{
 200        outb(reg, sio_cip);
 201        outb(val, sio_cip + 1);
 202}
 203
 204static inline int superio_inb(int sio_cip, int reg)
 205{
 206        outb(reg, sio_cip);
 207        return inb(sio_cip + 1);
 208}
 209
 210static inline void superio_select(int sio_cip, int ldn)
 211{
 212        outb(SIO_VT1211_LDN, sio_cip);
 213        outb(ldn, sio_cip + 1);
 214}
 215
 216static inline int superio_enter(int sio_cip)
 217{
 218        if (!request_muxed_region(sio_cip, 2, DRVNAME))
 219                return -EBUSY;
 220
 221        outb(0x87, sio_cip);
 222        outb(0x87, sio_cip);
 223
 224        return 0;
 225}
 226
 227static inline void superio_exit(int sio_cip)
 228{
 229        outb(0xaa, sio_cip);
 230        release_region(sio_cip, 2);
 231}
 232
 233/* ---------------------------------------------------------------------
 234 * Device I/O access
 235 * --------------------------------------------------------------------- */
 236
 237static inline u8 vt1211_read8(struct vt1211_data *data, u8 reg)
 238{
 239        return inb(data->addr + reg);
 240}
 241
 242static inline void vt1211_write8(struct vt1211_data *data, u8 reg, u8 val)
 243{
 244        outb(val, data->addr + reg);
 245}
 246
 247static struct vt1211_data *vt1211_update_device(struct device *dev)
 248{
 249        struct vt1211_data *data = dev_get_drvdata(dev);
 250        int ix, val;
 251
 252        mutex_lock(&data->update_lock);
 253
 254        /* registers cache is refreshed after 1 second */
 255        if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
 256                /* read VID */
 257                data->vid = vt1211_read8(data, VT1211_REG_VID) & 0x1f;
 258
 259                /* voltage (in) registers */
 260                for (ix = 0; ix < ARRAY_SIZE(data->in); ix++) {
 261                        if (ISVOLT(ix, data->uch_config)) {
 262                                data->in[ix] = vt1211_read8(data,
 263                                                VT1211_REG_IN(ix));
 264                                data->in_min[ix] = vt1211_read8(data,
 265                                                VT1211_REG_IN_MIN(ix));
 266                                data->in_max[ix] = vt1211_read8(data,
 267                                                VT1211_REG_IN_MAX(ix));
 268                        }
 269                }
 270
 271                /* temp registers */
 272                for (ix = 0; ix < ARRAY_SIZE(data->temp); ix++) {
 273                        if (ISTEMP(ix, data->uch_config)) {
 274                                data->temp[ix] = vt1211_read8(data,
 275                                                regtemp[ix]);
 276                                data->temp_max[ix] = vt1211_read8(data,
 277                                                regtempmax[ix]);
 278                                data->temp_hyst[ix] = vt1211_read8(data,
 279                                                regtemphyst[ix]);
 280                        }
 281                }
 282
 283                /* fan & pwm registers */
 284                for (ix = 0; ix < ARRAY_SIZE(data->fan); ix++) {
 285                        data->fan[ix] = vt1211_read8(data,
 286                                                VT1211_REG_FAN(ix));
 287                        data->fan_min[ix] = vt1211_read8(data,
 288                                                VT1211_REG_FAN_MIN(ix));
 289                        data->pwm[ix] = vt1211_read8(data,
 290                                                VT1211_REG_PWM(ix));
 291                }
 292                val = vt1211_read8(data, VT1211_REG_FAN_DIV);
 293                data->fan_div[0] = (val >> 4) & 3;
 294                data->fan_div[1] = (val >> 6) & 3;
 295                data->fan_ctl = val & 0xf;
 296
 297                val = vt1211_read8(data, VT1211_REG_PWM_CTL);
 298                data->pwm_ctl[0] = val & 0xf;
 299                data->pwm_ctl[1] = (val >> 4) & 0xf;
 300
 301                data->pwm_clk = vt1211_read8(data, VT1211_REG_PWM_CLK);
 302
 303                /* pwm & temp auto point registers */
 304                data->pwm_auto_pwm[0][1] = vt1211_read8(data,
 305                                                VT1211_REG_PWM_AUTO_PWM(0, 1));
 306                data->pwm_auto_pwm[0][2] = vt1211_read8(data,
 307                                                VT1211_REG_PWM_AUTO_PWM(0, 2));
 308                data->pwm_auto_pwm[1][1] = vt1211_read8(data,
 309                                                VT1211_REG_PWM_AUTO_PWM(1, 1));
 310                data->pwm_auto_pwm[1][2] = vt1211_read8(data,
 311                                                VT1211_REG_PWM_AUTO_PWM(1, 2));
 312                for (ix = 0; ix < ARRAY_SIZE(data->pwm_auto_temp); ix++) {
 313                        data->pwm_auto_temp[ix] = vt1211_read8(data,
 314                                                VT1211_REG_PWM_AUTO_TEMP(ix));
 315                }
 316
 317                /* alarm registers */
 318                data->alarms = (vt1211_read8(data, VT1211_REG_ALARM2) << 8) |
 319                                vt1211_read8(data, VT1211_REG_ALARM1);
 320
 321                data->last_updated = jiffies;
 322                data->valid = 1;
 323        }
 324
 325        mutex_unlock(&data->update_lock);
 326
 327        return data;
 328}
 329
 330/* ---------------------------------------------------------------------
 331 * Voltage sysfs interfaces
 332 * ix = [0-5]
 333 * --------------------------------------------------------------------- */
 334
 335#define SHOW_IN_INPUT   0
 336#define SHOW_SET_IN_MIN 1
 337#define SHOW_SET_IN_MAX 2
 338#define SHOW_IN_ALARM   3
 339
 340static ssize_t show_in(struct device *dev, struct device_attribute *attr,
 341                       char *buf)
 342{
 343        struct vt1211_data *data = vt1211_update_device(dev);
 344        struct sensor_device_attribute_2 *sensor_attr_2 =
 345                                                to_sensor_dev_attr_2(attr);
 346        int ix = sensor_attr_2->index;
 347        int fn = sensor_attr_2->nr;
 348        int res;
 349
 350        switch (fn) {
 351        case SHOW_IN_INPUT:
 352                res = IN_FROM_REG(ix, data->in[ix]);
 353                break;
 354        case SHOW_SET_IN_MIN:
 355                res = IN_FROM_REG(ix, data->in_min[ix]);
 356                break;
 357        case SHOW_SET_IN_MAX:
 358                res = IN_FROM_REG(ix, data->in_max[ix]);
 359                break;
 360        case SHOW_IN_ALARM:
 361                res = (data->alarms >> bitalarmin[ix]) & 1;
 362                break;
 363        default:
 364                res = 0;
 365                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 366        }
 367
 368        return sprintf(buf, "%d\n", res);
 369}
 370
 371static ssize_t set_in(struct device *dev, struct device_attribute *attr,
 372                      const char *buf, size_t count)
 373{
 374        struct vt1211_data *data = dev_get_drvdata(dev);
 375        struct sensor_device_attribute_2 *sensor_attr_2 =
 376                                                to_sensor_dev_attr_2(attr);
 377        int ix = sensor_attr_2->index;
 378        int fn = sensor_attr_2->nr;
 379        long val;
 380        int err;
 381
 382        err = kstrtol(buf, 10, &val);
 383        if (err)
 384                return err;
 385
 386        mutex_lock(&data->update_lock);
 387        switch (fn) {
 388        case SHOW_SET_IN_MIN:
 389                data->in_min[ix] = IN_TO_REG(ix, val);
 390                vt1211_write8(data, VT1211_REG_IN_MIN(ix), data->in_min[ix]);
 391                break;
 392        case SHOW_SET_IN_MAX:
 393                data->in_max[ix] = IN_TO_REG(ix, val);
 394                vt1211_write8(data, VT1211_REG_IN_MAX(ix), data->in_max[ix]);
 395                break;
 396        default:
 397                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 398        }
 399        mutex_unlock(&data->update_lock);
 400
 401        return count;
 402}
 403
 404/* ---------------------------------------------------------------------
 405 * Temperature sysfs interfaces
 406 * ix = [0-6]
 407 * --------------------------------------------------------------------- */
 408
 409#define SHOW_TEMP_INPUT         0
 410#define SHOW_SET_TEMP_MAX       1
 411#define SHOW_SET_TEMP_MAX_HYST  2
 412#define SHOW_TEMP_ALARM         3
 413
 414static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
 415                         char *buf)
 416{
 417        struct vt1211_data *data = vt1211_update_device(dev);
 418        struct sensor_device_attribute_2 *sensor_attr_2 =
 419                                                to_sensor_dev_attr_2(attr);
 420        int ix = sensor_attr_2->index;
 421        int fn = sensor_attr_2->nr;
 422        int res;
 423
 424        switch (fn) {
 425        case SHOW_TEMP_INPUT:
 426                res = TEMP_FROM_REG(ix, data->temp[ix]);
 427                break;
 428        case SHOW_SET_TEMP_MAX:
 429                res = TEMP_FROM_REG(ix, data->temp_max[ix]);
 430                break;
 431        case SHOW_SET_TEMP_MAX_HYST:
 432                res = TEMP_FROM_REG(ix, data->temp_hyst[ix]);
 433                break;
 434        case SHOW_TEMP_ALARM:
 435                res = (data->alarms >> bitalarmtemp[ix]) & 1;
 436                break;
 437        default:
 438                res = 0;
 439                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 440        }
 441
 442        return sprintf(buf, "%d\n", res);
 443}
 444
 445static ssize_t set_temp(struct device *dev, struct device_attribute *attr,
 446                        const char *buf, size_t count)
 447{
 448        struct vt1211_data *data = dev_get_drvdata(dev);
 449        struct sensor_device_attribute_2 *sensor_attr_2 =
 450                                                to_sensor_dev_attr_2(attr);
 451        int ix = sensor_attr_2->index;
 452        int fn = sensor_attr_2->nr;
 453        long val;
 454        int err;
 455
 456        err = kstrtol(buf, 10, &val);
 457        if (err)
 458                return err;
 459
 460        mutex_lock(&data->update_lock);
 461        switch (fn) {
 462        case SHOW_SET_TEMP_MAX:
 463                data->temp_max[ix] = TEMP_TO_REG(ix, val);
 464                vt1211_write8(data, regtempmax[ix],
 465                              data->temp_max[ix]);
 466                break;
 467        case SHOW_SET_TEMP_MAX_HYST:
 468                data->temp_hyst[ix] = TEMP_TO_REG(ix, val);
 469                vt1211_write8(data, regtemphyst[ix],
 470                              data->temp_hyst[ix]);
 471                break;
 472        default:
 473                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 474        }
 475        mutex_unlock(&data->update_lock);
 476
 477        return count;
 478}
 479
 480/* ---------------------------------------------------------------------
 481 * Fan sysfs interfaces
 482 * ix = [0-1]
 483 * --------------------------------------------------------------------- */
 484
 485#define SHOW_FAN_INPUT          0
 486#define SHOW_SET_FAN_MIN        1
 487#define SHOW_SET_FAN_DIV        2
 488#define SHOW_FAN_ALARM          3
 489
 490static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
 491                        char *buf)
 492{
 493        struct vt1211_data *data = vt1211_update_device(dev);
 494        struct sensor_device_attribute_2 *sensor_attr_2 =
 495                                                to_sensor_dev_attr_2(attr);
 496        int ix = sensor_attr_2->index;
 497        int fn = sensor_attr_2->nr;
 498        int res;
 499
 500        switch (fn) {
 501        case SHOW_FAN_INPUT:
 502                res = RPM_FROM_REG(data->fan[ix], data->fan_div[ix]);
 503                break;
 504        case SHOW_SET_FAN_MIN:
 505                res = RPM_FROM_REG(data->fan_min[ix], data->fan_div[ix]);
 506                break;
 507        case SHOW_SET_FAN_DIV:
 508                res = DIV_FROM_REG(data->fan_div[ix]);
 509                break;
 510        case SHOW_FAN_ALARM:
 511                res = (data->alarms >> bitalarmfan[ix]) & 1;
 512                break;
 513        default:
 514                res = 0;
 515                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 516        }
 517
 518        return sprintf(buf, "%d\n", res);
 519}
 520
 521static ssize_t set_fan(struct device *dev, struct device_attribute *attr,
 522                       const char *buf, size_t count)
 523{
 524        struct vt1211_data *data = dev_get_drvdata(dev);
 525        struct sensor_device_attribute_2 *sensor_attr_2 =
 526                                                to_sensor_dev_attr_2(attr);
 527        int ix = sensor_attr_2->index;
 528        int fn = sensor_attr_2->nr;
 529        int reg;
 530        unsigned long val;
 531        int err;
 532
 533        err = kstrtoul(buf, 10, &val);
 534        if (err)
 535                return err;
 536
 537        mutex_lock(&data->update_lock);
 538
 539        /* sync the data cache */
 540        reg = vt1211_read8(data, VT1211_REG_FAN_DIV);
 541        data->fan_div[0] = (reg >> 4) & 3;
 542        data->fan_div[1] = (reg >> 6) & 3;
 543        data->fan_ctl = reg & 0xf;
 544
 545        switch (fn) {
 546        case SHOW_SET_FAN_MIN:
 547                data->fan_min[ix] = RPM_TO_REG(val, data->fan_div[ix]);
 548                vt1211_write8(data, VT1211_REG_FAN_MIN(ix),
 549                              data->fan_min[ix]);
 550                break;
 551        case SHOW_SET_FAN_DIV:
 552                switch (val) {
 553                case 1:
 554                        data->fan_div[ix] = 0;
 555                        break;
 556                case 2:
 557                        data->fan_div[ix] = 1;
 558                        break;
 559                case 4:
 560                        data->fan_div[ix] = 2;
 561                        break;
 562                case 8:
 563                        data->fan_div[ix] = 3;
 564                        break;
 565                default:
 566                        count = -EINVAL;
 567                        dev_warn(dev,
 568                                 "fan div value %ld not supported. Choose one of 1, 2, 4, or 8.\n",
 569                                 val);
 570                        goto EXIT;
 571                }
 572                vt1211_write8(data, VT1211_REG_FAN_DIV,
 573                              ((data->fan_div[1] << 6) |
 574                               (data->fan_div[0] << 4) |
 575                                data->fan_ctl));
 576                break;
 577        default:
 578                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 579        }
 580
 581EXIT:
 582        mutex_unlock(&data->update_lock);
 583        return count;
 584}
 585
 586/* ---------------------------------------------------------------------
 587 * PWM sysfs interfaces
 588 * ix = [0-1]
 589 * --------------------------------------------------------------------- */
 590
 591#define SHOW_PWM                        0
 592#define SHOW_SET_PWM_ENABLE             1
 593#define SHOW_SET_PWM_FREQ               2
 594#define SHOW_SET_PWM_AUTO_CHANNELS_TEMP 3
 595
 596static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
 597                        char *buf)
 598{
 599        struct vt1211_data *data = vt1211_update_device(dev);
 600        struct sensor_device_attribute_2 *sensor_attr_2 =
 601                                                to_sensor_dev_attr_2(attr);
 602        int ix = sensor_attr_2->index;
 603        int fn = sensor_attr_2->nr;
 604        int res;
 605
 606        switch (fn) {
 607        case SHOW_PWM:
 608                res = data->pwm[ix];
 609                break;
 610        case SHOW_SET_PWM_ENABLE:
 611                res = ((data->pwm_ctl[ix] >> 3) & 1) ? 2 : 0;
 612                break;
 613        case SHOW_SET_PWM_FREQ:
 614                res = 90000 >> (data->pwm_clk & 7);
 615                break;
 616        case SHOW_SET_PWM_AUTO_CHANNELS_TEMP:
 617                res = (data->pwm_ctl[ix] & 7) + 1;
 618                break;
 619        default:
 620                res = 0;
 621                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 622        }
 623
 624        return sprintf(buf, "%d\n", res);
 625}
 626
 627static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
 628                       const char *buf, size_t count)
 629{
 630        struct vt1211_data *data = dev_get_drvdata(dev);
 631        struct sensor_device_attribute_2 *sensor_attr_2 =
 632                                                to_sensor_dev_attr_2(attr);
 633        int ix = sensor_attr_2->index;
 634        int fn = sensor_attr_2->nr;
 635        int tmp, reg;
 636        unsigned long val;
 637        int err;
 638
 639        err = kstrtoul(buf, 10, &val);
 640        if (err)
 641                return err;
 642
 643        mutex_lock(&data->update_lock);
 644
 645        switch (fn) {
 646        case SHOW_SET_PWM_ENABLE:
 647                /* sync the data cache */
 648                reg = vt1211_read8(data, VT1211_REG_FAN_DIV);
 649                data->fan_div[0] = (reg >> 4) & 3;
 650                data->fan_div[1] = (reg >> 6) & 3;
 651                data->fan_ctl = reg & 0xf;
 652                reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 653                data->pwm_ctl[0] = reg & 0xf;
 654                data->pwm_ctl[1] = (reg >> 4) & 0xf;
 655                switch (val) {
 656                case 0:
 657                        data->pwm_ctl[ix] &= 7;
 658                        /*
 659                         * disable SmartGuardian if both PWM outputs are
 660                         * disabled
 661                         */
 662                        if ((data->pwm_ctl[ix ^ 1] & 1) == 0)
 663                                data->fan_ctl &= 0xe;
 664                        break;
 665                case 2:
 666                        data->pwm_ctl[ix] |= 8;
 667                        data->fan_ctl |= 1;
 668                        break;
 669                default:
 670                        count = -EINVAL;
 671                        dev_warn(dev,
 672                                 "pwm mode %ld not supported. Choose one of 0 or 2.\n",
 673                                 val);
 674                        goto EXIT;
 675                }
 676                vt1211_write8(data, VT1211_REG_PWM_CTL,
 677                              ((data->pwm_ctl[1] << 4) |
 678                                data->pwm_ctl[0]));
 679                vt1211_write8(data, VT1211_REG_FAN_DIV,
 680                              ((data->fan_div[1] << 6) |
 681                               (data->fan_div[0] << 4) |
 682                                data->fan_ctl));
 683                break;
 684        case SHOW_SET_PWM_FREQ:
 685                val = 135000 / clamp_val(val, 135000 >> 7, 135000);
 686                /* calculate tmp = log2(val) */
 687                tmp = 0;
 688                for (val >>= 1; val > 0; val >>= 1)
 689                        tmp++;
 690                /* sync the data cache */
 691                reg = vt1211_read8(data, VT1211_REG_PWM_CLK);
 692                data->pwm_clk = (reg & 0xf8) | tmp;
 693                vt1211_write8(data, VT1211_REG_PWM_CLK, data->pwm_clk);
 694                break;
 695        case SHOW_SET_PWM_AUTO_CHANNELS_TEMP:
 696                if (val < 1 || val > 7) {
 697                        count = -EINVAL;
 698                        dev_warn(dev,
 699                                 "temp channel %ld not supported. Choose a value between 1 and 7.\n",
 700                                 val);
 701                        goto EXIT;
 702                }
 703                if (!ISTEMP(val - 1, data->uch_config)) {
 704                        count = -EINVAL;
 705                        dev_warn(dev, "temp channel %ld is not available.\n",
 706                                 val);
 707                        goto EXIT;
 708                }
 709                /* sync the data cache */
 710                reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 711                data->pwm_ctl[0] = reg & 0xf;
 712                data->pwm_ctl[1] = (reg >> 4) & 0xf;
 713                data->pwm_ctl[ix] = (data->pwm_ctl[ix] & 8) | (val - 1);
 714                vt1211_write8(data, VT1211_REG_PWM_CTL,
 715                              ((data->pwm_ctl[1] << 4) | data->pwm_ctl[0]));
 716                break;
 717        default:
 718                dev_dbg(dev, "Unknown attr fetch (%d)\n", fn);
 719        }
 720
 721EXIT:
 722        mutex_unlock(&data->update_lock);
 723        return count;
 724}
 725
 726/* ---------------------------------------------------------------------
 727 * PWM auto point definitions
 728 * ix = [0-1]
 729 * ap = [0-3]
 730 * --------------------------------------------------------------------- */
 731
 732/*
 733 * pwm[ix+1]_auto_point[ap+1]_temp mapping table:
 734 * Note that there is only a single set of temp auto points that controls both
 735 * PWM controllers. We still create 2 sets of sysfs files to make it look
 736 * more consistent even though they map to the same registers.
 737 *
 738 * ix ap : description
 739 * -------------------
 740 * 0  0  : pwm1/2 off temperature        (pwm_auto_temp[0])
 741 * 0  1  : pwm1/2 low speed temperature  (pwm_auto_temp[1])
 742 * 0  2  : pwm1/2 high speed temperature (pwm_auto_temp[2])
 743 * 0  3  : pwm1/2 full speed temperature (pwm_auto_temp[3])
 744 * 1  0  : pwm1/2 off temperature        (pwm_auto_temp[0])
 745 * 1  1  : pwm1/2 low speed temperature  (pwm_auto_temp[1])
 746 * 1  2  : pwm1/2 high speed temperature (pwm_auto_temp[2])
 747 * 1  3  : pwm1/2 full speed temperature (pwm_auto_temp[3])
 748 */
 749
 750static ssize_t show_pwm_auto_point_temp(struct device *dev,
 751                                        struct device_attribute *attr,
 752                                        char *buf)
 753{
 754        struct vt1211_data *data = vt1211_update_device(dev);
 755        struct sensor_device_attribute_2 *sensor_attr_2 =
 756                                                to_sensor_dev_attr_2(attr);
 757        int ix = sensor_attr_2->index;
 758        int ap = sensor_attr_2->nr;
 759
 760        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->pwm_ctl[ix] & 7,
 761                       data->pwm_auto_temp[ap]));
 762}
 763
 764static ssize_t set_pwm_auto_point_temp(struct device *dev,
 765                                       struct device_attribute *attr,
 766                                       const char *buf, size_t count)
 767{
 768        struct vt1211_data *data = dev_get_drvdata(dev);
 769        struct sensor_device_attribute_2 *sensor_attr_2 =
 770                                                to_sensor_dev_attr_2(attr);
 771        int ix = sensor_attr_2->index;
 772        int ap = sensor_attr_2->nr;
 773        int reg;
 774        long val;
 775        int err;
 776
 777        err = kstrtol(buf, 10, &val);
 778        if (err)
 779                return err;
 780
 781
 782        mutex_lock(&data->update_lock);
 783
 784        /* sync the data cache */
 785        reg = vt1211_read8(data, VT1211_REG_PWM_CTL);
 786        data->pwm_ctl[0] = reg & 0xf;
 787        data->pwm_ctl[1] = (reg >> 4) & 0xf;
 788
 789        data->pwm_auto_temp[ap] = TEMP_TO_REG(data->pwm_ctl[ix] & 7, val);
 790        vt1211_write8(data, VT1211_REG_PWM_AUTO_TEMP(ap),
 791                      data->pwm_auto_temp[ap]);
 792        mutex_unlock(&data->update_lock);
 793
 794        return count;
 795}
 796
 797/*
 798 * pwm[ix+1]_auto_point[ap+1]_pwm mapping table:
 799 * Note that the PWM auto points 0 & 3 are hard-wired in the VT1211 and can't
 800 * be changed.
 801 *
 802 * ix ap : description
 803 * -------------------
 804 * 0  0  : pwm1 off                   (pwm_auto_pwm[0][0], hard-wired to 0)
 805 * 0  1  : pwm1 low speed duty cycle  (pwm_auto_pwm[0][1])
 806 * 0  2  : pwm1 high speed duty cycle (pwm_auto_pwm[0][2])
 807 * 0  3  : pwm1 full speed            (pwm_auto_pwm[0][3], hard-wired to 255)
 808 * 1  0  : pwm2 off                   (pwm_auto_pwm[1][0], hard-wired to 0)
 809 * 1  1  : pwm2 low speed duty cycle  (pwm_auto_pwm[1][1])
 810 * 1  2  : pwm2 high speed duty cycle (pwm_auto_pwm[1][2])
 811 * 1  3  : pwm2 full speed            (pwm_auto_pwm[1][3], hard-wired to 255)
 812 */
 813
 814static ssize_t show_pwm_auto_point_pwm(struct device *dev,
 815                                       struct device_attribute *attr,
 816                                       char *buf)
 817{
 818        struct vt1211_data *data = vt1211_update_device(dev);
 819        struct sensor_device_attribute_2 *sensor_attr_2 =
 820                                                to_sensor_dev_attr_2(attr);
 821        int ix = sensor_attr_2->index;
 822        int ap = sensor_attr_2->nr;
 823
 824        return sprintf(buf, "%d\n", data->pwm_auto_pwm[ix][ap]);
 825}
 826
 827static ssize_t set_pwm_auto_point_pwm(struct device *dev,
 828                                      struct device_attribute *attr,
 829                                      const char *buf, size_t count)
 830{
 831        struct vt1211_data *data = dev_get_drvdata(dev);
 832        struct sensor_device_attribute_2 *sensor_attr_2 =
 833                                                to_sensor_dev_attr_2(attr);
 834        int ix = sensor_attr_2->index;
 835        int ap = sensor_attr_2->nr;
 836        unsigned long val;
 837        int err;
 838
 839        err = kstrtoul(buf, 10, &val);
 840        if (err)
 841                return err;
 842
 843        mutex_lock(&data->update_lock);
 844        data->pwm_auto_pwm[ix][ap] = clamp_val(val, 0, 255);
 845        vt1211_write8(data, VT1211_REG_PWM_AUTO_PWM(ix, ap),
 846                      data->pwm_auto_pwm[ix][ap]);
 847        mutex_unlock(&data->update_lock);
 848
 849        return count;
 850}
 851
 852/* ---------------------------------------------------------------------
 853 * Miscellaneous sysfs interfaces (VRM, VID, name, and (legacy) alarms)
 854 * --------------------------------------------------------------------- */
 855
 856static ssize_t show_vrm(struct device *dev, struct device_attribute *attr,
 857                        char *buf)
 858{
 859        struct vt1211_data *data = dev_get_drvdata(dev);
 860
 861        return sprintf(buf, "%d\n", data->vrm);
 862}
 863
 864static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
 865                       const char *buf, size_t count)
 866{
 867        struct vt1211_data *data = dev_get_drvdata(dev);
 868        unsigned long val;
 869        int err;
 870
 871        err = kstrtoul(buf, 10, &val);
 872        if (err)
 873                return err;
 874
 875        if (val > 255)
 876                return -EINVAL;
 877
 878        data->vrm = val;
 879
 880        return count;
 881}
 882
 883static ssize_t show_vid(struct device *dev, struct device_attribute *attr,
 884                        char *buf)
 885{
 886        struct vt1211_data *data = dev_get_drvdata(dev);
 887
 888        return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
 889}
 890
 891static ssize_t show_name(struct device *dev,
 892                         struct device_attribute *attr, char *buf)
 893{
 894        struct vt1211_data *data = dev_get_drvdata(dev);
 895
 896        return sprintf(buf, "%s\n", data->name);
 897}
 898
 899static ssize_t show_alarms(struct device *dev,
 900                           struct device_attribute *attr, char *buf)
 901{
 902        struct vt1211_data *data = vt1211_update_device(dev);
 903
 904        return sprintf(buf, "%d\n", data->alarms);
 905}
 906
 907/* ---------------------------------------------------------------------
 908 * Device attribute structs
 909 * --------------------------------------------------------------------- */
 910
 911#define SENSOR_ATTR_IN(ix) \
 912{       SENSOR_ATTR_2(in##ix##_input, S_IRUGO, \
 913                show_in, NULL, SHOW_IN_INPUT, ix), \
 914        SENSOR_ATTR_2(in##ix##_min, S_IRUGO | S_IWUSR, \
 915                show_in, set_in, SHOW_SET_IN_MIN, ix), \
 916        SENSOR_ATTR_2(in##ix##_max, S_IRUGO | S_IWUSR, \
 917                show_in, set_in, SHOW_SET_IN_MAX, ix), \
 918        SENSOR_ATTR_2(in##ix##_alarm, S_IRUGO, \
 919                show_in, NULL, SHOW_IN_ALARM, ix) \
 920}
 921
 922static struct sensor_device_attribute_2 vt1211_sysfs_in[][4] = {
 923        SENSOR_ATTR_IN(0),
 924        SENSOR_ATTR_IN(1),
 925        SENSOR_ATTR_IN(2),
 926        SENSOR_ATTR_IN(3),
 927        SENSOR_ATTR_IN(4),
 928        SENSOR_ATTR_IN(5)
 929};
 930
 931#define IN_UNIT_ATTRS(X)                        \
 932{       &vt1211_sysfs_in[X][0].dev_attr.attr,   \
 933        &vt1211_sysfs_in[X][1].dev_attr.attr,   \
 934        &vt1211_sysfs_in[X][2].dev_attr.attr,   \
 935        &vt1211_sysfs_in[X][3].dev_attr.attr,   \
 936        NULL                                    \
 937}
 938
 939static struct attribute *vt1211_in_attr[][5] = {
 940        IN_UNIT_ATTRS(0),
 941        IN_UNIT_ATTRS(1),
 942        IN_UNIT_ATTRS(2),
 943        IN_UNIT_ATTRS(3),
 944        IN_UNIT_ATTRS(4),
 945        IN_UNIT_ATTRS(5)
 946};
 947
 948static const struct attribute_group vt1211_in_attr_group[] = {
 949        { .attrs = vt1211_in_attr[0] },
 950        { .attrs = vt1211_in_attr[1] },
 951        { .attrs = vt1211_in_attr[2] },
 952        { .attrs = vt1211_in_attr[3] },
 953        { .attrs = vt1211_in_attr[4] },
 954        { .attrs = vt1211_in_attr[5] }
 955};
 956
 957#define SENSOR_ATTR_TEMP(ix) \
 958{       SENSOR_ATTR_2(temp##ix##_input, S_IRUGO, \
 959                show_temp, NULL, SHOW_TEMP_INPUT, ix-1), \
 960        SENSOR_ATTR_2(temp##ix##_max, S_IRUGO | S_IWUSR, \
 961                show_temp, set_temp, SHOW_SET_TEMP_MAX, ix-1), \
 962        SENSOR_ATTR_2(temp##ix##_max_hyst, S_IRUGO | S_IWUSR, \
 963                show_temp, set_temp, SHOW_SET_TEMP_MAX_HYST, ix-1), \
 964        SENSOR_ATTR_2(temp##ix##_alarm, S_IRUGO, \
 965                show_temp, NULL, SHOW_TEMP_ALARM, ix-1) \
 966}
 967
 968static struct sensor_device_attribute_2 vt1211_sysfs_temp[][4] = {
 969        SENSOR_ATTR_TEMP(1),
 970        SENSOR_ATTR_TEMP(2),
 971        SENSOR_ATTR_TEMP(3),
 972        SENSOR_ATTR_TEMP(4),
 973        SENSOR_ATTR_TEMP(5),
 974        SENSOR_ATTR_TEMP(6),
 975        SENSOR_ATTR_TEMP(7),
 976};
 977
 978#define TEMP_UNIT_ATTRS(X)                      \
 979{       &vt1211_sysfs_temp[X][0].dev_attr.attr, \
 980        &vt1211_sysfs_temp[X][1].dev_attr.attr, \
 981        &vt1211_sysfs_temp[X][2].dev_attr.attr, \
 982        &vt1211_sysfs_temp[X][3].dev_attr.attr, \
 983        NULL                                    \
 984}
 985
 986static struct attribute *vt1211_temp_attr[][5] = {
 987        TEMP_UNIT_ATTRS(0),
 988        TEMP_UNIT_ATTRS(1),
 989        TEMP_UNIT_ATTRS(2),
 990        TEMP_UNIT_ATTRS(3),
 991        TEMP_UNIT_ATTRS(4),
 992        TEMP_UNIT_ATTRS(5),
 993        TEMP_UNIT_ATTRS(6)
 994};
 995
 996static const struct attribute_group vt1211_temp_attr_group[] = {
 997        { .attrs = vt1211_temp_attr[0] },
 998        { .attrs = vt1211_temp_attr[1] },
 999        { .attrs = vt1211_temp_attr[2] },
1000        { .attrs = vt1211_temp_attr[3] },
1001        { .attrs = vt1211_temp_attr[4] },
1002        { .attrs = vt1211_temp_attr[5] },
1003        { .attrs = vt1211_temp_attr[6] }
1004};
1005
1006#define SENSOR_ATTR_FAN(ix) \
1007        SENSOR_ATTR_2(fan##ix##_input, S_IRUGO, \
1008                show_fan, NULL, SHOW_FAN_INPUT, ix-1), \
1009        SENSOR_ATTR_2(fan##ix##_min, S_IRUGO | S_IWUSR, \
1010                show_fan, set_fan, SHOW_SET_FAN_MIN, ix-1), \
1011        SENSOR_ATTR_2(fan##ix##_div, S_IRUGO | S_IWUSR, \
1012                show_fan, set_fan, SHOW_SET_FAN_DIV, ix-1), \
1013        SENSOR_ATTR_2(fan##ix##_alarm, S_IRUGO, \
1014                show_fan, NULL, SHOW_FAN_ALARM, ix-1)
1015
1016#define SENSOR_ATTR_PWM(ix) \
1017        SENSOR_ATTR_2(pwm##ix, S_IRUGO, \
1018                show_pwm, NULL, SHOW_PWM, ix-1), \
1019        SENSOR_ATTR_2(pwm##ix##_enable, S_IRUGO | S_IWUSR, \
1020                show_pwm, set_pwm, SHOW_SET_PWM_ENABLE, ix-1), \
1021        SENSOR_ATTR_2(pwm##ix##_auto_channels_temp, S_IRUGO | S_IWUSR, \
1022                show_pwm, set_pwm, SHOW_SET_PWM_AUTO_CHANNELS_TEMP, ix-1)
1023
1024#define SENSOR_ATTR_PWM_FREQ(ix) \
1025        SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO | S_IWUSR, \
1026                show_pwm, set_pwm, SHOW_SET_PWM_FREQ, ix-1)
1027
1028#define SENSOR_ATTR_PWM_FREQ_RO(ix) \
1029        SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO, \
1030                show_pwm, NULL, SHOW_SET_PWM_FREQ, ix-1)
1031
1032#define SENSOR_ATTR_PWM_AUTO_POINT_TEMP(ix, ap) \
1033        SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO | S_IWUSR, \
1034                show_pwm_auto_point_temp, set_pwm_auto_point_temp, \
1035                ap-1, ix-1)
1036
1037#define SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(ix, ap) \
1038        SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO, \
1039                show_pwm_auto_point_temp, NULL, \
1040                ap-1, ix-1)
1041
1042#define SENSOR_ATTR_PWM_AUTO_POINT_PWM(ix, ap) \
1043        SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO | S_IWUSR, \
1044                show_pwm_auto_point_pwm, set_pwm_auto_point_pwm, \
1045                ap-1, ix-1)
1046
1047#define SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(ix, ap) \
1048        SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO, \
1049                show_pwm_auto_point_pwm, NULL, \
1050                ap-1, ix-1)
1051
1052static struct sensor_device_attribute_2 vt1211_sysfs_fan_pwm[] = {
1053        SENSOR_ATTR_FAN(1),
1054        SENSOR_ATTR_FAN(2),
1055        SENSOR_ATTR_PWM(1),
1056        SENSOR_ATTR_PWM(2),
1057        SENSOR_ATTR_PWM_FREQ(1),
1058        SENSOR_ATTR_PWM_FREQ_RO(2),
1059        SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 1),
1060        SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 2),
1061        SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 3),
1062        SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 4),
1063        SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 1),
1064        SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 2),
1065        SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 3),
1066        SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 4),
1067        SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 1),
1068        SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 2),
1069        SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 3),
1070        SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 4),
1071        SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 1),
1072        SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 2),
1073        SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 3),
1074        SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 4),
1075};
1076
1077static struct device_attribute vt1211_sysfs_misc[] = {
1078        __ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm),
1079        __ATTR(cpu0_vid, S_IRUGO, show_vid, NULL),
1080        __ATTR(name, S_IRUGO, show_name, NULL),
1081        __ATTR(alarms, S_IRUGO, show_alarms, NULL),
1082};
1083
1084/* ---------------------------------------------------------------------
1085 * Device registration and initialization
1086 * --------------------------------------------------------------------- */
1087
1088static void vt1211_init_device(struct vt1211_data *data)
1089{
1090        /* set VRM */
1091        data->vrm = vid_which_vrm();
1092
1093        /* Read (and initialize) UCH config */
1094        data->uch_config = vt1211_read8(data, VT1211_REG_UCH_CONFIG);
1095        if (uch_config > -1) {
1096                data->uch_config = (data->uch_config & 0x83) |
1097                                   (uch_config << 2);
1098                vt1211_write8(data, VT1211_REG_UCH_CONFIG, data->uch_config);
1099        }
1100
1101        /*
1102         * Initialize the interrupt mode (if request at module load time).
1103         * The VT1211 implements 3 different modes for clearing interrupts:
1104         * 0: Clear INT when status register is read. Regenerate INT as long
1105         *    as temp stays above hysteresis limit.
1106         * 1: Clear INT when status register is read. DON'T regenerate INT
1107         *    until temp falls below hysteresis limit and exceeds hot limit
1108         *    again.
1109         * 2: Clear INT when temp falls below max limit.
1110         *
1111         * The driver only allows to force mode 0 since that's the only one
1112         * that makes sense for 'sensors'
1113         */
1114        if (int_mode == 0) {
1115                vt1211_write8(data, VT1211_REG_TEMP1_CONFIG, 0);
1116                vt1211_write8(data, VT1211_REG_TEMP2_CONFIG, 0);
1117        }
1118
1119        /* Fill in some hard wired values into our data struct */
1120        data->pwm_auto_pwm[0][3] = 255;
1121        data->pwm_auto_pwm[1][3] = 255;
1122}
1123
1124static void vt1211_remove_sysfs(struct platform_device *pdev)
1125{
1126        struct device *dev = &pdev->dev;
1127        int i;
1128
1129        for (i = 0; i < ARRAY_SIZE(vt1211_in_attr_group); i++)
1130                sysfs_remove_group(&dev->kobj, &vt1211_in_attr_group[i]);
1131
1132        for (i = 0; i < ARRAY_SIZE(vt1211_temp_attr_group); i++)
1133                sysfs_remove_group(&dev->kobj, &vt1211_temp_attr_group[i]);
1134
1135        for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) {
1136                device_remove_file(dev,
1137                        &vt1211_sysfs_fan_pwm[i].dev_attr);
1138        }
1139        for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++)
1140                device_remove_file(dev, &vt1211_sysfs_misc[i]);
1141}
1142
1143static int vt1211_probe(struct platform_device *pdev)
1144{
1145        struct device *dev = &pdev->dev;
1146        struct vt1211_data *data;
1147        struct resource *res;
1148        int i, err;
1149
1150        data = devm_kzalloc(dev, sizeof(struct vt1211_data), GFP_KERNEL);
1151        if (!data)
1152                return -ENOMEM;
1153
1154        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1155        if (!devm_request_region(dev, res->start, resource_size(res),
1156                                 DRVNAME)) {
1157                dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
1158                        (unsigned long)res->start, (unsigned long)res->end);
1159                return -EBUSY;
1160        }
1161        data->addr = res->start;
1162        data->name = DRVNAME;
1163        mutex_init(&data->update_lock);
1164
1165        platform_set_drvdata(pdev, data);
1166
1167        /* Initialize the VT1211 chip */
1168        vt1211_init_device(data);
1169
1170        /* Create sysfs interface files */
1171        for (i = 0; i < ARRAY_SIZE(vt1211_in_attr_group); i++) {
1172                if (ISVOLT(i, data->uch_config)) {
1173                        err = sysfs_create_group(&dev->kobj,
1174                                                 &vt1211_in_attr_group[i]);
1175                        if (err)
1176                                goto EXIT_DEV_REMOVE;
1177                }
1178        }
1179        for (i = 0; i < ARRAY_SIZE(vt1211_temp_attr_group); i++) {
1180                if (ISTEMP(i, data->uch_config)) {
1181                        err = sysfs_create_group(&dev->kobj,
1182                                                 &vt1211_temp_attr_group[i]);
1183                        if (err)
1184                                goto EXIT_DEV_REMOVE;
1185                }
1186        }
1187        for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) {
1188                err = device_create_file(dev,
1189                        &vt1211_sysfs_fan_pwm[i].dev_attr);
1190                if (err)
1191                        goto EXIT_DEV_REMOVE;
1192        }
1193        for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++) {
1194                err = device_create_file(dev,
1195                       &vt1211_sysfs_misc[i]);
1196                if (err)
1197                        goto EXIT_DEV_REMOVE;
1198        }
1199
1200        /* Register device */
1201        data->hwmon_dev = hwmon_device_register(dev);
1202        if (IS_ERR(data->hwmon_dev)) {
1203                err = PTR_ERR(data->hwmon_dev);
1204                dev_err(dev, "Class registration failed (%d)\n", err);
1205                goto EXIT_DEV_REMOVE_SILENT;
1206        }
1207
1208        return 0;
1209
1210EXIT_DEV_REMOVE:
1211        dev_err(dev, "Sysfs interface creation failed (%d)\n", err);
1212EXIT_DEV_REMOVE_SILENT:
1213        vt1211_remove_sysfs(pdev);
1214        return err;
1215}
1216
1217static int vt1211_remove(struct platform_device *pdev)
1218{
1219        struct vt1211_data *data = platform_get_drvdata(pdev);
1220
1221        hwmon_device_unregister(data->hwmon_dev);
1222        vt1211_remove_sysfs(pdev);
1223
1224        return 0;
1225}
1226
1227static struct platform_driver vt1211_driver = {
1228        .driver = {
1229                .name  = DRVNAME,
1230        },
1231        .probe  = vt1211_probe,
1232        .remove = vt1211_remove,
1233};
1234
1235static int __init vt1211_device_add(unsigned short address)
1236{
1237        struct resource res = {
1238                .start  = address,
1239                .end    = address + 0x7f,
1240                .flags  = IORESOURCE_IO,
1241        };
1242        int err;
1243
1244        pdev = platform_device_alloc(DRVNAME, address);
1245        if (!pdev) {
1246                err = -ENOMEM;
1247                pr_err("Device allocation failed (%d)\n", err);
1248                goto EXIT;
1249        }
1250
1251        res.name = pdev->name;
1252        err = acpi_check_resource_conflict(&res);
1253        if (err)
1254                goto EXIT_DEV_PUT;
1255
1256        err = platform_device_add_resources(pdev, &res, 1);
1257        if (err) {
1258                pr_err("Device resource addition failed (%d)\n", err);
1259                goto EXIT_DEV_PUT;
1260        }
1261
1262        err = platform_device_add(pdev);
1263        if (err) {
1264                pr_err("Device addition failed (%d)\n", err);
1265                goto EXIT_DEV_PUT;
1266        }
1267
1268        return 0;
1269
1270EXIT_DEV_PUT:
1271        platform_device_put(pdev);
1272EXIT:
1273        return err;
1274}
1275
1276static int __init vt1211_find(int sio_cip, unsigned short *address)
1277{
1278        int err;
1279        int devid;
1280
1281        err = superio_enter(sio_cip);
1282        if (err)
1283                return err;
1284
1285        err = -ENODEV;
1286        devid = force_id ? force_id : superio_inb(sio_cip, SIO_VT1211_DEVID);
1287        if (devid != SIO_VT1211_ID)
1288                goto EXIT;
1289
1290        superio_select(sio_cip, SIO_VT1211_LDN_HWMON);
1291
1292        if ((superio_inb(sio_cip, SIO_VT1211_ACTIVE) & 1) == 0) {
1293                pr_warn("HW monitor is disabled, skipping\n");
1294                goto EXIT;
1295        }
1296
1297        *address = ((superio_inb(sio_cip, SIO_VT1211_BADDR) << 8) |
1298                    (superio_inb(sio_cip, SIO_VT1211_BADDR + 1))) & 0xff00;
1299        if (*address == 0) {
1300                pr_warn("Base address is not set, skipping\n");
1301                goto EXIT;
1302        }
1303
1304        err = 0;
1305        pr_info("Found VT1211 chip at 0x%04x, revision %u\n",
1306                *address, superio_inb(sio_cip, SIO_VT1211_DEVREV));
1307
1308EXIT:
1309        superio_exit(sio_cip);
1310        return err;
1311}
1312
1313static int __init vt1211_init(void)
1314{
1315        int err;
1316        unsigned short address = 0;
1317
1318        err = vt1211_find(SIO_REG_CIP1, &address);
1319        if (err) {
1320                err = vt1211_find(SIO_REG_CIP2, &address);
1321                if (err)
1322                        goto EXIT;
1323        }
1324
1325        if ((uch_config < -1) || (uch_config > 31)) {
1326                err = -EINVAL;
1327                pr_warn("Invalid UCH configuration %d. Choose a value between 0 and 31.\n",
1328                        uch_config);
1329                goto EXIT;
1330        }
1331
1332        if ((int_mode < -1) || (int_mode > 0)) {
1333                err = -EINVAL;
1334                pr_warn("Invalid interrupt mode %d. Only mode 0 is supported.\n",
1335                        int_mode);
1336                goto EXIT;
1337        }
1338
1339        err = platform_driver_register(&vt1211_driver);
1340        if (err)
1341                goto EXIT;
1342
1343        /* Sets global pdev as a side effect */
1344        err = vt1211_device_add(address);
1345        if (err)
1346                goto EXIT_DRV_UNREGISTER;
1347
1348        return 0;
1349
1350EXIT_DRV_UNREGISTER:
1351        platform_driver_unregister(&vt1211_driver);
1352EXIT:
1353        return err;
1354}
1355
1356static void __exit vt1211_exit(void)
1357{
1358        platform_device_unregister(pdev);
1359        platform_driver_unregister(&vt1211_driver);
1360}
1361
1362MODULE_AUTHOR("Juerg Haefliger <juergh@gmail.com>");
1363MODULE_DESCRIPTION("VT1211 sensors");
1364MODULE_LICENSE("GPL");
1365
1366module_init(vt1211_init);
1367module_exit(vt1211_exit);
1368