linux/drivers/hwmon/w83l786ng.c
<<
>>
Prefs
   1/*
   2 * w83l786ng.c - Linux kernel driver for hardware monitoring
   3 * Copyright (c) 2007 Kevin Lo <kevlo@kevlo.org>
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation - version 2.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17 * 02110-1301 USA.
  18 */
  19
  20/*
  21 * Supports following chips:
  22 *
  23 * Chip         #vin    #fanin  #pwm    #temp   wchipid vendid  i2c     ISA
  24 * w83l786ng    3       2       2       2       0x7b    0x5ca3  yes     no
  25 */
  26
  27#include <linux/module.h>
  28#include <linux/init.h>
  29#include <linux/slab.h>
  30#include <linux/i2c.h>
  31#include <linux/hwmon.h>
  32#include <linux/hwmon-vid.h>
  33#include <linux/hwmon-sysfs.h>
  34#include <linux/err.h>
  35#include <linux/mutex.h>
  36#include <linux/jiffies.h>
  37
  38/* Addresses to scan */
  39static const unsigned short normal_i2c[] = { 0x2e, 0x2f, I2C_CLIENT_END };
  40
  41/* Insmod parameters */
  42
  43static bool reset;
  44module_param(reset, bool, 0);
  45MODULE_PARM_DESC(reset, "Set to 1 to reset chip, not recommended");
  46
  47#define W83L786NG_REG_IN_MIN(nr)        (0x2C + (nr) * 2)
  48#define W83L786NG_REG_IN_MAX(nr)        (0x2B + (nr) * 2)
  49#define W83L786NG_REG_IN(nr)            ((nr) + 0x20)
  50
  51#define W83L786NG_REG_FAN(nr)           ((nr) + 0x28)
  52#define W83L786NG_REG_FAN_MIN(nr)       ((nr) + 0x3B)
  53
  54#define W83L786NG_REG_CONFIG            0x40
  55#define W83L786NG_REG_ALARM1            0x41
  56#define W83L786NG_REG_ALARM2            0x42
  57#define W83L786NG_REG_GPIO_EN           0x47
  58#define W83L786NG_REG_MAN_ID2           0x4C
  59#define W83L786NG_REG_MAN_ID1           0x4D
  60#define W83L786NG_REG_CHIP_ID           0x4E
  61
  62#define W83L786NG_REG_DIODE             0x53
  63#define W83L786NG_REG_FAN_DIV           0x54
  64#define W83L786NG_REG_FAN_CFG           0x80
  65
  66#define W83L786NG_REG_TOLERANCE         0x8D
  67
  68static const u8 W83L786NG_REG_TEMP[2][3] = {
  69        { 0x25,         /* TEMP 0 in DataSheet */
  70          0x35,         /* TEMP 0 Over in DataSheet */
  71          0x36 },       /* TEMP 0 Hyst in DataSheet */
  72        { 0x26,         /* TEMP 1 in DataSheet */
  73          0x37,         /* TEMP 1 Over in DataSheet */
  74          0x38 }        /* TEMP 1 Hyst in DataSheet */
  75};
  76
  77static const u8 W83L786NG_PWM_MODE_SHIFT[] = {6, 7};
  78static const u8 W83L786NG_PWM_ENABLE_SHIFT[] = {2, 4};
  79
  80/* FAN Duty Cycle, be used to control */
  81static const u8 W83L786NG_REG_PWM[] = {0x81, 0x87};
  82
  83
  84static inline u8
  85FAN_TO_REG(long rpm, int div)
  86{
  87        if (rpm == 0)
  88                return 255;
  89        rpm = clamp_val(rpm, 1, 1000000);
  90        return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
  91}
  92
  93#define FAN_FROM_REG(val, div)  ((val) == 0   ? -1 : \
  94                                ((val) == 255 ? 0 : \
  95                                1350000 / ((val) * (div))))
  96
  97/* for temp */
  98#define TEMP_TO_REG(val)        (clamp_val(((val) < 0 ? (val) + 0x100 * 1000 \
  99                                                      : (val)) / 1000, 0, 0xff))
 100#define TEMP_FROM_REG(val)      (((val) & 0x80 ? \
 101                                  (val) - 0x100 : (val)) * 1000)
 102
 103/*
 104 * The analog voltage inputs have 8mV LSB. Since the sysfs output is
 105 * in mV as would be measured on the chip input pin, need to just
 106 * multiply/divide by 8 to translate from/to register values.
 107 */
 108#define IN_TO_REG(val)          (clamp_val((((val) + 4) / 8), 0, 255))
 109#define IN_FROM_REG(val)        ((val) * 8)
 110
 111#define DIV_FROM_REG(val)       (1 << (val))
 112
 113static inline u8
 114DIV_TO_REG(long val)
 115{
 116        int i;
 117        val = clamp_val(val, 1, 128) >> 1;
 118        for (i = 0; i < 7; i++) {
 119                if (val == 0)
 120                        break;
 121                val >>= 1;
 122        }
 123        return (u8)i;
 124}
 125
 126struct w83l786ng_data {
 127        struct i2c_client *client;
 128        struct mutex update_lock;
 129        char valid;                     /* !=0 if following fields are valid */
 130        unsigned long last_updated;     /* In jiffies */
 131        unsigned long last_nonvolatile; /* In jiffies, last time we update the
 132                                         * nonvolatile registers */
 133
 134        u8 in[3];
 135        u8 in_max[3];
 136        u8 in_min[3];
 137        u8 fan[2];
 138        u8 fan_div[2];
 139        u8 fan_min[2];
 140        u8 temp_type[2];
 141        u8 temp[2][3];
 142        u8 pwm[2];
 143        u8 pwm_mode[2]; /* 0->DC variable voltage
 144                         * 1->PWM variable duty cycle */
 145
 146        u8 pwm_enable[2]; /* 1->manual
 147                           * 2->thermal cruise (also called SmartFan I) */
 148        u8 tolerance[2];
 149};
 150
 151static u8
 152w83l786ng_read_value(struct i2c_client *client, u8 reg)
 153{
 154        return i2c_smbus_read_byte_data(client, reg);
 155}
 156
 157static int
 158w83l786ng_write_value(struct i2c_client *client, u8 reg, u8 value)
 159{
 160        return i2c_smbus_write_byte_data(client, reg, value);
 161}
 162
 163static struct w83l786ng_data *w83l786ng_update_device(struct device *dev)
 164{
 165        struct w83l786ng_data *data = dev_get_drvdata(dev);
 166        struct i2c_client *client = data->client;
 167        int i, j;
 168        u8 reg_tmp, pwmcfg;
 169
 170        mutex_lock(&data->update_lock);
 171        if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
 172            || !data->valid) {
 173                dev_dbg(&client->dev, "Updating w83l786ng data.\n");
 174
 175                /* Update the voltages measured value and limits */
 176                for (i = 0; i < 3; i++) {
 177                        data->in[i] = w83l786ng_read_value(client,
 178                            W83L786NG_REG_IN(i));
 179                        data->in_min[i] = w83l786ng_read_value(client,
 180                            W83L786NG_REG_IN_MIN(i));
 181                        data->in_max[i] = w83l786ng_read_value(client,
 182                            W83L786NG_REG_IN_MAX(i));
 183                }
 184
 185                /* Update the fan counts and limits */
 186                for (i = 0; i < 2; i++) {
 187                        data->fan[i] = w83l786ng_read_value(client,
 188                            W83L786NG_REG_FAN(i));
 189                        data->fan_min[i] = w83l786ng_read_value(client,
 190                            W83L786NG_REG_FAN_MIN(i));
 191                }
 192
 193                /* Update the fan divisor */
 194                reg_tmp = w83l786ng_read_value(client, W83L786NG_REG_FAN_DIV);
 195                data->fan_div[0] = reg_tmp & 0x07;
 196                data->fan_div[1] = (reg_tmp >> 4) & 0x07;
 197
 198                pwmcfg = w83l786ng_read_value(client, W83L786NG_REG_FAN_CFG);
 199                for (i = 0; i < 2; i++) {
 200                        data->pwm_mode[i] =
 201                            ((pwmcfg >> W83L786NG_PWM_MODE_SHIFT[i]) & 1)
 202                            ? 0 : 1;
 203                        data->pwm_enable[i] =
 204                            ((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 3) + 1;
 205                        data->pwm[i] =
 206                            (w83l786ng_read_value(client, W83L786NG_REG_PWM[i])
 207                             & 0x0f) * 0x11;
 208                }
 209
 210
 211                /* Update the temperature sensors */
 212                for (i = 0; i < 2; i++) {
 213                        for (j = 0; j < 3; j++) {
 214                                data->temp[i][j] = w83l786ng_read_value(client,
 215                                    W83L786NG_REG_TEMP[i][j]);
 216                        }
 217                }
 218
 219                /* Update Smart Fan I/II tolerance */
 220                reg_tmp = w83l786ng_read_value(client, W83L786NG_REG_TOLERANCE);
 221                data->tolerance[0] = reg_tmp & 0x0f;
 222                data->tolerance[1] = (reg_tmp >> 4) & 0x0f;
 223
 224                data->last_updated = jiffies;
 225                data->valid = 1;
 226
 227        }
 228
 229        mutex_unlock(&data->update_lock);
 230
 231        return data;
 232}
 233
 234/* following are the sysfs callback functions */
 235#define show_in_reg(reg) \
 236static ssize_t \
 237show_##reg(struct device *dev, struct device_attribute *attr, \
 238           char *buf) \
 239{ \
 240        int nr = to_sensor_dev_attr(attr)->index; \
 241        struct w83l786ng_data *data = w83l786ng_update_device(dev); \
 242        return sprintf(buf, "%d\n", IN_FROM_REG(data->reg[nr])); \
 243}
 244
 245show_in_reg(in)
 246show_in_reg(in_min)
 247show_in_reg(in_max)
 248
 249#define store_in_reg(REG, reg) \
 250static ssize_t \
 251store_in_##reg(struct device *dev, struct device_attribute *attr, \
 252               const char *buf, size_t count) \
 253{ \
 254        int nr = to_sensor_dev_attr(attr)->index; \
 255        struct w83l786ng_data *data = dev_get_drvdata(dev); \
 256        struct i2c_client *client = data->client; \
 257        unsigned long val; \
 258        int err = kstrtoul(buf, 10, &val); \
 259        if (err) \
 260                return err; \
 261        mutex_lock(&data->update_lock); \
 262        data->in_##reg[nr] = IN_TO_REG(val); \
 263        w83l786ng_write_value(client, W83L786NG_REG_IN_##REG(nr), \
 264                              data->in_##reg[nr]); \
 265        mutex_unlock(&data->update_lock); \
 266        return count; \
 267}
 268
 269store_in_reg(MIN, min)
 270store_in_reg(MAX, max)
 271
 272static struct sensor_device_attribute sda_in_input[] = {
 273        SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),
 274        SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
 275        SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
 276};
 277
 278static struct sensor_device_attribute sda_in_min[] = {
 279        SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
 280        SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
 281        SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
 282};
 283
 284static struct sensor_device_attribute sda_in_max[] = {
 285        SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
 286        SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
 287        SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
 288};
 289
 290#define show_fan_reg(reg) \
 291static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
 292                          char *buf) \
 293{ \
 294        int nr = to_sensor_dev_attr(attr)->index; \
 295        struct w83l786ng_data *data = w83l786ng_update_device(dev); \
 296        return sprintf(buf, "%d\n", \
 297                FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
 298}
 299
 300show_fan_reg(fan);
 301show_fan_reg(fan_min);
 302
 303static ssize_t
 304store_fan_min(struct device *dev, struct device_attribute *attr,
 305              const char *buf, size_t count)
 306{
 307        int nr = to_sensor_dev_attr(attr)->index;
 308        struct w83l786ng_data *data = dev_get_drvdata(dev);
 309        struct i2c_client *client = data->client;
 310        unsigned long val;
 311        int err;
 312
 313        err = kstrtoul(buf, 10, &val);
 314        if (err)
 315                return err;
 316
 317        mutex_lock(&data->update_lock);
 318        data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 319        w83l786ng_write_value(client, W83L786NG_REG_FAN_MIN(nr),
 320                              data->fan_min[nr]);
 321        mutex_unlock(&data->update_lock);
 322
 323        return count;
 324}
 325
 326static ssize_t
 327show_fan_div(struct device *dev, struct device_attribute *attr,
 328             char *buf)
 329{
 330        int nr = to_sensor_dev_attr(attr)->index;
 331        struct w83l786ng_data *data = w83l786ng_update_device(dev);
 332        return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr]));
 333}
 334
 335/*
 336 * Note: we save and restore the fan minimum here, because its value is
 337 * determined in part by the fan divisor.  This follows the principle of
 338 * least surprise; the user doesn't expect the fan minimum to change just
 339 * because the divisor changed.
 340 */
 341static ssize_t
 342store_fan_div(struct device *dev, struct device_attribute *attr,
 343              const char *buf, size_t count)
 344{
 345        int nr = to_sensor_dev_attr(attr)->index;
 346        struct w83l786ng_data *data = dev_get_drvdata(dev);
 347        struct i2c_client *client = data->client;
 348
 349        unsigned long min;
 350        u8 tmp_fan_div;
 351        u8 fan_div_reg;
 352        u8 keep_mask = 0;
 353        u8 new_shift = 0;
 354
 355        unsigned long val;
 356        int err;
 357
 358        err = kstrtoul(buf, 10, &val);
 359        if (err)
 360                return err;
 361
 362        /* Save fan_min */
 363        mutex_lock(&data->update_lock);
 364        min = FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr]));
 365
 366        data->fan_div[nr] = DIV_TO_REG(val);
 367
 368        switch (nr) {
 369        case 0:
 370                keep_mask = 0xf8;
 371                new_shift = 0;
 372                break;
 373        case 1:
 374                keep_mask = 0x8f;
 375                new_shift = 4;
 376                break;
 377        }
 378
 379        fan_div_reg = w83l786ng_read_value(client, W83L786NG_REG_FAN_DIV)
 380                                           & keep_mask;
 381
 382        tmp_fan_div = (data->fan_div[nr] << new_shift) & ~keep_mask;
 383
 384        w83l786ng_write_value(client, W83L786NG_REG_FAN_DIV,
 385                              fan_div_reg | tmp_fan_div);
 386
 387        /* Restore fan_min */
 388        data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
 389        w83l786ng_write_value(client, W83L786NG_REG_FAN_MIN(nr),
 390                              data->fan_min[nr]);
 391        mutex_unlock(&data->update_lock);
 392
 393        return count;
 394}
 395
 396static struct sensor_device_attribute sda_fan_input[] = {
 397        SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
 398        SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
 399};
 400
 401static struct sensor_device_attribute sda_fan_min[] = {
 402        SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
 403                    store_fan_min, 0),
 404        SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
 405                    store_fan_min, 1),
 406};
 407
 408static struct sensor_device_attribute sda_fan_div[] = {
 409        SENSOR_ATTR(fan1_div, S_IWUSR | S_IRUGO, show_fan_div,
 410                    store_fan_div, 0),
 411        SENSOR_ATTR(fan2_div, S_IWUSR | S_IRUGO, show_fan_div,
 412                    store_fan_div, 1),
 413};
 414
 415
 416/* read/write the temperature, includes measured value and limits */
 417
 418static ssize_t
 419show_temp(struct device *dev, struct device_attribute *attr, char *buf)
 420{
 421        struct sensor_device_attribute_2 *sensor_attr =
 422            to_sensor_dev_attr_2(attr);
 423        int nr = sensor_attr->nr;
 424        int index = sensor_attr->index;
 425        struct w83l786ng_data *data = w83l786ng_update_device(dev);
 426        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr][index]));
 427}
 428
 429static ssize_t
 430store_temp(struct device *dev, struct device_attribute *attr,
 431           const char *buf, size_t count)
 432{
 433        struct sensor_device_attribute_2 *sensor_attr =
 434            to_sensor_dev_attr_2(attr);
 435        int nr = sensor_attr->nr;
 436        int index = sensor_attr->index;
 437        struct w83l786ng_data *data = dev_get_drvdata(dev);
 438        struct i2c_client *client = data->client;
 439        long val;
 440        int err;
 441
 442        err = kstrtol(buf, 10, &val);
 443        if (err)
 444                return err;
 445
 446        mutex_lock(&data->update_lock);
 447        data->temp[nr][index] = TEMP_TO_REG(val);
 448        w83l786ng_write_value(client, W83L786NG_REG_TEMP[nr][index],
 449                              data->temp[nr][index]);
 450        mutex_unlock(&data->update_lock);
 451
 452        return count;
 453}
 454
 455static struct sensor_device_attribute_2 sda_temp_input[] = {
 456        SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
 457        SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 1, 0),
 458};
 459
 460static struct sensor_device_attribute_2 sda_temp_max[] = {
 461        SENSOR_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,
 462                      show_temp, store_temp, 0, 1),
 463        SENSOR_ATTR_2(temp2_max, S_IRUGO | S_IWUSR,
 464                      show_temp, store_temp, 1, 1),
 465};
 466
 467static struct sensor_device_attribute_2 sda_temp_max_hyst[] = {
 468        SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,
 469                      show_temp, store_temp, 0, 2),
 470        SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
 471                      show_temp, store_temp, 1, 2),
 472};
 473
 474#define show_pwm_reg(reg) \
 475static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
 476                          char *buf) \
 477{ \
 478        struct w83l786ng_data *data = w83l786ng_update_device(dev); \
 479        int nr = to_sensor_dev_attr(attr)->index; \
 480        return sprintf(buf, "%d\n", data->reg[nr]); \
 481}
 482
 483show_pwm_reg(pwm_mode)
 484show_pwm_reg(pwm_enable)
 485show_pwm_reg(pwm)
 486
 487static ssize_t
 488store_pwm_mode(struct device *dev, struct device_attribute *attr,
 489               const char *buf, size_t count)
 490{
 491        int nr = to_sensor_dev_attr(attr)->index;
 492        struct w83l786ng_data *data = dev_get_drvdata(dev);
 493        struct i2c_client *client = data->client;
 494        u8 reg;
 495        unsigned long val;
 496        int err;
 497
 498        err = kstrtoul(buf, 10, &val);
 499        if (err)
 500                return err;
 501
 502        if (val > 1)
 503                return -EINVAL;
 504        mutex_lock(&data->update_lock);
 505        data->pwm_mode[nr] = val;
 506        reg = w83l786ng_read_value(client, W83L786NG_REG_FAN_CFG);
 507        reg &= ~(1 << W83L786NG_PWM_MODE_SHIFT[nr]);
 508        if (!val)
 509                reg |= 1 << W83L786NG_PWM_MODE_SHIFT[nr];
 510        w83l786ng_write_value(client, W83L786NG_REG_FAN_CFG, reg);
 511        mutex_unlock(&data->update_lock);
 512        return count;
 513}
 514
 515static ssize_t
 516store_pwm(struct device *dev, struct device_attribute *attr,
 517          const char *buf, size_t count)
 518{
 519        int nr = to_sensor_dev_attr(attr)->index;
 520        struct w83l786ng_data *data = dev_get_drvdata(dev);
 521        struct i2c_client *client = data->client;
 522        unsigned long val;
 523        int err;
 524
 525        err = kstrtoul(buf, 10, &val);
 526        if (err)
 527                return err;
 528        val = clamp_val(val, 0, 255);
 529        val = DIV_ROUND_CLOSEST(val, 0x11);
 530
 531        mutex_lock(&data->update_lock);
 532        data->pwm[nr] = val * 0x11;
 533        val |= w83l786ng_read_value(client, W83L786NG_REG_PWM[nr]) & 0xf0;
 534        w83l786ng_write_value(client, W83L786NG_REG_PWM[nr], val);
 535        mutex_unlock(&data->update_lock);
 536        return count;
 537}
 538
 539static ssize_t
 540store_pwm_enable(struct device *dev, struct device_attribute *attr,
 541                 const char *buf, size_t count)
 542{
 543        int nr = to_sensor_dev_attr(attr)->index;
 544        struct w83l786ng_data *data = dev_get_drvdata(dev);
 545        struct i2c_client *client = data->client;
 546        u8 reg;
 547        unsigned long val;
 548        int err;
 549
 550        err = kstrtoul(buf, 10, &val);
 551        if (err)
 552                return err;
 553
 554        if (!val || val > 2)  /* only modes 1 and 2 are supported */
 555                return -EINVAL;
 556
 557        mutex_lock(&data->update_lock);
 558        reg = w83l786ng_read_value(client, W83L786NG_REG_FAN_CFG);
 559        data->pwm_enable[nr] = val;
 560        reg &= ~(0x03 << W83L786NG_PWM_ENABLE_SHIFT[nr]);
 561        reg |= (val - 1) << W83L786NG_PWM_ENABLE_SHIFT[nr];
 562        w83l786ng_write_value(client, W83L786NG_REG_FAN_CFG, reg);
 563        mutex_unlock(&data->update_lock);
 564        return count;
 565}
 566
 567static struct sensor_device_attribute sda_pwm[] = {
 568        SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0),
 569        SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1),
 570};
 571
 572static struct sensor_device_attribute sda_pwm_mode[] = {
 573        SENSOR_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
 574                    store_pwm_mode, 0),
 575        SENSOR_ATTR(pwm2_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
 576                    store_pwm_mode, 1),
 577};
 578
 579static struct sensor_device_attribute sda_pwm_enable[] = {
 580        SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
 581                    store_pwm_enable, 0),
 582        SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
 583                    store_pwm_enable, 1),
 584};
 585
 586/* For Smart Fan I/Thermal Cruise and Smart Fan II */
 587static ssize_t
 588show_tolerance(struct device *dev, struct device_attribute *attr, char *buf)
 589{
 590        int nr = to_sensor_dev_attr(attr)->index;
 591        struct w83l786ng_data *data = w83l786ng_update_device(dev);
 592        return sprintf(buf, "%ld\n", (long)data->tolerance[nr]);
 593}
 594
 595static ssize_t
 596store_tolerance(struct device *dev, struct device_attribute *attr,
 597                const char *buf, size_t count)
 598{
 599        int nr = to_sensor_dev_attr(attr)->index;
 600        struct w83l786ng_data *data = dev_get_drvdata(dev);
 601        struct i2c_client *client = data->client;
 602        u8 tol_tmp, tol_mask;
 603        unsigned long val;
 604        int err;
 605
 606        err = kstrtoul(buf, 10, &val);
 607        if (err)
 608                return err;
 609
 610        mutex_lock(&data->update_lock);
 611        tol_mask = w83l786ng_read_value(client,
 612            W83L786NG_REG_TOLERANCE) & ((nr == 1) ? 0x0f : 0xf0);
 613        tol_tmp = clamp_val(val, 0, 15);
 614        tol_tmp &= 0x0f;
 615        data->tolerance[nr] = tol_tmp;
 616        if (nr == 1)
 617                tol_tmp <<= 4;
 618
 619        w83l786ng_write_value(client, W83L786NG_REG_TOLERANCE,
 620                              tol_mask | tol_tmp);
 621        mutex_unlock(&data->update_lock);
 622        return count;
 623}
 624
 625static struct sensor_device_attribute sda_tolerance[] = {
 626        SENSOR_ATTR(pwm1_tolerance, S_IWUSR | S_IRUGO,
 627                    show_tolerance, store_tolerance, 0),
 628        SENSOR_ATTR(pwm2_tolerance, S_IWUSR | S_IRUGO,
 629                    show_tolerance, store_tolerance, 1),
 630};
 631
 632
 633#define IN_UNIT_ATTRS(X)        \
 634        &sda_in_input[X].dev_attr.attr,         \
 635        &sda_in_min[X].dev_attr.attr,           \
 636        &sda_in_max[X].dev_attr.attr
 637
 638#define FAN_UNIT_ATTRS(X)       \
 639        &sda_fan_input[X].dev_attr.attr,        \
 640        &sda_fan_min[X].dev_attr.attr,          \
 641        &sda_fan_div[X].dev_attr.attr
 642
 643#define TEMP_UNIT_ATTRS(X)      \
 644        &sda_temp_input[X].dev_attr.attr,       \
 645        &sda_temp_max[X].dev_attr.attr,         \
 646        &sda_temp_max_hyst[X].dev_attr.attr
 647
 648#define PWM_UNIT_ATTRS(X)       \
 649        &sda_pwm[X].dev_attr.attr,              \
 650        &sda_pwm_mode[X].dev_attr.attr,         \
 651        &sda_pwm_enable[X].dev_attr.attr
 652
 653#define TOLERANCE_UNIT_ATTRS(X) \
 654        &sda_tolerance[X].dev_attr.attr
 655
 656static struct attribute *w83l786ng_attrs[] = {
 657        IN_UNIT_ATTRS(0),
 658        IN_UNIT_ATTRS(1),
 659        IN_UNIT_ATTRS(2),
 660        FAN_UNIT_ATTRS(0),
 661        FAN_UNIT_ATTRS(1),
 662        TEMP_UNIT_ATTRS(0),
 663        TEMP_UNIT_ATTRS(1),
 664        PWM_UNIT_ATTRS(0),
 665        PWM_UNIT_ATTRS(1),
 666        TOLERANCE_UNIT_ATTRS(0),
 667        TOLERANCE_UNIT_ATTRS(1),
 668        NULL
 669};
 670
 671ATTRIBUTE_GROUPS(w83l786ng);
 672
 673static int
 674w83l786ng_detect(struct i2c_client *client, struct i2c_board_info *info)
 675{
 676        struct i2c_adapter *adapter = client->adapter;
 677        u16 man_id;
 678        u8 chip_id;
 679
 680        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 681                return -ENODEV;
 682
 683        /* Detection */
 684        if ((w83l786ng_read_value(client, W83L786NG_REG_CONFIG) & 0x80)) {
 685                dev_dbg(&adapter->dev, "W83L786NG detection failed at 0x%02x\n",
 686                        client->addr);
 687                return -ENODEV;
 688        }
 689
 690        /* Identification */
 691        man_id = (w83l786ng_read_value(client, W83L786NG_REG_MAN_ID1) << 8) +
 692                 w83l786ng_read_value(client, W83L786NG_REG_MAN_ID2);
 693        chip_id = w83l786ng_read_value(client, W83L786NG_REG_CHIP_ID);
 694
 695        if (man_id != 0x5CA3 ||         /* Winbond */
 696            chip_id != 0x80) {          /* W83L786NG */
 697                dev_dbg(&adapter->dev,
 698                        "Unsupported chip (man_id=0x%04X, chip_id=0x%02X)\n",
 699                        man_id, chip_id);
 700                return -ENODEV;
 701        }
 702
 703        strlcpy(info->type, "w83l786ng", I2C_NAME_SIZE);
 704
 705        return 0;
 706}
 707
 708static void w83l786ng_init_client(struct i2c_client *client)
 709{
 710        u8 tmp;
 711
 712        if (reset)
 713                w83l786ng_write_value(client, W83L786NG_REG_CONFIG, 0x80);
 714
 715        /* Start monitoring */
 716        tmp = w83l786ng_read_value(client, W83L786NG_REG_CONFIG);
 717        if (!(tmp & 0x01))
 718                w83l786ng_write_value(client, W83L786NG_REG_CONFIG, tmp | 0x01);
 719}
 720
 721static int
 722w83l786ng_probe(struct i2c_client *client, const struct i2c_device_id *id)
 723{
 724        struct device *dev = &client->dev;
 725        struct w83l786ng_data *data;
 726        struct device *hwmon_dev;
 727        int i;
 728        u8 reg_tmp;
 729
 730        data = devm_kzalloc(dev, sizeof(struct w83l786ng_data), GFP_KERNEL);
 731        if (!data)
 732                return -ENOMEM;
 733
 734        data->client = client;
 735        mutex_init(&data->update_lock);
 736
 737        /* Initialize the chip */
 738        w83l786ng_init_client(client);
 739
 740        /* A few vars need to be filled upon startup */
 741        for (i = 0; i < 2; i++) {
 742                data->fan_min[i] = w83l786ng_read_value(client,
 743                    W83L786NG_REG_FAN_MIN(i));
 744        }
 745
 746        /* Update the fan divisor */
 747        reg_tmp = w83l786ng_read_value(client, W83L786NG_REG_FAN_DIV);
 748        data->fan_div[0] = reg_tmp & 0x07;
 749        data->fan_div[1] = (reg_tmp >> 4) & 0x07;
 750
 751        hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
 752                                                           data,
 753                                                           w83l786ng_groups);
 754        return PTR_ERR_OR_ZERO(hwmon_dev);
 755}
 756
 757static const struct i2c_device_id w83l786ng_id[] = {
 758        { "w83l786ng", 0 },
 759        { }
 760};
 761MODULE_DEVICE_TABLE(i2c, w83l786ng_id);
 762
 763static struct i2c_driver w83l786ng_driver = {
 764        .class          = I2C_CLASS_HWMON,
 765        .driver = {
 766                   .name = "w83l786ng",
 767        },
 768        .probe          = w83l786ng_probe,
 769        .id_table       = w83l786ng_id,
 770        .detect         = w83l786ng_detect,
 771        .address_list   = normal_i2c,
 772};
 773
 774module_i2c_driver(w83l786ng_driver);
 775
 776MODULE_AUTHOR("Kevin Lo");
 777MODULE_DESCRIPTION("w83l786ng driver");
 778MODULE_LICENSE("GPL");
 779