linux/drivers/hwmon/w83792d.c
<<
>>
Prefs
   1/*
   2    w83792d.c - Part of lm_sensors, Linux kernel modules for hardware
   3                monitoring
   4    Copyright (C) 2004, 2005 Winbond Electronics Corp.
   5                        Chunhao Huang <DZShen@Winbond.com.tw>,
   6                        Rudolf Marek <r.marek@assembler.cz>
   7
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 2 of the License, or
  11    (at your option) any later version.
  12
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17
  18    You should have received a copy of the GNU General Public License
  19    along with this program; if not, write to the Free Software
  20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21
  22    Note:
  23    1. This driver is only for 2.6 kernel, 2.4 kernel need a different driver.
  24    2. This driver is only for Winbond W83792D C version device, there
  25       are also some motherboards with B version W83792D device. The
  26       calculation method to in6-in7(measured value, limits) is a little
  27       different between C and B version. C or B version can be identified
  28       by CR[0x49h].
  29*/
  30
  31/*
  32    Supports following chips:
  33
  34    Chip        #vin    #fanin  #pwm    #temp   wchipid vendid  i2c     ISA
  35    w83792d     9       7       7       3       0x7a    0x5ca3  yes     no
  36*/
  37
  38#include <linux/module.h>
  39#include <linux/init.h>
  40#include <linux/slab.h>
  41#include <linux/i2c.h>
  42#include <linux/hwmon.h>
  43#include <linux/hwmon-sysfs.h>
  44#include <linux/err.h>
  45#include <linux/mutex.h>
  46#include <linux/sysfs.h>
  47
  48/* Addresses to scan */
  49static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
  50                                                I2C_CLIENT_END };
  51
  52/* Insmod parameters */
  53I2C_CLIENT_INSMOD_1(w83792d);
  54
  55static unsigned short force_subclients[4];
  56module_param_array(force_subclients, short, NULL, 0);
  57MODULE_PARM_DESC(force_subclients, "List of subclient addresses: "
  58                        "{bus, clientaddr, subclientaddr1, subclientaddr2}");
  59
  60static int init;
  61module_param(init, bool, 0);
  62MODULE_PARM_DESC(init, "Set to one to force chip initialization");
  63
  64/* The W83792D registers */
  65static const u8 W83792D_REG_IN[9] = {
  66        0x20,   /* Vcore A in DataSheet */
  67        0x21,   /* Vcore B in DataSheet */
  68        0x22,   /* VIN0 in DataSheet */
  69        0x23,   /* VIN1 in DataSheet */
  70        0x24,   /* VIN2 in DataSheet */
  71        0x25,   /* VIN3 in DataSheet */
  72        0x26,   /* 5VCC in DataSheet */
  73        0xB0,   /* 5VSB in DataSheet */
  74        0xB1    /* VBAT in DataSheet */
  75};
  76#define W83792D_REG_LOW_BITS1 0x3E  /* Low Bits I in DataSheet */
  77#define W83792D_REG_LOW_BITS2 0x3F  /* Low Bits II in DataSheet */
  78static const u8 W83792D_REG_IN_MAX[9] = {
  79        0x2B,   /* Vcore A High Limit in DataSheet */
  80        0x2D,   /* Vcore B High Limit in DataSheet */
  81        0x2F,   /* VIN0 High Limit in DataSheet */
  82        0x31,   /* VIN1 High Limit in DataSheet */
  83        0x33,   /* VIN2 High Limit in DataSheet */
  84        0x35,   /* VIN3 High Limit in DataSheet */
  85        0x37,   /* 5VCC High Limit in DataSheet */
  86        0xB4,   /* 5VSB High Limit in DataSheet */
  87        0xB6    /* VBAT High Limit in DataSheet */
  88};
  89static const u8 W83792D_REG_IN_MIN[9] = {
  90        0x2C,   /* Vcore A Low Limit in DataSheet */
  91        0x2E,   /* Vcore B Low Limit in DataSheet */
  92        0x30,   /* VIN0 Low Limit in DataSheet */
  93        0x32,   /* VIN1 Low Limit in DataSheet */
  94        0x34,   /* VIN2 Low Limit in DataSheet */
  95        0x36,   /* VIN3 Low Limit in DataSheet */
  96        0x38,   /* 5VCC Low Limit in DataSheet */
  97        0xB5,   /* 5VSB Low Limit in DataSheet */
  98        0xB7    /* VBAT Low Limit in DataSheet */
  99};
 100static const u8 W83792D_REG_FAN[7] = {
 101        0x28,   /* FAN 1 Count in DataSheet */
 102        0x29,   /* FAN 2 Count in DataSheet */
 103        0x2A,   /* FAN 3 Count in DataSheet */
 104        0xB8,   /* FAN 4 Count in DataSheet */
 105        0xB9,   /* FAN 5 Count in DataSheet */
 106        0xBA,   /* FAN 6 Count in DataSheet */
 107        0xBE    /* FAN 7 Count in DataSheet */
 108};
 109static const u8 W83792D_REG_FAN_MIN[7] = {
 110        0x3B,   /* FAN 1 Count Low Limit in DataSheet */
 111        0x3C,   /* FAN 2 Count Low Limit in DataSheet */
 112        0x3D,   /* FAN 3 Count Low Limit in DataSheet */
 113        0xBB,   /* FAN 4 Count Low Limit in DataSheet */
 114        0xBC,   /* FAN 5 Count Low Limit in DataSheet */
 115        0xBD,   /* FAN 6 Count Low Limit in DataSheet */
 116        0xBF    /* FAN 7 Count Low Limit in DataSheet */
 117};
 118#define W83792D_REG_FAN_CFG 0x84        /* FAN Configuration in DataSheet */
 119static const u8 W83792D_REG_FAN_DIV[4] = {
 120        0x47,   /* contains FAN2 and FAN1 Divisor */
 121        0x5B,   /* contains FAN4 and FAN3 Divisor */
 122        0x5C,   /* contains FAN6 and FAN5 Divisor */
 123        0x9E    /* contains FAN7 Divisor. */
 124};
 125static const u8 W83792D_REG_PWM[7] = {
 126        0x81,   /* FAN 1 Duty Cycle, be used to control */
 127        0x83,   /* FAN 2 Duty Cycle, be used to control */
 128        0x94,   /* FAN 3 Duty Cycle, be used to control */
 129        0xA3,   /* FAN 4 Duty Cycle, be used to control */
 130        0xA4,   /* FAN 5 Duty Cycle, be used to control */
 131        0xA5,   /* FAN 6 Duty Cycle, be used to control */
 132        0xA6    /* FAN 7 Duty Cycle, be used to control */
 133};
 134#define W83792D_REG_BANK                0x4E
 135#define W83792D_REG_TEMP2_CONFIG        0xC2
 136#define W83792D_REG_TEMP3_CONFIG        0xCA
 137
 138static const u8 W83792D_REG_TEMP1[3] = {
 139        0x27,   /* TEMP 1 in DataSheet */
 140        0x39,   /* TEMP 1 Over in DataSheet */
 141        0x3A,   /* TEMP 1 Hyst in DataSheet */
 142};
 143
 144static const u8 W83792D_REG_TEMP_ADD[2][6] = {
 145        { 0xC0,         /* TEMP 2 in DataSheet */
 146          0xC1,         /* TEMP 2(0.5 deg) in DataSheet */
 147          0xC5,         /* TEMP 2 Over High part in DataSheet */
 148          0xC6,         /* TEMP 2 Over Low part in DataSheet */
 149          0xC3,         /* TEMP 2 Thyst High part in DataSheet */
 150          0xC4 },       /* TEMP 2 Thyst Low part in DataSheet */
 151        { 0xC8,         /* TEMP 3 in DataSheet */
 152          0xC9,         /* TEMP 3(0.5 deg) in DataSheet */
 153          0xCD,         /* TEMP 3 Over High part in DataSheet */
 154          0xCE,         /* TEMP 3 Over Low part in DataSheet */
 155          0xCB,         /* TEMP 3 Thyst High part in DataSheet */
 156          0xCC }        /* TEMP 3 Thyst Low part in DataSheet */
 157};
 158
 159static const u8 W83792D_REG_THERMAL[3] = {
 160        0x85,   /* SmartFanI: Fan1 target value */
 161        0x86,   /* SmartFanI: Fan2 target value */
 162        0x96    /* SmartFanI: Fan3 target value */
 163};
 164
 165static const u8 W83792D_REG_TOLERANCE[3] = {
 166        0x87,   /* (bit3-0)SmartFan Fan1 tolerance */
 167        0x87,   /* (bit7-4)SmartFan Fan2 tolerance */
 168        0x97    /* (bit3-0)SmartFan Fan3 tolerance */
 169};
 170
 171static const u8 W83792D_REG_POINTS[3][4] = {
 172        { 0x85,         /* SmartFanII: Fan1 temp point 1 */
 173          0xE3,         /* SmartFanII: Fan1 temp point 2 */
 174          0xE4,         /* SmartFanII: Fan1 temp point 3 */
 175          0xE5 },       /* SmartFanII: Fan1 temp point 4 */
 176        { 0x86,         /* SmartFanII: Fan2 temp point 1 */
 177          0xE6,         /* SmartFanII: Fan2 temp point 2 */
 178          0xE7,         /* SmartFanII: Fan2 temp point 3 */
 179          0xE8 },       /* SmartFanII: Fan2 temp point 4 */
 180        { 0x96,         /* SmartFanII: Fan3 temp point 1 */
 181          0xE9,         /* SmartFanII: Fan3 temp point 2 */
 182          0xEA,         /* SmartFanII: Fan3 temp point 3 */
 183          0xEB }        /* SmartFanII: Fan3 temp point 4 */
 184};
 185
 186static const u8 W83792D_REG_LEVELS[3][4] = {
 187        { 0x88,         /* (bit3-0) SmartFanII: Fan1 Non-Stop */
 188          0x88,         /* (bit7-4) SmartFanII: Fan1 Level 1 */
 189          0xE0,         /* (bit7-4) SmartFanII: Fan1 Level 2 */
 190          0xE0 },       /* (bit3-0) SmartFanII: Fan1 Level 3 */
 191        { 0x89,         /* (bit3-0) SmartFanII: Fan2 Non-Stop */
 192          0x89,         /* (bit7-4) SmartFanII: Fan2 Level 1 */
 193          0xE1,         /* (bit7-4) SmartFanII: Fan2 Level 2 */
 194          0xE1 },       /* (bit3-0) SmartFanII: Fan2 Level 3 */
 195        { 0x98,         /* (bit3-0) SmartFanII: Fan3 Non-Stop */
 196          0x98,         /* (bit7-4) SmartFanII: Fan3 Level 1 */
 197          0xE2,         /* (bit7-4) SmartFanII: Fan3 Level 2 */
 198          0xE2 }        /* (bit3-0) SmartFanII: Fan3 Level 3 */
 199};
 200
 201#define W83792D_REG_GPIO_EN             0x1A
 202#define W83792D_REG_CONFIG              0x40
 203#define W83792D_REG_VID_FANDIV          0x47
 204#define W83792D_REG_CHIPID              0x49
 205#define W83792D_REG_WCHIPID             0x58
 206#define W83792D_REG_CHIPMAN             0x4F
 207#define W83792D_REG_PIN                 0x4B
 208#define W83792D_REG_I2C_SUBADDR         0x4A
 209
 210#define W83792D_REG_ALARM1 0xA9         /* realtime status register1 */
 211#define W83792D_REG_ALARM2 0xAA         /* realtime status register2 */
 212#define W83792D_REG_ALARM3 0xAB         /* realtime status register3 */
 213#define W83792D_REG_CHASSIS 0x42        /* Bit 5: Case Open status bit */
 214#define W83792D_REG_CHASSIS_CLR 0x44    /* Bit 7: Case Open CLR_CHS/Reset bit */
 215
 216/* control in0/in1 's limit modifiability */
 217#define W83792D_REG_VID_IN_B            0x17
 218
 219#define W83792D_REG_VBAT                0x5D
 220#define W83792D_REG_I2C_ADDR            0x48
 221
 222/* Conversions. Rounding and limit checking is only done on the TO_REG
 223   variants. Note that you should be a bit careful with which arguments
 224   these macros are called: arguments may be evaluated more than once.
 225   Fixing this is just not worth it. */
 226#define IN_FROM_REG(nr,val) (((nr)<=1)?(val*2): \
 227                                ((((nr)==6)||((nr)==7))?(val*6):(val*4)))
 228#define IN_TO_REG(nr,val) (((nr)<=1)?(val/2): \
 229                                ((((nr)==6)||((nr)==7))?(val/6):(val/4)))
 230
 231static inline u8
 232FAN_TO_REG(long rpm, int div)
 233{
 234        if (rpm == 0)
 235                return 255;
 236        rpm = SENSORS_LIMIT(rpm, 1, 1000000);
 237        return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
 238}
 239
 240#define FAN_FROM_REG(val,div)   ((val) == 0   ? -1 : \
 241                                ((val) == 255 ? 0 : \
 242                                                1350000 / ((val) * (div))))
 243
 244/* for temp1 */
 245#define TEMP1_TO_REG(val)       (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
 246                                        : (val)) / 1000, 0, 0xff))
 247#define TEMP1_FROM_REG(val)     (((val) & 0x80 ? (val)-0x100 : (val)) * 1000)
 248/* for temp2 and temp3, because they need addtional resolution */
 249#define TEMP_ADD_FROM_REG(val1, val2) \
 250        ((((val1) & 0x80 ? (val1)-0x100 \
 251                : (val1)) * 1000) + ((val2 & 0x80) ? 500 : 0))
 252#define TEMP_ADD_TO_REG_HIGH(val) \
 253        (SENSORS_LIMIT(((val) < 0 ? (val)+0x100*1000 \
 254                        : (val)) / 1000, 0, 0xff))
 255#define TEMP_ADD_TO_REG_LOW(val)        ((val%1000) ? 0x80 : 0x00)
 256
 257#define DIV_FROM_REG(val)               (1 << (val))
 258
 259static inline u8
 260DIV_TO_REG(long val)
 261{
 262        int i;
 263        val = SENSORS_LIMIT(val, 1, 128) >> 1;
 264        for (i = 0; i < 7; i++) {
 265                if (val == 0)
 266                        break;
 267                val >>= 1;
 268        }
 269        return ((u8) i);
 270}
 271
 272struct w83792d_data {
 273        struct device *hwmon_dev;
 274
 275        struct mutex update_lock;
 276        char valid;             /* !=0 if following fields are valid */
 277        unsigned long last_updated;     /* In jiffies */
 278
 279        /* array of 2 pointers to subclients */
 280        struct i2c_client *lm75[2];
 281
 282        u8 in[9];               /* Register value */
 283        u8 in_max[9];           /* Register value */
 284        u8 in_min[9];           /* Register value */
 285        u16 low_bits;           /* Additional resolution to voltage in6-0 */
 286        u8 fan[7];              /* Register value */
 287        u8 fan_min[7];          /* Register value */
 288        u8 temp1[3];            /* current, over, thyst */
 289        u8 temp_add[2][6];      /* Register value */
 290        u8 fan_div[7];          /* Register encoding, shifted right */
 291        u8 pwm[7];              /* We only consider the first 3 set of pwm,
 292                                   although 792 chip has 7 set of pwm. */
 293        u8 pwmenable[3];
 294        u32 alarms;             /* realtime status register encoding,combined */
 295        u8 chassis;             /* Chassis status */
 296        u8 chassis_clear;       /* CLR_CHS, clear chassis intrusion detection */
 297        u8 thermal_cruise[3];   /* Smart FanI: Fan1,2,3 target value */
 298        u8 tolerance[3];        /* Fan1,2,3 tolerance(Smart Fan I/II) */
 299        u8 sf2_points[3][4];    /* Smart FanII: Fan1,2,3 temperature points */
 300        u8 sf2_levels[3][4];    /* Smart FanII: Fan1,2,3 duty cycle levels */
 301};
 302
 303static int w83792d_probe(struct i2c_client *client,
 304                         const struct i2c_device_id *id);
 305static int w83792d_detect(struct i2c_client *client, int kind,
 306                          struct i2c_board_info *info);
 307static int w83792d_remove(struct i2c_client *client);
 308static struct w83792d_data *w83792d_update_device(struct device *dev);
 309
 310#ifdef DEBUG
 311static void w83792d_print_debug(struct w83792d_data *data, struct device *dev);
 312#endif
 313
 314static void w83792d_init_client(struct i2c_client *client);
 315
 316static const struct i2c_device_id w83792d_id[] = {
 317        { "w83792d", w83792d },
 318        { }
 319};
 320MODULE_DEVICE_TABLE(i2c, w83792d_id);
 321
 322static struct i2c_driver w83792d_driver = {
 323        .class          = I2C_CLASS_HWMON,
 324        .driver = {
 325                .name = "w83792d",
 326        },
 327        .probe          = w83792d_probe,
 328        .remove         = w83792d_remove,
 329        .id_table       = w83792d_id,
 330        .detect         = w83792d_detect,
 331        .address_data   = &addr_data,
 332};
 333
 334static inline long in_count_from_reg(int nr, struct w83792d_data *data)
 335{
 336        /* in7 and in8 do not have low bits, but the formula still works */
 337        return ((data->in[nr] << 2) | ((data->low_bits >> (2 * nr)) & 0x03));
 338}
 339
 340/* The SMBus locks itself. The Winbond W83792D chip has a bank register,
 341   but the driver only accesses registers in bank 0, so we don't have
 342   to switch banks and lock access between switches. */
 343static inline int w83792d_read_value(struct i2c_client *client, u8 reg)
 344{
 345        return i2c_smbus_read_byte_data(client, reg);
 346}
 347
 348static inline int
 349w83792d_write_value(struct i2c_client *client, u8 reg, u8 value)
 350{
 351        return i2c_smbus_write_byte_data(client, reg, value);
 352}
 353
 354/* following are the sysfs callback functions */
 355static ssize_t show_in(struct device *dev, struct device_attribute *attr,
 356                        char *buf)
 357{
 358        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 359        int nr = sensor_attr->index;
 360        struct w83792d_data *data = w83792d_update_device(dev);
 361        return sprintf(buf,"%ld\n", IN_FROM_REG(nr,(in_count_from_reg(nr, data))));
 362}
 363
 364#define show_in_reg(reg) \
 365static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
 366                        char *buf) \
 367{ \
 368        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
 369        int nr = sensor_attr->index; \
 370        struct w83792d_data *data = w83792d_update_device(dev); \
 371        return sprintf(buf,"%ld\n", (long)(IN_FROM_REG(nr, (data->reg[nr])*4))); \
 372}
 373
 374show_in_reg(in_min);
 375show_in_reg(in_max);
 376
 377#define store_in_reg(REG, reg) \
 378static ssize_t store_in_##reg (struct device *dev, \
 379                                struct device_attribute *attr, \
 380                                const char *buf, size_t count) \
 381{ \
 382        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
 383        int nr = sensor_attr->index; \
 384        struct i2c_client *client = to_i2c_client(dev); \
 385        struct w83792d_data *data = i2c_get_clientdata(client); \
 386        u32 val; \
 387         \
 388        val = simple_strtoul(buf, NULL, 10); \
 389        mutex_lock(&data->update_lock); \
 390        data->in_##reg[nr] = SENSORS_LIMIT(IN_TO_REG(nr, val)/4, 0, 255); \
 391        w83792d_write_value(client, W83792D_REG_IN_##REG[nr], data->in_##reg[nr]); \
 392        mutex_unlock(&data->update_lock); \
 393         \
 394        return count; \
 395}
 396store_in_reg(MIN, min);
 397store_in_reg(MAX, max);
 398
 399#define show_fan_reg(reg) \
 400static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \
 401                        char *buf) \
 402{ \
 403        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \
 404        int nr = sensor_attr->index - 1; \
 405        struct w83792d_data *data = w83792d_update_device(dev); \
 406        return sprintf(buf,"%d\n", \
 407                FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
 408}
 409
 410show_fan_reg(fan);
 411show_fan_reg(fan_min);
 412
 413static ssize_t
 414store_fan_min(struct device *dev, struct device_attribute *attr,
 415                const char *buf, size_t count)
 416{
 417        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 418        int nr = sensor_attr->index - 1;
 419        struct i2c_client *client = to_i2c_client(dev);
 420        struct w83792d_data *data = i2c_get_clientdata(client);
 421        u32 val;
 422
 423        val = simple_strtoul(buf, NULL, 10);
 424        mutex_lock(&data->update_lock);
 425        data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 426        w83792d_write_value(client, W83792D_REG_FAN_MIN[nr],
 427                                data->fan_min[nr]);
 428        mutex_unlock(&data->update_lock);
 429
 430        return count;
 431}
 432
 433static ssize_t
 434show_fan_div(struct device *dev, struct device_attribute *attr,
 435                char *buf)
 436{
 437        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 438        int nr = sensor_attr->index;
 439        struct w83792d_data *data = w83792d_update_device(dev);
 440        return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr - 1]));
 441}
 442
 443/* Note: we save and restore the fan minimum here, because its value is
 444   determined in part by the fan divisor.  This follows the principle of
 445   least surprise; the user doesn't expect the fan minimum to change just
 446   because the divisor changed. */
 447static ssize_t
 448store_fan_div(struct device *dev, struct device_attribute *attr,
 449                const char *buf, size_t count)
 450{
 451        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 452        int nr = sensor_attr->index - 1;
 453        struct i2c_client *client = to_i2c_client(dev);
 454        struct w83792d_data *data = i2c_get_clientdata(client);
 455        unsigned long min;
 456        /*u8 reg;*/
 457        u8 fan_div_reg = 0;
 458        u8 tmp_fan_div;
 459
 460        /* Save fan_min */
 461        mutex_lock(&data->update_lock);
 462        min = FAN_FROM_REG(data->fan_min[nr],
 463                           DIV_FROM_REG(data->fan_div[nr]));
 464
 465        data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10));
 466
 467        fan_div_reg = w83792d_read_value(client, W83792D_REG_FAN_DIV[nr >> 1]);
 468        fan_div_reg &= (nr & 0x01) ? 0x8f : 0xf8;
 469        tmp_fan_div = (nr & 0x01) ? (((data->fan_div[nr]) << 4) & 0x70)
 470                                        : ((data->fan_div[nr]) & 0x07);
 471        w83792d_write_value(client, W83792D_REG_FAN_DIV[nr >> 1],
 472                                        fan_div_reg | tmp_fan_div);
 473
 474        /* Restore fan_min */
 475        data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
 476        w83792d_write_value(client, W83792D_REG_FAN_MIN[nr], data->fan_min[nr]);
 477        mutex_unlock(&data->update_lock);
 478
 479        return count;
 480}
 481
 482/* read/write the temperature1, includes measured value and limits */
 483
 484static ssize_t show_temp1(struct device *dev, struct device_attribute *attr,
 485                                char *buf)
 486{
 487        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 488        int nr = sensor_attr->index;
 489        struct w83792d_data *data = w83792d_update_device(dev);
 490        return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[nr]));
 491}
 492
 493static ssize_t store_temp1(struct device *dev, struct device_attribute *attr,
 494                                const char *buf, size_t count)
 495{
 496        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 497        int nr = sensor_attr->index;
 498        struct i2c_client *client = to_i2c_client(dev);
 499        struct w83792d_data *data = i2c_get_clientdata(client);
 500        s32 val;
 501
 502        val = simple_strtol(buf, NULL, 10);
 503        mutex_lock(&data->update_lock);
 504        data->temp1[nr] = TEMP1_TO_REG(val);
 505        w83792d_write_value(client, W83792D_REG_TEMP1[nr],
 506                data->temp1[nr]);
 507        mutex_unlock(&data->update_lock);
 508
 509        return count;
 510}
 511
 512/* read/write the temperature2-3, includes measured value and limits */
 513
 514static ssize_t show_temp23(struct device *dev, struct device_attribute *attr,
 515                                char *buf)
 516{
 517        struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
 518        int nr = sensor_attr->nr;
 519        int index = sensor_attr->index;
 520        struct w83792d_data *data = w83792d_update_device(dev);
 521        return sprintf(buf,"%ld\n",
 522                (long)TEMP_ADD_FROM_REG(data->temp_add[nr][index],
 523                        data->temp_add[nr][index+1]));
 524}
 525
 526static ssize_t store_temp23(struct device *dev, struct device_attribute *attr,
 527                                const char *buf, size_t count)
 528{
 529        struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
 530        int nr = sensor_attr->nr;
 531        int index = sensor_attr->index;
 532        struct i2c_client *client = to_i2c_client(dev);
 533        struct w83792d_data *data = i2c_get_clientdata(client);
 534        s32 val;
 535
 536        val = simple_strtol(buf, NULL, 10);
 537        mutex_lock(&data->update_lock);
 538        data->temp_add[nr][index] = TEMP_ADD_TO_REG_HIGH(val);
 539        data->temp_add[nr][index+1] = TEMP_ADD_TO_REG_LOW(val);
 540        w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index],
 541                data->temp_add[nr][index]);
 542        w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index+1],
 543                data->temp_add[nr][index+1]);
 544        mutex_unlock(&data->update_lock);
 545
 546        return count;
 547}
 548
 549/* get reatime status of all sensors items: voltage, temp, fan */
 550static ssize_t
 551show_alarms_reg(struct device *dev, struct device_attribute *attr, char *buf)
 552{
 553        struct w83792d_data *data = w83792d_update_device(dev);
 554        return sprintf(buf, "%d\n", data->alarms);
 555}
 556
 557static ssize_t show_alarm(struct device *dev,
 558                          struct device_attribute *attr, char *buf)
 559{
 560        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 561        int nr = sensor_attr->index;
 562        struct w83792d_data *data = w83792d_update_device(dev);
 563        return sprintf(buf, "%d\n", (data->alarms >> nr) & 1);
 564}
 565
 566static ssize_t
 567show_pwm(struct device *dev, struct device_attribute *attr,
 568                char *buf)
 569{
 570        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 571        int nr = sensor_attr->index;
 572        struct w83792d_data *data = w83792d_update_device(dev);
 573        return sprintf(buf, "%d\n", (data->pwm[nr] & 0x0f) << 4);
 574}
 575
 576static ssize_t
 577show_pwmenable(struct device *dev, struct device_attribute *attr,
 578                        char *buf)
 579{
 580        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 581        int nr = sensor_attr->index - 1;
 582        struct w83792d_data *data = w83792d_update_device(dev);
 583        long pwm_enable_tmp = 1;
 584
 585        switch (data->pwmenable[nr]) {
 586        case 0:
 587                pwm_enable_tmp = 1; /* manual mode */
 588                break;
 589        case 1:
 590                pwm_enable_tmp = 3; /*thermal cruise/Smart Fan I */
 591                break;
 592        case 2:
 593                pwm_enable_tmp = 2; /* Smart Fan II */
 594                break;
 595        }
 596
 597        return sprintf(buf, "%ld\n", pwm_enable_tmp);
 598}
 599
 600static ssize_t
 601store_pwm(struct device *dev, struct device_attribute *attr,
 602                const char *buf, size_t count)
 603{
 604        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 605        int nr = sensor_attr->index;
 606        struct i2c_client *client = to_i2c_client(dev);
 607        struct w83792d_data *data = i2c_get_clientdata(client);
 608        u8 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 255) >> 4;
 609
 610        mutex_lock(&data->update_lock);
 611        val |= w83792d_read_value(client, W83792D_REG_PWM[nr]) & 0xf0;
 612        data->pwm[nr] = val;
 613        w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
 614        mutex_unlock(&data->update_lock);
 615
 616        return count;
 617}
 618
 619static ssize_t
 620store_pwmenable(struct device *dev, struct device_attribute *attr,
 621                        const char *buf, size_t count)
 622{
 623        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 624        int nr = sensor_attr->index - 1;
 625        struct i2c_client *client = to_i2c_client(dev);
 626        struct w83792d_data *data = i2c_get_clientdata(client);
 627        u32 val;
 628        u8 fan_cfg_tmp, cfg1_tmp, cfg2_tmp, cfg3_tmp, cfg4_tmp;
 629
 630        val = simple_strtoul(buf, NULL, 10);
 631        if (val < 1 || val > 3)
 632                return -EINVAL;
 633
 634        mutex_lock(&data->update_lock);
 635        switch (val) {
 636        case 1:
 637                data->pwmenable[nr] = 0; /* manual mode */
 638                break;
 639        case 2:
 640                data->pwmenable[nr] = 2; /* Smart Fan II */
 641                break;
 642        case 3:
 643                data->pwmenable[nr] = 1; /* thermal cruise/Smart Fan I */
 644                break;
 645        }
 646        cfg1_tmp = data->pwmenable[0];
 647        cfg2_tmp = (data->pwmenable[1]) << 2;
 648        cfg3_tmp = (data->pwmenable[2]) << 4;
 649        cfg4_tmp = w83792d_read_value(client,W83792D_REG_FAN_CFG) & 0xc0;
 650        fan_cfg_tmp = ((cfg4_tmp | cfg3_tmp) | cfg2_tmp) | cfg1_tmp;
 651        w83792d_write_value(client, W83792D_REG_FAN_CFG, fan_cfg_tmp);
 652        mutex_unlock(&data->update_lock);
 653
 654        return count;
 655}
 656
 657static ssize_t
 658show_pwm_mode(struct device *dev, struct device_attribute *attr,
 659                        char *buf)
 660{
 661        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 662        int nr = sensor_attr->index;
 663        struct w83792d_data *data = w83792d_update_device(dev);
 664        return sprintf(buf, "%d\n", data->pwm[nr] >> 7);
 665}
 666
 667static ssize_t
 668store_pwm_mode(struct device *dev, struct device_attribute *attr,
 669                        const char *buf, size_t count)
 670{
 671        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 672        int nr = sensor_attr->index;
 673        struct i2c_client *client = to_i2c_client(dev);
 674        struct w83792d_data *data = i2c_get_clientdata(client);
 675        u32 val;
 676
 677        val = simple_strtoul(buf, NULL, 10);
 678        if (val != 0 && val != 1)
 679                return -EINVAL;
 680
 681        mutex_lock(&data->update_lock);
 682        data->pwm[nr] = w83792d_read_value(client, W83792D_REG_PWM[nr]);
 683        if (val) {                      /* PWM mode */
 684                data->pwm[nr] |= 0x80;
 685        } else {                        /* DC mode */
 686                data->pwm[nr] &= 0x7f;
 687        }
 688        w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
 689        mutex_unlock(&data->update_lock);
 690
 691        return count;
 692}
 693
 694static ssize_t
 695show_regs_chassis(struct device *dev, struct device_attribute *attr,
 696                        char *buf)
 697{
 698        struct w83792d_data *data = w83792d_update_device(dev);
 699        return sprintf(buf, "%d\n", data->chassis);
 700}
 701
 702static ssize_t
 703show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf)
 704{
 705        struct w83792d_data *data = w83792d_update_device(dev);
 706        return sprintf(buf, "%d\n", data->chassis_clear);
 707}
 708
 709static ssize_t
 710store_chassis_clear(struct device *dev, struct device_attribute *attr,
 711                        const char *buf, size_t count)
 712{
 713        struct i2c_client *client = to_i2c_client(dev);
 714        struct w83792d_data *data = i2c_get_clientdata(client);
 715        u32 val;
 716        u8 temp1 = 0, temp2 = 0;
 717
 718        val = simple_strtoul(buf, NULL, 10);
 719        mutex_lock(&data->update_lock);
 720        data->chassis_clear = SENSORS_LIMIT(val, 0 ,1);
 721        temp1 = ((data->chassis_clear) << 7) & 0x80;
 722        temp2 = w83792d_read_value(client,
 723                W83792D_REG_CHASSIS_CLR) & 0x7f;
 724        w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, temp1 | temp2);
 725        mutex_unlock(&data->update_lock);
 726
 727        return count;
 728}
 729
 730/* For Smart Fan I / Thermal Cruise */
 731static ssize_t
 732show_thermal_cruise(struct device *dev, struct device_attribute *attr,
 733                        char *buf)
 734{
 735        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 736        int nr = sensor_attr->index;
 737        struct w83792d_data *data = w83792d_update_device(dev);
 738        return sprintf(buf, "%ld\n", (long)data->thermal_cruise[nr-1]);
 739}
 740
 741static ssize_t
 742store_thermal_cruise(struct device *dev, struct device_attribute *attr,
 743                        const char *buf, size_t count)
 744{
 745        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 746        int nr = sensor_attr->index - 1;
 747        struct i2c_client *client = to_i2c_client(dev);
 748        struct w83792d_data *data = i2c_get_clientdata(client);
 749        u32 val;
 750        u8 target_tmp=0, target_mask=0;
 751
 752        val = simple_strtoul(buf, NULL, 10);
 753        target_tmp = val;
 754        target_tmp = target_tmp & 0x7f;
 755        mutex_lock(&data->update_lock);
 756        target_mask = w83792d_read_value(client, W83792D_REG_THERMAL[nr]) & 0x80;
 757        data->thermal_cruise[nr] = SENSORS_LIMIT(target_tmp, 0, 255);
 758        w83792d_write_value(client, W83792D_REG_THERMAL[nr],
 759                (data->thermal_cruise[nr]) | target_mask);
 760        mutex_unlock(&data->update_lock);
 761
 762        return count;
 763}
 764
 765/* For Smart Fan I/Thermal Cruise and Smart Fan II */
 766static ssize_t
 767show_tolerance(struct device *dev, struct device_attribute *attr,
 768                char *buf)
 769{
 770        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 771        int nr = sensor_attr->index;
 772        struct w83792d_data *data = w83792d_update_device(dev);
 773        return sprintf(buf, "%ld\n", (long)data->tolerance[nr-1]);
 774}
 775
 776static ssize_t
 777store_tolerance(struct device *dev, struct device_attribute *attr,
 778                const char *buf, size_t count)
 779{
 780        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 781        int nr = sensor_attr->index - 1;
 782        struct i2c_client *client = to_i2c_client(dev);
 783        struct w83792d_data *data = i2c_get_clientdata(client);
 784        u32 val;
 785        u8 tol_tmp, tol_mask;
 786
 787        val = simple_strtoul(buf, NULL, 10);
 788        mutex_lock(&data->update_lock);
 789        tol_mask = w83792d_read_value(client,
 790                W83792D_REG_TOLERANCE[nr]) & ((nr == 1) ? 0x0f : 0xf0);
 791        tol_tmp = SENSORS_LIMIT(val, 0, 15);
 792        tol_tmp &= 0x0f;
 793        data->tolerance[nr] = tol_tmp;
 794        if (nr == 1) {
 795                tol_tmp <<= 4;
 796        }
 797        w83792d_write_value(client, W83792D_REG_TOLERANCE[nr],
 798                tol_mask | tol_tmp);
 799        mutex_unlock(&data->update_lock);
 800
 801        return count;
 802}
 803
 804/* For Smart Fan II */
 805static ssize_t
 806show_sf2_point(struct device *dev, struct device_attribute *attr,
 807                char *buf)
 808{
 809        struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
 810        int nr = sensor_attr->nr;
 811        int index = sensor_attr->index;
 812        struct w83792d_data *data = w83792d_update_device(dev);
 813        return sprintf(buf, "%ld\n", (long)data->sf2_points[index-1][nr-1]);
 814}
 815
 816static ssize_t
 817store_sf2_point(struct device *dev, struct device_attribute *attr,
 818                const char *buf, size_t count)
 819{
 820        struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
 821        int nr = sensor_attr->nr - 1;
 822        int index = sensor_attr->index - 1;
 823        struct i2c_client *client = to_i2c_client(dev);
 824        struct w83792d_data *data = i2c_get_clientdata(client);
 825        u32 val;
 826        u8 mask_tmp = 0;
 827
 828        val = simple_strtoul(buf, NULL, 10);
 829        mutex_lock(&data->update_lock);
 830        data->sf2_points[index][nr] = SENSORS_LIMIT(val, 0, 127);
 831        mask_tmp = w83792d_read_value(client,
 832                                        W83792D_REG_POINTS[index][nr]) & 0x80;
 833        w83792d_write_value(client, W83792D_REG_POINTS[index][nr],
 834                mask_tmp|data->sf2_points[index][nr]);
 835        mutex_unlock(&data->update_lock);
 836
 837        return count;
 838}
 839
 840static ssize_t
 841show_sf2_level(struct device *dev, struct device_attribute *attr,
 842                char *buf)
 843{
 844        struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
 845        int nr = sensor_attr->nr;
 846        int index = sensor_attr->index;
 847        struct w83792d_data *data = w83792d_update_device(dev);
 848        return sprintf(buf, "%d\n",
 849                        (((data->sf2_levels[index-1][nr]) * 100) / 15));
 850}
 851
 852static ssize_t
 853store_sf2_level(struct device *dev, struct device_attribute *attr,
 854                const char *buf, size_t count)
 855{
 856        struct sensor_device_attribute_2 *sensor_attr = to_sensor_dev_attr_2(attr);
 857        int nr = sensor_attr->nr;
 858        int index = sensor_attr->index - 1;
 859        struct i2c_client *client = to_i2c_client(dev);
 860        struct w83792d_data *data = i2c_get_clientdata(client);
 861        u32 val;
 862        u8 mask_tmp=0, level_tmp=0;
 863
 864        val = simple_strtoul(buf, NULL, 10);
 865        mutex_lock(&data->update_lock);
 866        data->sf2_levels[index][nr] = SENSORS_LIMIT((val * 15) / 100, 0, 15);
 867        mask_tmp = w83792d_read_value(client, W83792D_REG_LEVELS[index][nr])
 868                & ((nr==3) ? 0xf0 : 0x0f);
 869        if (nr==3) {
 870                level_tmp = data->sf2_levels[index][nr];
 871        } else {
 872                level_tmp = data->sf2_levels[index][nr] << 4;
 873        }
 874        w83792d_write_value(client, W83792D_REG_LEVELS[index][nr], level_tmp | mask_tmp);
 875        mutex_unlock(&data->update_lock);
 876
 877        return count;
 878}
 879
 880
 881static int
 882w83792d_detect_subclients(struct i2c_client *new_client)
 883{
 884        int i, id, err;
 885        int address = new_client->addr;
 886        u8 val;
 887        struct i2c_adapter *adapter = new_client->adapter;
 888        struct w83792d_data *data = i2c_get_clientdata(new_client);
 889
 890        id = i2c_adapter_id(adapter);
 891        if (force_subclients[0] == id && force_subclients[1] == address) {
 892                for (i = 2; i <= 3; i++) {
 893                        if (force_subclients[i] < 0x48 ||
 894                            force_subclients[i] > 0x4f) {
 895                                dev_err(&new_client->dev, "invalid subclient "
 896                                        "address %d; must be 0x48-0x4f\n",
 897                                        force_subclients[i]);
 898                                err = -ENODEV;
 899                                goto ERROR_SC_0;
 900                        }
 901                }
 902                w83792d_write_value(new_client, W83792D_REG_I2C_SUBADDR,
 903                                        (force_subclients[2] & 0x07) |
 904                                        ((force_subclients[3] & 0x07) << 4));
 905        }
 906
 907        val = w83792d_read_value(new_client, W83792D_REG_I2C_SUBADDR);
 908        if (!(val & 0x08)) {
 909                data->lm75[0] = i2c_new_dummy(adapter, 0x48 + (val & 0x7));
 910        }
 911        if (!(val & 0x80)) {
 912                if ((data->lm75[0] != NULL) &&
 913                        ((val & 0x7) == ((val >> 4) & 0x7))) {
 914                        dev_err(&new_client->dev, "duplicate addresses 0x%x, "
 915                                "use force_subclient\n", data->lm75[0]->addr);
 916                        err = -ENODEV;
 917                        goto ERROR_SC_1;
 918                }
 919                data->lm75[1] = i2c_new_dummy(adapter,
 920                                              0x48 + ((val >> 4) & 0x7));
 921        }
 922
 923        return 0;
 924
 925/* Undo inits in case of errors */
 926
 927ERROR_SC_1:
 928        if (data->lm75[0] != NULL)
 929                i2c_unregister_device(data->lm75[0]);
 930ERROR_SC_0:
 931        return err;
 932}
 933
 934static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in, NULL, 0);
 935static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
 936static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
 937static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
 938static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
 939static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
 940static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
 941static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
 942static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
 943static SENSOR_DEVICE_ATTR(in0_min, S_IWUSR | S_IRUGO,
 944                        show_in_min, store_in_min, 0);
 945static SENSOR_DEVICE_ATTR(in1_min, S_IWUSR | S_IRUGO,
 946                        show_in_min, store_in_min, 1);
 947static SENSOR_DEVICE_ATTR(in2_min, S_IWUSR | S_IRUGO,
 948                        show_in_min, store_in_min, 2);
 949static SENSOR_DEVICE_ATTR(in3_min, S_IWUSR | S_IRUGO,
 950                        show_in_min, store_in_min, 3);
 951static SENSOR_DEVICE_ATTR(in4_min, S_IWUSR | S_IRUGO,
 952                        show_in_min, store_in_min, 4);
 953static SENSOR_DEVICE_ATTR(in5_min, S_IWUSR | S_IRUGO,
 954                        show_in_min, store_in_min, 5);
 955static SENSOR_DEVICE_ATTR(in6_min, S_IWUSR | S_IRUGO,
 956                        show_in_min, store_in_min, 6);
 957static SENSOR_DEVICE_ATTR(in7_min, S_IWUSR | S_IRUGO,
 958                        show_in_min, store_in_min, 7);
 959static SENSOR_DEVICE_ATTR(in8_min, S_IWUSR | S_IRUGO,
 960                        show_in_min, store_in_min, 8);
 961static SENSOR_DEVICE_ATTR(in0_max, S_IWUSR | S_IRUGO,
 962                        show_in_max, store_in_max, 0);
 963static SENSOR_DEVICE_ATTR(in1_max, S_IWUSR | S_IRUGO,
 964                        show_in_max, store_in_max, 1);
 965static SENSOR_DEVICE_ATTR(in2_max, S_IWUSR | S_IRUGO,
 966                        show_in_max, store_in_max, 2);
 967static SENSOR_DEVICE_ATTR(in3_max, S_IWUSR | S_IRUGO,
 968                        show_in_max, store_in_max, 3);
 969static SENSOR_DEVICE_ATTR(in4_max, S_IWUSR | S_IRUGO,
 970                        show_in_max, store_in_max, 4);
 971static SENSOR_DEVICE_ATTR(in5_max, S_IWUSR | S_IRUGO,
 972                        show_in_max, store_in_max, 5);
 973static SENSOR_DEVICE_ATTR(in6_max, S_IWUSR | S_IRUGO,
 974                        show_in_max, store_in_max, 6);
 975static SENSOR_DEVICE_ATTR(in7_max, S_IWUSR | S_IRUGO,
 976                        show_in_max, store_in_max, 7);
 977static SENSOR_DEVICE_ATTR(in8_max, S_IWUSR | S_IRUGO,
 978                        show_in_max, store_in_max, 8);
 979static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0);
 980static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0);
 981static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0);
 982static SENSOR_DEVICE_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,
 983                        show_temp1, store_temp1, 0, 1);
 984static SENSOR_DEVICE_ATTR_2(temp2_max, S_IRUGO | S_IWUSR, show_temp23,
 985                        store_temp23, 0, 2);
 986static SENSOR_DEVICE_ATTR_2(temp3_max, S_IRUGO | S_IWUSR, show_temp23,
 987                        store_temp23, 1, 2);
 988static SENSOR_DEVICE_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,
 989                        show_temp1, store_temp1, 0, 2);
 990static SENSOR_DEVICE_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
 991                        show_temp23, store_temp23, 0, 4);
 992static SENSOR_DEVICE_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,
 993                        show_temp23, store_temp23, 1, 4);
 994static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
 995static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
 996static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
 997static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 2);
 998static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 3);
 999static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 4);
1000static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 5);
1001static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 6);
1002static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 7);
1003static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 8);
1004static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 9);
1005static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 10);
1006static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 11);
1007static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 12);
1008static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_alarm, NULL, 15);
1009static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19);
1010static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20);
1011static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21);
1012static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22);
1013static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, 23);
1014static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL);
1015static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR,
1016                        show_chassis_clear, store_chassis_clear);
1017static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0);
1018static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1);
1019static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2);
1020static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
1021                        show_pwmenable, store_pwmenable, 1);
1022static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
1023                        show_pwmenable, store_pwmenable, 2);
1024static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
1025                        show_pwmenable, store_pwmenable, 3);
1026static SENSOR_DEVICE_ATTR(pwm1_mode, S_IWUSR | S_IRUGO,
1027                        show_pwm_mode, store_pwm_mode, 0);
1028static SENSOR_DEVICE_ATTR(pwm2_mode, S_IWUSR | S_IRUGO,
1029                        show_pwm_mode, store_pwm_mode, 1);
1030static SENSOR_DEVICE_ATTR(pwm3_mode, S_IWUSR | S_IRUGO,
1031                        show_pwm_mode, store_pwm_mode, 2);
1032static SENSOR_DEVICE_ATTR(tolerance1, S_IWUSR | S_IRUGO,
1033                        show_tolerance, store_tolerance, 1);
1034static SENSOR_DEVICE_ATTR(tolerance2, S_IWUSR | S_IRUGO,
1035                        show_tolerance, store_tolerance, 2);
1036static SENSOR_DEVICE_ATTR(tolerance3, S_IWUSR | S_IRUGO,
1037                        show_tolerance, store_tolerance, 3);
1038static SENSOR_DEVICE_ATTR(thermal_cruise1, S_IWUSR | S_IRUGO,
1039                        show_thermal_cruise, store_thermal_cruise, 1);
1040static SENSOR_DEVICE_ATTR(thermal_cruise2, S_IWUSR | S_IRUGO,
1041                        show_thermal_cruise, store_thermal_cruise, 2);
1042static SENSOR_DEVICE_ATTR(thermal_cruise3, S_IWUSR | S_IRUGO,
1043                        show_thermal_cruise, store_thermal_cruise, 3);
1044static SENSOR_DEVICE_ATTR_2(sf2_point1_fan1, S_IRUGO | S_IWUSR,
1045                        show_sf2_point, store_sf2_point, 1, 1);
1046static SENSOR_DEVICE_ATTR_2(sf2_point2_fan1, S_IRUGO | S_IWUSR,
1047                        show_sf2_point, store_sf2_point, 2, 1);
1048static SENSOR_DEVICE_ATTR_2(sf2_point3_fan1, S_IRUGO | S_IWUSR,
1049                        show_sf2_point, store_sf2_point, 3, 1);
1050static SENSOR_DEVICE_ATTR_2(sf2_point4_fan1, S_IRUGO | S_IWUSR,
1051                        show_sf2_point, store_sf2_point, 4, 1);
1052static SENSOR_DEVICE_ATTR_2(sf2_point1_fan2, S_IRUGO | S_IWUSR,
1053                        show_sf2_point, store_sf2_point, 1, 2);
1054static SENSOR_DEVICE_ATTR_2(sf2_point2_fan2, S_IRUGO | S_IWUSR,
1055                        show_sf2_point, store_sf2_point, 2, 2);
1056static SENSOR_DEVICE_ATTR_2(sf2_point3_fan2, S_IRUGO | S_IWUSR,
1057                        show_sf2_point, store_sf2_point, 3, 2);
1058static SENSOR_DEVICE_ATTR_2(sf2_point4_fan2, S_IRUGO | S_IWUSR,
1059                        show_sf2_point, store_sf2_point, 4, 2);
1060static SENSOR_DEVICE_ATTR_2(sf2_point1_fan3, S_IRUGO | S_IWUSR,
1061                        show_sf2_point, store_sf2_point, 1, 3);
1062static SENSOR_DEVICE_ATTR_2(sf2_point2_fan3, S_IRUGO | S_IWUSR,
1063                        show_sf2_point, store_sf2_point, 2, 3);
1064static SENSOR_DEVICE_ATTR_2(sf2_point3_fan3, S_IRUGO | S_IWUSR,
1065                        show_sf2_point, store_sf2_point, 3, 3);
1066static SENSOR_DEVICE_ATTR_2(sf2_point4_fan3, S_IRUGO | S_IWUSR,
1067                        show_sf2_point, store_sf2_point, 4, 3);
1068static SENSOR_DEVICE_ATTR_2(sf2_level1_fan1, S_IRUGO | S_IWUSR,
1069                        show_sf2_level, store_sf2_level, 1, 1);
1070static SENSOR_DEVICE_ATTR_2(sf2_level2_fan1, S_IRUGO | S_IWUSR,
1071                        show_sf2_level, store_sf2_level, 2, 1);
1072static SENSOR_DEVICE_ATTR_2(sf2_level3_fan1, S_IRUGO | S_IWUSR,
1073                        show_sf2_level, store_sf2_level, 3, 1);
1074static SENSOR_DEVICE_ATTR_2(sf2_level1_fan2, S_IRUGO | S_IWUSR,
1075                        show_sf2_level, store_sf2_level, 1, 2);
1076static SENSOR_DEVICE_ATTR_2(sf2_level2_fan2, S_IRUGO | S_IWUSR,
1077                        show_sf2_level, store_sf2_level, 2, 2);
1078static SENSOR_DEVICE_ATTR_2(sf2_level3_fan2, S_IRUGO | S_IWUSR,
1079                        show_sf2_level, store_sf2_level, 3, 2);
1080static SENSOR_DEVICE_ATTR_2(sf2_level1_fan3, S_IRUGO | S_IWUSR,
1081                        show_sf2_level, store_sf2_level, 1, 3);
1082static SENSOR_DEVICE_ATTR_2(sf2_level2_fan3, S_IRUGO | S_IWUSR,
1083                        show_sf2_level, store_sf2_level, 2, 3);
1084static SENSOR_DEVICE_ATTR_2(sf2_level3_fan3, S_IRUGO | S_IWUSR,
1085                        show_sf2_level, store_sf2_level, 3, 3);
1086static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 1);
1087static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 2);
1088static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 3);
1089static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 4);
1090static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 5);
1091static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan, NULL, 6);
1092static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan, NULL, 7);
1093static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
1094                        show_fan_min, store_fan_min, 1);
1095static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
1096                        show_fan_min, store_fan_min, 2);
1097static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
1098                        show_fan_min, store_fan_min, 3);
1099static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
1100                        show_fan_min, store_fan_min, 4);
1101static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
1102                        show_fan_min, store_fan_min, 5);
1103static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
1104                        show_fan_min, store_fan_min, 6);
1105static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
1106                        show_fan_min, store_fan_min, 7);
1107static SENSOR_DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO,
1108                        show_fan_div, store_fan_div, 1);
1109static SENSOR_DEVICE_ATTR(fan2_div, S_IWUSR | S_IRUGO,
1110                        show_fan_div, store_fan_div, 2);
1111static SENSOR_DEVICE_ATTR(fan3_div, S_IWUSR | S_IRUGO,
1112                        show_fan_div, store_fan_div, 3);
1113static SENSOR_DEVICE_ATTR(fan4_div, S_IWUSR | S_IRUGO,
1114                        show_fan_div, store_fan_div, 4);
1115static SENSOR_DEVICE_ATTR(fan5_div, S_IWUSR | S_IRUGO,
1116                        show_fan_div, store_fan_div, 5);
1117static SENSOR_DEVICE_ATTR(fan6_div, S_IWUSR | S_IRUGO,
1118                        show_fan_div, store_fan_div, 6);
1119static SENSOR_DEVICE_ATTR(fan7_div, S_IWUSR | S_IRUGO,
1120                        show_fan_div, store_fan_div, 7);
1121
1122static struct attribute *w83792d_attributes_fan[4][5] = {
1123        {
1124                &sensor_dev_attr_fan4_input.dev_attr.attr,
1125                &sensor_dev_attr_fan4_min.dev_attr.attr,
1126                &sensor_dev_attr_fan4_div.dev_attr.attr,
1127                &sensor_dev_attr_fan4_alarm.dev_attr.attr,
1128                NULL
1129        }, {
1130                &sensor_dev_attr_fan5_input.dev_attr.attr,
1131                &sensor_dev_attr_fan5_min.dev_attr.attr,
1132                &sensor_dev_attr_fan5_div.dev_attr.attr,
1133                &sensor_dev_attr_fan5_alarm.dev_attr.attr,
1134                NULL
1135        }, {
1136                &sensor_dev_attr_fan6_input.dev_attr.attr,
1137                &sensor_dev_attr_fan6_min.dev_attr.attr,
1138                &sensor_dev_attr_fan6_div.dev_attr.attr,
1139                &sensor_dev_attr_fan6_alarm.dev_attr.attr,
1140                NULL
1141        }, {
1142                &sensor_dev_attr_fan7_input.dev_attr.attr,
1143                &sensor_dev_attr_fan7_min.dev_attr.attr,
1144                &sensor_dev_attr_fan7_div.dev_attr.attr,
1145                &sensor_dev_attr_fan7_alarm.dev_attr.attr,
1146                NULL
1147        }
1148};
1149
1150static const struct attribute_group w83792d_group_fan[4] = {
1151        { .attrs = w83792d_attributes_fan[0] },
1152        { .attrs = w83792d_attributes_fan[1] },
1153        { .attrs = w83792d_attributes_fan[2] },
1154        { .attrs = w83792d_attributes_fan[3] },
1155};
1156
1157static struct attribute *w83792d_attributes[] = {
1158        &sensor_dev_attr_in0_input.dev_attr.attr,
1159        &sensor_dev_attr_in0_max.dev_attr.attr,
1160        &sensor_dev_attr_in0_min.dev_attr.attr,
1161        &sensor_dev_attr_in1_input.dev_attr.attr,
1162        &sensor_dev_attr_in1_max.dev_attr.attr,
1163        &sensor_dev_attr_in1_min.dev_attr.attr,
1164        &sensor_dev_attr_in2_input.dev_attr.attr,
1165        &sensor_dev_attr_in2_max.dev_attr.attr,
1166        &sensor_dev_attr_in2_min.dev_attr.attr,
1167        &sensor_dev_attr_in3_input.dev_attr.attr,
1168        &sensor_dev_attr_in3_max.dev_attr.attr,
1169        &sensor_dev_attr_in3_min.dev_attr.attr,
1170        &sensor_dev_attr_in4_input.dev_attr.attr,
1171        &sensor_dev_attr_in4_max.dev_attr.attr,
1172        &sensor_dev_attr_in4_min.dev_attr.attr,
1173        &sensor_dev_attr_in5_input.dev_attr.attr,
1174        &sensor_dev_attr_in5_max.dev_attr.attr,
1175        &sensor_dev_attr_in5_min.dev_attr.attr,
1176        &sensor_dev_attr_in6_input.dev_attr.attr,
1177        &sensor_dev_attr_in6_max.dev_attr.attr,
1178        &sensor_dev_attr_in6_min.dev_attr.attr,
1179        &sensor_dev_attr_in7_input.dev_attr.attr,
1180        &sensor_dev_attr_in7_max.dev_attr.attr,
1181        &sensor_dev_attr_in7_min.dev_attr.attr,
1182        &sensor_dev_attr_in8_input.dev_attr.attr,
1183        &sensor_dev_attr_in8_max.dev_attr.attr,
1184        &sensor_dev_attr_in8_min.dev_attr.attr,
1185        &sensor_dev_attr_in0_alarm.dev_attr.attr,
1186        &sensor_dev_attr_in1_alarm.dev_attr.attr,
1187        &sensor_dev_attr_in2_alarm.dev_attr.attr,
1188        &sensor_dev_attr_in3_alarm.dev_attr.attr,
1189        &sensor_dev_attr_in4_alarm.dev_attr.attr,
1190        &sensor_dev_attr_in5_alarm.dev_attr.attr,
1191        &sensor_dev_attr_in6_alarm.dev_attr.attr,
1192        &sensor_dev_attr_in7_alarm.dev_attr.attr,
1193        &sensor_dev_attr_in8_alarm.dev_attr.attr,
1194        &sensor_dev_attr_temp1_input.dev_attr.attr,
1195        &sensor_dev_attr_temp1_max.dev_attr.attr,
1196        &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
1197        &sensor_dev_attr_temp2_input.dev_attr.attr,
1198        &sensor_dev_attr_temp2_max.dev_attr.attr,
1199        &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
1200        &sensor_dev_attr_temp3_input.dev_attr.attr,
1201        &sensor_dev_attr_temp3_max.dev_attr.attr,
1202        &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
1203        &sensor_dev_attr_temp1_alarm.dev_attr.attr,
1204        &sensor_dev_attr_temp2_alarm.dev_attr.attr,
1205        &sensor_dev_attr_temp3_alarm.dev_attr.attr,
1206        &sensor_dev_attr_pwm1.dev_attr.attr,
1207        &sensor_dev_attr_pwm1_mode.dev_attr.attr,
1208        &sensor_dev_attr_pwm1_enable.dev_attr.attr,
1209        &sensor_dev_attr_pwm2.dev_attr.attr,
1210        &sensor_dev_attr_pwm2_mode.dev_attr.attr,
1211        &sensor_dev_attr_pwm2_enable.dev_attr.attr,
1212        &sensor_dev_attr_pwm3.dev_attr.attr,
1213        &sensor_dev_attr_pwm3_mode.dev_attr.attr,
1214        &sensor_dev_attr_pwm3_enable.dev_attr.attr,
1215        &dev_attr_alarms.attr,
1216        &dev_attr_chassis.attr,
1217        &dev_attr_chassis_clear.attr,
1218        &sensor_dev_attr_tolerance1.dev_attr.attr,
1219        &sensor_dev_attr_thermal_cruise1.dev_attr.attr,
1220        &sensor_dev_attr_tolerance2.dev_attr.attr,
1221        &sensor_dev_attr_thermal_cruise2.dev_attr.attr,
1222        &sensor_dev_attr_tolerance3.dev_attr.attr,
1223        &sensor_dev_attr_thermal_cruise3.dev_attr.attr,
1224        &sensor_dev_attr_sf2_point1_fan1.dev_attr.attr,
1225        &sensor_dev_attr_sf2_point2_fan1.dev_attr.attr,
1226        &sensor_dev_attr_sf2_point3_fan1.dev_attr.attr,
1227        &sensor_dev_attr_sf2_point4_fan1.dev_attr.attr,
1228        &sensor_dev_attr_sf2_point1_fan2.dev_attr.attr,
1229        &sensor_dev_attr_sf2_point2_fan2.dev_attr.attr,
1230        &sensor_dev_attr_sf2_point3_fan2.dev_attr.attr,
1231        &sensor_dev_attr_sf2_point4_fan2.dev_attr.attr,
1232        &sensor_dev_attr_sf2_point1_fan3.dev_attr.attr,
1233        &sensor_dev_attr_sf2_point2_fan3.dev_attr.attr,
1234        &sensor_dev_attr_sf2_point3_fan3.dev_attr.attr,
1235        &sensor_dev_attr_sf2_point4_fan3.dev_attr.attr,
1236        &sensor_dev_attr_sf2_level1_fan1.dev_attr.attr,
1237        &sensor_dev_attr_sf2_level2_fan1.dev_attr.attr,
1238        &sensor_dev_attr_sf2_level3_fan1.dev_attr.attr,
1239        &sensor_dev_attr_sf2_level1_fan2.dev_attr.attr,
1240        &sensor_dev_attr_sf2_level2_fan2.dev_attr.attr,
1241        &sensor_dev_attr_sf2_level3_fan2.dev_attr.attr,
1242        &sensor_dev_attr_sf2_level1_fan3.dev_attr.attr,
1243        &sensor_dev_attr_sf2_level2_fan3.dev_attr.attr,
1244        &sensor_dev_attr_sf2_level3_fan3.dev_attr.attr,
1245        &sensor_dev_attr_fan1_input.dev_attr.attr,
1246        &sensor_dev_attr_fan1_min.dev_attr.attr,
1247        &sensor_dev_attr_fan1_div.dev_attr.attr,
1248        &sensor_dev_attr_fan1_alarm.dev_attr.attr,
1249        &sensor_dev_attr_fan2_input.dev_attr.attr,
1250        &sensor_dev_attr_fan2_min.dev_attr.attr,
1251        &sensor_dev_attr_fan2_div.dev_attr.attr,
1252        &sensor_dev_attr_fan2_alarm.dev_attr.attr,
1253        &sensor_dev_attr_fan3_input.dev_attr.attr,
1254        &sensor_dev_attr_fan3_min.dev_attr.attr,
1255        &sensor_dev_attr_fan3_div.dev_attr.attr,
1256        &sensor_dev_attr_fan3_alarm.dev_attr.attr,
1257        NULL
1258};
1259
1260static const struct attribute_group w83792d_group = {
1261        .attrs = w83792d_attributes,
1262};
1263
1264/* Return 0 if detection is successful, -ENODEV otherwise */
1265static int
1266w83792d_detect(struct i2c_client *client, int kind, struct i2c_board_info *info)
1267{
1268        struct i2c_adapter *adapter = client->adapter;
1269        int val1, val2;
1270        unsigned short address = client->addr;
1271
1272        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1273                return -ENODEV;
1274        }
1275
1276        /* The w83792d may be stuck in some other bank than bank 0. This may
1277           make reading other information impossible. Specify a force=... or
1278           force_*=... parameter, and the Winbond will be reset to the right
1279           bank. */
1280        if (kind < 0) {
1281                if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80) {
1282                        return -ENODEV;
1283                }
1284                val1 = w83792d_read_value(client, W83792D_REG_BANK);
1285                val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1286                /* Check for Winbond ID if in bank 0 */
1287                if (!(val1 & 0x07)) {  /* is Bank0 */
1288                        if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1289                             ((val1 & 0x80) && (val2 != 0x5c))) {
1290                                return -ENODEV;
1291                        }
1292                }
1293                /* If Winbond chip, address of chip and W83792D_REG_I2C_ADDR
1294                   should match */
1295                if (w83792d_read_value(client,
1296                                        W83792D_REG_I2C_ADDR) != address) {
1297                        return -ENODEV;
1298                }
1299        }
1300
1301        /* We have either had a force parameter, or we have already detected the
1302           Winbond. Put it now into bank 0 and Vendor ID High Byte */
1303        w83792d_write_value(client,
1304                            W83792D_REG_BANK,
1305                            (w83792d_read_value(client,
1306                                W83792D_REG_BANK) & 0x78) | 0x80);
1307
1308        /* Determine the chip type. */
1309        if (kind <= 0) {
1310                /* get vendor ID */
1311                val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1312                if (val2 != 0x5c) {  /* the vendor is NOT Winbond */
1313                        return -ENODEV;
1314                }
1315                val1 = w83792d_read_value(client, W83792D_REG_WCHIPID);
1316                if (val1 == 0x7a) {
1317                        kind = w83792d;
1318                } else {
1319                        if (kind == 0)
1320                                dev_warn(&adapter->dev,
1321                                        "w83792d: Ignoring 'force' parameter for"
1322                                        " unknown chip at adapter %d, address"
1323                                        " 0x%02x\n", i2c_adapter_id(adapter),
1324                                        address);
1325                        return -ENODEV;
1326                }
1327        }
1328
1329        strlcpy(info->type, "w83792d", I2C_NAME_SIZE);
1330
1331        return 0;
1332}
1333
1334static int
1335w83792d_probe(struct i2c_client *client, const struct i2c_device_id *id)
1336{
1337        struct w83792d_data *data;
1338        struct device *dev = &client->dev;
1339        int i, val1, err;
1340
1341        data = kzalloc(sizeof(struct w83792d_data), GFP_KERNEL);
1342        if (!data) {
1343                err = -ENOMEM;
1344                goto ERROR0;
1345        }
1346
1347        i2c_set_clientdata(client, data);
1348        data->valid = 0;
1349        mutex_init(&data->update_lock);
1350
1351        err = w83792d_detect_subclients(client);
1352        if (err)
1353                goto ERROR1;
1354
1355        /* Initialize the chip */
1356        w83792d_init_client(client);
1357
1358        /* A few vars need to be filled upon startup */
1359        for (i = 0; i < 7; i++) {
1360                data->fan_min[i] = w83792d_read_value(client,
1361                                        W83792D_REG_FAN_MIN[i]);
1362        }
1363
1364        /* Register sysfs hooks */
1365        if ((err = sysfs_create_group(&dev->kobj, &w83792d_group)))
1366                goto ERROR3;
1367
1368        /* Read GPIO enable register to check if pins for fan 4,5 are used as
1369           GPIO */
1370        val1 = w83792d_read_value(client, W83792D_REG_GPIO_EN);
1371
1372        if (!(val1 & 0x40))
1373                if ((err = sysfs_create_group(&dev->kobj,
1374                                              &w83792d_group_fan[0])))
1375                        goto exit_remove_files;
1376
1377        if (!(val1 & 0x20))
1378                if ((err = sysfs_create_group(&dev->kobj,
1379                                              &w83792d_group_fan[1])))
1380                        goto exit_remove_files;
1381
1382        val1 = w83792d_read_value(client, W83792D_REG_PIN);
1383        if (val1 & 0x40)
1384                if ((err = sysfs_create_group(&dev->kobj,
1385                                              &w83792d_group_fan[2])))
1386                        goto exit_remove_files;
1387
1388        if (val1 & 0x04)
1389                if ((err = sysfs_create_group(&dev->kobj,
1390                                              &w83792d_group_fan[3])))
1391                        goto exit_remove_files;
1392
1393        data->hwmon_dev = hwmon_device_register(dev);
1394        if (IS_ERR(data->hwmon_dev)) {
1395                err = PTR_ERR(data->hwmon_dev);
1396                goto exit_remove_files;
1397        }
1398
1399        return 0;
1400
1401exit_remove_files:
1402        sysfs_remove_group(&dev->kobj, &w83792d_group);
1403        for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++)
1404                sysfs_remove_group(&dev->kobj, &w83792d_group_fan[i]);
1405ERROR3:
1406        if (data->lm75[0] != NULL)
1407                i2c_unregister_device(data->lm75[0]);
1408        if (data->lm75[1] != NULL)
1409                i2c_unregister_device(data->lm75[1]);
1410ERROR1:
1411        kfree(data);
1412ERROR0:
1413        return err;
1414}
1415
1416static int
1417w83792d_remove(struct i2c_client *client)
1418{
1419        struct w83792d_data *data = i2c_get_clientdata(client);
1420        int i;
1421
1422        hwmon_device_unregister(data->hwmon_dev);
1423        sysfs_remove_group(&client->dev.kobj, &w83792d_group);
1424        for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++)
1425                sysfs_remove_group(&client->dev.kobj,
1426                                   &w83792d_group_fan[i]);
1427
1428        if (data->lm75[0] != NULL)
1429                i2c_unregister_device(data->lm75[0]);
1430        if (data->lm75[1] != NULL)
1431                i2c_unregister_device(data->lm75[1]);
1432
1433        kfree(data);
1434        return 0;
1435}
1436
1437static void
1438w83792d_init_client(struct i2c_client *client)
1439{
1440        u8 temp2_cfg, temp3_cfg, vid_in_b;
1441
1442        if (init) {
1443                w83792d_write_value(client, W83792D_REG_CONFIG, 0x80);
1444        }
1445        /* Clear the bit6 of W83792D_REG_VID_IN_B(set it into 0):
1446           W83792D_REG_VID_IN_B bit6 = 0: the high/low limit of
1447             vin0/vin1 can be modified by user;
1448           W83792D_REG_VID_IN_B bit6 = 1: the high/low limit of
1449             vin0/vin1 auto-updated, can NOT be modified by user. */
1450        vid_in_b = w83792d_read_value(client, W83792D_REG_VID_IN_B);
1451        w83792d_write_value(client, W83792D_REG_VID_IN_B,
1452                            vid_in_b & 0xbf);
1453
1454        temp2_cfg = w83792d_read_value(client, W83792D_REG_TEMP2_CONFIG);
1455        temp3_cfg = w83792d_read_value(client, W83792D_REG_TEMP3_CONFIG);
1456        w83792d_write_value(client, W83792D_REG_TEMP2_CONFIG,
1457                                temp2_cfg & 0xe6);
1458        w83792d_write_value(client, W83792D_REG_TEMP3_CONFIG,
1459                                temp3_cfg & 0xe6);
1460
1461        /* Start monitoring */
1462        w83792d_write_value(client, W83792D_REG_CONFIG,
1463                            (w83792d_read_value(client,
1464                                                W83792D_REG_CONFIG) & 0xf7)
1465                            | 0x01);
1466}
1467
1468static struct w83792d_data *w83792d_update_device(struct device *dev)
1469{
1470        struct i2c_client *client = to_i2c_client(dev);
1471        struct w83792d_data *data = i2c_get_clientdata(client);
1472        int i, j;
1473        u8 reg_array_tmp[4], reg_tmp;
1474
1475        mutex_lock(&data->update_lock);
1476
1477        if (time_after
1478            (jiffies - data->last_updated, (unsigned long) (HZ * 3))
1479            || time_before(jiffies, data->last_updated) || !data->valid) {
1480                dev_dbg(dev, "Starting device update\n");
1481
1482                /* Update the voltages measured value and limits */
1483                for (i = 0; i < 9; i++) {
1484                        data->in[i] = w83792d_read_value(client,
1485                                                W83792D_REG_IN[i]);
1486                        data->in_max[i] = w83792d_read_value(client,
1487                                                W83792D_REG_IN_MAX[i]);
1488                        data->in_min[i] = w83792d_read_value(client,
1489                                                W83792D_REG_IN_MIN[i]);
1490                }
1491                data->low_bits = w83792d_read_value(client,
1492                                                W83792D_REG_LOW_BITS1) +
1493                                 (w83792d_read_value(client,
1494                                                W83792D_REG_LOW_BITS2) << 8);
1495                for (i = 0; i < 7; i++) {
1496                        /* Update the Fan measured value and limits */
1497                        data->fan[i] = w83792d_read_value(client,
1498                                                W83792D_REG_FAN[i]);
1499                        data->fan_min[i] = w83792d_read_value(client,
1500                                                W83792D_REG_FAN_MIN[i]);
1501                        /* Update the PWM/DC Value and PWM/DC flag */
1502                        data->pwm[i] = w83792d_read_value(client,
1503                                                W83792D_REG_PWM[i]);
1504                }
1505
1506                reg_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG);
1507                data->pwmenable[0] = reg_tmp & 0x03;
1508                data->pwmenable[1] = (reg_tmp>>2) & 0x03;
1509                data->pwmenable[2] = (reg_tmp>>4) & 0x03;
1510
1511                for (i = 0; i < 3; i++) {
1512                        data->temp1[i] = w83792d_read_value(client,
1513                                                        W83792D_REG_TEMP1[i]);
1514                }
1515                for (i = 0; i < 2; i++) {
1516                        for (j = 0; j < 6; j++) {
1517                                data->temp_add[i][j] = w83792d_read_value(
1518                                        client,W83792D_REG_TEMP_ADD[i][j]);
1519                        }
1520                }
1521
1522                /* Update the Fan Divisor */
1523                for (i = 0; i < 4; i++) {
1524                        reg_array_tmp[i] = w83792d_read_value(client,
1525                                                        W83792D_REG_FAN_DIV[i]);
1526                }
1527                data->fan_div[0] = reg_array_tmp[0] & 0x07;
1528                data->fan_div[1] = (reg_array_tmp[0] >> 4) & 0x07;
1529                data->fan_div[2] = reg_array_tmp[1] & 0x07;
1530                data->fan_div[3] = (reg_array_tmp[1] >> 4) & 0x07;
1531                data->fan_div[4] = reg_array_tmp[2] & 0x07;
1532                data->fan_div[5] = (reg_array_tmp[2] >> 4) & 0x07;
1533                data->fan_div[6] = reg_array_tmp[3] & 0x07;
1534
1535                /* Update the realtime status */
1536                data->alarms = w83792d_read_value(client, W83792D_REG_ALARM1) +
1537                        (w83792d_read_value(client, W83792D_REG_ALARM2) << 8) +
1538                        (w83792d_read_value(client, W83792D_REG_ALARM3) << 16);
1539
1540                /* Update CaseOpen status and it's CLR_CHS. */
1541                data->chassis = (w83792d_read_value(client,
1542                        W83792D_REG_CHASSIS) >> 5) & 0x01;
1543                data->chassis_clear = (w83792d_read_value(client,
1544                        W83792D_REG_CHASSIS_CLR) >> 7) & 0x01;
1545
1546                /* Update Thermal Cruise/Smart Fan I target value */
1547                for (i = 0; i < 3; i++) {
1548                        data->thermal_cruise[i] =
1549                                w83792d_read_value(client,
1550                                W83792D_REG_THERMAL[i]) & 0x7f;
1551                }
1552
1553                /* Update Smart Fan I/II tolerance */
1554                reg_tmp = w83792d_read_value(client, W83792D_REG_TOLERANCE[0]);
1555                data->tolerance[0] = reg_tmp & 0x0f;
1556                data->tolerance[1] = (reg_tmp >> 4) & 0x0f;
1557                data->tolerance[2] = w83792d_read_value(client,
1558                                        W83792D_REG_TOLERANCE[2]) & 0x0f;
1559
1560                /* Update Smart Fan II temperature points */
1561                for (i = 0; i < 3; i++) {
1562                        for (j = 0; j < 4; j++) {
1563                                data->sf2_points[i][j] = w83792d_read_value(
1564                                        client,W83792D_REG_POINTS[i][j]) & 0x7f;
1565                        }
1566                }
1567
1568                /* Update Smart Fan II duty cycle levels */
1569                for (i = 0; i < 3; i++) {
1570                        reg_tmp = w83792d_read_value(client,
1571                                                W83792D_REG_LEVELS[i][0]);
1572                        data->sf2_levels[i][0] = reg_tmp & 0x0f;
1573                        data->sf2_levels[i][1] = (reg_tmp >> 4) & 0x0f;
1574                        reg_tmp = w83792d_read_value(client,
1575                                                W83792D_REG_LEVELS[i][2]);
1576                        data->sf2_levels[i][2] = (reg_tmp >> 4) & 0x0f;
1577                        data->sf2_levels[i][3] = reg_tmp & 0x0f;
1578                }
1579
1580                data->last_updated = jiffies;
1581                data->valid = 1;
1582        }
1583
1584        mutex_unlock(&data->update_lock);
1585
1586#ifdef DEBUG
1587        w83792d_print_debug(data, dev);
1588#endif
1589
1590        return data;
1591}
1592
1593#ifdef DEBUG
1594static void w83792d_print_debug(struct w83792d_data *data, struct device *dev)
1595{
1596        int i=0, j=0;
1597        dev_dbg(dev, "==========The following is the debug message...========\n");
1598        dev_dbg(dev, "9 set of Voltages: =====>\n");
1599        for (i=0; i<9; i++) {
1600                dev_dbg(dev, "vin[%d] is: 0x%x\n", i, data->in[i]);
1601                dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]);
1602                dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]);
1603        }
1604        dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits & 0xff);
1605        dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits >> 8);
1606        dev_dbg(dev, "7 set of Fan Counts and Duty Cycles: =====>\n");
1607        for (i=0; i<7; i++) {
1608                dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]);
1609                dev_dbg(dev, "fan[%d] min is: 0x%x\n", i, data->fan_min[i]);
1610                dev_dbg(dev, "pwm[%d]     is: 0x%x\n", i, data->pwm[i]);
1611        }
1612        dev_dbg(dev, "3 set of Temperatures: =====>\n");
1613        for (i=0; i<3; i++) {
1614                dev_dbg(dev, "temp1[%d] is: 0x%x\n", i, data->temp1[i]);
1615        }
1616
1617        for (i=0; i<2; i++) {
1618                for (j=0; j<6; j++) {
1619                        dev_dbg(dev, "temp_add[%d][%d] is: 0x%x\n", i, j,
1620                                                        data->temp_add[i][j]);
1621                }
1622        }
1623
1624        for (i=0; i<7; i++) {
1625                dev_dbg(dev, "fan_div[%d] is: 0x%x\n", i, data->fan_div[i]);
1626        }
1627        dev_dbg(dev, "==========End of the debug message...==================\n");
1628        dev_dbg(dev, "\n");
1629}
1630#endif
1631
1632static int __init
1633sensors_w83792d_init(void)
1634{
1635        return i2c_add_driver(&w83792d_driver);
1636}
1637
1638static void __exit
1639sensors_w83792d_exit(void)
1640{
1641        i2c_del_driver(&w83792d_driver);
1642}
1643
1644MODULE_AUTHOR("Chunhao Huang @ Winbond <DZShen@Winbond.com.tw>");
1645MODULE_DESCRIPTION("W83792AD/D driver for linux-2.6");
1646MODULE_LICENSE("GPL");
1647
1648module_init(sensors_w83792d_init);
1649module_exit(sensors_w83792d_exit);
1650
1651