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