linux/drivers/hwmon/adm9240.c
<<
>>
Prefs
   1/*
   2 * adm9240.c    Part of lm_sensors, Linux kernel modules for hardware
   3 *              monitoring
   4 *
   5 * Copyright (C) 1999   Frodo Looijaard <frodol@dds.nl>
   6 *                      Philip Edelbrock <phil@netroedge.com>
   7 * Copyright (C) 2003   Michiel Rook <michiel@grendelproject.nl>
   8 * Copyright (C) 2005   Grant Coady <gcoady.lk@gmail.com> with valuable
   9 *                              guidance from Jean Delvare
  10 *
  11 * Driver supports      Analog Devices          ADM9240
  12 *                      Dallas Semiconductor    DS1780
  13 *                      National Semiconductor  LM81
  14 *
  15 * ADM9240 is the reference, DS1780 and LM81 are register compatibles
  16 *
  17 * Voltage      Six inputs are scaled by chip, VID also reported
  18 * Temperature  Chip temperature to 0.5'C, maximum and max_hysteris
  19 * Fans         2 fans, low speed alarm, automatic fan clock divider
  20 * Alarms       16-bit map of active alarms
  21 * Analog Out   0..1250 mV output
  22 *
  23 * Chassis Intrusion: clear CI latch with 'echo 0 > intrusion0_alarm'
  24 *
  25 * Test hardware: Intel SE440BX-2 desktop motherboard --Grant
  26 *
  27 * LM81 extended temp reading not implemented
  28 *
  29 * This program is free software; you can redistribute it and/or modify
  30 * it under the terms of the GNU General Public License as published by
  31 * the Free Software Foundation; either version 2 of the License, or
  32 * (at your option) any later version.
  33 *
  34 * This program is distributed in the hope that it will be useful,
  35 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  36 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  37 * GNU General Public License for more details.
  38 *
  39 * You should have received a copy of the GNU General Public License
  40 * along with this program; if not, write to the Free Software
  41 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  42 */
  43
  44#include <linux/init.h>
  45#include <linux/module.h>
  46#include <linux/slab.h>
  47#include <linux/i2c.h>
  48#include <linux/hwmon-sysfs.h>
  49#include <linux/hwmon.h>
  50#include <linux/hwmon-vid.h>
  51#include <linux/err.h>
  52#include <linux/mutex.h>
  53#include <linux/jiffies.h>
  54
  55/* Addresses to scan */
  56static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
  57                                        I2C_CLIENT_END };
  58
  59enum chips { adm9240, ds1780, lm81 };
  60
  61/* ADM9240 registers */
  62#define ADM9240_REG_MAN_ID              0x3e
  63#define ADM9240_REG_DIE_REV             0x3f
  64#define ADM9240_REG_CONFIG              0x40
  65
  66#define ADM9240_REG_IN(nr)              (0x20 + (nr))   /* 0..5 */
  67#define ADM9240_REG_IN_MAX(nr)          (0x2b + (nr) * 2)
  68#define ADM9240_REG_IN_MIN(nr)          (0x2c + (nr) * 2)
  69#define ADM9240_REG_FAN(nr)             (0x28 + (nr))   /* 0..1 */
  70#define ADM9240_REG_FAN_MIN(nr)         (0x3b + (nr))
  71#define ADM9240_REG_INT(nr)             (0x41 + (nr))
  72#define ADM9240_REG_INT_MASK(nr)        (0x43 + (nr))
  73#define ADM9240_REG_TEMP                0x27
  74#define ADM9240_REG_TEMP_MAX(nr)        (0x39 + (nr)) /* 0, 1 = high, hyst */
  75#define ADM9240_REG_ANALOG_OUT          0x19
  76#define ADM9240_REG_CHASSIS_CLEAR       0x46
  77#define ADM9240_REG_VID_FAN_DIV         0x47
  78#define ADM9240_REG_I2C_ADDR            0x48
  79#define ADM9240_REG_VID4                0x49
  80#define ADM9240_REG_TEMP_CONF           0x4b
  81
  82/* generalised scaling with integer rounding */
  83static inline int SCALE(long val, int mul, int div)
  84{
  85        if (val < 0)
  86                return (val * mul - div / 2) / div;
  87        else
  88                return (val * mul + div / 2) / div;
  89}
  90
  91/* adm9240 internally scales voltage measurements */
  92static const u16 nom_mv[] = { 2500, 2700, 3300, 5000, 12000, 2700 };
  93
  94static inline unsigned int IN_FROM_REG(u8 reg, int n)
  95{
  96        return SCALE(reg, nom_mv[n], 192);
  97}
  98
  99static inline u8 IN_TO_REG(unsigned long val, int n)
 100{
 101        return clamp_val(SCALE(val, 192, nom_mv[n]), 0, 255);
 102}
 103
 104/* temperature range: -40..125, 127 disables temperature alarm */
 105static inline s8 TEMP_TO_REG(long val)
 106{
 107        return clamp_val(SCALE(val, 1, 1000), -40, 127);
 108}
 109
 110/* two fans, each with low fan speed limit */
 111static inline unsigned int FAN_FROM_REG(u8 reg, u8 div)
 112{
 113        if (!reg) /* error */
 114                return -1;
 115
 116        if (reg == 255)
 117                return 0;
 118
 119        return SCALE(1350000, 1, reg * div);
 120}
 121
 122/* analog out 0..1250mV */
 123static inline u8 AOUT_TO_REG(unsigned long val)
 124{
 125        return clamp_val(SCALE(val, 255, 1250), 0, 255);
 126}
 127
 128static inline unsigned int AOUT_FROM_REG(u8 reg)
 129{
 130        return SCALE(reg, 1250, 255);
 131}
 132
 133/* per client data */
 134struct adm9240_data {
 135        struct i2c_client *client;
 136        struct mutex update_lock;
 137        char valid;
 138        unsigned long last_updated_measure;
 139        unsigned long last_updated_config;
 140
 141        u8 in[6];               /* ro   in0_input */
 142        u8 in_max[6];           /* rw   in0_max */
 143        u8 in_min[6];           /* rw   in0_min */
 144        u8 fan[2];              /* ro   fan1_input */
 145        u8 fan_min[2];          /* rw   fan1_min */
 146        u8 fan_div[2];          /* rw   fan1_div, read-only accessor */
 147        s16 temp;               /* ro   temp1_input, 9-bit sign-extended */
 148        s8 temp_max[2];         /* rw   0 -> temp_max, 1 -> temp_max_hyst */
 149        u16 alarms;             /* ro   alarms */
 150        u8 aout;                /* rw   aout_output */
 151        u8 vid;                 /* ro   vid */
 152        u8 vrm;                 /* --   vrm set on startup, no accessor */
 153};
 154
 155/* write new fan div, callers must hold data->update_lock */
 156static void adm9240_write_fan_div(struct i2c_client *client, int nr,
 157                u8 fan_div)
 158{
 159        u8 reg, old, shift = (nr + 2) * 2;
 160
 161        reg = i2c_smbus_read_byte_data(client, ADM9240_REG_VID_FAN_DIV);
 162        old = (reg >> shift) & 3;
 163        reg &= ~(3 << shift);
 164        reg |= (fan_div << shift);
 165        i2c_smbus_write_byte_data(client, ADM9240_REG_VID_FAN_DIV, reg);
 166        dev_dbg(&client->dev,
 167                "fan%d clock divider changed from %u to %u\n",
 168                nr + 1, 1 << old, 1 << fan_div);
 169}
 170
 171static struct adm9240_data *adm9240_update_device(struct device *dev)
 172{
 173        struct adm9240_data *data = dev_get_drvdata(dev);
 174        struct i2c_client *client = data->client;
 175        int i;
 176
 177        mutex_lock(&data->update_lock);
 178
 179        /* minimum measurement cycle: 1.75 seconds */
 180        if (time_after(jiffies, data->last_updated_measure + (HZ * 7 / 4))
 181                        || !data->valid) {
 182
 183                for (i = 0; i < 6; i++) { /* read voltages */
 184                        data->in[i] = i2c_smbus_read_byte_data(client,
 185                                        ADM9240_REG_IN(i));
 186                }
 187                data->alarms = i2c_smbus_read_byte_data(client,
 188                                        ADM9240_REG_INT(0)) |
 189                                        i2c_smbus_read_byte_data(client,
 190                                        ADM9240_REG_INT(1)) << 8;
 191
 192                /*
 193                 * read temperature: assume temperature changes less than
 194                 * 0.5'C per two measurement cycles thus ignore possible
 195                 * but unlikely aliasing error on lsb reading. --Grant
 196                 */
 197                data->temp = ((i2c_smbus_read_byte_data(client,
 198                                        ADM9240_REG_TEMP) << 8) |
 199                                        i2c_smbus_read_byte_data(client,
 200                                        ADM9240_REG_TEMP_CONF)) / 128;
 201
 202                for (i = 0; i < 2; i++) { /* read fans */
 203                        data->fan[i] = i2c_smbus_read_byte_data(client,
 204                                        ADM9240_REG_FAN(i));
 205
 206                        /* adjust fan clock divider on overflow */
 207                        if (data->valid && data->fan[i] == 255 &&
 208                                        data->fan_div[i] < 3) {
 209
 210                                adm9240_write_fan_div(client, i,
 211                                                ++data->fan_div[i]);
 212
 213                                /* adjust fan_min if active, but not to 0 */
 214                                if (data->fan_min[i] < 255 &&
 215                                                data->fan_min[i] >= 2)
 216                                        data->fan_min[i] /= 2;
 217                        }
 218                }
 219                data->last_updated_measure = jiffies;
 220        }
 221
 222        /* minimum config reading cycle: 300 seconds */
 223        if (time_after(jiffies, data->last_updated_config + (HZ * 300))
 224                        || !data->valid) {
 225
 226                for (i = 0; i < 6; i++) {
 227                        data->in_min[i] = i2c_smbus_read_byte_data(client,
 228                                        ADM9240_REG_IN_MIN(i));
 229                        data->in_max[i] = i2c_smbus_read_byte_data(client,
 230                                        ADM9240_REG_IN_MAX(i));
 231                }
 232                for (i = 0; i < 2; i++) {
 233                        data->fan_min[i] = i2c_smbus_read_byte_data(client,
 234                                        ADM9240_REG_FAN_MIN(i));
 235                }
 236                data->temp_max[0] = i2c_smbus_read_byte_data(client,
 237                                ADM9240_REG_TEMP_MAX(0));
 238                data->temp_max[1] = i2c_smbus_read_byte_data(client,
 239                                ADM9240_REG_TEMP_MAX(1));
 240
 241                /* read fan divs and 5-bit VID */
 242                i = i2c_smbus_read_byte_data(client, ADM9240_REG_VID_FAN_DIV);
 243                data->fan_div[0] = (i >> 4) & 3;
 244                data->fan_div[1] = (i >> 6) & 3;
 245                data->vid = i & 0x0f;
 246                data->vid |= (i2c_smbus_read_byte_data(client,
 247                                        ADM9240_REG_VID4) & 1) << 4;
 248                /* read analog out */
 249                data->aout = i2c_smbus_read_byte_data(client,
 250                                ADM9240_REG_ANALOG_OUT);
 251
 252                data->last_updated_config = jiffies;
 253                data->valid = 1;
 254        }
 255        mutex_unlock(&data->update_lock);
 256        return data;
 257}
 258
 259/*** sysfs accessors ***/
 260
 261/* temperature */
 262static ssize_t show_temp(struct device *dev, struct device_attribute *dummy,
 263                char *buf)
 264{
 265        struct adm9240_data *data = adm9240_update_device(dev);
 266        return sprintf(buf, "%d\n", data->temp * 500); /* 9-bit value */
 267}
 268
 269static ssize_t show_max(struct device *dev, struct device_attribute *devattr,
 270                char *buf)
 271{
 272        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 273        struct adm9240_data *data = adm9240_update_device(dev);
 274        return sprintf(buf, "%d\n", data->temp_max[attr->index] * 1000);
 275}
 276
 277static ssize_t set_max(struct device *dev, struct device_attribute *devattr,
 278                const char *buf, size_t count)
 279{
 280        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 281        struct adm9240_data *data = dev_get_drvdata(dev);
 282        struct i2c_client *client = data->client;
 283        long val;
 284        int err;
 285
 286        err = kstrtol(buf, 10, &val);
 287        if (err)
 288                return err;
 289
 290        mutex_lock(&data->update_lock);
 291        data->temp_max[attr->index] = TEMP_TO_REG(val);
 292        i2c_smbus_write_byte_data(client, ADM9240_REG_TEMP_MAX(attr->index),
 293                        data->temp_max[attr->index]);
 294        mutex_unlock(&data->update_lock);
 295        return count;
 296}
 297
 298static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
 299static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
 300                show_max, set_max, 0);
 301static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO,
 302                show_max, set_max, 1);
 303
 304/* voltage */
 305static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
 306                char *buf)
 307{
 308        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 309        struct adm9240_data *data = adm9240_update_device(dev);
 310        return sprintf(buf, "%d\n", IN_FROM_REG(data->in[attr->index],
 311                                attr->index));
 312}
 313
 314static ssize_t show_in_min(struct device *dev,
 315                struct device_attribute *devattr, char *buf)
 316{
 317        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 318        struct adm9240_data *data = adm9240_update_device(dev);
 319        return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[attr->index],
 320                                attr->index));
 321}
 322
 323static ssize_t show_in_max(struct device *dev,
 324                struct device_attribute *devattr, char *buf)
 325{
 326        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 327        struct adm9240_data *data = adm9240_update_device(dev);
 328        return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[attr->index],
 329                                attr->index));
 330}
 331
 332static ssize_t set_in_min(struct device *dev,
 333                struct device_attribute *devattr,
 334                const char *buf, size_t count)
 335{
 336        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 337        struct adm9240_data *data = dev_get_drvdata(dev);
 338        struct i2c_client *client = data->client;
 339        unsigned long val;
 340        int err;
 341
 342        err = kstrtoul(buf, 10, &val);
 343        if (err)
 344                return err;
 345
 346        mutex_lock(&data->update_lock);
 347        data->in_min[attr->index] = IN_TO_REG(val, attr->index);
 348        i2c_smbus_write_byte_data(client, ADM9240_REG_IN_MIN(attr->index),
 349                        data->in_min[attr->index]);
 350        mutex_unlock(&data->update_lock);
 351        return count;
 352}
 353
 354static ssize_t set_in_max(struct device *dev,
 355                struct device_attribute *devattr,
 356                const char *buf, size_t count)
 357{
 358        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 359        struct adm9240_data *data = dev_get_drvdata(dev);
 360        struct i2c_client *client = data->client;
 361        unsigned long val;
 362        int err;
 363
 364        err = kstrtoul(buf, 10, &val);
 365        if (err)
 366                return err;
 367
 368        mutex_lock(&data->update_lock);
 369        data->in_max[attr->index] = IN_TO_REG(val, attr->index);
 370        i2c_smbus_write_byte_data(client, ADM9240_REG_IN_MAX(attr->index),
 371                        data->in_max[attr->index]);
 372        mutex_unlock(&data->update_lock);
 373        return count;
 374}
 375
 376#define vin(nr)                                                 \
 377static SENSOR_DEVICE_ATTR(in##nr##_input, S_IRUGO,              \
 378                show_in, NULL, nr);                             \
 379static SENSOR_DEVICE_ATTR(in##nr##_min, S_IRUGO | S_IWUSR,      \
 380                show_in_min, set_in_min, nr);                   \
 381static SENSOR_DEVICE_ATTR(in##nr##_max, S_IRUGO | S_IWUSR,      \
 382                show_in_max, set_in_max, nr);
 383
 384vin(0);
 385vin(1);
 386vin(2);
 387vin(3);
 388vin(4);
 389vin(5);
 390
 391/* fans */
 392static ssize_t show_fan(struct device *dev,
 393                struct device_attribute *devattr, char *buf)
 394{
 395        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 396        struct adm9240_data *data = adm9240_update_device(dev);
 397        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[attr->index],
 398                                1 << data->fan_div[attr->index]));
 399}
 400
 401static ssize_t show_fan_min(struct device *dev,
 402                struct device_attribute *devattr, char *buf)
 403{
 404        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 405        struct adm9240_data *data = adm9240_update_device(dev);
 406        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[attr->index],
 407                                1 << data->fan_div[attr->index]));
 408}
 409
 410static ssize_t show_fan_div(struct device *dev,
 411                struct device_attribute *devattr, char *buf)
 412{
 413        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 414        struct adm9240_data *data = adm9240_update_device(dev);
 415        return sprintf(buf, "%d\n", 1 << data->fan_div[attr->index]);
 416}
 417
 418/*
 419 * set fan speed low limit:
 420 *
 421 * - value is zero: disable fan speed low limit alarm
 422 *
 423 * - value is below fan speed measurement range: enable fan speed low
 424 *   limit alarm to be asserted while fan speed too slow to measure
 425 *
 426 * - otherwise: select fan clock divider to suit fan speed low limit,
 427 *   measurement code may adjust registers to ensure fan speed reading
 428 */
 429static ssize_t set_fan_min(struct device *dev,
 430                struct device_attribute *devattr,
 431                const char *buf, size_t count)
 432{
 433        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 434        struct adm9240_data *data = dev_get_drvdata(dev);
 435        struct i2c_client *client = data->client;
 436        int nr = attr->index;
 437        u8 new_div;
 438        unsigned long val;
 439        int err;
 440
 441        err = kstrtoul(buf, 10, &val);
 442        if (err)
 443                return err;
 444
 445        mutex_lock(&data->update_lock);
 446
 447        if (!val) {
 448                data->fan_min[nr] = 255;
 449                new_div = data->fan_div[nr];
 450
 451                dev_dbg(&client->dev, "fan%u low limit set disabled\n",
 452                                nr + 1);
 453
 454        } else if (val < 1350000 / (8 * 254)) {
 455                new_div = 3;
 456                data->fan_min[nr] = 254;
 457
 458                dev_dbg(&client->dev, "fan%u low limit set minimum %u\n",
 459                                nr + 1, FAN_FROM_REG(254, 1 << new_div));
 460
 461        } else {
 462                unsigned int new_min = 1350000 / val;
 463
 464                new_div = 0;
 465                while (new_min > 192 && new_div < 3) {
 466                        new_div++;
 467                        new_min /= 2;
 468                }
 469                if (!new_min) /* keep > 0 */
 470                        new_min++;
 471
 472                data->fan_min[nr] = new_min;
 473
 474                dev_dbg(&client->dev, "fan%u low limit set fan speed %u\n",
 475                                nr + 1, FAN_FROM_REG(new_min, 1 << new_div));
 476        }
 477
 478        if (new_div != data->fan_div[nr]) {
 479                data->fan_div[nr] = new_div;
 480                adm9240_write_fan_div(client, nr, new_div);
 481        }
 482        i2c_smbus_write_byte_data(client, ADM9240_REG_FAN_MIN(nr),
 483                        data->fan_min[nr]);
 484
 485        mutex_unlock(&data->update_lock);
 486        return count;
 487}
 488
 489#define fan(nr)                                                 \
 490static SENSOR_DEVICE_ATTR(fan##nr##_input, S_IRUGO,             \
 491                show_fan, NULL, nr - 1);                        \
 492static SENSOR_DEVICE_ATTR(fan##nr##_div, S_IRUGO,               \
 493                show_fan_div, NULL, nr - 1);                    \
 494static SENSOR_DEVICE_ATTR(fan##nr##_min, S_IRUGO | S_IWUSR,     \
 495                show_fan_min, set_fan_min, nr - 1);
 496
 497fan(1);
 498fan(2);
 499
 500/* alarms */
 501static ssize_t show_alarms(struct device *dev,
 502                struct device_attribute *attr, char *buf)
 503{
 504        struct adm9240_data *data = adm9240_update_device(dev);
 505        return sprintf(buf, "%u\n", data->alarms);
 506}
 507static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 508
 509static ssize_t show_alarm(struct device *dev,
 510                struct device_attribute *attr, char *buf)
 511{
 512        int bitnr = to_sensor_dev_attr(attr)->index;
 513        struct adm9240_data *data = adm9240_update_device(dev);
 514        return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
 515}
 516static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
 517static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
 518static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
 519static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
 520static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
 521static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
 522static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
 523static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
 524static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
 525
 526/* vid */
 527static ssize_t show_vid(struct device *dev,
 528                struct device_attribute *attr, char *buf)
 529{
 530        struct adm9240_data *data = adm9240_update_device(dev);
 531        return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
 532}
 533static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 534
 535/* analog output */
 536static ssize_t show_aout(struct device *dev,
 537                struct device_attribute *attr, char *buf)
 538{
 539        struct adm9240_data *data = adm9240_update_device(dev);
 540        return sprintf(buf, "%d\n", AOUT_FROM_REG(data->aout));
 541}
 542
 543static ssize_t set_aout(struct device *dev,
 544                struct device_attribute *attr,
 545                const char *buf, size_t count)
 546{
 547        struct adm9240_data *data = dev_get_drvdata(dev);
 548        struct i2c_client *client = data->client;
 549        long val;
 550        int err;
 551
 552        err = kstrtol(buf, 10, &val);
 553        if (err)
 554                return err;
 555
 556        mutex_lock(&data->update_lock);
 557        data->aout = AOUT_TO_REG(val);
 558        i2c_smbus_write_byte_data(client, ADM9240_REG_ANALOG_OUT, data->aout);
 559        mutex_unlock(&data->update_lock);
 560        return count;
 561}
 562static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout);
 563
 564static ssize_t chassis_clear(struct device *dev,
 565                struct device_attribute *attr,
 566                const char *buf, size_t count)
 567{
 568        struct adm9240_data *data = dev_get_drvdata(dev);
 569        struct i2c_client *client = data->client;
 570        unsigned long val;
 571
 572        if (kstrtoul(buf, 10, &val) || val != 0)
 573                return -EINVAL;
 574
 575        mutex_lock(&data->update_lock);
 576        i2c_smbus_write_byte_data(client, ADM9240_REG_CHASSIS_CLEAR, 0x80);
 577        data->valid = 0;                /* Force cache refresh */
 578        mutex_unlock(&data->update_lock);
 579        dev_dbg(&client->dev, "chassis intrusion latch cleared\n");
 580
 581        return count;
 582}
 583static SENSOR_DEVICE_ATTR(intrusion0_alarm, S_IRUGO | S_IWUSR, show_alarm,
 584                chassis_clear, 12);
 585
 586static struct attribute *adm9240_attrs[] = {
 587        &sensor_dev_attr_in0_input.dev_attr.attr,
 588        &sensor_dev_attr_in0_min.dev_attr.attr,
 589        &sensor_dev_attr_in0_max.dev_attr.attr,
 590        &sensor_dev_attr_in0_alarm.dev_attr.attr,
 591        &sensor_dev_attr_in1_input.dev_attr.attr,
 592        &sensor_dev_attr_in1_min.dev_attr.attr,
 593        &sensor_dev_attr_in1_max.dev_attr.attr,
 594        &sensor_dev_attr_in1_alarm.dev_attr.attr,
 595        &sensor_dev_attr_in2_input.dev_attr.attr,
 596        &sensor_dev_attr_in2_min.dev_attr.attr,
 597        &sensor_dev_attr_in2_max.dev_attr.attr,
 598        &sensor_dev_attr_in2_alarm.dev_attr.attr,
 599        &sensor_dev_attr_in3_input.dev_attr.attr,
 600        &sensor_dev_attr_in3_min.dev_attr.attr,
 601        &sensor_dev_attr_in3_max.dev_attr.attr,
 602        &sensor_dev_attr_in3_alarm.dev_attr.attr,
 603        &sensor_dev_attr_in4_input.dev_attr.attr,
 604        &sensor_dev_attr_in4_min.dev_attr.attr,
 605        &sensor_dev_attr_in4_max.dev_attr.attr,
 606        &sensor_dev_attr_in4_alarm.dev_attr.attr,
 607        &sensor_dev_attr_in5_input.dev_attr.attr,
 608        &sensor_dev_attr_in5_min.dev_attr.attr,
 609        &sensor_dev_attr_in5_max.dev_attr.attr,
 610        &sensor_dev_attr_in5_alarm.dev_attr.attr,
 611        &dev_attr_temp1_input.attr,
 612        &sensor_dev_attr_temp1_max.dev_attr.attr,
 613        &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
 614        &sensor_dev_attr_temp1_alarm.dev_attr.attr,
 615        &sensor_dev_attr_fan1_input.dev_attr.attr,
 616        &sensor_dev_attr_fan1_div.dev_attr.attr,
 617        &sensor_dev_attr_fan1_min.dev_attr.attr,
 618        &sensor_dev_attr_fan1_alarm.dev_attr.attr,
 619        &sensor_dev_attr_fan2_input.dev_attr.attr,
 620        &sensor_dev_attr_fan2_div.dev_attr.attr,
 621        &sensor_dev_attr_fan2_min.dev_attr.attr,
 622        &sensor_dev_attr_fan2_alarm.dev_attr.attr,
 623        &dev_attr_alarms.attr,
 624        &dev_attr_aout_output.attr,
 625        &sensor_dev_attr_intrusion0_alarm.dev_attr.attr,
 626        &dev_attr_cpu0_vid.attr,
 627        NULL
 628};
 629
 630ATTRIBUTE_GROUPS(adm9240);
 631
 632
 633/*** sensor chip detect and driver install ***/
 634
 635/* Return 0 if detection is successful, -ENODEV otherwise */
 636static int adm9240_detect(struct i2c_client *new_client,
 637                          struct i2c_board_info *info)
 638{
 639        struct i2c_adapter *adapter = new_client->adapter;
 640        const char *name = "";
 641        int address = new_client->addr;
 642        u8 man_id, die_rev;
 643
 644        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 645                return -ENODEV;
 646
 647        /* verify chip: reg address should match i2c address */
 648        if (i2c_smbus_read_byte_data(new_client, ADM9240_REG_I2C_ADDR)
 649                        != address) {
 650                dev_err(&adapter->dev, "detect fail: address match, 0x%02x\n",
 651                        address);
 652                return -ENODEV;
 653        }
 654
 655        /* check known chip manufacturer */
 656        man_id = i2c_smbus_read_byte_data(new_client, ADM9240_REG_MAN_ID);
 657        if (man_id == 0x23) {
 658                name = "adm9240";
 659        } else if (man_id == 0xda) {
 660                name = "ds1780";
 661        } else if (man_id == 0x01) {
 662                name = "lm81";
 663        } else {
 664                dev_err(&adapter->dev, "detect fail: unknown manuf, 0x%02x\n",
 665                        man_id);
 666                return -ENODEV;
 667        }
 668
 669        /* successful detect, print chip info */
 670        die_rev = i2c_smbus_read_byte_data(new_client, ADM9240_REG_DIE_REV);
 671        dev_info(&adapter->dev, "found %s revision %u\n",
 672                 man_id == 0x23 ? "ADM9240" :
 673                 man_id == 0xda ? "DS1780" : "LM81", die_rev);
 674
 675        strlcpy(info->type, name, I2C_NAME_SIZE);
 676
 677        return 0;
 678}
 679
 680static void adm9240_init_client(struct i2c_client *client)
 681{
 682        struct adm9240_data *data = i2c_get_clientdata(client);
 683        u8 conf = i2c_smbus_read_byte_data(client, ADM9240_REG_CONFIG);
 684        u8 mode = i2c_smbus_read_byte_data(client, ADM9240_REG_TEMP_CONF) & 3;
 685
 686        data->vrm = vid_which_vrm(); /* need this to report vid as mV */
 687
 688        dev_info(&client->dev, "Using VRM: %d.%d\n", data->vrm / 10,
 689                        data->vrm % 10);
 690
 691        if (conf & 1) { /* measurement cycle running: report state */
 692
 693                dev_info(&client->dev, "status: config 0x%02x mode %u\n",
 694                                conf, mode);
 695
 696        } else { /* cold start: open limits before starting chip */
 697                int i;
 698
 699                for (i = 0; i < 6; i++) {
 700                        i2c_smbus_write_byte_data(client,
 701                                        ADM9240_REG_IN_MIN(i), 0);
 702                        i2c_smbus_write_byte_data(client,
 703                                        ADM9240_REG_IN_MAX(i), 255);
 704                }
 705                i2c_smbus_write_byte_data(client,
 706                                ADM9240_REG_FAN_MIN(0), 255);
 707                i2c_smbus_write_byte_data(client,
 708                                ADM9240_REG_FAN_MIN(1), 255);
 709                i2c_smbus_write_byte_data(client,
 710                                ADM9240_REG_TEMP_MAX(0), 127);
 711                i2c_smbus_write_byte_data(client,
 712                                ADM9240_REG_TEMP_MAX(1), 127);
 713
 714                /* start measurement cycle */
 715                i2c_smbus_write_byte_data(client, ADM9240_REG_CONFIG, 1);
 716
 717                dev_info(&client->dev,
 718                         "cold start: config was 0x%02x mode %u\n", conf, mode);
 719        }
 720}
 721
 722static int adm9240_probe(struct i2c_client *new_client,
 723                         const struct i2c_device_id *id)
 724{
 725        struct device *dev = &new_client->dev;
 726        struct device *hwmon_dev;
 727        struct adm9240_data *data;
 728
 729        data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
 730        if (!data)
 731                return -ENOMEM;
 732
 733        i2c_set_clientdata(new_client, data);
 734        data->client = new_client;
 735        mutex_init(&data->update_lock);
 736
 737        adm9240_init_client(new_client);
 738
 739        hwmon_dev = devm_hwmon_device_register_with_groups(dev,
 740                                                           new_client->name,
 741                                                           data,
 742                                                           adm9240_groups);
 743        return PTR_ERR_OR_ZERO(hwmon_dev);
 744}
 745
 746static const struct i2c_device_id adm9240_id[] = {
 747        { "adm9240", adm9240 },
 748        { "ds1780", ds1780 },
 749        { "lm81", lm81 },
 750        { }
 751};
 752MODULE_DEVICE_TABLE(i2c, adm9240_id);
 753
 754static struct i2c_driver adm9240_driver = {
 755        .class          = I2C_CLASS_HWMON,
 756        .driver = {
 757                .name   = "adm9240",
 758        },
 759        .probe          = adm9240_probe,
 760        .id_table       = adm9240_id,
 761        .detect         = adm9240_detect,
 762        .address_list   = normal_i2c,
 763};
 764
 765module_i2c_driver(adm9240_driver);
 766
 767MODULE_AUTHOR("Michiel Rook <michiel@grendelproject.nl>, "
 768                "Grant Coady <gcoady.lk@gmail.com> and others");
 769MODULE_DESCRIPTION("ADM9240/DS1780/LM81 driver");
 770MODULE_LICENSE("GPL");
 771