linux/drivers/hwmon/w83791d.c History
<<
>>
Prefs
   1/*
   2    w83791d.c - Part of lm_sensors, Linux kernel modules for hardware
   3                monitoring
   4
   5    Copyright (C) 2006-2007 Charles Spirakis <bezaur@gmail.com>
   6
   7    This program is free software; you can redistribute it and/or modify
   8    it under the terms of the GNU General Public License as published by
   9    the Free Software Foundation; either version 2 of the License, or
  10    (at your option) any later version.
  11
  12    This program is distributed in the hope that it will be useful,
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15    GNU General Public License for more details.
  16
  17    You should have received a copy of the GNU General Public License
  18    along with this program; if not, write to the Free Software
  19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20*/
  21
  22/*
  23    Supports following chips:
  24
  25    Chip        #vin    #fanin  #pwm    #temp   wchipid vendid  i2c     ISA
  26    w83791d     10      5       5       3       0x71    0x5ca3  yes     no
  27
  28    The w83791d chip appears to be part way between the 83781d and the
  29    83792d. Thus, this file is derived from both the w83792d.c and
  30    w83781d.c files.
  31
  32    The w83791g chip is the same as the w83791d but lead-free.
  33*/
  34
  35#include <linux/module.h>
  36#include <linux/init.h>
  37#include <linux/slab.h>
  38#include <linux/i2c.h>
  39#include <linux/hwmon.h>
  40#include <linux/hwmon-vid.h>
  41#include <linux/hwmon-sysfs.h>
  42#include <linux/err.h>
  43#include <linux/mutex.h>
  44
  45#define NUMBER_OF_VIN           10
  46#define NUMBER_OF_FANIN         5
  47#define NUMBER_OF_TEMPIN        3
  48#define NUMBER_OF_PWM           5
  49
  50/* Addresses to scan */
  51static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
  52                                                I2C_CLIENT_END };
  53
  54/* Insmod parameters */
  55I2C_CLIENT_INSMOD_1(w83791d);
  56
  57static unsigned short force_subclients[4];
  58module_param_array(force_subclients, short, NULL, 0);
  59MODULE_PARM_DESC(force_subclients, "List of subclient addresses: "
  60                        "{bus, clientaddr, subclientaddr1, subclientaddr2}");
  61
  62static int reset;
  63module_param(reset, bool, 0);
  64MODULE_PARM_DESC(reset, "Set to one to force a hardware chip reset");
  65
  66static int init;
  67module_param(init, bool, 0);
  68MODULE_PARM_DESC(init, "Set to one to force extra software initialization");
  69
  70/* The W83791D registers */
  71static const u8 W83791D_REG_IN[NUMBER_OF_VIN] = {
  72        0x20,                   /* VCOREA in DataSheet */
  73        0x21,                   /* VINR0 in DataSheet */
  74        0x22,                   /* +3.3VIN in DataSheet */
  75        0x23,                   /* VDD5V in DataSheet */
  76        0x24,                   /* +12VIN in DataSheet */
  77        0x25,                   /* -12VIN in DataSheet */
  78        0x26,                   /* -5VIN in DataSheet */
  79        0xB0,                   /* 5VSB in DataSheet */
  80        0xB1,                   /* VBAT in DataSheet */
  81        0xB2                    /* VINR1 in DataSheet */
  82};
  83
  84static const u8 W83791D_REG_IN_MAX[NUMBER_OF_VIN] = {
  85        0x2B,                   /* VCOREA High Limit in DataSheet */
  86        0x2D,                   /* VINR0 High Limit in DataSheet */
  87        0x2F,                   /* +3.3VIN High Limit in DataSheet */
  88        0x31,                   /* VDD5V High Limit in DataSheet */
  89        0x33,                   /* +12VIN High Limit in DataSheet */
  90        0x35,                   /* -12VIN High Limit in DataSheet */
  91        0x37,                   /* -5VIN High Limit in DataSheet */
  92        0xB4,                   /* 5VSB High Limit in DataSheet */
  93        0xB6,                   /* VBAT High Limit in DataSheet */
  94        0xB8                    /* VINR1 High Limit in DataSheet */
  95};
  96static const u8 W83791D_REG_IN_MIN[NUMBER_OF_VIN] = {
  97        0x2C,                   /* VCOREA Low Limit in DataSheet */
  98        0x2E,                   /* VINR0 Low Limit in DataSheet */
  99        0x30,                   /* +3.3VIN Low Limit in DataSheet */
 100        0x32,                   /* VDD5V Low Limit in DataSheet */
 101        0x34,                   /* +12VIN Low Limit in DataSheet */
 102        0x36,                   /* -12VIN Low Limit in DataSheet */
 103        0x38,                   /* -5VIN Low Limit in DataSheet */
 104        0xB5,                   /* 5VSB Low Limit in DataSheet */
 105        0xB7,                   /* VBAT Low Limit in DataSheet */
 106        0xB9                    /* VINR1 Low Limit in DataSheet */
 107};
 108static const u8 W83791D_REG_FAN[NUMBER_OF_FANIN] = {
 109        0x28,                   /* FAN 1 Count in DataSheet */
 110        0x29,                   /* FAN 2 Count in DataSheet */
 111        0x2A,                   /* FAN 3 Count in DataSheet */
 112        0xBA,                   /* FAN 4 Count in DataSheet */
 113        0xBB,                   /* FAN 5 Count in DataSheet */
 114};
 115static const u8 W83791D_REG_FAN_MIN[NUMBER_OF_FANIN] = {
 116        0x3B,                   /* FAN 1 Count Low Limit in DataSheet */
 117        0x3C,                   /* FAN 2 Count Low Limit in DataSheet */
 118        0x3D,                   /* FAN 3 Count Low Limit in DataSheet */
 119        0xBC,                   /* FAN 4 Count Low Limit in DataSheet */
 120        0xBD,                   /* FAN 5 Count Low Limit in DataSheet */
 121};
 122
 123static const u8 W83791D_REG_PWM[NUMBER_OF_PWM] = {
 124        0x81,                   /* PWM 1 duty cycle register in DataSheet */
 125        0x83,                   /* PWM 2 duty cycle register in DataSheet */
 126        0x94,                   /* PWM 3 duty cycle register in DataSheet */
 127        0xA0,                   /* PWM 4 duty cycle register in DataSheet */
 128        0xA1,                   /* PWM 5 duty cycle register in DataSheet */
 129};
 130
 131static const u8 W83791D_REG_TEMP_TARGET[3] = {
 132        0x85,                   /* PWM 1 target temperature for temp 1 */
 133        0x86,                   /* PWM 2 target temperature for temp 2 */
 134        0x96,                   /* PWM 3 target temperature for temp 3 */
 135};
 136
 137static const u8 W83791D_REG_TEMP_TOL[2] = {
 138        0x87,                   /* PWM 1/2 temperature tolerance */
 139        0x97,                   /* PWM 3 temperature tolerance */
 140};
 141
 142static const u8 W83791D_REG_FAN_CFG[2] = {
 143        0x84,                   /* FAN 1/2 configuration */
 144        0x95,                   /* FAN 3 configuration */
 145};
 146
 147static const u8 W83791D_REG_FAN_DIV[3] = {
 148        0x47,                   /* contains FAN1 and FAN2 Divisor */
 149        0x4b,                   /* contains FAN3 Divisor */
 150        0x5C,                   /* contains FAN4 and FAN5 Divisor */
 151};
 152
 153#define W83791D_REG_BANK                0x4E
 154#define W83791D_REG_TEMP2_CONFIG        0xC2
 155#define W83791D_REG_TEMP3_CONFIG        0xCA
 156
 157static const u8 W83791D_REG_TEMP1[3] = {
 158        0x27,                   /* TEMP 1 in DataSheet */
 159        0x39,                   /* TEMP 1 Over in DataSheet */
 160        0x3A,                   /* TEMP 1 Hyst in DataSheet */
 161};
 162
 163static const u8 W83791D_REG_TEMP_ADD[2][6] = {
 164        {0xC0,                  /* TEMP 2 in DataSheet */
 165         0xC1,                  /* TEMP 2(0.5 deg) in DataSheet */
 166         0xC5,                  /* TEMP 2 Over High part in DataSheet */
 167         0xC6,                  /* TEMP 2 Over Low part in DataSheet */
 168         0xC3,                  /* TEMP 2 Thyst High part in DataSheet */
 169         0xC4},                 /* TEMP 2 Thyst Low part in DataSheet */
 170        {0xC8,                  /* TEMP 3 in DataSheet */
 171         0xC9,                  /* TEMP 3(0.5 deg) in DataSheet */
 172         0xCD,                  /* TEMP 3 Over High part in DataSheet */
 173         0xCE,                  /* TEMP 3 Over Low part in DataSheet */
 174         0xCB,                  /* TEMP 3 Thyst High part in DataSheet */
 175         0xCC}                  /* TEMP 3 Thyst Low part in DataSheet */
 176};
 177
 178#define W83791D_REG_BEEP_CONFIG         0x4D
 179
 180static const u8 W83791D_REG_BEEP_CTRL[3] = {
 181        0x56,                   /* BEEP Control Register 1 */
 182        0x57,                   /* BEEP Control Register 2 */
 183        0xA3,                   /* BEEP Control Register 3 */
 184};
 185
 186#define W83791D_REG_GPIO                0x15
 187#define W83791D_REG_CONFIG              0x40
 188#define W83791D_REG_VID_FANDIV          0x47
 189#define W83791D_REG_DID_VID4            0x49
 190#define W83791D_REG_WCHIPID             0x58
 191#define W83791D_REG_CHIPMAN             0x4F
 192#define W83791D_REG_PIN                 0x4B
 193#define W83791D_REG_I2C_SUBADDR         0x4A
 194
 195#define W83791D_REG_ALARM1 0xA9 /* realtime status register1 */
 196#define W83791D_REG_ALARM2 0xAA /* realtime status register2 */
 197#define W83791D_REG_ALARM3 0xAB /* realtime status register3 */
 198
 199#define W83791D_REG_VBAT                0x5D
 200#define W83791D_REG_I2C_ADDR            0x48
 201
 202/* The SMBus locks itself. The Winbond W83791D has a bank select register
 203   (index 0x4e), but the driver only accesses registers in bank 0. Since
 204   we don't switch banks, we don't need any special code to handle
 205   locking access between bank switches */
 206static inline int w83791d_read(struct i2c_client *client, u8 reg)
 207{
 208        return i2c_smbus_read_byte_data(client, reg);
 209}
 210
 211static inline int w83791d_write(struct i2c_client *client, u8 reg, u8 value)
 212{
 213        return i2c_smbus_write_byte_data(client, reg, value);
 214}
 215
 216/* The analog voltage inputs have 16mV LSB. Since the sysfs output is
 217   in mV as would be measured on the chip input pin, need to just
 218   multiply/divide by 16 to translate from/to register values. */
 219#define IN_TO_REG(val)          (SENSORS_LIMIT((((val) + 8) / 16), 0, 255))
 220#define IN_FROM_REG(val)        ((val) * 16)
 221
 222static u8 fan_to_reg(long rpm, int div)
 223{
 224        if (rpm == 0)
 225                return 255;
 226        rpm = SENSORS_LIMIT(rpm, 1, 1000000);
 227        return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
 228}
 229
 230#define FAN_FROM_REG(val,div)   ((val) == 0   ? -1 : \
 231                                ((val) == 255 ? 0 : \
 232                                        1350000 / ((val) * (div))))
 233
 234/* for temp1 which is 8-bit resolution, LSB = 1 degree Celsius */
 235#define TEMP1_FROM_REG(val)     ((val) * 1000)
 236#define TEMP1_TO_REG(val)       ((val) <= -128000 ? -128 : \
 237                                 (val) >= 127000 ? 127 : \
 238                                 (val) < 0 ? ((val) - 500) / 1000 : \
 239                                 ((val) + 500) / 1000)
 240
 241/* for temp2 and temp3 which are 9-bit resolution, LSB = 0.5 degree Celsius
 242   Assumes the top 8 bits are the integral amount and the bottom 8 bits
 243   are the fractional amount. Since we only have 0.5 degree resolution,
 244   the bottom 7 bits will always be zero */
 245#define TEMP23_FROM_REG(val)    ((val) / 128 * 500)
 246#define TEMP23_TO_REG(val)      ((val) <= -128000 ? 0x8000 : \
 247                                 (val) >= 127500 ? 0x7F80 : \
 248                                 (val) < 0 ? ((val) - 250) / 500 * 128 : \
 249                                 ((val) + 250) / 500 * 128)
 250
 251/* for thermal cruise target temp, 7-bits, LSB = 1 degree Celsius */
 252#define TARGET_TEMP_TO_REG(val)         ((val) < 0 ? 0 : \
 253                                        (val) >= 127000 ? 127 : \
 254                                        ((val) + 500) / 1000)
 255
 256/* for thermal cruise temp tolerance, 4-bits, LSB = 1 degree Celsius */
 257#define TOL_TEMP_TO_REG(val)            ((val) < 0 ? 0 : \
 258                                        (val) >= 15000 ? 15 : \
 259                                        ((val) + 500) / 1000)
 260
 261#define BEEP_MASK_TO_REG(val)           ((val) & 0xffffff)
 262#define BEEP_MASK_FROM_REG(val)         ((val) & 0xffffff)
 263
 264#define DIV_FROM_REG(val)               (1 << (val))
 265
 266static u8 div_to_reg(int nr, long val)
 267{
 268        int i;
 269
 270        /* fan divisors max out at 128 */
 271        val = SENSORS_LIMIT(val, 1, 128) >> 1;
 272        for (i = 0; i < 7; i++) {
 273                if (val == 0)
 274                        break;
 275                val >>= 1;
 276        }
 277        return (u8) i;
 278}
 279
 280struct w83791d_data {
 281        struct device *hwmon_dev;
 282        struct mutex update_lock;
 283
 284        char valid;                     /* !=0 if following fields are valid */
 285        unsigned long last_updated;     /* In jiffies */
 286
 287        /* array of 2 pointers to subclients */
 288        struct i2c_client *lm75[2];
 289
 290        /* volts */
 291        u8 in[NUMBER_OF_VIN];           /* Register value */
 292        u8 in_max[NUMBER_OF_VIN];       /* Register value */
 293        u8 in_min[NUMBER_OF_VIN];       /* Register value */
 294
 295        /* fans */
 296        u8 fan[NUMBER_OF_FANIN];        /* Register value */
 297        u8 fan_min[NUMBER_OF_FANIN];    /* Register value */
 298        u8 fan_div[NUMBER_OF_FANIN];    /* Register encoding, shifted right */
 299
 300        /* Temperature sensors */
 301
 302        s8 temp1[3];            /* current, over, thyst */
 303        s16 temp_add[2][3];     /* fixed point value. Top 8 bits are the
 304                                   integral part, bottom 8 bits are the
 305                                   fractional part. We only use the top
 306                                   9 bits as the resolution is only
 307                                   to the 0.5 degree C...
 308                                   two sensors with three values
 309                                   (cur, over, hyst)  */
 310
 311        /* PWMs */
 312        u8 pwm[5];              /* pwm duty cycle */
 313        u8 pwm_enable[3];       /* pwm enable status for fan 1-3
 314                                        (fan 4-5 only support manual mode) */
 315
 316        u8 temp_target[3];      /* pwm 1-3 target temperature */
 317        u8 temp_tolerance[3];   /* pwm 1-3 temperature tolerance */
 318
 319        /* Misc */
 320        u32 alarms;             /* realtime status register encoding,combined */
 321        u8 beep_enable;         /* Global beep enable */
 322        u32 beep_mask;          /* Mask off specific beeps */
 323        u8 vid;                 /* Register encoding, combined */
 324        u8 vrm;                 /* hwmon-vid */
 325};
 326
 327static int w83791d_probe(struct i2c_client *client,
 328                         const struct i2c_device_id *id);
 329static int w83791d_detect(struct i2c_client *client, int kind,
 330                          struct i2c_board_info *info);
 331static int w83791d_remove(struct i2c_client *client);
 332
 333static int w83791d_read(struct i2c_client *client, u8 register);
 334static int w83791d_write(struct i2c_client *client, u8 register, u8 value);
 335static struct w83791d_data *w83791d_update_device(struct device *dev);
 336
 337#ifdef DEBUG
 338static void w83791d_print_debug(struct w83791d_data *data, struct device *dev);
 339#endif
 340
 341static void w83791d_init_client(struct i2c_client *client);
 342
 343static const struct i2c_device_id w83791d_id[] = {
 344        { "w83791d", w83791d },
 345        { }
 346};
 347MODULE_DEVICE_TABLE(i2c, w83791d_id);
 348
 349static struct i2c_driver w83791d_driver = {
 350        .class          = I2C_CLASS_HWMON,
 351        .driver = {
 352                .name = "w83791d",
 353        },
 354        .probe          = w83791d_probe,
 355        .remove         = w83791d_remove,
 356        .id_table       = w83791d_id,
 357        .detect         = w83791d_detect,
 358        .address_data   = &addr_data,
 359};
 360
 361/* following are the sysfs callback functions */
 362#define show_in_reg(reg) \
 363static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
 364                        char *buf) \
 365{ \
 366        struct sensor_device_attribute *sensor_attr = \
 367                                                to_sensor_dev_attr(attr); \
 368        struct w83791d_data *data = w83791d_update_device(dev); \
 369        int nr = sensor_attr->index; \
 370        return sprintf(buf,"%d\n", IN_FROM_REG(data->reg[nr])); \
 371}
 372
 373show_in_reg(in);
 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 = \
 383                                                to_sensor_dev_attr(attr); \
 384        struct i2c_client *client = to_i2c_client(dev); \
 385        struct w83791d_data *data = i2c_get_clientdata(client); \
 386        unsigned long val = simple_strtoul(buf, NULL, 10); \
 387        int nr = sensor_attr->index; \
 388         \
 389        mutex_lock(&data->update_lock); \
 390        data->in_##reg[nr] = IN_TO_REG(val); \
 391        w83791d_write(client, W83791D_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
 399static struct sensor_device_attribute sda_in_input[] = {
 400        SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),
 401        SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
 402        SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
 403        SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),
 404        SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),
 405        SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),
 406        SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),
 407        SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),
 408        SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),
 409        SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9),
 410};
 411
 412static struct sensor_device_attribute sda_in_min[] = {
 413        SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
 414        SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
 415        SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
 416        SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),
 417        SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),
 418        SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),
 419        SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),
 420        SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),
 421        SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),
 422        SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),
 423};
 424
 425static struct sensor_device_attribute sda_in_max[] = {
 426        SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
 427        SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
 428        SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
 429        SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),
 430        SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),
 431        SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),
 432        SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),
 433        SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),
 434        SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),
 435        SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),
 436};
 437
 438
 439static ssize_t show_beep(struct device *dev, struct device_attribute *attr,
 440                        char *buf)
 441{
 442        struct sensor_device_attribute *sensor_attr =
 443                                                to_sensor_dev_attr(attr);
 444        struct w83791d_data *data = w83791d_update_device(dev);
 445        int bitnr = sensor_attr->index;
 446
 447        return sprintf(buf, "%d\n", (data->beep_mask >> bitnr) & 1);
 448}
 449
 450static ssize_t store_beep(struct device *dev, struct device_attribute *attr,
 451                        const char *buf, size_t count)
 452{
 453        struct sensor_device_attribute *sensor_attr =
 454                                                to_sensor_dev_attr(attr);
 455        struct i2c_client *client = to_i2c_client(dev);
 456        struct w83791d_data *data = i2c_get_clientdata(client);
 457        int bitnr = sensor_attr->index;
 458        int bytenr = bitnr / 8;
 459        long val = simple_strtol(buf, NULL, 10) ? 1 : 0;
 460
 461        mutex_lock(&data->update_lock);
 462
 463        data->beep_mask &= ~(0xff << (bytenr * 8));
 464        data->beep_mask |= w83791d_read(client, W83791D_REG_BEEP_CTRL[bytenr])
 465                << (bytenr * 8);
 466
 467        data->beep_mask &= ~(1 << bitnr);
 468        data->beep_mask |= val << bitnr;
 469
 470        w83791d_write(client, W83791D_REG_BEEP_CTRL[bytenr],
 471                (data->beep_mask >> (bytenr * 8)) & 0xff);
 472
 473        mutex_unlock(&data->update_lock);
 474
 475        return count;
 476}
 477
 478static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
 479                        char *buf)
 480{
 481        struct sensor_device_attribute *sensor_attr =
 482                                                to_sensor_dev_attr(attr);
 483        struct w83791d_data *data = w83791d_update_device(dev);
 484        int bitnr = sensor_attr->index;
 485
 486        return sprintf(buf, "%d\n", (data->alarms >> bitnr) & 1);
 487}
 488
 489/* Note: The bitmask for the beep enable/disable is different than
 490   the bitmask for the alarm. */
 491static struct sensor_device_attribute sda_in_beep[] = {
 492        SENSOR_ATTR(in0_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 0),
 493        SENSOR_ATTR(in1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 13),
 494        SENSOR_ATTR(in2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 2),
 495        SENSOR_ATTR(in3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 3),
 496        SENSOR_ATTR(in4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 8),
 497        SENSOR_ATTR(in5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 9),
 498        SENSOR_ATTR(in6_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 10),
 499        SENSOR_ATTR(in7_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 16),
 500        SENSOR_ATTR(in8_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 17),
 501        SENSOR_ATTR(in9_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 14),
 502};
 503
 504static struct sensor_device_attribute sda_in_alarm[] = {
 505        SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0),
 506        SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1),
 507        SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2),
 508        SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3),
 509        SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8),
 510        SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9),
 511        SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10),
 512        SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19),
 513        SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20),
 514        SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 14),
 515};
 516
 517#define show_fan_reg(reg) \
 518static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
 519                                char *buf) \
 520{ \
 521        struct sensor_device_attribute *sensor_attr = \
 522                                                to_sensor_dev_attr(attr); \
 523        struct w83791d_data *data = w83791d_update_device(dev); \
 524        int nr = sensor_attr->index; \
 525        return sprintf(buf,"%d\n", \
 526                FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
 527}
 528
 529show_fan_reg(fan);
 530show_fan_reg(fan_min);
 531
 532static ssize_t store_fan_min(struct device *dev, struct device_attribute *attr,
 533                                const char *buf, size_t count)
 534{
 535        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 536        struct i2c_client *client = to_i2c_client(dev);
 537        struct w83791d_data *data = i2c_get_clientdata(client);
 538        unsigned long val = simple_strtoul(buf, NULL, 10);
 539        int nr = sensor_attr->index;
 540
 541        mutex_lock(&data->update_lock);
 542        data->fan_min[nr] = fan_to_reg(val, DIV_FROM_REG(data->fan_div[nr]));
 543        w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);
 544        mutex_unlock(&data->update_lock);
 545
 546        return count;
 547}
 548
 549static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr,
 550                                char *buf)
 551{
 552        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 553        int nr = sensor_attr->index;
 554        struct w83791d_data *data = w83791d_update_device(dev);
 555        return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr]));
 556}
 557
 558/* Note: we save and restore the fan minimum here, because its value is
 559   determined in part by the fan divisor.  This follows the principle of
 560   least suprise; the user doesn't expect the fan minimum to change just
 561   because the divisor changed. */
 562static ssize_t store_fan_div(struct device *dev, struct device_attribute *attr,
 563                                const char *buf, size_t count)
 564{
 565        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 566        struct i2c_client *client = to_i2c_client(dev);
 567        struct w83791d_data *data = i2c_get_clientdata(client);
 568        int nr = sensor_attr->index;
 569        unsigned long min;
 570        u8 tmp_fan_div;
 571        u8 fan_div_reg;
 572        u8 vbat_reg;
 573        int indx = 0;
 574        u8 keep_mask = 0;
 575        u8 new_shift = 0;
 576
 577        /* Save fan_min */
 578        min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));
 579
 580        mutex_lock(&data->update_lock);
 581        data->fan_div[nr] = div_to_reg(nr, simple_strtoul(buf, NULL, 10));
 582
 583        switch (nr) {
 584        case 0:
 585                indx = 0;
 586                keep_mask = 0xcf;
 587                new_shift = 4;
 588                break;
 589        case 1:
 590                indx = 0;
 591                keep_mask = 0x3f;
 592                new_shift = 6;
 593                break;
 594        case 2:
 595                indx = 1;
 596                keep_mask = 0x3f;
 597                new_shift = 6;
 598                break;
 599        case 3:
 600                indx = 2;
 601                keep_mask = 0xf8;
 602                new_shift = 0;
 603                break;
 604        case 4:
 605                indx = 2;
 606                keep_mask = 0x8f;
 607                new_shift = 4;
 608                break;
 609#ifdef DEBUG
 610        default:
 611                dev_warn(dev, "store_fan_div: Unexpected nr seen: %d\n", nr);
 612                count = -EINVAL;
 613                goto err_exit;
 614#endif
 615        }
 616
 617        fan_div_reg = w83791d_read(client, W83791D_REG_FAN_DIV[indx])
 618                        & keep_mask;
 619        tmp_fan_div = (data->fan_div[nr] << new_shift) & ~keep_mask;
 620
 621        w83791d_write(client, W83791D_REG_FAN_DIV[indx],
 622                                fan_div_reg | tmp_fan_div);
 623
 624        /* Bit 2 of fans 0-2 is stored in the vbat register (bits 5-7) */
 625        if (nr < 3) {
 626                keep_mask = ~(1 << (nr + 5));
 627                vbat_reg = w83791d_read(client, W83791D_REG_VBAT)
 628                                & keep_mask;
 629                tmp_fan_div = (data->fan_div[nr] << (3 + nr)) & ~keep_mask;
 630                w83791d_write(client, W83791D_REG_VBAT,
 631                                vbat_reg | tmp_fan_div);
 632        }
 633
 634        /* Restore fan_min */
 635        data->fan_min[nr] = fan_to_reg(min, DIV_FROM_REG(data->fan_div[nr]));
 636        w83791d_write(client, W83791D_REG_FAN_MIN[nr], data->fan_min[nr]);
 637
 638#ifdef DEBUG
 639err_exit:
 640#endif
 641        mutex_unlock(&data->update_lock);
 642
 643        return count;
 644}
 645
 646static struct sensor_device_attribute sda_fan_input[] = {
 647        SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
 648        SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
 649        SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
 650        SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),
 651        SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),
 652};
 653
 654static struct sensor_device_attribute sda_fan_min[] = {
 655        SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO,
 656                        show_fan_min, store_fan_min, 0),
 657        SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO,
 658                        show_fan_min, store_fan_min, 1),
 659        SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO,
 660                        show_fan_min, store_fan_min, 2),
 661        SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO,
 662                        show_fan_min, store_fan_min, 3),
 663        SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO,
 664                        show_fan_min, store_fan_min, 4),
 665};
 666
 667static struct sensor_device_attribute sda_fan_div[] = {
 668        SENSOR_ATTR(fan1_div, S_IWUSR | S_IRUGO,
 669                        show_fan_div, store_fan_div, 0),
 670        SENSOR_ATTR(fan2_div, S_IWUSR | S_IRUGO,
 671                        show_fan_div, store_fan_div, 1),
 672        SENSOR_ATTR(fan3_div, S_IWUSR | S_IRUGO,
 673                        show_fan_div, store_fan_div, 2),
 674        SENSOR_ATTR(fan4_div, S_IWUSR | S_IRUGO,
 675                        show_fan_div, store_fan_div, 3),
 676        SENSOR_ATTR(fan5_div, S_IWUSR | S_IRUGO,
 677                        show_fan_div, store_fan_div, 4),
 678};
 679
 680static struct sensor_device_attribute sda_fan_beep[] = {
 681        SENSOR_ATTR(fan1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 6),
 682        SENSOR_ATTR(fan2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 7),
 683        SENSOR_ATTR(fan3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 11),
 684        SENSOR_ATTR(fan4_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 21),
 685        SENSOR_ATTR(fan5_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 22),
 686};
 687
 688static struct sensor_device_attribute sda_fan_alarm[] = {
 689        SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6),
 690        SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7),
 691        SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11),
 692        SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21),
 693        SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22),
 694};
 695
 696/* read/write PWMs */
 697static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
 698                                char *buf)
 699{
 700        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 701        int nr = sensor_attr->index;
 702        struct w83791d_data *data = w83791d_update_device(dev);
 703        return sprintf(buf, "%u\n", data->pwm[nr]);
 704}
 705
 706static ssize_t store_pwm(struct device *dev, struct device_attribute *attr,
 707                const char *buf, size_t count)
 708{
 709        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 710        struct i2c_client *client = to_i2c_client(dev);
 711        struct w83791d_data *data = i2c_get_clientdata(client);
 712        int nr = sensor_attr->index;
 713        unsigned long val;
 714
 715        if (strict_strtoul(buf, 10, &val))
 716                return -EINVAL;
 717
 718        mutex_lock(&data->update_lock);
 719        data->pwm[nr] = SENSORS_LIMIT(val, 0, 255);
 720        w83791d_write(client, W83791D_REG_PWM[nr], data->pwm[nr]);
 721        mutex_unlock(&data->update_lock);
 722        return count;
 723}
 724
 725static struct sensor_device_attribute sda_pwm[] = {
 726        SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO,
 727                        show_pwm, store_pwm, 0),
 728        SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO,
 729                        show_pwm, store_pwm, 1),
 730        SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO,
 731                        show_pwm, store_pwm, 2),
 732        SENSOR_ATTR(pwm4, S_IWUSR | S_IRUGO,
 733                        show_pwm, store_pwm, 3),
 734        SENSOR_ATTR(pwm5, S_IWUSR | S_IRUGO,
 735                        show_pwm, store_pwm, 4),
 736};
 737
 738static ssize_t show_pwmenable(struct device *dev, struct device_attribute *attr,
 739                                char *buf)
 740{
 741        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 742        int nr = sensor_attr->index;
 743        struct w83791d_data *data = w83791d_update_device(dev);
 744        return sprintf(buf, "%u\n", data->pwm_enable[nr] + 1);
 745}
 746
 747static ssize_t store_pwmenable(struct device *dev,
 748                struct device_attribute *attr, const char *buf, size_t count)
 749{
 750        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 751        struct i2c_client *client = to_i2c_client(dev);
 752        struct w83791d_data *data = i2c_get_clientdata(client);
 753        int nr = sensor_attr->index;
 754        unsigned long val;
 755        u8 reg_cfg_tmp;
 756        u8 reg_idx = 0;
 757        u8 val_shift = 0;
 758        u8 keep_mask = 0;
 759
 760        int ret = strict_strtoul(buf, 10, &val);
 761
 762        if (ret || val < 1 || val > 3)
 763                return -EINVAL;
 764
 765        mutex_lock(&data->update_lock);
 766        data->pwm_enable[nr] = val - 1;
 767        switch (nr) {
 768        case 0:
 769                reg_idx = 0;
 770                val_shift = 2;
 771                keep_mask = 0xf3;
 772                break;
 773        case 1:
 774                reg_idx = 0;
 775                val_shift = 4;
 776                keep_mask = 0xcf;
 777                break;
 778        case 2:
 779                reg_idx = 1;
 780                val_shift = 2;
 781                keep_mask = 0xf3;
 782                break;
 783        }
 784
 785        reg_cfg_tmp = w83791d_read(client, W83791D_REG_FAN_CFG[reg_idx]);
 786        reg_cfg_tmp = (reg_cfg_tmp & keep_mask) |
 787                                        data->pwm_enable[nr] << val_shift;
 788
 789        w83791d_write(client, W83791D_REG_FAN_CFG[reg_idx], reg_cfg_tmp);
 790        mutex_unlock(&data->update_lock);
 791
 792        return count;
 793}
 794static struct sensor_device_attribute sda_pwmenable[] = {
 795        SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
 796                        show_pwmenable, store_pwmenable, 0),
 797        SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
 798                        show_pwmenable, store_pwmenable, 1),
 799        SENSOR_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
 800                        show_pwmenable, store_pwmenable, 2),
 801};
 802
 803/* For Smart Fan I / Thermal Cruise */
 804static ssize_t show_temp_target(struct device *dev,
 805                        struct device_attribute *attr, char *buf)
 806{
 807        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 808        struct w83791d_data *data = w83791d_update_device(dev);
 809        int nr = sensor_attr->index;
 810        return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp_target[nr]));
 811}
 812
 813static ssize_t store_temp_target(struct device *dev,
 814                struct device_attribute *attr, const char *buf, size_t count)
 815{
 816        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 817        struct i2c_client *client = to_i2c_client(dev);
 818        struct w83791d_data *data = i2c_get_clientdata(client);
 819        int nr = sensor_attr->index;
 820        unsigned long val;
 821        u8 target_mask;
 822
 823        if (strict_strtoul(buf, 10, &val))
 824                return -EINVAL;
 825
 826        mutex_lock(&data->update_lock);
 827        data->temp_target[nr] = TARGET_TEMP_TO_REG(val);
 828        target_mask = w83791d_read(client,
 829                                W83791D_REG_TEMP_TARGET[nr]) & 0x80;
 830        w83791d_write(client, W83791D_REG_TEMP_TARGET[nr],
 831                                data->temp_target[nr] | target_mask);
 832        mutex_unlock(&data->update_lock);
 833        return count;
 834}
 835
 836static struct sensor_device_attribute sda_temp_target[] = {
 837        SENSOR_ATTR(temp1_target, S_IWUSR | S_IRUGO,
 838                        show_temp_target, store_temp_target, 0),
 839        SENSOR_ATTR(temp2_target, S_IWUSR | S_IRUGO,
 840                        show_temp_target, store_temp_target, 1),
 841        SENSOR_ATTR(temp3_target, S_IWUSR | S_IRUGO,
 842                        show_temp_target, store_temp_target, 2),
 843};
 844
 845static ssize_t show_temp_tolerance(struct device *dev,
 846                        struct device_attribute *attr, char *buf)
 847{
 848        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 849        struct w83791d_data *data = w83791d_update_device(dev);
 850        int nr = sensor_attr->index;
 851        return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp_tolerance[nr]));
 852}
 853
 854static ssize_t store_temp_tolerance(struct device *dev,
 855                struct device_attribute *attr, const char *buf, size_t count)
 856{
 857        struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 858        struct i2c_client *client = to_i2c_client(dev);
 859        struct w83791d_data *data = i2c_get_clientdata(client);
 860        int nr = sensor_attr->index;
 861        unsigned long val;
 862        u8 target_mask;
 863        u8 reg_idx = 0;
 864        u8 val_shift = 0;
 865        u8 keep_mask = 0;
 866
 867        if (strict_strtoul(buf, 10, &val))
 868                return -EINVAL;
 869
 870        switch (nr) {
 871        case 0:
 872                reg_idx = 0;
 873                val_shift = 0;
 874                keep_mask = 0xf0;
 875                break;
 876        case 1:
 877                reg_idx = 0;
 878                val_shift = 4;
 879                keep_mask = 0x0f;
 880                break;
 881        case 2:
 882                reg_idx = 1;
 883                val_shift = 0;
 884                keep_mask = 0xf0;
 885                break;
 886        }
 887
 888        mutex_lock(&data->update_lock);
 889        data->temp_tolerance[nr] = TOL_TEMP_TO_REG(val);
 890        target_mask = w83791d_read(client,
 891                        W83791D_REG_TEMP_TOL[reg_idx]) & keep_mask;
 892        w83791d_write(client, W83791D_REG_TEMP_TOL[reg_idx],
 893                        (data->temp_tolerance[nr] << val_shift) | target_mask);
 894        mutex_unlock(&data->update_lock);
 895        return count;
 896}
 897
 898static struct sensor_device_attribute sda_temp_tolerance[] = {
 899        SENSOR_ATTR(temp1_tolerance, S_IWUSR | S_IRUGO,
 900                        show_temp_tolerance, store_temp_tolerance, 0),
 901        SENSOR_ATTR(temp2_tolerance, S_IWUSR | S_IRUGO,
 902                        show_temp_tolerance, store_temp_tolerance, 1),
 903        SENSOR_ATTR(temp3_tolerance, S_IWUSR | S_IRUGO,
 904                        show_temp_tolerance, store_temp_tolerance, 2),
 905};
 906
 907/* read/write the temperature1, includes measured value and limits */
 908static ssize_t show_temp1(struct device *dev, struct device_attribute *devattr,
 909                                char *buf)
 910{
 911        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 912        struct w83791d_data *data = w83791d_update_device(dev);
 913        return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[attr->index]));
 914}
 915
 916static ssize_t store_temp1(struct device *dev, struct device_attribute *devattr,
 917                                const char *buf, size_t count)
 918{
 919        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 920        struct i2c_client *client = to_i2c_client(dev);
 921        struct w83791d_data *data = i2c_get_clientdata(client);
 922        long val = simple_strtol(buf, NULL, 10);
 923        int nr = attr->index;
 924
 925        mutex_lock(&data->update_lock);
 926        data->temp1[nr] = TEMP1_TO_REG(val);
 927        w83791d_write(client, W83791D_REG_TEMP1[nr], data->temp1[nr]);
 928        mutex_unlock(&data->update_lock);
 929        return count;
 930}
 931
 932/* read/write temperature2-3, includes measured value and limits */
 933static ssize_t show_temp23(struct device *dev, struct device_attribute *devattr,
 934                                char *buf)
 935{
 936        struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
 937        struct w83791d_data *data = w83791d_update_device(dev);
 938        int nr = attr->nr;
 939        int index = attr->index;
 940        return sprintf(buf, "%d\n", TEMP23_FROM_REG(data->temp_add[nr][index]));
 941}
 942
 943static ssize_t store_temp23(struct device *dev,
 944                                struct device_attribute *devattr,
 945                                const char *buf, size_t count)
 946{
 947        struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
 948        struct i2c_client *client = to_i2c_client(dev);
 949        struct w83791d_data *data = i2c_get_clientdata(client);
 950        long val = simple_strtol(buf, NULL, 10);
 951        int nr = attr->nr;
 952        int index = attr->index;
 953
 954        mutex_lock(&data->update_lock);
 955        data->temp_add[nr][index] = TEMP23_TO_REG(val);
 956        w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2],
 957                                data->temp_add[nr][index] >> 8);
 958        w83791d_write(client, W83791D_REG_TEMP_ADD[nr][index * 2 + 1],
 959                                data->temp_add[nr][index] & 0x80);
 960        mutex_unlock(&data->update_lock);
 961
 962        return count;
 963}
 964
 965static struct sensor_device_attribute_2 sda_temp_input[] = {
 966        SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0),
 967        SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0),
 968        SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0),
 969};
 970
 971static struct sensor_device_attribute_2 sda_temp_max[] = {
 972        SENSOR_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,
 973                        show_temp1, store_temp1, 0, 1),
 974        SENSOR_ATTR_2(temp2_max, S_IRUGO | S_IWUSR,
 975                        show_temp23, store_temp23, 0, 1),
 976        SENSOR_ATTR_2(temp3_max, S_IRUGO | S_IWUSR,
 977                        show_temp23, store_temp23, 1, 1),
 978};
 979
 980static struct sensor_device_attribute_2 sda_temp_max_hyst[] = {
 981        SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,
 982                        show_temp1, store_temp1, 0, 2),
 983        SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
 984                        show_temp23, store_temp23, 0, 2),
 985        SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,
 986                        show_temp23, store_temp23, 1, 2),
 987};
 988
 989/* Note: The bitmask for the beep enable/disable is different than
 990   the bitmask for the alarm. */
 991static struct sensor_device_attribute sda_temp_beep[] = {
 992        SENSOR_ATTR(temp1_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 4),
 993        SENSOR_ATTR(temp2_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 5),
 994        SENSOR_ATTR(temp3_beep, S_IWUSR | S_IRUGO, show_beep, store_beep, 1),
 995};
 996
 997static struct sensor_device_attribute sda_temp_alarm[] = {
 998        SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),
 999        SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),
1000        SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),
1001};
1002
1003/* get reatime status of all sensors items: voltage, temp, fan */
1004static ssize_t show_alarms_reg(struct device *dev,
1005                                struct device_attribute *attr, char *buf)
1006{
1007        struct w83791d_data *data = w83791d_update_device(dev);
1008        return sprintf(buf, "%u\n", data->alarms);
1009}
1010
1011static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL);
1012
1013/* Beep control */
1014
1015#define GLOBAL_BEEP_ENABLE_SHIFT        15
1016#define GLOBAL_BEEP_ENABLE_MASK         (1 << GLOBAL_BEEP_ENABLE_SHIFT)
1017
1018static ssize_t show_beep_enable(struct device *dev,
1019                                struct device_attribute *attr, char *buf)
1020{
1021        struct w83791d_data *data = w83791d_update_device(dev);
1022        return sprintf(buf, "%d\n", data->beep_enable);
1023}
1024
1025static ssize_t show_beep_mask(struct device *dev,
1026                                struct device_attribute *attr, char *buf)
1027{
1028        struct w83791d_data *data = w83791d_update_device(dev);
1029        return sprintf(buf, "%d\n", BEEP_MASK_FROM_REG(data->beep_mask));
1030}
1031
1032
1033static ssize_t store_beep_mask(struct device *dev,
1034                                struct device_attribute *attr,
1035                                const char *buf, size_t count)
1036{
1037        struct i2c_client *client = to_i2c_client(dev);
1038        struct w83791d_data *data = i2c_get_clientdata(client);
1039        long val = simple_strtol(buf, NULL, 10);
1040        int i;
1041
1042        mutex_lock(&data->update_lock);
1043
1044        /* The beep_enable state overrides any enabling request from
1045           the masks */
1046        data->beep_mask = BEEP_MASK_TO_REG(val) & ~GLOBAL_BEEP_ENABLE_MASK;
1047        data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);
1048
1049        val = data->beep_mask;
1050
1051        for (i = 0; i < 3; i++) {
1052                w83791d_write(client, W83791D_REG_BEEP_CTRL[i], (val & 0xff));
1053                val >>= 8;
1054        }
1055
1056        mutex_unlock(&data->update_lock);
1057
1058        return count;
1059}
1060
1061static ssize_t store_beep_enable(struct device *dev,
1062                                struct device_attribute *attr,
1063                                const char *buf, size_t count)
1064{
1065        struct i2c_client *client = to_i2c_client(dev);
1066        struct w83791d_data *data = i2c_get_clientdata(client);
1067        long val = simple_strtol(buf, NULL, 10);
1068
1069        mutex_lock(&data->update_lock);
1070
1071        data->beep_enable = val ? 1 : 0;
1072
1073        /* Keep the full mask value in sync with the current enable */
1074        data->beep_mask &= ~GLOBAL_BEEP_ENABLE_MASK;
1075        data->beep_mask |= (data->beep_enable << GLOBAL_BEEP_ENABLE_SHIFT);
1076
1077        /* The global control is in the second beep control register
1078           so only need to update that register */
1079        val = (data->beep_mask >> 8) & 0xff;
1080
1081        w83791d_write(client, W83791D_REG_BEEP_CTRL[1], val);
1082
1083        mutex_unlock(&data->update_lock);
1084
1085        return count;
1086}
1087
1088static struct sensor_device_attribute sda_beep_ctrl[] = {
1089        SENSOR_ATTR(beep_enable, S_IRUGO | S_IWUSR,
1090                        show_beep_enable, store_beep_enable, 0),
1091        SENSOR_ATTR(beep_mask, S_IRUGO | S_IWUSR,
1092                        show_beep_mask, store_beep_mask, 1)
1093};
1094
1095/* cpu voltage regulation information */
1096static ssize_t show_vid_reg(struct device *dev,
1097                                struct device_attribute *attr, char *buf)
1098{
1099        struct w83791d_data *data = w83791d_update_device(dev);
1100        return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
1101}
1102
1103static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL);
1104
1105static ssize_t show_vrm_reg(struct device *dev,
1106                                struct device_attribute *attr, char *buf)
1107{
1108        struct w83791d_data *data = dev_get_drvdata(dev);
1109        return sprintf(buf, "%d\n", data->vrm);
1110}
1111
1112static ssize_t store_vrm_reg(struct device *dev,
1113                                struct device_attribute *attr,
1114                                const char *buf, size_t count)
1115{
1116        struct w83791d_data *data = dev_get_drvdata(dev);
1117
1118        /* No lock needed as vrm is internal to the driver
1119           (not read from a chip register) and so is not
1120           updated in w83791d_update_device() */
1121        data->vrm = simple_strtoul(buf, NULL, 10);
1122
1123        return count;
1124}
1125
1126static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
1127
1128#define IN_UNIT_ATTRS(X) \
1129        &sda_in_input[X].dev_attr.attr, \
1130        &sda_in_min[X].dev_attr.attr,   \
1131        &sda_in_max[X].dev_attr.attr,   \
1132        &sda_in_beep[X].dev_attr.attr,  \
1133        &sda_in_alarm[X].dev_attr.attr
1134
1135#define FAN_UNIT_ATTRS(X) \
1136        &sda_fan_input[X].dev_attr.attr,        \
1137        &sda_fan_min[X].dev_attr.attr,          \
1138        &sda_fan_div[X].dev_attr.attr,          \
1139        &sda_fan_beep[X].dev_attr.attr,         \
1140        &sda_fan_alarm[X].dev_attr.attr
1141
1142#define TEMP_UNIT_ATTRS(X) \
1143        &sda_temp_input[X].dev_attr.attr,       \
1144        &sda_temp_max[X].dev_attr.attr,         \
1145        &sda_temp_max_hyst[X].dev_attr.attr,    \
1146        &sda_temp_beep[X].dev_attr.attr,        \
1147        &sda_temp_alarm[X].dev_attr.attr
1148
1149static struct attribute *w83791d_attributes[] = {
1150        IN_UNIT_ATTRS(0),
1151        IN_UNIT_ATTRS(1),
1152        IN_UNIT_ATTRS(2),
1153        IN_UNIT_ATTRS(3),
1154        IN_UNIT_ATTRS(4),
1155        IN_UNIT_ATTRS(5),
1156        IN_UNIT_ATTRS(6),
1157        IN_UNIT_ATTRS(7),
1158        IN_UNIT_ATTRS(8),
1159        IN_UNIT_ATTRS(9),
1160        FAN_UNIT_ATTRS(0),
1161        FAN_UNIT_ATTRS(1),
1162        FAN_UNIT_ATTRS(2),
1163        TEMP_UNIT_ATTRS(0),
1164        TEMP_UNIT_ATTRS(1),
1165        TEMP_UNIT_ATTRS(2),
1166        &dev_attr_alarms.attr,
1167        &sda_beep_ctrl[0].dev_attr.attr,
1168        &sda_beep_ctrl[1].dev_attr.attr,
1169        &dev_attr_cpu0_vid.attr,
1170        &dev_attr_vrm.attr,
1171        &sda_pwm[0].dev_attr.attr,
1172        &sda_pwm[1].dev_attr.attr,
1173        &sda_pwm[2].dev_attr.attr,
1174        &sda_pwmenable[0].dev_attr.attr,
1175        &sda_pwmenable[1].dev_attr.attr,
1176        &sda_pwmenable[2].dev_attr.attr,
1177        &sda_temp_target[0].dev_attr.attr,
1178        &sda_temp_target[1].dev_attr.attr,
1179        &sda_temp_target[2].dev_attr.attr,
1180        &sda_temp_tolerance[0].dev_attr.attr,
1181        &sda_temp_tolerance[1].dev_attr.attr,
1182        &sda_temp_tolerance[2].dev_attr.attr,
1183        NULL
1184};
1185
1186static const struct attribute_group w83791d_group = {
1187        .attrs = w83791d_attributes,
1188};
1189
1190/* Separate group of attributes for fan/pwm 4-5. Their pins can also be
1191   in use for GPIO in which case their sysfs-interface should not be made
1192   available */
1193static struct attribute *w83791d_attributes_fanpwm45[] = {
1194        FAN_UNIT_ATTRS(3),
1195        FAN_UNIT_ATTRS(4),
1196        &sda_pwm[3].dev_attr.attr,
1197        &sda_pwm[4].dev_attr.attr,
1198        NULL
1199};
1200
1201static const struct attribute_group w83791d_group_fanpwm45 = {
1202        .attrs = w83791d_attributes_fanpwm45,
1203};
1204
1205static int w83791d_detect_subclients(struct i2c_client *client)
1206{
1207        struct i2c_adapter *adapter = client->adapter;
1208        struct w83791d_data *data = i2c_get_clientdata(client);
1209        int address = client->addr;
1210        int i, id, err;
1211        u8 val;
1212
1213        id = i2c_adapter_id(adapter);
1214        if (force_subclients[0] == id && force_subclients[1] == address) {
1215                for (i = 2; i <= 3; i++) {
1216                        if (force_subclients[i] < 0x48 ||
1217                            force_subclients[i] > 0x4f) {
1218                                dev_err(&client->dev,
1219                                        "invalid subclient "
1220                                        "address %d; must be 0x48-0x4f\n",
1221                                        force_subclients[i]);
1222                                err = -ENODEV;
1223                                goto error_sc_0;
1224                        }
1225                }
1226                w83791d_write(client, W83791D_REG_I2C_SUBADDR,
1227                                        (force_subclients[2] & 0x07) |
1228                                        ((force_subclients[3] & 0x07) << 4));
1229        }
1230
1231        val = w83791d_read(client, W83791D_REG_I2C_SUBADDR);
1232        if (!(val & 0x08)) {
1233                data->lm75[0] = i2c_new_dummy(adapter, 0x48 + (val & 0x7));
1234        }
1235        if (!(val & 0x80)) {
1236                if ((data->lm75[0] != NULL) &&
1237                                ((val & 0x7) == ((val >> 4) & 0x7))) {
1238                        dev_err(&client->dev,
1239                                "duplicate addresses 0x%x, "
1240                                "use force_subclient\n",
1241                                data->lm75[0]->addr);
1242                        err = -ENODEV;
1243                        goto error_sc_1;
1244                }
1245                data->lm75[1] = i2c_new_dummy(adapter,
1246                                              0x48 + ((val >> 4) & 0x7));
1247        }
1248
1249        return 0;
1250
1251/* Undo inits in case of errors */
1252
1253error_sc_1:
1254        if (data->lm75[0] != NULL)
1255                i2c_unregister_device(data->lm75[0]);
1256error_sc_0:
1257        return err;
1258}
1259
1260
1261/* Return 0 if detection is successful, -ENODEV otherwise */
1262static int w83791d_detect(struct i2c_client *client, int kind,
1263                          struct i2c_board_info *info)
1264{
1265        struct i2c_adapter *adapter = client->adapter;
1266        int val1, val2;
1267        unsigned short address = client->addr;
1268
1269        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1270                return -ENODEV;
1271        }
1272
1273        /* The w83791d may be stuck in some other bank than bank 0. This may
1274           make reading other information impossible. Specify a force=...
1275           parameter, and the Winbond will be reset to the right bank. */
1276        if (kind < 0) {
1277                if (w83791d_read(client, W83791D_REG_CONFIG) & 0x80) {
1278                        return -ENODEV;
1279                }
1280                val1 = w83791d_read(client, W83791D_REG_BANK);
1281                val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1282                /* Check for Winbond ID if in bank 0 */
1283                if (!(val1 & 0x07)) {
1284                        /* yes it is Bank0 */
1285                        if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1286                            ((val1 & 0x80) && (val2 != 0x5c))) {
1287                                return -ENODEV;
1288                        }
1289                }
1290                /* If Winbond chip, address of chip and W83791D_REG_I2C_ADDR
1291                   should match */
1292                if (w83791d_read(client, W83791D_REG_I2C_ADDR) != address) {
1293                        return -ENODEV;
1294                }
1295        }
1296
1297        /* We either have a force parameter or we have reason to
1298           believe it is a Winbond chip. Either way, we want bank 0 and
1299           Vendor ID high byte */
1300        val1 = w83791d_read(client, W83791D_REG_BANK) & 0x78;
1301        w83791d_write(client, W83791D_REG_BANK, val1 | 0x80);
1302
1303        /* Verify it is a Winbond w83791d */
1304        if (kind <= 0) {
1305                /* get vendor ID */
1306                val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1307                if (val2 != 0x5c) {     /* the vendor is NOT Winbond */
1308                        return -ENODEV;
1309                }
1310                val1 = w83791d_read(client, W83791D_REG_WCHIPID);
1311                if (val1 == 0x71) {
1312                        kind = w83791d;
1313                } else {
1314                        if (kind == 0)
1315                                dev_warn(&adapter->dev,
1316                                        "w83791d: Ignoring 'force' parameter "
1317                                        "for unknown chip at adapter %d, "
1318                                        "address 0x%02x\n",
1319                                        i2c_adapter_id(adapter), address);
1320                        return -ENODEV;
1321                }
1322        }
1323
1324        strlcpy(info->type, "w83791d", I2C_NAME_SIZE);
1325
1326        return 0;
1327}
1328
1329static int w83791d_probe(struct i2c_client *client,
1330                         const struct i2c_device_id *id)
1331{
1332        struct w83791d_data *data;
1333        struct device *dev = &client->dev;
1334        int i, err;
1335        u8 has_fanpwm45;
1336
1337#ifdef DEBUG
1338        int val1;
1339        val1 = w83791d_read(client, W83791D_REG_DID_VID4);
1340        dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n",
1341                        (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1);
1342#endif
1343
1344        data = kzalloc(sizeof(struct w83791d_data), GFP_KERNEL);
1345        if (!data) {
1346                err = -ENOMEM;
1347                goto error0;
1348        }
1349
1350        i2c_set_clientdata(client, data);
1351        mutex_init(&data->update_lock);
1352
1353        err = w83791d_detect_subclients(client);
1354        if (err)
1355                goto error1;
1356
1357        /* Initialize the chip */
1358        w83791d_init_client(client);
1359
1360        /* If the fan_div is changed, make sure there is a rational
1361           fan_min in place */
1362        for (i = 0; i < NUMBER_OF_FANIN; i++) {
1363                data->fan_min[i] = w83791d_read(client, W83791D_REG_FAN_MIN[i]);
1364        }
1365
1366        /* Register sysfs hooks */
1367        if ((err = sysfs_create_group(&client->dev.kobj, &w83791d_group)))
1368                goto error3;
1369
1370        /* Check if pins of fan/pwm 4-5 are in use as GPIO */
1371        has_fanpwm45 = w83791d_read(client, W83791D_REG_GPIO) & 0x10;
1372        if (has_fanpwm45) {
1373                err = sysfs_create_group(&client->dev.kobj,
1374                                         &w83791d_group_fanpwm45);
1375                if (err)
1376                        goto error4;
1377        }
1378
1379        /* Everything is ready, now register the working device */
1380        data->hwmon_dev = hwmon_device_register(dev);
1381        if (IS_ERR(data->hwmon_dev)) {
1382                err = PTR_ERR(data->hwmon_dev);
1383                goto error5;
1384        }
1385
1386        return 0;
1387
1388error5:
1389        if (has_fanpwm45)
1390                sysfs_remove_group(&client->dev.kobj, &w83791d_group_fanpwm45);
1391error4:
1392        sysfs_remove_group(&client->dev.kobj, &w83791d_group);
1393error3:
1394        if (data->lm75[0] != NULL)
1395                i2c_unregister_device(data->lm75[0]);
1396        if (data->lm75[1] != NULL)
1397                i2c_unregister_device(data->lm75[1]);
1398error1:
1399        kfree(data);
1400error0:
1401        return err;
1402}
1403
1404static int w83791d_remove(struct i2c_client *client)
1405{
1406        struct w83791d_data *data = i2c_get_clientdata(client);
1407
1408        hwmon_device_unregister(data->hwmon_dev);
1409        sysfs_remove_group(&client->dev.kobj, &w83791d_group);
1410
1411        if (data->lm75[0] != NULL)
1412                i2c_unregister_device(data->lm75[0]);
1413        if (data->lm75[1] != NULL)
1414                i2c_unregister_device(data->lm75[1]);
1415
1416        kfree(data);
1417        return 0;
1418}
1419
1420static void w83791d_init_client(struct i2c_client *client)
1421{
1422        struct w83791d_data *data = i2c_get_clientdata(client);
1423        u8 tmp;
1424        u8 old_beep;
1425
1426        /* The difference between reset and init is that reset
1427           does a hard reset of the chip via index 0x40, bit 7,
1428           but init simply forces certain registers to have "sane"
1429           values. The hope is that the BIOS has done the right
1430           thing (which is why the default is reset=0, init=0),
1431           but if not, reset is the hard hammer and init
1432           is the soft mallet both of which are trying to whack
1433           things into place...
1434           NOTE: The data sheet makes a distinction between
1435           "power on defaults" and "reset by MR". As far as I can tell,
1436           the hard reset puts everything into a power-on state so I'm
1437           not sure what "reset by MR" means or how it can happen.
1438           */
1439        if (reset || init) {
1440                /* keep some BIOS settings when we... */
1441                old_beep = w83791d_read(client, W83791D_REG_BEEP_CONFIG);
1442
1443                if (reset) {
1444                        /* ... reset the chip and ... */
1445                        w83791d_write(client, W83791D_REG_CONFIG, 0x80);
1446                }
1447
1448                /* ... disable power-on abnormal beep */
1449                w83791d_write(client, W83791D_REG_BEEP_CONFIG, old_beep | 0x80);
1450
1451                /* disable the global beep (not done by hard reset) */
1452                tmp = w83791d_read(client, W83791D_REG_BEEP_CTRL[1]);
1453                w83791d_write(client, W83791D_REG_BEEP_CTRL[1], tmp & 0xef);
1454
1455                if (init) {
1456                        /* Make sure monitoring is turned on for add-ons */
1457                        tmp = w83791d_read(client, W83791D_REG_TEMP2_CONFIG);
1458                        if (tmp & 1) {
1459                                w83791d_write(client, W83791D_REG_TEMP2_CONFIG,
1460                                        tmp & 0xfe);
1461                        }
1462
1463                        tmp = w83791d_read(client, W83791D_REG_TEMP3_CONFIG);
1464                        if (tmp & 1) {
1465                                w83791d_write(client, W83791D_REG_TEMP3_CONFIG,
1466                                        tmp & 0xfe);
1467                        }
1468
1469                        /* Start monitoring */
1470                        tmp = w83791d_read(client, W83791D_REG_CONFIG) & 0xf7;
1471                        w83791d_write(client, W83791D_REG_CONFIG, tmp | 0x01);
1472                }
1473        }
1474
1475        data->vrm = vid_which_vrm();
1476}
1477
1478static struct w83791d_data *w83791d_update_device(struct device *dev)
1479{
1480        struct i2c_client *client = to_i2c_client(dev);
1481        struct w83791d_data *data = i2c_get_clientdata(client);
1482        int i, j;
1483        u8 reg_array_tmp[3];
1484        u8 vbat_reg;
1485
1486        mutex_lock(&data->update_lock);
1487
1488        if (time_after(jiffies, data->last_updated + (HZ * 3))
1489                        || !data->valid) {
1490                dev_dbg(dev, "Starting w83791d device update\n");
1491
1492                /* Update the voltages measured value and limits */
1493                for (i = 0; i < NUMBER_OF_VIN; i++) {
1494                        data->in[i] = w83791d_read(client,
1495                                                W83791D_REG_IN[i]);
1496                        data->in_max[i] = w83791d_read(client,
1497                                                W83791D_REG_IN_MAX[i]);
1498                        data->in_min[i] = w83791d_read(client,
1499                                                W83791D_REG_IN_MIN[i]);
1500                }
1501
1502                /* Update the fan counts and limits */
1503                for (i = 0; i < NUMBER_OF_FANIN; i++) {
1504                        /* Update the Fan measured value and limits */
1505                        data->fan[i] = w83791d_read(client,
1506                                                W83791D_REG_FAN[i]);
1507                        data->fan_min[i] = w83791d_read(client,
1508                                                W83791D_REG_FAN_MIN[i]);
1509                }
1510
1511                /* Update the fan divisor */
1512                for (i = 0; i < 3; i++) {
1513                        reg_array_tmp[i] = w83791d_read(client,
1514                                                W83791D_REG_FAN_DIV[i]);
1515                }
1516                data->fan_div[0] = (reg_array_tmp[0] >> 4) & 0x03;
1517                data->fan_div[1] = (reg_array_tmp[0] >> 6) & 0x03;
1518                data->fan_div[2] = (reg_array_tmp[1] >> 6) & 0x03;
1519                data->fan_div[3] = reg_array_tmp[2] & 0x07;
1520                data->fan_div[4] = (reg_array_tmp[2] >> 4) & 0x07;
1521
1522                /* The fan divisor for fans 0-2 get bit 2 from
1523                   bits 5-7 respectively of vbat register */
1524                vbat_reg = w83791d_read(client, W83791D_REG_VBAT);
1525                for (i = 0; i < 3; i++)
1526                        data->fan_div[i] |= (vbat_reg >> (3 + i)) & 0x04;
1527
1528                /* Update PWM duty cycle */
1529                for (i = 0; i < NUMBER_OF_PWM; i++) {
1530                        data->pwm[i] =  w83791d_read(client,
1531                                                W83791D_REG_PWM[i]);
1532                }
1533
1534                /* Update PWM enable status */
1535                for (i = 0; i < 2; i++) {
1536                        reg_array_tmp[i] = w83791d_read(client,
1537                                                W83791D_REG_FAN_CFG[i]);
1538                }
1539                data->pwm_enable[0] = (reg_array_tmp[0] >> 2) & 0x03;
1540                data->pwm_enable[1] = (reg_array_tmp[0] >> 4) & 0x03;
1541                data->pwm_enable[2] = (reg_array_tmp[1] >> 2) & 0x03;
1542
1543                /* Update PWM target temperature */
1544                for (i = 0; i < 3; i++) {
1545                        data->temp_target[i] = w83791d_read(client,
1546                                W83791D_REG_TEMP_TARGET[i]) & 0x7f;
1547                }
1548
1549                /* Update PWM temperature tolerance */
1550                for (i = 0; i < 2; i++) {
1551                        reg_array_tmp[i] = w83791d_read(client,
1552                                        W83791D_REG_TEMP_TOL[i]);
1553                }
1554                data->temp_tolerance[0] = reg_array_tmp[0] & 0x0f;
1555                data->temp_tolerance[1] = (reg_array_tmp[0] >> 4) & 0x0f;
1556                data->temp_tolerance[2] = reg_array_tmp[1] & 0x0f;
1557
1558                /* Update the first temperature sensor */
1559                for (i = 0; i < 3; i++) {
1560                        data->temp1[i] = w83791d_read(client,
1561                                                W83791D_REG_TEMP1[i]);
1562                }
1563
1564                /* Update the rest of the temperature sensors */
1565                for (i = 0; i < 2; i++) {
1566                        for (j = 0; j < 3; j++) {
1567                                data->temp_add[i][j] =
1568                                        (w83791d_read(client,
1569                                        W83791D_REG_TEMP_ADD[i][j * 2]) << 8) |
1570                                        w83791d_read(client,
1571                                        W83791D_REG_TEMP_ADD[i][j * 2 + 1]);
1572                        }
1573                }
1574
1575                /* Update the realtime status */
1576                data->alarms =
1577                        w83791d_read(client, W83791D_REG_ALARM1) +
1578                        (w83791d_read(client, W83791D_REG_ALARM2) << 8) +
1579                        (w83791d_read(client, W83791D_REG_ALARM3) << 16);
1580
1581                /* Update the beep configuration information */
1582                data->beep_mask =
1583                        w83791d_read(client, W83791D_REG_BEEP_CTRL[0]) +
1584                        (w83791d_read(client, W83791D_REG_BEEP_CTRL[1]) << 8) +
1585                        (w83791d_read(client, W83791D_REG_BEEP_CTRL[2]) << 16);
1586
1587                /* Extract global beep enable flag */
1588                data->beep_enable =
1589                        (data->beep_mask >> GLOBAL_BEEP_ENABLE_SHIFT) & 0x01;
1590
1591                /* Update the cpu voltage information */
1592                i = w83791d_read(client, W83791D_REG_VID_FANDIV);
1593                data->vid = i & 0x0f;
1594                data->vid |= (w83791d_read(client, W83791D_REG_DID_VID4) & 0x01)
1595                                << 4;
1596
1597                data->last_updated = jiffies;
1598                data->valid = 1;
1599        }
1600
1601        mutex_unlock(&data->update_lock);
1602
1603#ifdef DEBUG
1604        w83791d_print_debug(data, dev);
1605#endif
1606
1607        return data;
1608}
1609
1610#ifdef DEBUG
1611static void w83791d_print_debug(struct w83791d_data *data, struct device *dev)
1612{
1613        int i = 0, j = 0;
1614
1615        dev_dbg(dev, "======Start of w83791d debug values======\n");
1616        dev_dbg(dev, "%d set of Voltages: ===>\n", NUMBER_OF_VIN);
1617        for (i = 0; i < NUMBER_OF_VIN; i++) {
1618                dev_dbg(dev, "vin[%d] is:     0x%02x\n", i, data->in[i]);
1619                dev_dbg(dev, "vin[%d] min is: 0x%02x\n", i, data->in_min[i]);
1620                dev_dbg(dev, "vin[%d] max is: 0x%02x\n", i, data->in_max[i]);
1621        }
1622        dev_dbg(dev, "%d set of Fan Counts/Divisors: ===>\n", NUMBER_OF_FANIN);
1623        for (i = 0; i < NUMBER_OF_FANIN; i++) {
1624                dev_dbg(dev, "fan[%d] is:     0x%02x\n", i, data->fan[i]);
1625                dev_dbg(dev, "fan[%d] min is: 0x%02x\n", i, data->fan_min[i]);
1626                dev_dbg(dev, "fan_div[%d] is: 0x%02x\n", i, data->fan_div[i]);
1627        }
1628
1629        /* temperature math is signed, but only print out the
1630           bits that matter */
1631        dev_dbg(dev, "%d set of Temperatures: ===>\n", NUMBER_OF_TEMPIN);
1632        for (i = 0; i < 3; i++) {
1633                dev_dbg(dev, "temp1[%d] is: 0x%02x\n", i, (u8) data->temp1[i]);
1634        }
1635        for (i = 0; i < 2; i++) {
1636                for (j = 0; j < 3; j++) {
1637                        dev_dbg(dev, "temp_add[%d][%d] is: 0x%04x\n", i, j,
1638                                (u16) data->temp_add[i][j]);
1639                }
1640        }
1641
1642        dev_dbg(dev, "Misc Information: ===>\n");
1643        dev_dbg(dev, "alarm is:     0x%08x\n", data->alarms);
1644        dev_dbg(dev, "beep_mask is: 0x%08x\n", data->beep_mask);
1645        dev_dbg(dev, "beep_enable is: %d\n", data->beep_enable);
1646        dev_dbg(dev, "vid is: 0x%02x\n", data->vid);
1647        dev_dbg(dev, "vrm is: 0x%02x\n", data->vrm);
1648        dev_dbg(dev, "=======End of w83791d debug values========\n");
1649        dev_dbg(dev, "\n");
1650}
1651#endif
1652
1653static int __init sensors_w83791d_init(void)
1654{
1655        return i2c_add_driver(&w83791d_driver);
1656}
1657
1658static void __exit sensors_w83791d_exit(void)
1659{
1660        i2c_del_driver(&w83791d_driver);
1661}
1662
1663MODULE_AUTHOR("Charles Spirakis <bezaur@gmail.com>");
1664MODULE_DESCRIPTION("W83791D driver");
1665MODULE_LICENSE("GPL");
1666
1667module_init(sensors_w83791d_init);
1668module_exit(sensors_w83791d_exit);
1669
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.