linux/drivers/hwmon/f71882fg.c
<<
>>
Prefs
   1/***************************************************************************
   2 *   Copyright (C) 2006 by Hans Edgington <hans@edgington.nl>              *
   3 *   Copyright (C) 2007-2011 Hans de Goede <hdegoede@redhat.com>           *
   4 *                                                                         *
   5 *   This program is free software; you can redistribute it and/or modify  *
   6 *   it under the terms of the GNU General Public License as published by  *
   7 *   the Free Software Foundation; either version 2 of the License, or     *
   8 *   (at your option) any later version.                                   *
   9 *                                                                         *
  10 *   This program is distributed in the hope that it will be useful,       *
  11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  13 *   GNU General Public License for more details.                          *
  14 *                                                                         *
  15 *   You should have received a copy of the GNU General Public License     *
  16 *   along with this program; if not, write to the                         *
  17 *   Free Software Foundation, Inc.,                                       *
  18 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  19 ***************************************************************************/
  20
  21#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  22
  23#include <linux/module.h>
  24#include <linux/init.h>
  25#include <linux/slab.h>
  26#include <linux/jiffies.h>
  27#include <linux/platform_device.h>
  28#include <linux/hwmon.h>
  29#include <linux/hwmon-sysfs.h>
  30#include <linux/err.h>
  31#include <linux/mutex.h>
  32#include <linux/io.h>
  33#include <linux/acpi.h>
  34
  35#define DRVNAME "f71882fg"
  36
  37#define SIO_F71858FG_LD_HWM     0x02    /* Hardware monitor logical device */
  38#define SIO_F71882FG_LD_HWM     0x04    /* Hardware monitor logical device */
  39#define SIO_UNLOCK_KEY          0x87    /* Key to enable Super-I/O */
  40#define SIO_LOCK_KEY            0xAA    /* Key to disable Super-I/O */
  41
  42#define SIO_REG_LDSEL           0x07    /* Logical device select */
  43#define SIO_REG_DEVID           0x20    /* Device ID (2 bytes) */
  44#define SIO_REG_DEVREV          0x22    /* Device revision */
  45#define SIO_REG_MANID           0x23    /* Fintek ID (2 bytes) */
  46#define SIO_REG_ENABLE          0x30    /* Logical device enable */
  47#define SIO_REG_ADDR            0x60    /* Logical device address (2 bytes) */
  48
  49#define SIO_FINTEK_ID           0x1934  /* Manufacturers ID */
  50#define SIO_F71808E_ID          0x0901  /* Chipset ID */
  51#define SIO_F71808A_ID          0x1001  /* Chipset ID */
  52#define SIO_F71858_ID           0x0507  /* Chipset ID */
  53#define SIO_F71862_ID           0x0601  /* Chipset ID */
  54#define SIO_F71869_ID           0x0814  /* Chipset ID */
  55#define SIO_F71869A_ID          0x1007  /* Chipset ID */
  56#define SIO_F71882_ID           0x0541  /* Chipset ID */
  57#define SIO_F71889_ID           0x0723  /* Chipset ID */
  58#define SIO_F71889E_ID          0x0909  /* Chipset ID */
  59#define SIO_F71889A_ID          0x1005  /* Chipset ID */
  60#define SIO_F8000_ID            0x0581  /* Chipset ID */
  61#define SIO_F81865_ID           0x0704  /* Chipset ID */
  62
  63#define REGION_LENGTH           8
  64#define ADDR_REG_OFFSET         5
  65#define DATA_REG_OFFSET         6
  66
  67#define F71882FG_REG_IN_STATUS          0x12 /* f7188x only */
  68#define F71882FG_REG_IN_BEEP            0x13 /* f7188x only */
  69#define F71882FG_REG_IN(nr)             (0x20  + (nr))
  70#define F71882FG_REG_IN1_HIGH           0x32 /* f7188x only */
  71
  72#define F71882FG_REG_FAN(nr)            (0xA0 + (16 * (nr)))
  73#define F71882FG_REG_FAN_TARGET(nr)     (0xA2 + (16 * (nr)))
  74#define F71882FG_REG_FAN_FULL_SPEED(nr) (0xA4 + (16 * (nr)))
  75#define F71882FG_REG_FAN_STATUS         0x92
  76#define F71882FG_REG_FAN_BEEP           0x93
  77
  78#define F71882FG_REG_TEMP(nr)           (0x70 + 2 * (nr))
  79#define F71882FG_REG_TEMP_OVT(nr)       (0x80 + 2 * (nr))
  80#define F71882FG_REG_TEMP_HIGH(nr)      (0x81 + 2 * (nr))
  81#define F71882FG_REG_TEMP_STATUS        0x62
  82#define F71882FG_REG_TEMP_BEEP          0x63
  83#define F71882FG_REG_TEMP_CONFIG        0x69
  84#define F71882FG_REG_TEMP_HYST(nr)      (0x6C + (nr))
  85#define F71882FG_REG_TEMP_TYPE          0x6B
  86#define F71882FG_REG_TEMP_DIODE_OPEN    0x6F
  87
  88#define F71882FG_REG_PWM(nr)            (0xA3 + (16 * (nr)))
  89#define F71882FG_REG_PWM_TYPE           0x94
  90#define F71882FG_REG_PWM_ENABLE         0x96
  91
  92#define F71882FG_REG_FAN_HYST(nr)       (0x98 + (nr))
  93
  94#define F71882FG_REG_FAN_FAULT_T        0x9F
  95#define F71882FG_FAN_NEG_TEMP_EN        0x20
  96#define F71882FG_FAN_PROG_SEL           0x80
  97
  98#define F71882FG_REG_POINT_PWM(pwm, point)      (0xAA + (point) + (16 * (pwm)))
  99#define F71882FG_REG_POINT_TEMP(pwm, point)     (0xA6 + (point) + (16 * (pwm)))
 100#define F71882FG_REG_POINT_MAPPING(nr)          (0xAF + 16 * (nr))
 101
 102#define F71882FG_REG_START              0x01
 103
 104#define F71882FG_MAX_INS                9
 105
 106#define FAN_MIN_DETECT                  366 /* Lowest detectable fanspeed */
 107
 108static unsigned short force_id;
 109module_param(force_id, ushort, 0);
 110MODULE_PARM_DESC(force_id, "Override the detected device ID");
 111
 112enum chips { f71808e, f71808a, f71858fg, f71862fg, f71869, f71869a, f71882fg,
 113             f71889fg, f71889ed, f71889a, f8000, f81865f };
 114
 115static const char *f71882fg_names[] = {
 116        "f71808e",
 117        "f71808a",
 118        "f71858fg",
 119        "f71862fg",
 120        "f71869", /* Both f71869f and f71869e, reg. compatible and same id */
 121        "f71869a",
 122        "f71882fg",
 123        "f71889fg", /* f81801u too, same id */
 124        "f71889ed",
 125        "f71889a",
 126        "f8000",
 127        "f81865f",
 128};
 129
 130static const char f71882fg_has_in[][F71882FG_MAX_INS] = {
 131        [f71808e]       = { 1, 1, 1, 1, 1, 1, 0, 1, 1 },
 132        [f71808a]       = { 1, 1, 1, 1, 0, 0, 0, 1, 1 },
 133        [f71858fg]      = { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
 134        [f71862fg]      = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 135        [f71869]        = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 136        [f71869a]       = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 137        [f71882fg]      = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 138        [f71889fg]      = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 139        [f71889ed]      = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 140        [f71889a]       = { 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 141        [f8000]         = { 1, 1, 1, 0, 0, 0, 0, 0, 0 },
 142        [f81865f]       = { 1, 1, 1, 1, 1, 1, 1, 0, 0 },
 143};
 144
 145static const char f71882fg_has_in1_alarm[] = {
 146        [f71808e]       = 0,
 147        [f71808a]       = 0,
 148        [f71858fg]      = 0,
 149        [f71862fg]      = 0,
 150        [f71869]        = 0,
 151        [f71869a]       = 0,
 152        [f71882fg]      = 1,
 153        [f71889fg]      = 1,
 154        [f71889ed]      = 1,
 155        [f71889a]       = 1,
 156        [f8000]         = 0,
 157        [f81865f]       = 1,
 158};
 159
 160static const char f71882fg_fan_has_beep[] = {
 161        [f71808e]       = 0,
 162        [f71808a]       = 0,
 163        [f71858fg]      = 0,
 164        [f71862fg]      = 1,
 165        [f71869]        = 1,
 166        [f71869a]       = 1,
 167        [f71882fg]      = 1,
 168        [f71889fg]      = 1,
 169        [f71889ed]      = 1,
 170        [f71889a]       = 1,
 171        [f8000]         = 0,
 172        [f81865f]       = 1,
 173};
 174
 175static const char f71882fg_nr_fans[] = {
 176        [f71808e]       = 3,
 177        [f71808a]       = 2, /* +1 fan which is monitor + simple pwm only */
 178        [f71858fg]      = 3,
 179        [f71862fg]      = 3,
 180        [f71869]        = 3,
 181        [f71869a]       = 3,
 182        [f71882fg]      = 4,
 183        [f71889fg]      = 3,
 184        [f71889ed]      = 3,
 185        [f71889a]       = 3,
 186        [f8000]         = 3, /* +1 fan which is monitor only */
 187        [f81865f]       = 2,
 188};
 189
 190static const char f71882fg_temp_has_beep[] = {
 191        [f71808e]       = 0,
 192        [f71808a]       = 1,
 193        [f71858fg]      = 0,
 194        [f71862fg]      = 1,
 195        [f71869]        = 1,
 196        [f71869a]       = 1,
 197        [f71882fg]      = 1,
 198        [f71889fg]      = 1,
 199        [f71889ed]      = 1,
 200        [f71889a]       = 1,
 201        [f8000]         = 0,
 202        [f81865f]       = 1,
 203};
 204
 205static const char f71882fg_nr_temps[] = {
 206        [f71808e]       = 2,
 207        [f71808a]       = 2,
 208        [f71858fg]      = 3,
 209        [f71862fg]      = 3,
 210        [f71869]        = 3,
 211        [f71869a]       = 3,
 212        [f71882fg]      = 3,
 213        [f71889fg]      = 3,
 214        [f71889ed]      = 3,
 215        [f71889a]       = 3,
 216        [f8000]         = 3,
 217        [f81865f]       = 2,
 218};
 219
 220static struct platform_device *f71882fg_pdev;
 221
 222/* Super-I/O Function prototypes */
 223static inline int superio_inb(int base, int reg);
 224static inline int superio_inw(int base, int reg);
 225static inline int superio_enter(int base);
 226static inline void superio_select(int base, int ld);
 227static inline void superio_exit(int base);
 228
 229struct f71882fg_sio_data {
 230        enum chips type;
 231};
 232
 233struct f71882fg_data {
 234        unsigned short addr;
 235        enum chips type;
 236        struct device *hwmon_dev;
 237
 238        struct mutex update_lock;
 239        int temp_start;                 /* temp numbering start (0 or 1) */
 240        char valid;                     /* !=0 if following fields are valid */
 241        char auto_point_temp_signed;
 242        unsigned long last_updated;     /* In jiffies */
 243        unsigned long last_limits;      /* In jiffies */
 244
 245        /* Register Values */
 246        u8      in[F71882FG_MAX_INS];
 247        u8      in1_max;
 248        u8      in_status;
 249        u8      in_beep;
 250        u16     fan[4];
 251        u16     fan_target[4];
 252        u16     fan_full_speed[4];
 253        u8      fan_status;
 254        u8      fan_beep;
 255        /* Note: all models have max 3 temperature channels, but on some
 256           they are addressed as 0-2 and on others as 1-3, so for coding
 257           convenience we reserve space for 4 channels */
 258        u16     temp[4];
 259        u8      temp_ovt[4];
 260        u8      temp_high[4];
 261        u8      temp_hyst[2]; /* 2 hysts stored per reg */
 262        u8      temp_type[4];
 263        u8      temp_status;
 264        u8      temp_beep;
 265        u8      temp_diode_open;
 266        u8      temp_config;
 267        u8      pwm[4];
 268        u8      pwm_enable;
 269        u8      pwm_auto_point_hyst[2];
 270        u8      pwm_auto_point_mapping[4];
 271        u8      pwm_auto_point_pwm[4][5];
 272        s8      pwm_auto_point_temp[4][4];
 273};
 274
 275/* Sysfs in */
 276static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
 277        char *buf);
 278static ssize_t show_in_max(struct device *dev, struct device_attribute
 279        *devattr, char *buf);
 280static ssize_t store_in_max(struct device *dev, struct device_attribute
 281        *devattr, const char *buf, size_t count);
 282static ssize_t show_in_beep(struct device *dev, struct device_attribute
 283        *devattr, char *buf);
 284static ssize_t store_in_beep(struct device *dev, struct device_attribute
 285        *devattr, const char *buf, size_t count);
 286static ssize_t show_in_alarm(struct device *dev, struct device_attribute
 287        *devattr, char *buf);
 288/* Sysfs Fan */
 289static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
 290        char *buf);
 291static ssize_t show_fan_full_speed(struct device *dev,
 292        struct device_attribute *devattr, char *buf);
 293static ssize_t store_fan_full_speed(struct device *dev,
 294        struct device_attribute *devattr, const char *buf, size_t count);
 295static ssize_t show_fan_beep(struct device *dev, struct device_attribute
 296        *devattr, char *buf);
 297static ssize_t store_fan_beep(struct device *dev, struct device_attribute
 298        *devattr, const char *buf, size_t count);
 299static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
 300        *devattr, char *buf);
 301/* Sysfs Temp */
 302static ssize_t show_temp(struct device *dev, struct device_attribute
 303        *devattr, char *buf);
 304static ssize_t show_temp_max(struct device *dev, struct device_attribute
 305        *devattr, char *buf);
 306static ssize_t store_temp_max(struct device *dev, struct device_attribute
 307        *devattr, const char *buf, size_t count);
 308static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
 309        *devattr, char *buf);
 310static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
 311        *devattr, const char *buf, size_t count);
 312static ssize_t show_temp_crit(struct device *dev, struct device_attribute
 313        *devattr, char *buf);
 314static ssize_t store_temp_crit(struct device *dev, struct device_attribute
 315        *devattr, const char *buf, size_t count);
 316static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
 317        *devattr, char *buf);
 318static ssize_t show_temp_type(struct device *dev, struct device_attribute
 319        *devattr, char *buf);
 320static ssize_t show_temp_beep(struct device *dev, struct device_attribute
 321        *devattr, char *buf);
 322static ssize_t store_temp_beep(struct device *dev, struct device_attribute
 323        *devattr, const char *buf, size_t count);
 324static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
 325        *devattr, char *buf);
 326static ssize_t show_temp_fault(struct device *dev, struct device_attribute
 327        *devattr, char *buf);
 328/* PWM and Auto point control */
 329static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
 330        char *buf);
 331static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
 332        const char *buf, size_t count);
 333static ssize_t show_simple_pwm(struct device *dev,
 334        struct device_attribute *devattr, char *buf);
 335static ssize_t store_simple_pwm(struct device *dev,
 336        struct device_attribute *devattr, const char *buf, size_t count);
 337static ssize_t show_pwm_enable(struct device *dev,
 338        struct device_attribute *devattr, char *buf);
 339static ssize_t store_pwm_enable(struct device *dev,
 340        struct device_attribute *devattr, const char *buf, size_t count);
 341static ssize_t show_pwm_interpolate(struct device *dev,
 342        struct device_attribute *devattr, char *buf);
 343static ssize_t store_pwm_interpolate(struct device *dev,
 344        struct device_attribute *devattr, const char *buf, size_t count);
 345static ssize_t show_pwm_auto_point_channel(struct device *dev,
 346        struct device_attribute *devattr, char *buf);
 347static ssize_t store_pwm_auto_point_channel(struct device *dev,
 348        struct device_attribute *devattr, const char *buf, size_t count);
 349static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
 350        struct device_attribute *devattr, char *buf);
 351static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
 352        struct device_attribute *devattr, const char *buf, size_t count);
 353static ssize_t show_pwm_auto_point_pwm(struct device *dev,
 354        struct device_attribute *devattr, char *buf);
 355static ssize_t store_pwm_auto_point_pwm(struct device *dev,
 356        struct device_attribute *devattr, const char *buf, size_t count);
 357static ssize_t show_pwm_auto_point_temp(struct device *dev,
 358        struct device_attribute *devattr, char *buf);
 359static ssize_t store_pwm_auto_point_temp(struct device *dev,
 360        struct device_attribute *devattr, const char *buf, size_t count);
 361/* Sysfs misc */
 362static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
 363        char *buf);
 364
 365static int __devinit f71882fg_probe(struct platform_device * pdev);
 366static int f71882fg_remove(struct platform_device *pdev);
 367
 368static struct platform_driver f71882fg_driver = {
 369        .driver = {
 370                .owner  = THIS_MODULE,
 371                .name   = DRVNAME,
 372        },
 373        .probe          = f71882fg_probe,
 374        .remove         = f71882fg_remove,
 375};
 376
 377static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 378
 379/* Temp attr for the f71858fg, the f71858fg is special as it has its
 380   temperature indexes start at 0 (the others start at 1) */
 381static struct sensor_device_attribute_2 f71858fg_temp_attr[] = {
 382        SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
 383        SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
 384                store_temp_max, 0, 0),
 385        SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 386                store_temp_max_hyst, 0, 0),
 387        SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 0),
 388        SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 389                store_temp_crit, 0, 0),
 390        SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 391                0, 0),
 392        SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
 393        SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
 394        SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
 395        SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
 396                store_temp_max, 0, 1),
 397        SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 398                store_temp_max_hyst, 0, 1),
 399        SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
 400        SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 401                store_temp_crit, 0, 1),
 402        SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 403                0, 1),
 404        SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 405        SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 406        SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
 407        SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
 408                store_temp_max, 0, 2),
 409        SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 410                store_temp_max_hyst, 0, 2),
 411        SENSOR_ATTR_2(temp3_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
 412        SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 413                store_temp_crit, 0, 2),
 414        SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 415                0, 2),
 416        SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 417        SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 418};
 419
 420/* Temp attr for the standard models */
 421static struct sensor_device_attribute_2 fxxxx_temp_attr[3][9] = { {
 422        SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
 423        SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
 424                store_temp_max, 0, 1),
 425        SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 426                store_temp_max_hyst, 0, 1),
 427        /* Should really be temp1_max_alarm, but older versions did not handle
 428           the max and crit alarms separately and lm_sensors v2 depends on the
 429           presence of temp#_alarm files. The same goes for temp2/3 _alarm. */
 430        SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
 431        SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 432                store_temp_crit, 0, 1),
 433        SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 434                0, 1),
 435        SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 436        SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1),
 437        SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 438}, {
 439        SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2),
 440        SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
 441                store_temp_max, 0, 2),
 442        SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 443                store_temp_max_hyst, 0, 2),
 444        /* Should be temp2_max_alarm, see temp1_alarm note */
 445        SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
 446        SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 447                store_temp_crit, 0, 2),
 448        SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 449                0, 2),
 450        SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 451        SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
 452        SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 453}, {
 454        SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
 455        SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
 456                store_temp_max, 0, 3),
 457        SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
 458                store_temp_max_hyst, 0, 3),
 459        /* Should be temp3_max_alarm, see temp1_alarm note */
 460        SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3),
 461        SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
 462                store_temp_crit, 0, 3),
 463        SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
 464                0, 3),
 465        SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 7),
 466        SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3),
 467        SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3),
 468} };
 469
 470/* Temp attr for models which can beep on temp alarm */
 471static struct sensor_device_attribute_2 fxxxx_temp_beep_attr[3][2] = { {
 472        SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 473                store_temp_beep, 0, 1),
 474        SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 475                store_temp_beep, 0, 5),
 476}, {
 477        SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 478                store_temp_beep, 0, 2),
 479        SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 480                store_temp_beep, 0, 6),
 481}, {
 482        SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 483                store_temp_beep, 0, 3),
 484        SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep,
 485                store_temp_beep, 0, 7),
 486} };
 487
 488/* Temp attr for the f8000
 489   Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max)
 490   is used as hysteresis value to clear alarms
 491   Also like the f71858fg its temperature indexes start at 0
 492 */
 493static struct sensor_device_attribute_2 f8000_temp_attr[] = {
 494        SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
 495        SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_crit,
 496                store_temp_crit, 0, 0),
 497        SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 498                store_temp_max, 0, 0),
 499        SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4),
 500        SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
 501        SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
 502        SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_crit,
 503                store_temp_crit, 0, 1),
 504        SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 505                store_temp_max, 0, 1),
 506        SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5),
 507        SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
 508        SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
 509        SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_crit,
 510                store_temp_crit, 0, 2),
 511        SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max,
 512                store_temp_max, 0, 2),
 513        SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6),
 514        SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
 515};
 516
 517/* in attr for all models */
 518static struct sensor_device_attribute_2 fxxxx_in_attr[] = {
 519        SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0),
 520        SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1),
 521        SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2),
 522        SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3),
 523        SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4),
 524        SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5),
 525        SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
 526        SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
 527        SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
 528};
 529
 530/* For models with in1 alarm capability */
 531static struct sensor_device_attribute_2 fxxxx_in1_alarm_attr[] = {
 532        SENSOR_ATTR_2(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max,
 533                0, 1),
 534        SENSOR_ATTR_2(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep,
 535                0, 1),
 536        SENSOR_ATTR_2(in1_alarm, S_IRUGO, show_in_alarm, NULL, 0, 1),
 537};
 538
 539/* Fan / PWM attr common to all models */
 540static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { {
 541        SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0),
 542        SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR,
 543                      show_fan_full_speed,
 544                      store_fan_full_speed, 0, 0),
 545        SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0),
 546        SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0),
 547        SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 548                      store_pwm_enable, 0, 0),
 549        SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR,
 550                      show_pwm_interpolate, store_pwm_interpolate, 0, 0),
 551}, {
 552        SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1),
 553        SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR,
 554                      show_fan_full_speed,
 555                      store_fan_full_speed, 0, 1),
 556        SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1),
 557        SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1),
 558        SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 559                      store_pwm_enable, 0, 1),
 560        SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR,
 561                      show_pwm_interpolate, store_pwm_interpolate, 0, 1),
 562}, {
 563        SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
 564        SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR,
 565                      show_fan_full_speed,
 566                      store_fan_full_speed, 0, 2),
 567        SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
 568        SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2),
 569        SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 570                      store_pwm_enable, 0, 2),
 571        SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR,
 572                      show_pwm_interpolate, store_pwm_interpolate, 0, 2),
 573}, {
 574        SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
 575        SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR,
 576                      show_fan_full_speed,
 577                      store_fan_full_speed, 0, 3),
 578        SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3),
 579        SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3),
 580        SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable,
 581                      store_pwm_enable, 0, 3),
 582        SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR,
 583                      show_pwm_interpolate, store_pwm_interpolate, 0, 3),
 584} };
 585
 586/* Attr for the third fan of the f71808a, which only has manual pwm */
 587static struct sensor_device_attribute_2 f71808a_fan3_attr[] = {
 588        SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2),
 589        SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2),
 590        SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR,
 591                      show_simple_pwm, store_simple_pwm, 0, 2),
 592};
 593
 594/* Attr for models which can beep on Fan alarm */
 595static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = {
 596        SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 597                store_fan_beep, 0, 0),
 598        SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 599                store_fan_beep, 0, 1),
 600        SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 601                store_fan_beep, 0, 2),
 602        SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep,
 603                store_fan_beep, 0, 3),
 604};
 605
 606/* PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the
 607   standard models */
 608static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[3][7] = { {
 609        SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 610                      show_pwm_auto_point_channel,
 611                      store_pwm_auto_point_channel, 0, 0),
 612        SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 613                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 614                      1, 0),
 615        SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 616                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 617                      4, 0),
 618        SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 619                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 620                      0, 0),
 621        SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 622                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 623                      3, 0),
 624        SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 625                      show_pwm_auto_point_temp_hyst,
 626                      store_pwm_auto_point_temp_hyst,
 627                      0, 0),
 628        SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 629                      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 630}, {
 631        SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 632                      show_pwm_auto_point_channel,
 633                      store_pwm_auto_point_channel, 0, 1),
 634        SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 635                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 636                      1, 1),
 637        SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 638                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 639                      4, 1),
 640        SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 641                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 642                      0, 1),
 643        SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 644                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 645                      3, 1),
 646        SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 647                      show_pwm_auto_point_temp_hyst,
 648                      store_pwm_auto_point_temp_hyst,
 649                      0, 1),
 650        SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 651                      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 652}, {
 653        SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 654                      show_pwm_auto_point_channel,
 655                      store_pwm_auto_point_channel, 0, 2),
 656        SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 657                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 658                      1, 2),
 659        SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 660                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 661                      4, 2),
 662        SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 663                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 664                      0, 2),
 665        SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 666                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 667                      3, 2),
 668        SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 669                      show_pwm_auto_point_temp_hyst,
 670                      store_pwm_auto_point_temp_hyst,
 671                      0, 2),
 672        SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 673                      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 674} };
 675
 676/* PWM attr for the f71808e/f71869, almost identical to the f71862fg, but the
 677   pwm setting when the temperature is above the pwmX_auto_point1_temp can be
 678   programmed instead of being hardcoded to 0xff */
 679static struct sensor_device_attribute_2 f71869_auto_pwm_attr[3][8] = { {
 680        SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 681                      show_pwm_auto_point_channel,
 682                      store_pwm_auto_point_channel, 0, 0),
 683        SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 684                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 685                      0, 0),
 686        SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 687                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 688                      1, 0),
 689        SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 690                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 691                      4, 0),
 692        SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 693                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 694                      0, 0),
 695        SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 696                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 697                      3, 0),
 698        SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 699                      show_pwm_auto_point_temp_hyst,
 700                      store_pwm_auto_point_temp_hyst,
 701                      0, 0),
 702        SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 703                      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 704}, {
 705        SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 706                      show_pwm_auto_point_channel,
 707                      store_pwm_auto_point_channel, 0, 1),
 708        SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 709                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 710                      0, 1),
 711        SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 712                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 713                      1, 1),
 714        SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 715                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 716                      4, 1),
 717        SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 718                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 719                      0, 1),
 720        SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 721                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 722                      3, 1),
 723        SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 724                      show_pwm_auto_point_temp_hyst,
 725                      store_pwm_auto_point_temp_hyst,
 726                      0, 1),
 727        SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 728                      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 729}, {
 730        SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 731                      show_pwm_auto_point_channel,
 732                      store_pwm_auto_point_channel, 0, 2),
 733        SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 734                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 735                      0, 2),
 736        SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 737                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 738                      1, 2),
 739        SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
 740                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 741                      4, 2),
 742        SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 743                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 744                      0, 2),
 745        SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 746                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 747                      3, 2),
 748        SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 749                      show_pwm_auto_point_temp_hyst,
 750                      store_pwm_auto_point_temp_hyst,
 751                      0, 2),
 752        SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 753                      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 754} };
 755
 756/* PWM attr for the standard models */
 757static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { {
 758        SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 759                      show_pwm_auto_point_channel,
 760                      store_pwm_auto_point_channel, 0, 0),
 761        SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 762                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 763                      0, 0),
 764        SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 765                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 766                      1, 0),
 767        SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 768                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 769                      2, 0),
 770        SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR,
 771                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 772                      3, 0),
 773        SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR,
 774                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 775                      4, 0),
 776        SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR,
 777                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 778                      0, 0),
 779        SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR,
 780                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 781                      1, 0),
 782        SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR,
 783                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 784                      2, 0),
 785        SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR,
 786                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 787                      3, 0),
 788        SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 789                      show_pwm_auto_point_temp_hyst,
 790                      store_pwm_auto_point_temp_hyst,
 791                      0, 0),
 792        SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO,
 793                      show_pwm_auto_point_temp_hyst, NULL, 1, 0),
 794        SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO,
 795                      show_pwm_auto_point_temp_hyst, NULL, 2, 0),
 796        SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO,
 797                      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
 798}, {
 799        SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 800                      show_pwm_auto_point_channel,
 801                      store_pwm_auto_point_channel, 0, 1),
 802        SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 803                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 804                      0, 1),
 805        SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 806                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 807                      1, 1),
 808        SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 809                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 810                      2, 1),
 811        SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR,
 812                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 813                      3, 1),
 814        SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR,
 815                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 816                      4, 1),
 817        SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR,
 818                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 819                      0, 1),
 820        SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR,
 821                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 822                      1, 1),
 823        SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR,
 824                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 825                      2, 1),
 826        SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR,
 827                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 828                      3, 1),
 829        SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 830                      show_pwm_auto_point_temp_hyst,
 831                      store_pwm_auto_point_temp_hyst,
 832                      0, 1),
 833        SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO,
 834                      show_pwm_auto_point_temp_hyst, NULL, 1, 1),
 835        SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO,
 836                      show_pwm_auto_point_temp_hyst, NULL, 2, 1),
 837        SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO,
 838                      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
 839}, {
 840        SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
 841                      show_pwm_auto_point_channel,
 842                      store_pwm_auto_point_channel, 0, 2),
 843        SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR,
 844                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 845                      0, 2),
 846        SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR,
 847                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 848                      1, 2),
 849        SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR,
 850                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 851                      2, 2),
 852        SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR,
 853                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 854                      3, 2),
 855        SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR,
 856                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 857                      4, 2),
 858        SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR,
 859                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 860                      0, 2),
 861        SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR,
 862                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 863                      1, 2),
 864        SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR,
 865                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 866                      2, 2),
 867        SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR,
 868                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 869                      3, 2),
 870        SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 871                      show_pwm_auto_point_temp_hyst,
 872                      store_pwm_auto_point_temp_hyst,
 873                      0, 2),
 874        SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO,
 875                      show_pwm_auto_point_temp_hyst, NULL, 1, 2),
 876        SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO,
 877                      show_pwm_auto_point_temp_hyst, NULL, 2, 2),
 878        SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO,
 879                      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 880}, {
 881        SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR,
 882                      show_pwm_auto_point_channel,
 883                      store_pwm_auto_point_channel, 0, 3),
 884        SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR,
 885                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 886                      0, 3),
 887        SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR,
 888                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 889                      1, 3),
 890        SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR,
 891                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 892                      2, 3),
 893        SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR,
 894                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 895                      3, 3),
 896        SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR,
 897                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 898                      4, 3),
 899        SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR,
 900                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 901                      0, 3),
 902        SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR,
 903                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 904                      1, 3),
 905        SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR,
 906                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 907                      2, 3),
 908        SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR,
 909                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 910                      3, 3),
 911        SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 912                      show_pwm_auto_point_temp_hyst,
 913                      store_pwm_auto_point_temp_hyst,
 914                      0, 3),
 915        SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO,
 916                      show_pwm_auto_point_temp_hyst, NULL, 1, 3),
 917        SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO,
 918                      show_pwm_auto_point_temp_hyst, NULL, 2, 3),
 919        SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO,
 920                      show_pwm_auto_point_temp_hyst, NULL, 3, 3),
 921} };
 922
 923/* Fan attr specific to the f8000 (4th fan input can only measure speed) */
 924static struct sensor_device_attribute_2 f8000_fan_attr[] = {
 925        SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3),
 926};
 927
 928/* PWM attr for the f8000, zones mapped to temp instead of to pwm!
 929   Also the register block at offset A0 maps to TEMP1 (so our temp2, as the
 930   F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0 */
 931static struct sensor_device_attribute_2 f8000_auto_pwm_attr[3][14] = { {
 932        SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR,
 933                      show_pwm_auto_point_channel,
 934                      store_pwm_auto_point_channel, 0, 0),
 935        SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR,
 936                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 937                      0, 2),
 938        SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR,
 939                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 940                      1, 2),
 941        SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR,
 942                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 943                      2, 2),
 944        SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR,
 945                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 946                      3, 2),
 947        SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR,
 948                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 949                      4, 2),
 950        SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR,
 951                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 952                      0, 2),
 953        SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR,
 954                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 955                      1, 2),
 956        SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR,
 957                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 958                      2, 2),
 959        SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR,
 960                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 961                      3, 2),
 962        SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
 963                      show_pwm_auto_point_temp_hyst,
 964                      store_pwm_auto_point_temp_hyst,
 965                      0, 2),
 966        SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO,
 967                      show_pwm_auto_point_temp_hyst, NULL, 1, 2),
 968        SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO,
 969                      show_pwm_auto_point_temp_hyst, NULL, 2, 2),
 970        SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO,
 971                      show_pwm_auto_point_temp_hyst, NULL, 3, 2),
 972}, {
 973        SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR,
 974                      show_pwm_auto_point_channel,
 975                      store_pwm_auto_point_channel, 0, 1),
 976        SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR,
 977                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 978                      0, 0),
 979        SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR,
 980                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 981                      1, 0),
 982        SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR,
 983                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 984                      2, 0),
 985        SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR,
 986                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 987                      3, 0),
 988        SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR,
 989                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
 990                      4, 0),
 991        SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR,
 992                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 993                      0, 0),
 994        SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR,
 995                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 996                      1, 0),
 997        SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR,
 998                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
 999                      2, 0),
1000        SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR,
1001                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1002                      3, 0),
1003        SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
1004                      show_pwm_auto_point_temp_hyst,
1005                      store_pwm_auto_point_temp_hyst,
1006                      0, 0),
1007        SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO,
1008                      show_pwm_auto_point_temp_hyst, NULL, 1, 0),
1009        SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO,
1010                      show_pwm_auto_point_temp_hyst, NULL, 2, 0),
1011        SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO,
1012                      show_pwm_auto_point_temp_hyst, NULL, 3, 0),
1013}, {
1014        SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR,
1015                      show_pwm_auto_point_channel,
1016                      store_pwm_auto_point_channel, 0, 2),
1017        SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR,
1018                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1019                      0, 1),
1020        SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR,
1021                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1022                      1, 1),
1023        SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR,
1024                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1025                      2, 1),
1026        SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR,
1027                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1028                      3, 1),
1029        SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR,
1030                      show_pwm_auto_point_pwm, store_pwm_auto_point_pwm,
1031                      4, 1),
1032        SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR,
1033                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1034                      0, 1),
1035        SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR,
1036                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1037                      1, 1),
1038        SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR,
1039                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1040                      2, 1),
1041        SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR,
1042                      show_pwm_auto_point_temp, store_pwm_auto_point_temp,
1043                      3, 1),
1044        SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR,
1045                      show_pwm_auto_point_temp_hyst,
1046                      store_pwm_auto_point_temp_hyst,
1047                      0, 1),
1048        SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO,
1049                      show_pwm_auto_point_temp_hyst, NULL, 1, 1),
1050        SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO,
1051                      show_pwm_auto_point_temp_hyst, NULL, 2, 1),
1052        SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO,
1053                      show_pwm_auto_point_temp_hyst, NULL, 3, 1),
1054} };
1055
1056/* Super I/O functions */
1057static inline int superio_inb(int base, int reg)
1058{
1059        outb(reg, base);
1060        return inb(base + 1);
1061}
1062
1063static int superio_inw(int base, int reg)
1064{
1065        int val;
1066        val  = superio_inb(base, reg) << 8;
1067        val |= superio_inb(base, reg + 1);
1068        return val;
1069}
1070
1071static inline int superio_enter(int base)
1072{
1073        /* Don't step on other drivers' I/O space by accident */
1074        if (!request_muxed_region(base, 2, DRVNAME)) {
1075                pr_err("I/O address 0x%04x already in use\n", base);
1076                return -EBUSY;
1077        }
1078
1079        /* according to the datasheet the key must be send twice! */
1080        outb(SIO_UNLOCK_KEY, base);
1081        outb(SIO_UNLOCK_KEY, base);
1082
1083        return 0;
1084}
1085
1086static inline void superio_select(int base, int ld)
1087{
1088        outb(SIO_REG_LDSEL, base);
1089        outb(ld, base + 1);
1090}
1091
1092static inline void superio_exit(int base)
1093{
1094        outb(SIO_LOCK_KEY, base);
1095        release_region(base, 2);
1096}
1097
1098static inline int fan_from_reg(u16 reg)
1099{
1100        return reg ? (1500000 / reg) : 0;
1101}
1102
1103static inline u16 fan_to_reg(int fan)
1104{
1105        return fan ? (1500000 / fan) : 0;
1106}
1107
1108static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg)
1109{
1110        u8 val;
1111
1112        outb(reg, data->addr + ADDR_REG_OFFSET);
1113        val = inb(data->addr + DATA_REG_OFFSET);
1114
1115        return val;
1116}
1117
1118static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg)
1119{
1120        u16 val;
1121
1122        val  = f71882fg_read8(data, reg) << 8;
1123        val |= f71882fg_read8(data, reg + 1);
1124
1125        return val;
1126}
1127
1128static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val)
1129{
1130        outb(reg, data->addr + ADDR_REG_OFFSET);
1131        outb(val, data->addr + DATA_REG_OFFSET);
1132}
1133
1134static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val)
1135{
1136        f71882fg_write8(data, reg,     val >> 8);
1137        f71882fg_write8(data, reg + 1, val & 0xff);
1138}
1139
1140static u16 f71882fg_read_temp(struct f71882fg_data *data, int nr)
1141{
1142        if (data->type == f71858fg)
1143                return f71882fg_read16(data, F71882FG_REG_TEMP(nr));
1144        else
1145                return f71882fg_read8(data, F71882FG_REG_TEMP(nr));
1146}
1147
1148static struct f71882fg_data *f71882fg_update_device(struct device *dev)
1149{
1150        struct f71882fg_data *data = dev_get_drvdata(dev);
1151        int nr_fans = f71882fg_nr_fans[data->type];
1152        int nr_temps = f71882fg_nr_temps[data->type];
1153        int nr, reg, point;
1154
1155        mutex_lock(&data->update_lock);
1156
1157        /* Update once every 60 seconds */
1158        if (time_after(jiffies, data->last_limits + 60 * HZ) ||
1159                        !data->valid) {
1160                if (f71882fg_has_in1_alarm[data->type]) {
1161                        data->in1_max =
1162                                f71882fg_read8(data, F71882FG_REG_IN1_HIGH);
1163                        data->in_beep =
1164                                f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1165                }
1166
1167                /* Get High & boundary temps*/
1168                for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1169                                                                        nr++) {
1170                        data->temp_ovt[nr] = f71882fg_read8(data,
1171                                                F71882FG_REG_TEMP_OVT(nr));
1172                        data->temp_high[nr] = f71882fg_read8(data,
1173                                                F71882FG_REG_TEMP_HIGH(nr));
1174                }
1175
1176                if (data->type != f8000) {
1177                        data->temp_hyst[0] = f71882fg_read8(data,
1178                                                F71882FG_REG_TEMP_HYST(0));
1179                        data->temp_hyst[1] = f71882fg_read8(data,
1180                                                F71882FG_REG_TEMP_HYST(1));
1181                }
1182                /* All but the f71858fg / f8000 have this register */
1183                if ((data->type != f71858fg) && (data->type != f8000)) {
1184                        reg  = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
1185                        data->temp_type[1] = (reg & 0x02) ? 2 : 4;
1186                        data->temp_type[2] = (reg & 0x04) ? 2 : 4;
1187                        data->temp_type[3] = (reg & 0x08) ? 2 : 4;
1188                }
1189
1190                if (f71882fg_fan_has_beep[data->type])
1191                        data->fan_beep = f71882fg_read8(data,
1192                                                F71882FG_REG_FAN_BEEP);
1193
1194                if (f71882fg_temp_has_beep[data->type])
1195                        data->temp_beep = f71882fg_read8(data,
1196                                                F71882FG_REG_TEMP_BEEP);
1197
1198                data->pwm_enable = f71882fg_read8(data,
1199                                                  F71882FG_REG_PWM_ENABLE);
1200                data->pwm_auto_point_hyst[0] =
1201                        f71882fg_read8(data, F71882FG_REG_FAN_HYST(0));
1202                data->pwm_auto_point_hyst[1] =
1203                        f71882fg_read8(data, F71882FG_REG_FAN_HYST(1));
1204
1205                for (nr = 0; nr < nr_fans; nr++) {
1206                        data->pwm_auto_point_mapping[nr] =
1207                            f71882fg_read8(data,
1208                                           F71882FG_REG_POINT_MAPPING(nr));
1209
1210                        switch (data->type) {
1211                        default:
1212                                for (point = 0; point < 5; point++) {
1213                                        data->pwm_auto_point_pwm[nr][point] =
1214                                                f71882fg_read8(data,
1215                                                        F71882FG_REG_POINT_PWM
1216                                                        (nr, point));
1217                                }
1218                                for (point = 0; point < 4; point++) {
1219                                        data->pwm_auto_point_temp[nr][point] =
1220                                                f71882fg_read8(data,
1221                                                        F71882FG_REG_POINT_TEMP
1222                                                        (nr, point));
1223                                }
1224                                break;
1225                        case f71808e:
1226                        case f71869:
1227                                data->pwm_auto_point_pwm[nr][0] =
1228                                        f71882fg_read8(data,
1229                                                F71882FG_REG_POINT_PWM(nr, 0));
1230                                /* Fall through */
1231                        case f71862fg:
1232                                data->pwm_auto_point_pwm[nr][1] =
1233                                        f71882fg_read8(data,
1234                                                F71882FG_REG_POINT_PWM
1235                                                (nr, 1));
1236                                data->pwm_auto_point_pwm[nr][4] =
1237                                        f71882fg_read8(data,
1238                                                F71882FG_REG_POINT_PWM
1239                                                (nr, 4));
1240                                data->pwm_auto_point_temp[nr][0] =
1241                                        f71882fg_read8(data,
1242                                                F71882FG_REG_POINT_TEMP
1243                                                (nr, 0));
1244                                data->pwm_auto_point_temp[nr][3] =
1245                                        f71882fg_read8(data,
1246                                                F71882FG_REG_POINT_TEMP
1247                                                (nr, 3));
1248                                break;
1249                        }
1250                }
1251                data->last_limits = jiffies;
1252        }
1253
1254        /* Update every second */
1255        if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
1256                data->temp_status = f71882fg_read8(data,
1257                                                F71882FG_REG_TEMP_STATUS);
1258                data->temp_diode_open = f71882fg_read8(data,
1259                                                F71882FG_REG_TEMP_DIODE_OPEN);
1260                for (nr = data->temp_start; nr < nr_temps + data->temp_start;
1261                                                                        nr++)
1262                        data->temp[nr] = f71882fg_read_temp(data, nr);
1263
1264                data->fan_status = f71882fg_read8(data,
1265                                                F71882FG_REG_FAN_STATUS);
1266                for (nr = 0; nr < nr_fans; nr++) {
1267                        data->fan[nr] = f71882fg_read16(data,
1268                                                F71882FG_REG_FAN(nr));
1269                        data->fan_target[nr] =
1270                            f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr));
1271                        data->fan_full_speed[nr] =
1272                            f71882fg_read16(data,
1273                                            F71882FG_REG_FAN_FULL_SPEED(nr));
1274                        data->pwm[nr] =
1275                            f71882fg_read8(data, F71882FG_REG_PWM(nr));
1276                }
1277                /* Some models have 1 more fan with limited capabilities */
1278                if (data->type == f71808a) {
1279                        data->fan[2] = f71882fg_read16(data,
1280                                                F71882FG_REG_FAN(2));
1281                        data->pwm[2] = f71882fg_read8(data,
1282                                                        F71882FG_REG_PWM(2));
1283                }
1284                if (data->type == f8000)
1285                        data->fan[3] = f71882fg_read16(data,
1286                                                F71882FG_REG_FAN(3));
1287
1288                if (f71882fg_has_in1_alarm[data->type])
1289                        data->in_status = f71882fg_read8(data,
1290                                                F71882FG_REG_IN_STATUS);
1291                for (nr = 0; nr < F71882FG_MAX_INS; nr++)
1292                        if (f71882fg_has_in[data->type][nr])
1293                                data->in[nr] = f71882fg_read8(data,
1294                                                        F71882FG_REG_IN(nr));
1295
1296                data->last_updated = jiffies;
1297                data->valid = 1;
1298        }
1299
1300        mutex_unlock(&data->update_lock);
1301
1302        return data;
1303}
1304
1305/* Sysfs Interface */
1306static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
1307        char *buf)
1308{
1309        struct f71882fg_data *data = f71882fg_update_device(dev);
1310        int nr = to_sensor_dev_attr_2(devattr)->index;
1311        int speed = fan_from_reg(data->fan[nr]);
1312
1313        if (speed == FAN_MIN_DETECT)
1314                speed = 0;
1315
1316        return sprintf(buf, "%d\n", speed);
1317}
1318
1319static ssize_t show_fan_full_speed(struct device *dev,
1320                                   struct device_attribute *devattr, char *buf)
1321{
1322        struct f71882fg_data *data = f71882fg_update_device(dev);
1323        int nr = to_sensor_dev_attr_2(devattr)->index;
1324        int speed = fan_from_reg(data->fan_full_speed[nr]);
1325        return sprintf(buf, "%d\n", speed);
1326}
1327
1328static ssize_t store_fan_full_speed(struct device *dev,
1329                                    struct device_attribute *devattr,
1330                                    const char *buf, size_t count)
1331{
1332        struct f71882fg_data *data = dev_get_drvdata(dev);
1333        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1334        long val;
1335
1336        err = strict_strtol(buf, 10, &val);
1337        if (err)
1338                return err;
1339
1340        val = SENSORS_LIMIT(val, 23, 1500000);
1341        val = fan_to_reg(val);
1342
1343        mutex_lock(&data->update_lock);
1344        f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val);
1345        data->fan_full_speed[nr] = val;
1346        mutex_unlock(&data->update_lock);
1347
1348        return count;
1349}
1350
1351static ssize_t show_fan_beep(struct device *dev, struct device_attribute
1352        *devattr, char *buf)
1353{
1354        struct f71882fg_data *data = f71882fg_update_device(dev);
1355        int nr = to_sensor_dev_attr_2(devattr)->index;
1356
1357        if (data->fan_beep & (1 << nr))
1358                return sprintf(buf, "1\n");
1359        else
1360                return sprintf(buf, "0\n");
1361}
1362
1363static ssize_t store_fan_beep(struct device *dev, struct device_attribute
1364        *devattr, const char *buf, size_t count)
1365{
1366        struct f71882fg_data *data = dev_get_drvdata(dev);
1367        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1368        unsigned long val;
1369
1370        err = strict_strtoul(buf, 10, &val);
1371        if (err)
1372                return err;
1373
1374        mutex_lock(&data->update_lock);
1375        data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP);
1376        if (val)
1377                data->fan_beep |= 1 << nr;
1378        else
1379                data->fan_beep &= ~(1 << nr);
1380
1381        f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep);
1382        mutex_unlock(&data->update_lock);
1383
1384        return count;
1385}
1386
1387static ssize_t show_fan_alarm(struct device *dev, struct device_attribute
1388        *devattr, char *buf)
1389{
1390        struct f71882fg_data *data = f71882fg_update_device(dev);
1391        int nr = to_sensor_dev_attr_2(devattr)->index;
1392
1393        if (data->fan_status & (1 << nr))
1394                return sprintf(buf, "1\n");
1395        else
1396                return sprintf(buf, "0\n");
1397}
1398
1399static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
1400        char *buf)
1401{
1402        struct f71882fg_data *data = f71882fg_update_device(dev);
1403        int nr = to_sensor_dev_attr_2(devattr)->index;
1404
1405        return sprintf(buf, "%d\n", data->in[nr] * 8);
1406}
1407
1408static ssize_t show_in_max(struct device *dev, struct device_attribute
1409        *devattr, char *buf)
1410{
1411        struct f71882fg_data *data = f71882fg_update_device(dev);
1412
1413        return sprintf(buf, "%d\n", data->in1_max * 8);
1414}
1415
1416static ssize_t store_in_max(struct device *dev, struct device_attribute
1417        *devattr, const char *buf, size_t count)
1418{
1419        struct f71882fg_data *data = dev_get_drvdata(dev);
1420        int err;
1421        long val;
1422
1423        err = strict_strtol(buf, 10, &val);
1424        if (err)
1425                return err;
1426
1427        val /= 8;
1428        val = SENSORS_LIMIT(val, 0, 255);
1429
1430        mutex_lock(&data->update_lock);
1431        f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val);
1432        data->in1_max = val;
1433        mutex_unlock(&data->update_lock);
1434
1435        return count;
1436}
1437
1438static ssize_t show_in_beep(struct device *dev, struct device_attribute
1439        *devattr, char *buf)
1440{
1441        struct f71882fg_data *data = f71882fg_update_device(dev);
1442        int nr = to_sensor_dev_attr_2(devattr)->index;
1443
1444        if (data->in_beep & (1 << nr))
1445                return sprintf(buf, "1\n");
1446        else
1447                return sprintf(buf, "0\n");
1448}
1449
1450static ssize_t store_in_beep(struct device *dev, struct device_attribute
1451        *devattr, const char *buf, size_t count)
1452{
1453        struct f71882fg_data *data = dev_get_drvdata(dev);
1454        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1455        unsigned long val;
1456
1457        err = strict_strtoul(buf, 10, &val);
1458        if (err)
1459                return err;
1460
1461        mutex_lock(&data->update_lock);
1462        data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP);
1463        if (val)
1464                data->in_beep |= 1 << nr;
1465        else
1466                data->in_beep &= ~(1 << nr);
1467
1468        f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep);
1469        mutex_unlock(&data->update_lock);
1470
1471        return count;
1472}
1473
1474static ssize_t show_in_alarm(struct device *dev, struct device_attribute
1475        *devattr, char *buf)
1476{
1477        struct f71882fg_data *data = f71882fg_update_device(dev);
1478        int nr = to_sensor_dev_attr_2(devattr)->index;
1479
1480        if (data->in_status & (1 << nr))
1481                return sprintf(buf, "1\n");
1482        else
1483                return sprintf(buf, "0\n");
1484}
1485
1486static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
1487        char *buf)
1488{
1489        struct f71882fg_data *data = f71882fg_update_device(dev);
1490        int nr = to_sensor_dev_attr_2(devattr)->index;
1491        int sign, temp;
1492
1493        if (data->type == f71858fg) {
1494                /* TEMP_TABLE_SEL 1 or 3 ? */
1495                if (data->temp_config & 1) {
1496                        sign = data->temp[nr] & 0x0001;
1497                        temp = (data->temp[nr] >> 5) & 0x7ff;
1498                } else {
1499                        sign = data->temp[nr] & 0x8000;
1500                        temp = (data->temp[nr] >> 5) & 0x3ff;
1501                }
1502                temp *= 125;
1503                if (sign)
1504                        temp -= 128000;
1505        } else
1506                temp = data->temp[nr] * 1000;
1507
1508        return sprintf(buf, "%d\n", temp);
1509}
1510
1511static ssize_t show_temp_max(struct device *dev, struct device_attribute
1512        *devattr, char *buf)
1513{
1514        struct f71882fg_data *data = f71882fg_update_device(dev);
1515        int nr = to_sensor_dev_attr_2(devattr)->index;
1516
1517        return sprintf(buf, "%d\n", data->temp_high[nr] * 1000);
1518}
1519
1520static ssize_t store_temp_max(struct device *dev, struct device_attribute
1521        *devattr, const char *buf, size_t count)
1522{
1523        struct f71882fg_data *data = dev_get_drvdata(dev);
1524        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1525        long val;
1526
1527        err = strict_strtol(buf, 10, &val);
1528        if (err)
1529                return err;
1530
1531        val /= 1000;
1532        val = SENSORS_LIMIT(val, 0, 255);
1533
1534        mutex_lock(&data->update_lock);
1535        f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val);
1536        data->temp_high[nr] = val;
1537        mutex_unlock(&data->update_lock);
1538
1539        return count;
1540}
1541
1542static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute
1543        *devattr, char *buf)
1544{
1545        struct f71882fg_data *data = f71882fg_update_device(dev);
1546        int nr = to_sensor_dev_attr_2(devattr)->index;
1547        int temp_max_hyst;
1548
1549        mutex_lock(&data->update_lock);
1550        if (nr & 1)
1551                temp_max_hyst = data->temp_hyst[nr / 2] >> 4;
1552        else
1553                temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f;
1554        temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000;
1555        mutex_unlock(&data->update_lock);
1556
1557        return sprintf(buf, "%d\n", temp_max_hyst);
1558}
1559
1560static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute
1561        *devattr, const char *buf, size_t count)
1562{
1563        struct f71882fg_data *data = dev_get_drvdata(dev);
1564        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1565        ssize_t ret = count;
1566        u8 reg;
1567        long val;
1568
1569        err = strict_strtol(buf, 10, &val);
1570        if (err)
1571                return err;
1572
1573        val /= 1000;
1574
1575        mutex_lock(&data->update_lock);
1576
1577        /* convert abs to relative and check */
1578        data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr));
1579        val = SENSORS_LIMIT(val, data->temp_high[nr] - 15,
1580                            data->temp_high[nr]);
1581        val = data->temp_high[nr] - val;
1582
1583        /* convert value to register contents */
1584        reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2));
1585        if (nr & 1)
1586                reg = (reg & 0x0f) | (val << 4);
1587        else
1588                reg = (reg & 0xf0) | val;
1589        f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg);
1590        data->temp_hyst[nr / 2] = reg;
1591
1592        mutex_unlock(&data->update_lock);
1593        return ret;
1594}
1595
1596static ssize_t show_temp_crit(struct device *dev, struct device_attribute
1597        *devattr, char *buf)
1598{
1599        struct f71882fg_data *data = f71882fg_update_device(dev);
1600        int nr = to_sensor_dev_attr_2(devattr)->index;
1601
1602        return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000);
1603}
1604
1605static ssize_t store_temp_crit(struct device *dev, struct device_attribute
1606        *devattr, const char *buf, size_t count)
1607{
1608        struct f71882fg_data *data = dev_get_drvdata(dev);
1609        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1610        long val;
1611
1612        err = strict_strtol(buf, 10, &val);
1613        if (err)
1614                return err;
1615
1616        val /= 1000;
1617        val = SENSORS_LIMIT(val, 0, 255);
1618
1619        mutex_lock(&data->update_lock);
1620        f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val);
1621        data->temp_ovt[nr] = val;
1622        mutex_unlock(&data->update_lock);
1623
1624        return count;
1625}
1626
1627static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute
1628        *devattr, char *buf)
1629{
1630        struct f71882fg_data *data = f71882fg_update_device(dev);
1631        int nr = to_sensor_dev_attr_2(devattr)->index;
1632        int temp_crit_hyst;
1633
1634        mutex_lock(&data->update_lock);
1635        if (nr & 1)
1636                temp_crit_hyst = data->temp_hyst[nr / 2] >> 4;
1637        else
1638                temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f;
1639        temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000;
1640        mutex_unlock(&data->update_lock);
1641
1642        return sprintf(buf, "%d\n", temp_crit_hyst);
1643}
1644
1645static ssize_t show_temp_type(struct device *dev, struct device_attribute
1646        *devattr, char *buf)
1647{
1648        struct f71882fg_data *data = f71882fg_update_device(dev);
1649        int nr = to_sensor_dev_attr_2(devattr)->index;
1650
1651        return sprintf(buf, "%d\n", data->temp_type[nr]);
1652}
1653
1654static ssize_t show_temp_beep(struct device *dev, struct device_attribute
1655        *devattr, char *buf)
1656{
1657        struct f71882fg_data *data = f71882fg_update_device(dev);
1658        int nr = to_sensor_dev_attr_2(devattr)->index;
1659
1660        if (data->temp_beep & (1 << nr))
1661                return sprintf(buf, "1\n");
1662        else
1663                return sprintf(buf, "0\n");
1664}
1665
1666static ssize_t store_temp_beep(struct device *dev, struct device_attribute
1667        *devattr, const char *buf, size_t count)
1668{
1669        struct f71882fg_data *data = dev_get_drvdata(dev);
1670        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1671        unsigned long val;
1672
1673        err = strict_strtoul(buf, 10, &val);
1674        if (err)
1675                return err;
1676
1677        mutex_lock(&data->update_lock);
1678        data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
1679        if (val)
1680                data->temp_beep |= 1 << nr;
1681        else
1682                data->temp_beep &= ~(1 << nr);
1683
1684        f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
1685        mutex_unlock(&data->update_lock);
1686
1687        return count;
1688}
1689
1690static ssize_t show_temp_alarm(struct device *dev, struct device_attribute
1691        *devattr, char *buf)
1692{
1693        struct f71882fg_data *data = f71882fg_update_device(dev);
1694        int nr = to_sensor_dev_attr_2(devattr)->index;
1695
1696        if (data->temp_status & (1 << nr))
1697                return sprintf(buf, "1\n");
1698        else
1699                return sprintf(buf, "0\n");
1700}
1701
1702static ssize_t show_temp_fault(struct device *dev, struct device_attribute
1703        *devattr, char *buf)
1704{
1705        struct f71882fg_data *data = f71882fg_update_device(dev);
1706        int nr = to_sensor_dev_attr_2(devattr)->index;
1707
1708        if (data->temp_diode_open & (1 << nr))
1709                return sprintf(buf, "1\n");
1710        else
1711                return sprintf(buf, "0\n");
1712}
1713
1714static ssize_t show_pwm(struct device *dev,
1715                        struct device_attribute *devattr, char *buf)
1716{
1717        struct f71882fg_data *data = f71882fg_update_device(dev);
1718        int val, nr = to_sensor_dev_attr_2(devattr)->index;
1719        mutex_lock(&data->update_lock);
1720        if (data->pwm_enable & (1 << (2 * nr)))
1721                /* PWM mode */
1722                val = data->pwm[nr];
1723        else {
1724                /* RPM mode */
1725                val = 255 * fan_from_reg(data->fan_target[nr])
1726                        / fan_from_reg(data->fan_full_speed[nr]);
1727        }
1728        mutex_unlock(&data->update_lock);
1729        return sprintf(buf, "%d\n", val);
1730}
1731
1732static ssize_t store_pwm(struct device *dev,
1733                         struct device_attribute *devattr, const char *buf,
1734                         size_t count)
1735{
1736        struct f71882fg_data *data = dev_get_drvdata(dev);
1737        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1738        long val;
1739
1740        err = strict_strtol(buf, 10, &val);
1741        if (err)
1742                return err;
1743
1744        val = SENSORS_LIMIT(val, 0, 255);
1745
1746        mutex_lock(&data->update_lock);
1747        data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1748        if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) ||
1749            (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) {
1750                count = -EROFS;
1751                goto leave;
1752        }
1753        if (data->pwm_enable & (1 << (2 * nr))) {
1754                /* PWM mode */
1755                f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1756                data->pwm[nr] = val;
1757        } else {
1758                /* RPM mode */
1759                int target, full_speed;
1760                full_speed = f71882fg_read16(data,
1761                                             F71882FG_REG_FAN_FULL_SPEED(nr));
1762                target = fan_to_reg(val * fan_from_reg(full_speed) / 255);
1763                f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target);
1764                data->fan_target[nr] = target;
1765                data->fan_full_speed[nr] = full_speed;
1766        }
1767leave:
1768        mutex_unlock(&data->update_lock);
1769
1770        return count;
1771}
1772
1773static ssize_t show_simple_pwm(struct device *dev,
1774                               struct device_attribute *devattr, char *buf)
1775{
1776        struct f71882fg_data *data = f71882fg_update_device(dev);
1777        int val, nr = to_sensor_dev_attr_2(devattr)->index;
1778
1779        val = data->pwm[nr];
1780        return sprintf(buf, "%d\n", val);
1781}
1782
1783static ssize_t store_simple_pwm(struct device *dev,
1784                                struct device_attribute *devattr,
1785                                const char *buf, size_t count)
1786{
1787        struct f71882fg_data *data = dev_get_drvdata(dev);
1788        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1789        long val;
1790
1791        err = strict_strtol(buf, 10, &val);
1792        if (err)
1793                return err;
1794
1795        val = SENSORS_LIMIT(val, 0, 255);
1796
1797        mutex_lock(&data->update_lock);
1798        f71882fg_write8(data, F71882FG_REG_PWM(nr), val);
1799        data->pwm[nr] = val;
1800        mutex_unlock(&data->update_lock);
1801
1802        return count;
1803}
1804
1805static ssize_t show_pwm_enable(struct device *dev,
1806                               struct device_attribute *devattr, char *buf)
1807{
1808        int result = 0;
1809        struct f71882fg_data *data = f71882fg_update_device(dev);
1810        int nr = to_sensor_dev_attr_2(devattr)->index;
1811
1812        switch ((data->pwm_enable >> 2 * nr) & 3) {
1813        case 0:
1814        case 1:
1815                result = 2; /* Normal auto mode */
1816                break;
1817        case 2:
1818                result = 1; /* Manual mode */
1819                break;
1820        case 3:
1821                if (data->type == f8000)
1822                        result = 3; /* Thermostat mode */
1823                else
1824                        result = 1; /* Manual mode */
1825                break;
1826        }
1827
1828        return sprintf(buf, "%d\n", result);
1829}
1830
1831static ssize_t store_pwm_enable(struct device *dev, struct device_attribute
1832                                *devattr, const char *buf, size_t count)
1833{
1834        struct f71882fg_data *data = dev_get_drvdata(dev);
1835        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1836        long val;
1837
1838        err = strict_strtol(buf, 10, &val);
1839        if (err)
1840                return err;
1841
1842        /* Special case for F8000 pwm channel 3 which only does auto mode */
1843        if (data->type == f8000 && nr == 2 && val != 2)
1844                return -EINVAL;
1845
1846        mutex_lock(&data->update_lock);
1847        data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1848        /* Special case for F8000 auto PWM mode / Thermostat mode */
1849        if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) {
1850                switch (val) {
1851                case 2:
1852                        data->pwm_enable &= ~(2 << (2 * nr));
1853                        break;          /* Normal auto mode */
1854                case 3:
1855                        data->pwm_enable |= 2 << (2 * nr);
1856                        break;          /* Thermostat mode */
1857                default:
1858                        count = -EINVAL;
1859                        goto leave;
1860                }
1861        } else {
1862                switch (val) {
1863                case 1:
1864                        /* The f71858fg does not support manual RPM mode */
1865                        if (data->type == f71858fg &&
1866                            ((data->pwm_enable >> (2 * nr)) & 1)) {
1867                                count = -EINVAL;
1868                                goto leave;
1869                        }
1870                        data->pwm_enable |= 2 << (2 * nr);
1871                        break;          /* Manual */
1872                case 2:
1873                        data->pwm_enable &= ~(2 << (2 * nr));
1874                        break;          /* Normal auto mode */
1875                default:
1876                        count = -EINVAL;
1877                        goto leave;
1878                }
1879        }
1880        f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable);
1881leave:
1882        mutex_unlock(&data->update_lock);
1883
1884        return count;
1885}
1886
1887static ssize_t show_pwm_auto_point_pwm(struct device *dev,
1888                                       struct device_attribute *devattr,
1889                                       char *buf)
1890{
1891        int result;
1892        struct f71882fg_data *data = f71882fg_update_device(dev);
1893        int pwm = to_sensor_dev_attr_2(devattr)->index;
1894        int point = to_sensor_dev_attr_2(devattr)->nr;
1895
1896        mutex_lock(&data->update_lock);
1897        if (data->pwm_enable & (1 << (2 * pwm))) {
1898                /* PWM mode */
1899                result = data->pwm_auto_point_pwm[pwm][point];
1900        } else {
1901                /* RPM mode */
1902                result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]);
1903        }
1904        mutex_unlock(&data->update_lock);
1905
1906        return sprintf(buf, "%d\n", result);
1907}
1908
1909static ssize_t store_pwm_auto_point_pwm(struct device *dev,
1910                                        struct device_attribute *devattr,
1911                                        const char *buf, size_t count)
1912{
1913        struct f71882fg_data *data = dev_get_drvdata(dev);
1914        int err, pwm = to_sensor_dev_attr_2(devattr)->index;
1915        int point = to_sensor_dev_attr_2(devattr)->nr;
1916        long val;
1917
1918        err = strict_strtol(buf, 10, &val);
1919        if (err)
1920                return err;
1921
1922        val = SENSORS_LIMIT(val, 0, 255);
1923
1924        mutex_lock(&data->update_lock);
1925        data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
1926        if (data->pwm_enable & (1 << (2 * pwm))) {
1927                /* PWM mode */
1928        } else {
1929                /* RPM mode */
1930                if (val < 29)   /* Prevent negative numbers */
1931                        val = 255;
1932                else
1933                        val = (255 - val) * 32 / val;
1934        }
1935        f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val);
1936        data->pwm_auto_point_pwm[pwm][point] = val;
1937        mutex_unlock(&data->update_lock);
1938
1939        return count;
1940}
1941
1942static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev,
1943                                             struct device_attribute *devattr,
1944                                             char *buf)
1945{
1946        int result = 0;
1947        struct f71882fg_data *data = f71882fg_update_device(dev);
1948        int nr = to_sensor_dev_attr_2(devattr)->index;
1949        int point = to_sensor_dev_attr_2(devattr)->nr;
1950
1951        mutex_lock(&data->update_lock);
1952        if (nr & 1)
1953                result = data->pwm_auto_point_hyst[nr / 2] >> 4;
1954        else
1955                result = data->pwm_auto_point_hyst[nr / 2] & 0x0f;
1956        result = 1000 * (data->pwm_auto_point_temp[nr][point] - result);
1957        mutex_unlock(&data->update_lock);
1958
1959        return sprintf(buf, "%d\n", result);
1960}
1961
1962static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev,
1963                                              struct device_attribute *devattr,
1964                                              const char *buf, size_t count)
1965{
1966        struct f71882fg_data *data = dev_get_drvdata(dev);
1967        int err, nr = to_sensor_dev_attr_2(devattr)->index;
1968        int point = to_sensor_dev_attr_2(devattr)->nr;
1969        u8 reg;
1970        long val;
1971
1972        err = strict_strtol(buf, 10, &val);
1973        if (err)
1974                return err;
1975
1976        val /= 1000;
1977
1978        mutex_lock(&data->update_lock);
1979        data->pwm_auto_point_temp[nr][point] =
1980                f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point));
1981        val = SENSORS_LIMIT(val, data->pwm_auto_point_temp[nr][point] - 15,
1982                                data->pwm_auto_point_temp[nr][point]);
1983        val = data->pwm_auto_point_temp[nr][point] - val;
1984
1985        reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2));
1986        if (nr & 1)
1987                reg = (reg & 0x0f) | (val << 4);
1988        else
1989                reg = (reg & 0xf0) | val;
1990
1991        f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg);
1992        data->pwm_auto_point_hyst[nr / 2] = reg;
1993        mutex_unlock(&data->update_lock);
1994
1995        return count;
1996}
1997
1998static ssize_t show_pwm_interpolate(struct device *dev,
1999                                    struct device_attribute *devattr, char *buf)
2000{
2001        int result;
2002        struct f71882fg_data *data = f71882fg_update_device(dev);
2003        int nr = to_sensor_dev_attr_2(devattr)->index;
2004
2005        result = (data->pwm_auto_point_mapping[nr] >> 4) & 1;
2006
2007        return sprintf(buf, "%d\n", result);
2008}
2009
2010static ssize_t store_pwm_interpolate(struct device *dev,
2011                                     struct device_attribute *devattr,
2012                                     const char *buf, size_t count)
2013{
2014        struct f71882fg_data *data = dev_get_drvdata(dev);
2015        int err, nr = to_sensor_dev_attr_2(devattr)->index;
2016        unsigned long val;
2017
2018        err = strict_strtoul(buf, 10, &val);
2019        if (err)
2020                return err;
2021
2022        mutex_lock(&data->update_lock);
2023        data->pwm_auto_point_mapping[nr] =
2024                f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
2025        if (val)
2026                val = data->pwm_auto_point_mapping[nr] | (1 << 4);
2027        else
2028                val = data->pwm_auto_point_mapping[nr] & (~(1 << 4));
2029        f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
2030        data->pwm_auto_point_mapping[nr] = val;
2031        mutex_unlock(&data->update_lock);
2032
2033        return count;
2034}
2035
2036static ssize_t show_pwm_auto_point_channel(struct device *dev,
2037                                           struct device_attribute *devattr,
2038                                           char *buf)
2039{
2040        int result;
2041        struct f71882fg_data *data = f71882fg_update_device(dev);
2042        int nr = to_sensor_dev_attr_2(devattr)->index;
2043
2044        result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) -
2045                       data->temp_start);
2046
2047        return sprintf(buf, "%d\n", result);
2048}
2049
2050static ssize_t store_pwm_auto_point_channel(struct device *dev,
2051                                            struct device_attribute *devattr,
2052                                            const char *buf, size_t count)
2053{
2054        struct f71882fg_data *data = dev_get_drvdata(dev);
2055        int err, nr = to_sensor_dev_attr_2(devattr)->index;
2056        long val;
2057
2058        err = strict_strtol(buf, 10, &val);
2059        if (err)
2060                return err;
2061
2062        switch (val) {
2063        case 1:
2064                val = 0;
2065                break;
2066        case 2:
2067                val = 1;
2068                break;
2069        case 4:
2070                val = 2;
2071                break;
2072        default:
2073                return -EINVAL;
2074        }
2075        val += data->temp_start;
2076        mutex_lock(&data->update_lock);
2077        data->pwm_auto_point_mapping[nr] =
2078                f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr));
2079        val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val;
2080        f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val);
2081        data->pwm_auto_point_mapping[nr] = val;
2082        mutex_unlock(&data->update_lock);
2083
2084        return count;
2085}
2086
2087static ssize_t show_pwm_auto_point_temp(struct device *dev,
2088                                        struct device_attribute *devattr,
2089                                        char *buf)
2090{
2091        int result;
2092        struct f71882fg_data *data = f71882fg_update_device(dev);
2093        int pwm = to_sensor_dev_attr_2(devattr)->index;
2094        int point = to_sensor_dev_attr_2(devattr)->nr;
2095
2096        result = data->pwm_auto_point_temp[pwm][point];
2097        return sprintf(buf, "%d\n", 1000 * result);
2098}
2099
2100static ssize_t store_pwm_auto_point_temp(struct device *dev,
2101                                         struct device_attribute *devattr,
2102                                         const char *buf, size_t count)
2103{
2104        struct f71882fg_data *data = dev_get_drvdata(dev);
2105        int err, pwm = to_sensor_dev_attr_2(devattr)->index;
2106        int point = to_sensor_dev_attr_2(devattr)->nr;
2107        long val;
2108
2109        err = strict_strtol(buf, 10, &val);
2110        if (err)
2111                return err;
2112
2113        val /= 1000;
2114
2115        if (data->auto_point_temp_signed)
2116                val = SENSORS_LIMIT(val, -128, 127);
2117        else
2118                val = SENSORS_LIMIT(val, 0, 127);
2119
2120        mutex_lock(&data->update_lock);
2121        f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val);
2122        data->pwm_auto_point_temp[pwm][point] = val;
2123        mutex_unlock(&data->update_lock);
2124
2125        return count;
2126}
2127
2128static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
2129        char *buf)
2130{
2131        struct f71882fg_data *data = dev_get_drvdata(dev);
2132        return sprintf(buf, "%s\n", f71882fg_names[data->type]);
2133}
2134
2135static int __devinit f71882fg_create_sysfs_files(struct platform_device *pdev,
2136        struct sensor_device_attribute_2 *attr, int count)
2137{
2138        int err, i;
2139
2140        for (i = 0; i < count; i++) {
2141                err = device_create_file(&pdev->dev, &attr[i].dev_attr);
2142                if (err)
2143                        return err;
2144        }
2145        return 0;
2146}
2147
2148static void f71882fg_remove_sysfs_files(struct platform_device *pdev,
2149        struct sensor_device_attribute_2 *attr, int count)
2150{
2151        int i;
2152
2153        for (i = 0; i < count; i++)
2154                device_remove_file(&pdev->dev, &attr[i].dev_attr);
2155}
2156
2157static int __devinit f71882fg_create_fan_sysfs_files(
2158        struct platform_device *pdev, int idx)
2159{
2160        struct f71882fg_data *data = platform_get_drvdata(pdev);
2161        int err;
2162
2163        /* Sanity check the pwm setting */
2164        err = 0;
2165        switch (data->type) {
2166        case f71858fg:
2167                if (((data->pwm_enable >> (idx * 2)) & 3) == 3)
2168                        err = 1;
2169                break;
2170        case f71862fg:
2171                if (((data->pwm_enable >> (idx * 2)) & 1) != 1)
2172                        err = 1;
2173                break;
2174        case f8000:
2175                if (idx == 2)
2176                        err = data->pwm_enable & 0x20;
2177                break;
2178        default:
2179                break;
2180        }
2181        if (err) {
2182                dev_err(&pdev->dev,
2183                        "Invalid (reserved) pwm settings: 0x%02x, "
2184                        "skipping fan %d\n",
2185                        (data->pwm_enable >> (idx * 2)) & 3, idx + 1);
2186                return 0; /* This is a non fatal condition */
2187        }
2188
2189        err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[idx][0],
2190                                          ARRAY_SIZE(fxxxx_fan_attr[0]));
2191        if (err)
2192                return err;
2193
2194        if (f71882fg_fan_has_beep[data->type]) {
2195                err = f71882fg_create_sysfs_files(pdev,
2196                                                  &fxxxx_fan_beep_attr[idx],
2197                                                  1);
2198                if (err)
2199                        return err;
2200        }
2201
2202        dev_info(&pdev->dev, "Fan: %d is in %s mode\n", idx + 1,
2203                 (data->pwm_enable & (1 << (2 * idx))) ? "duty-cycle" : "RPM");
2204
2205        /* Check for unsupported auto pwm settings */
2206        switch (data->type) {
2207        case f71808e:
2208        case f71808a:
2209        case f71869:
2210        case f71869a:
2211        case f71889fg:
2212        case f71889ed:
2213        case f71889a:
2214                data->pwm_auto_point_mapping[idx] =
2215                        f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(idx));
2216                if ((data->pwm_auto_point_mapping[idx] & 0x80) ||
2217                    (data->pwm_auto_point_mapping[idx] & 3) == 0) {
2218                        dev_warn(&pdev->dev,
2219                                 "Auto pwm controlled by raw digital "
2220                                 "data, disabling pwm auto_point "
2221                                 "sysfs attributes for fan %d\n", idx + 1);
2222                        return 0; /* This is a non fatal condition */
2223                }
2224                break;
2225        default:
2226                break;
2227        }
2228
2229        switch (data->type) {
2230        case f71862fg:
2231                err = f71882fg_create_sysfs_files(pdev,
2232                                        &f71862fg_auto_pwm_attr[idx][0],
2233                                        ARRAY_SIZE(f71862fg_auto_pwm_attr[0]));
2234                break;
2235        case f71808e:
2236        case f71869:
2237                err = f71882fg_create_sysfs_files(pdev,
2238                                        &f71869_auto_pwm_attr[idx][0],
2239                                        ARRAY_SIZE(f71869_auto_pwm_attr[0]));
2240                break;
2241        case f8000:
2242                err = f71882fg_create_sysfs_files(pdev,
2243                                        &f8000_auto_pwm_attr[idx][0],
2244                                        ARRAY_SIZE(f8000_auto_pwm_attr[0]));
2245                break;
2246        default:
2247                err = f71882fg_create_sysfs_files(pdev,
2248                                        &fxxxx_auto_pwm_attr[idx][0],
2249                                        ARRAY_SIZE(fxxxx_auto_pwm_attr[0]));
2250        }
2251
2252        return err;
2253}
2254
2255static int __devinit f71882fg_probe(struct platform_device *pdev)
2256{
2257        struct f71882fg_data *data;
2258        struct f71882fg_sio_data *sio_data = pdev->dev.platform_data;
2259        int nr_fans = f71882fg_nr_fans[sio_data->type];
2260        int nr_temps = f71882fg_nr_temps[sio_data->type];
2261        int err, i;
2262        u8 start_reg, reg;
2263
2264        data = kzalloc(sizeof(struct f71882fg_data), GFP_KERNEL);
2265        if (!data)
2266                return -ENOMEM;
2267
2268        data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start;
2269        data->type = sio_data->type;
2270        data->temp_start =
2271            (data->type == f71858fg || data->type == f8000) ? 0 : 1;
2272        mutex_init(&data->update_lock);
2273        platform_set_drvdata(pdev, data);
2274
2275        start_reg = f71882fg_read8(data, F71882FG_REG_START);
2276        if (start_reg & 0x04) {
2277                dev_warn(&pdev->dev, "Hardware monitor is powered down\n");
2278                err = -ENODEV;
2279                goto exit_free;
2280        }
2281        if (!(start_reg & 0x03)) {
2282                dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
2283                err = -ENODEV;
2284                goto exit_free;
2285        }
2286
2287        /* Register sysfs interface files */
2288        err = device_create_file(&pdev->dev, &dev_attr_name);
2289        if (err)
2290                goto exit_unregister_sysfs;
2291
2292        if (start_reg & 0x01) {
2293                switch (data->type) {
2294                case f71858fg:
2295                        data->temp_config =
2296                                f71882fg_read8(data, F71882FG_REG_TEMP_CONFIG);
2297                        if (data->temp_config & 0x10)
2298                                /* The f71858fg temperature alarms behave as
2299                                   the f8000 alarms in this mode */
2300                                err = f71882fg_create_sysfs_files(pdev,
2301                                        f8000_temp_attr,
2302                                        ARRAY_SIZE(f8000_temp_attr));
2303                        else
2304                                err = f71882fg_create_sysfs_files(pdev,
2305                                        f71858fg_temp_attr,
2306                                        ARRAY_SIZE(f71858fg_temp_attr));
2307                        break;
2308                case f8000:
2309                        err = f71882fg_create_sysfs_files(pdev,
2310                                        f8000_temp_attr,
2311                                        ARRAY_SIZE(f8000_temp_attr));
2312                        break;
2313                default:
2314                        err = f71882fg_create_sysfs_files(pdev,
2315                                &fxxxx_temp_attr[0][0],
2316                                ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2317                }
2318                if (err)
2319                        goto exit_unregister_sysfs;
2320
2321                if (f71882fg_temp_has_beep[data->type]) {
2322                        err = f71882fg_create_sysfs_files(pdev,
2323                                        &fxxxx_temp_beep_attr[0][0],
2324                                        ARRAY_SIZE(fxxxx_temp_beep_attr[0])
2325                                                * nr_temps);
2326                        if (err)
2327                                goto exit_unregister_sysfs;
2328                }
2329
2330                for (i = 0; i < F71882FG_MAX_INS; i++) {
2331                        if (f71882fg_has_in[data->type][i]) {
2332                                err = device_create_file(&pdev->dev,
2333                                                &fxxxx_in_attr[i].dev_attr);
2334                                if (err)
2335                                        goto exit_unregister_sysfs;
2336                        }
2337                }
2338                if (f71882fg_has_in1_alarm[data->type]) {
2339                        err = f71882fg_create_sysfs_files(pdev,
2340                                        fxxxx_in1_alarm_attr,
2341                                        ARRAY_SIZE(fxxxx_in1_alarm_attr));
2342                        if (err)
2343                                goto exit_unregister_sysfs;
2344                }
2345        }
2346
2347        if (start_reg & 0x02) {
2348                switch (data->type) {
2349                case f71808e:
2350                case f71808a:
2351                case f71869:
2352                case f71869a:
2353                        /* These always have signed auto point temps */
2354                        data->auto_point_temp_signed = 1;
2355                        /* Fall through to select correct fan/pwm reg bank! */
2356                case f71889fg:
2357                case f71889ed:
2358                case f71889a:
2359                        reg = f71882fg_read8(data, F71882FG_REG_FAN_FAULT_T);
2360                        if (reg & F71882FG_FAN_NEG_TEMP_EN)
2361                                data->auto_point_temp_signed = 1;
2362                        /* Ensure banked pwm registers point to right bank */
2363                        reg &= ~F71882FG_FAN_PROG_SEL;
2364                        f71882fg_write8(data, F71882FG_REG_FAN_FAULT_T, reg);
2365                        break;
2366                default:
2367                        break;
2368                }
2369
2370                data->pwm_enable =
2371                        f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
2372
2373                for (i = 0; i < nr_fans; i++) {
2374                        err = f71882fg_create_fan_sysfs_files(pdev, i);
2375                        if (err)
2376                                goto exit_unregister_sysfs;
2377                }
2378
2379                /* Some types have 1 extra fan with limited functionality */
2380                switch (data->type) {
2381                case f71808a:
2382                        err = f71882fg_create_sysfs_files(pdev,
2383                                        f71808a_fan3_attr,
2384                                        ARRAY_SIZE(f71808a_fan3_attr));
2385                        break;
2386                case f8000:
2387                        err = f71882fg_create_sysfs_files(pdev,
2388                                        f8000_fan_attr,
2389                                        ARRAY_SIZE(f8000_fan_attr));
2390                        break;
2391                default:
2392                        break;
2393                }
2394                if (err)
2395                        goto exit_unregister_sysfs;
2396        }
2397
2398        data->hwmon_dev = hwmon_device_register(&pdev->dev);
2399        if (IS_ERR(data->hwmon_dev)) {
2400                err = PTR_ERR(data->hwmon_dev);
2401                data->hwmon_dev = NULL;
2402                goto exit_unregister_sysfs;
2403        }
2404
2405        return 0;
2406
2407exit_unregister_sysfs:
2408        f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
2409        return err; /* f71882fg_remove() also frees our data */
2410exit_free:
2411        kfree(data);
2412        return err;
2413}
2414
2415static int f71882fg_remove(struct platform_device *pdev)
2416{
2417        struct f71882fg_data *data = platform_get_drvdata(pdev);
2418        int nr_fans = f71882fg_nr_fans[data->type];
2419        int nr_temps = f71882fg_nr_temps[data->type];
2420        int i;
2421        u8 start_reg = f71882fg_read8(data, F71882FG_REG_START);
2422
2423        if (data->hwmon_dev)
2424                hwmon_device_unregister(data->hwmon_dev);
2425
2426        device_remove_file(&pdev->dev, &dev_attr_name);
2427
2428        if (start_reg & 0x01) {
2429                switch (data->type) {
2430                case f71858fg:
2431                        if (data->temp_config & 0x10)
2432                                f71882fg_remove_sysfs_files(pdev,
2433                                        f8000_temp_attr,
2434                                        ARRAY_SIZE(f8000_temp_attr));
2435                        else
2436                                f71882fg_remove_sysfs_files(pdev,
2437                                        f71858fg_temp_attr,
2438                                        ARRAY_SIZE(f71858fg_temp_attr));
2439                        break;
2440                case f8000:
2441                        f71882fg_remove_sysfs_files(pdev,
2442                                        f8000_temp_attr,
2443                                        ARRAY_SIZE(f8000_temp_attr));
2444                        break;
2445                default:
2446                        f71882fg_remove_sysfs_files(pdev,
2447                                &fxxxx_temp_attr[0][0],
2448                                ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps);
2449                }
2450                if (f71882fg_temp_has_beep[data->type]) {
2451                        f71882fg_remove_sysfs_files(pdev,
2452                               &fxxxx_temp_beep_attr[0][0],
2453                               ARRAY_SIZE(fxxxx_temp_beep_attr[0]) * nr_temps);
2454                }
2455
2456                for (i = 0; i < F71882FG_MAX_INS; i++) {
2457                        if (f71882fg_has_in[data->type][i]) {
2458                                device_remove_file(&pdev->dev,
2459                                                &fxxxx_in_attr[i].dev_attr);
2460                        }
2461                }
2462                if (f71882fg_has_in1_alarm[data->type]) {
2463                        f71882fg_remove_sysfs_files(pdev,
2464                                        fxxxx_in1_alarm_attr,
2465                                        ARRAY_SIZE(fxxxx_in1_alarm_attr));
2466                }
2467        }
2468
2469        if (start_reg & 0x02) {
2470                f71882fg_remove_sysfs_files(pdev, &fxxxx_fan_attr[0][0],
2471                                ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans);
2472
2473                if (f71882fg_fan_has_beep[data->type]) {
2474                        f71882fg_remove_sysfs_files(pdev,
2475                                        fxxxx_fan_beep_attr, nr_fans);
2476                }
2477
2478                switch (data->type) {
2479                case f71808a:
2480                        f71882fg_remove_sysfs_files(pdev,
2481                                &fxxxx_auto_pwm_attr[0][0],
2482                                ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2483                        f71882fg_remove_sysfs_files(pdev,
2484                                        f71808a_fan3_attr,
2485                                        ARRAY_SIZE(f71808a_fan3_attr));
2486                        break;
2487                case f71862fg:
2488                        f71882fg_remove_sysfs_files(pdev,
2489                                &f71862fg_auto_pwm_attr[0][0],
2490                                ARRAY_SIZE(f71862fg_auto_pwm_attr[0]) *
2491                                        nr_fans);
2492                        break;
2493                case f71808e:
2494                case f71869:
2495                        f71882fg_remove_sysfs_files(pdev,
2496                                &f71869_auto_pwm_attr[0][0],
2497                                ARRAY_SIZE(f71869_auto_pwm_attr[0]) * nr_fans);
2498                        break;
2499                case f8000:
2500                        f71882fg_remove_sysfs_files(pdev,
2501                                        f8000_fan_attr,
2502                                        ARRAY_SIZE(f8000_fan_attr));
2503                        f71882fg_remove_sysfs_files(pdev,
2504                                &f8000_auto_pwm_attr[0][0],
2505                                ARRAY_SIZE(f8000_auto_pwm_attr[0]) * nr_fans);
2506                        break;
2507                default:
2508                        f71882fg_remove_sysfs_files(pdev,
2509                                &fxxxx_auto_pwm_attr[0][0],
2510                                ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans);
2511                }
2512        }
2513
2514        platform_set_drvdata(pdev, NULL);
2515        kfree(data);
2516
2517        return 0;
2518}
2519
2520static int __init f71882fg_find(int sioaddr, unsigned short *address,
2521        struct f71882fg_sio_data *sio_data)
2522{
2523        u16 devid;
2524        int err = superio_enter(sioaddr);
2525        if (err)
2526                return err;
2527
2528        devid = superio_inw(sioaddr, SIO_REG_MANID);
2529        if (devid != SIO_FINTEK_ID) {
2530                pr_debug("Not a Fintek device\n");
2531                err = -ENODEV;
2532                goto exit;
2533        }
2534
2535        devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
2536        switch (devid) {
2537        case SIO_F71808E_ID:
2538                sio_data->type = f71808e;
2539                break;
2540        case SIO_F71808A_ID:
2541                sio_data->type = f71808a;
2542                break;
2543        case SIO_F71858_ID:
2544                sio_data->type = f71858fg;
2545                break;
2546        case SIO_F71862_ID:
2547                sio_data->type = f71862fg;
2548                break;
2549        case SIO_F71869_ID:
2550                sio_data->type = f71869;
2551                break;
2552        case SIO_F71869A_ID:
2553                sio_data->type = f71869a;
2554                break;
2555        case SIO_F71882_ID:
2556                sio_data->type = f71882fg;
2557                break;
2558        case SIO_F71889_ID:
2559                sio_data->type = f71889fg;
2560                break;
2561        case SIO_F71889E_ID:
2562                sio_data->type = f71889ed;
2563                break;
2564        case SIO_F71889A_ID:
2565                sio_data->type = f71889a;
2566                break;
2567        case SIO_F8000_ID:
2568                sio_data->type = f8000;
2569                break;
2570        case SIO_F81865_ID:
2571                sio_data->type = f81865f;
2572                break;
2573        default:
2574                pr_info("Unsupported Fintek device: %04x\n",
2575                        (unsigned int)devid);
2576                err = -ENODEV;
2577                goto exit;
2578        }
2579
2580        if (sio_data->type == f71858fg)
2581                superio_select(sioaddr, SIO_F71858FG_LD_HWM);
2582        else
2583                superio_select(sioaddr, SIO_F71882FG_LD_HWM);
2584
2585        if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
2586                pr_warn("Device not activated\n");
2587                err = -ENODEV;
2588                goto exit;
2589        }
2590
2591        *address = superio_inw(sioaddr, SIO_REG_ADDR);
2592        if (*address == 0) {
2593                pr_warn("Base address not set\n");
2594                err = -ENODEV;
2595                goto exit;
2596        }
2597        *address &= ~(REGION_LENGTH - 1);       /* Ignore 3 LSB */
2598
2599        err = 0;
2600        pr_info("Found %s chip at %#x, revision %d\n",
2601                f71882fg_names[sio_data->type], (unsigned int)*address,
2602                (int)superio_inb(sioaddr, SIO_REG_DEVREV));
2603exit:
2604        superio_exit(sioaddr);
2605        return err;
2606}
2607
2608static int __init f71882fg_device_add(unsigned short address,
2609        const struct f71882fg_sio_data *sio_data)
2610{
2611        struct resource res = {
2612                .start  = address,
2613                .end    = address + REGION_LENGTH - 1,
2614                .flags  = IORESOURCE_IO,
2615        };
2616        int err;
2617
2618        f71882fg_pdev = platform_device_alloc(DRVNAME, address);
2619        if (!f71882fg_pdev)
2620                return -ENOMEM;
2621
2622        res.name = f71882fg_pdev->name;
2623        err = acpi_check_resource_conflict(&res);
2624        if (err)
2625                goto exit_device_put;
2626
2627        err = platform_device_add_resources(f71882fg_pdev, &res, 1);
2628        if (err) {
2629                pr_err("Device resource addition failed\n");
2630                goto exit_device_put;
2631        }
2632
2633        err = platform_device_add_data(f71882fg_pdev, sio_data,
2634                                       sizeof(struct f71882fg_sio_data));
2635        if (err) {
2636                pr_err("Platform data allocation failed\n");
2637                goto exit_device_put;
2638        }
2639
2640        err = platform_device_add(f71882fg_pdev);
2641        if (err) {
2642                pr_err("Device addition failed\n");
2643                goto exit_device_put;
2644        }
2645
2646        return 0;
2647
2648exit_device_put:
2649        platform_device_put(f71882fg_pdev);
2650
2651        return err;
2652}
2653
2654static int __init f71882fg_init(void)
2655{
2656        int err = -ENODEV;
2657        unsigned short address;
2658        struct f71882fg_sio_data sio_data;
2659
2660        memset(&sio_data, 0, sizeof(sio_data));
2661
2662        if (f71882fg_find(0x2e, &address, &sio_data) &&
2663            f71882fg_find(0x4e, &address, &sio_data))
2664                goto exit;
2665
2666        err = platform_driver_register(&f71882fg_driver);
2667        if (err)
2668                goto exit;
2669
2670        err = f71882fg_device_add(address, &sio_data);
2671        if (err)
2672                goto exit_driver;
2673
2674        return 0;
2675
2676exit_driver:
2677        platform_driver_unregister(&f71882fg_driver);
2678exit:
2679        return err;
2680}
2681
2682static void __exit f71882fg_exit(void)
2683{
2684        platform_device_unregister(f71882fg_pdev);
2685        platform_driver_unregister(&f71882fg_driver);
2686}
2687
2688MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver");
2689MODULE_AUTHOR("Hans Edgington, Hans de Goede <hdegoede@redhat.com>");
2690MODULE_LICENSE("GPL");
2691
2692module_init(f71882fg_init);
2693module_exit(f71882fg_exit);
2694
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.