linux/drivers/hwmon/adm1025.c
<<
>>
Prefs
   1/*
   2 * adm1025.c
   3 *
   4 * Copyright (C) 2000       Chen-Yuan Wu <gwu@esoft.com>
   5 * Copyright (C) 2003-2008  Jean Delvare <khali@linux-fr.org>
   6 *
   7 * The ADM1025 is a sensor chip made by Analog Devices. It reports up to 6
   8 * voltages (including its own power source) and up to two temperatures
   9 * (its own plus up to one external one). Voltages are scaled internally
  10 * (which is not the common way) with ratios such that the nominal value
  11 * of each voltage correspond to a register value of 192 (which means a
  12 * resolution of about 0.5% of the nominal value). Temperature values are
  13 * reported with a 1 deg resolution and a 3 deg accuracy. Complete
  14 * datasheet can be obtained from Analog's website at:
  15 *   http://www.analog.com/Analog_Root/productPage/productHome/0,2121,ADM1025,00.html
  16 *
  17 * This driver also supports the ADM1025A, which differs from the ADM1025
  18 * only in that it has "open-drain VID inputs while the ADM1025 has
  19 * on-chip 100k pull-ups on the VID inputs". It doesn't make any
  20 * difference for us.
  21 *
  22 * This driver also supports the NE1619, a sensor chip made by Philips.
  23 * That chip is similar to the ADM1025A, with a few differences. The only
  24 * difference that matters to us is that the NE1619 has only two possible
  25 * addresses while the ADM1025A has a third one. Complete datasheet can be
  26 * obtained from Philips's website at:
  27 *   http://www.semiconductors.philips.com/pip/NE1619DS.html
  28 *
  29 * Since the ADM1025 was the first chipset supported by this driver, most
  30 * comments will refer to this chipset, but are actually general and
  31 * concern all supported chipsets, unless mentioned otherwise.
  32 *
  33 * This program is free software; you can redistribute it and/or modify
  34 * it under the terms of the GNU General Public License as published by
  35 * the Free Software Foundation; either version 2 of the License, or
  36 * (at your option) any later version.
  37 *
  38 * This program is distributed in the hope that it will be useful,
  39 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  40 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  41 * GNU General Public License for more details.
  42 *
  43 * You should have received a copy of the GNU General Public License
  44 * along with this program; if not, write to the Free Software
  45 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  46 */
  47
  48#include <linux/module.h>
  49#include <linux/init.h>
  50#include <linux/slab.h>
  51#include <linux/jiffies.h>
  52#include <linux/i2c.h>
  53#include <linux/hwmon.h>
  54#include <linux/hwmon-sysfs.h>
  55#include <linux/hwmon-vid.h>
  56#include <linux/err.h>
  57#include <linux/mutex.h>
  58
  59/*
  60 * Addresses to scan
  61 * ADM1025 and ADM1025A have three possible addresses: 0x2c, 0x2d and 0x2e.
  62 * NE1619 has two possible addresses: 0x2c and 0x2d.
  63 */
  64
  65static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
  66
  67/*
  68 * Insmod parameters
  69 */
  70
  71I2C_CLIENT_INSMOD_2(adm1025, ne1619);
  72
  73/*
  74 * The ADM1025 registers
  75 */
  76
  77#define ADM1025_REG_MAN_ID              0x3E
  78#define ADM1025_REG_CHIP_ID             0x3F
  79#define ADM1025_REG_CONFIG              0x40
  80#define ADM1025_REG_STATUS1             0x41
  81#define ADM1025_REG_STATUS2             0x42
  82#define ADM1025_REG_IN(nr)              (0x20 + (nr))
  83#define ADM1025_REG_IN_MAX(nr)          (0x2B + (nr) * 2)
  84#define ADM1025_REG_IN_MIN(nr)          (0x2C + (nr) * 2)
  85#define ADM1025_REG_TEMP(nr)            (0x26 + (nr))
  86#define ADM1025_REG_TEMP_HIGH(nr)       (0x37 + (nr) * 2)
  87#define ADM1025_REG_TEMP_LOW(nr)        (0x38 + (nr) * 2)
  88#define ADM1025_REG_VID                 0x47
  89#define ADM1025_REG_VID4                0x49
  90
  91/*
  92 * Conversions and various macros
  93 * The ADM1025 uses signed 8-bit values for temperatures.
  94 */
  95
  96static const int in_scale[6] = { 2500, 2250, 3300, 5000, 12000, 3300 };
  97
  98#define IN_FROM_REG(reg,scale)  (((reg) * (scale) + 96) / 192)
  99#define IN_TO_REG(val,scale)    ((val) <= 0 ? 0 : \
 100                                 (val) * 192 >= (scale) * 255 ? 255 : \
 101                                 ((val) * 192 + (scale)/2) / (scale))
 102
 103#define TEMP_FROM_REG(reg)      ((reg) * 1000)
 104#define TEMP_TO_REG(val)        ((val) <= -127500 ? -128 : \
 105                                 (val) >= 126500 ? 127 : \
 106                                 (((val) < 0 ? (val)-500 : (val)+500) / 1000))
 107
 108/*
 109 * Functions declaration
 110 */
 111
 112static int adm1025_probe(struct i2c_client *client,
 113                         const struct i2c_device_id *id);
 114static int adm1025_detect(struct i2c_client *client, int kind,
 115                          struct i2c_board_info *info);
 116static void adm1025_init_client(struct i2c_client *client);
 117static int adm1025_remove(struct i2c_client *client);
 118static struct adm1025_data *adm1025_update_device(struct device *dev);
 119
 120/*
 121 * Driver data (common to all clients)
 122 */
 123
 124static const struct i2c_device_id adm1025_id[] = {
 125        { "adm1025", adm1025 },
 126        { "ne1619", ne1619 },
 127        { }
 128};
 129MODULE_DEVICE_TABLE(i2c, adm1025_id);
 130
 131static struct i2c_driver adm1025_driver = {
 132        .class          = I2C_CLASS_HWMON,
 133        .driver = {
 134                .name   = "adm1025",
 135        },
 136        .probe          = adm1025_probe,
 137        .remove         = adm1025_remove,
 138        .id_table       = adm1025_id,
 139        .detect         = adm1025_detect,
 140        .address_data   = &addr_data,
 141};
 142
 143/*
 144 * Client data (each client gets its own)
 145 */
 146
 147struct adm1025_data {
 148        struct device *hwmon_dev;
 149        struct mutex update_lock;
 150        char valid; /* zero until following fields are valid */
 151        unsigned long last_updated; /* in jiffies */
 152
 153        u8 in[6];               /* register value */
 154        u8 in_max[6];           /* register value */
 155        u8 in_min[6];           /* register value */
 156        s8 temp[2];             /* register value */
 157        s8 temp_min[2];         /* register value */
 158        s8 temp_max[2];         /* register value */
 159        u16 alarms;             /* register values, combined */
 160        u8 vid;                 /* register values, combined */
 161        u8 vrm;
 162};
 163
 164/*
 165 * Sysfs stuff
 166 */
 167
 168static ssize_t
 169show_in(struct device *dev, struct device_attribute *attr, char *buf)
 170{
 171        int index = to_sensor_dev_attr(attr)->index;
 172        struct adm1025_data *data = adm1025_update_device(dev);
 173        return sprintf(buf, "%u\n", IN_FROM_REG(data->in[index],
 174                       in_scale[index]));
 175}
 176
 177static ssize_t
 178show_in_min(struct device *dev, struct device_attribute *attr, char *buf)
 179{
 180        int index = to_sensor_dev_attr(attr)->index;
 181        struct adm1025_data *data = adm1025_update_device(dev);
 182        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_min[index],
 183                       in_scale[index]));
 184}
 185
 186static ssize_t
 187show_in_max(struct device *dev, struct device_attribute *attr, char *buf)
 188{
 189        int index = to_sensor_dev_attr(attr)->index;
 190        struct adm1025_data *data = adm1025_update_device(dev);
 191        return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[index],
 192                       in_scale[index]));
 193}
 194
 195static ssize_t
 196show_temp(struct device *dev, struct device_attribute *attr, char *buf)
 197{
 198        int index = to_sensor_dev_attr(attr)->index;
 199        struct adm1025_data *data = adm1025_update_device(dev);
 200        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[index]));
 201}
 202
 203static ssize_t
 204show_temp_min(struct device *dev, struct device_attribute *attr, char *buf)
 205{
 206        int index = to_sensor_dev_attr(attr)->index;
 207        struct adm1025_data *data = adm1025_update_device(dev);
 208        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[index]));
 209}
 210
 211static ssize_t
 212show_temp_max(struct device *dev, struct device_attribute *attr, char *buf)
 213{
 214        int index = to_sensor_dev_attr(attr)->index;
 215        struct adm1025_data *data = adm1025_update_device(dev);
 216        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[index]));
 217}
 218
 219static ssize_t set_in_min(struct device *dev, struct device_attribute *attr,
 220                          const char *buf, size_t count)
 221{
 222        int index = to_sensor_dev_attr(attr)->index;
 223        struct i2c_client *client = to_i2c_client(dev);
 224        struct adm1025_data *data = i2c_get_clientdata(client);
 225        long val = simple_strtol(buf, NULL, 10);
 226
 227        mutex_lock(&data->update_lock);
 228        data->in_min[index] = IN_TO_REG(val, in_scale[index]);
 229        i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(index),
 230                                  data->in_min[index]);
 231        mutex_unlock(&data->update_lock);
 232        return count;
 233}
 234
 235static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
 236                          const char *buf, size_t count)
 237{
 238        int index = to_sensor_dev_attr(attr)->index;
 239        struct i2c_client *client = to_i2c_client(dev);
 240        struct adm1025_data *data = i2c_get_clientdata(client);
 241        long val = simple_strtol(buf, NULL, 10);
 242
 243        mutex_lock(&data->update_lock);
 244        data->in_max[index] = IN_TO_REG(val, in_scale[index]);
 245        i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(index),
 246                                  data->in_max[index]);
 247        mutex_unlock(&data->update_lock);
 248        return count;
 249}
 250
 251#define set_in(offset) \
 252static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
 253        show_in, NULL, offset); \
 254static SENSOR_DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \
 255        show_in_min, set_in_min, offset); \
 256static SENSOR_DEVICE_ATTR(in##offset##_max, S_IWUSR | S_IRUGO, \
 257        show_in_max, set_in_max, offset)
 258set_in(0);
 259set_in(1);
 260set_in(2);
 261set_in(3);
 262set_in(4);
 263set_in(5);
 264
 265static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr,
 266                            const char *buf, size_t count)
 267{
 268        int index = to_sensor_dev_attr(attr)->index;
 269        struct i2c_client *client = to_i2c_client(dev);
 270        struct adm1025_data *data = i2c_get_clientdata(client);
 271        long val = simple_strtol(buf, NULL, 10);
 272
 273        mutex_lock(&data->update_lock);
 274        data->temp_min[index] = TEMP_TO_REG(val);
 275        i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(index),
 276                                  data->temp_min[index]);
 277        mutex_unlock(&data->update_lock);
 278        return count;
 279}
 280
 281static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr,
 282        const char *buf, size_t count)
 283{
 284        int index = to_sensor_dev_attr(attr)->index;
 285        struct i2c_client *client = to_i2c_client(dev);
 286        struct adm1025_data *data = i2c_get_clientdata(client);
 287        long val = simple_strtol(buf, NULL, 10);
 288
 289        mutex_lock(&data->update_lock);
 290        data->temp_max[index] = TEMP_TO_REG(val);
 291        i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(index),
 292                                  data->temp_max[index]);
 293        mutex_unlock(&data->update_lock);
 294        return count;
 295}
 296
 297#define set_temp(offset) \
 298static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
 299        show_temp, NULL, offset - 1); \
 300static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \
 301        show_temp_min, set_temp_min, offset - 1); \
 302static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \
 303        show_temp_max, set_temp_max, offset - 1)
 304set_temp(1);
 305set_temp(2);
 306
 307static ssize_t
 308show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
 309{
 310        struct adm1025_data *data = adm1025_update_device(dev);
 311        return sprintf(buf, "%u\n", data->alarms);
 312}
 313static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 314
 315static ssize_t
 316show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
 317{
 318        int bitnr = to_sensor_dev_attr(attr)->index;
 319        struct adm1025_data *data = adm1025_update_device(dev);
 320        return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
 321}
 322static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
 323static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
 324static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
 325static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
 326static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
 327static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
 328static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 5);
 329static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 4);
 330static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, show_alarm, NULL, 14);
 331
 332static ssize_t
 333show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 334{
 335        struct adm1025_data *data = adm1025_update_device(dev);
 336        return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm));
 337}
 338static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 339
 340static ssize_t
 341show_vrm(struct device *dev, struct device_attribute *attr, char *buf)
 342{
 343        struct adm1025_data *data = dev_get_drvdata(dev);
 344        return sprintf(buf, "%u\n", data->vrm);
 345}
 346static ssize_t set_vrm(struct device *dev, struct device_attribute *attr,
 347                       const char *buf, size_t count)
 348{
 349        struct adm1025_data *data = dev_get_drvdata(dev);
 350        data->vrm = simple_strtoul(buf, NULL, 10);
 351        return count;
 352}
 353static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm);
 354
 355/*
 356 * Real code
 357 */
 358
 359static struct attribute *adm1025_attributes[] = {
 360        &sensor_dev_attr_in0_input.dev_attr.attr,
 361        &sensor_dev_attr_in1_input.dev_attr.attr,
 362        &sensor_dev_attr_in2_input.dev_attr.attr,
 363        &sensor_dev_attr_in3_input.dev_attr.attr,
 364        &sensor_dev_attr_in5_input.dev_attr.attr,
 365        &sensor_dev_attr_in0_min.dev_attr.attr,
 366        &sensor_dev_attr_in1_min.dev_attr.attr,
 367        &sensor_dev_attr_in2_min.dev_attr.attr,
 368        &sensor_dev_attr_in3_min.dev_attr.attr,
 369        &sensor_dev_attr_in5_min.dev_attr.attr,
 370        &sensor_dev_attr_in0_max.dev_attr.attr,
 371        &sensor_dev_attr_in1_max.dev_attr.attr,
 372        &sensor_dev_attr_in2_max.dev_attr.attr,
 373        &sensor_dev_attr_in3_max.dev_attr.attr,
 374        &sensor_dev_attr_in5_max.dev_attr.attr,
 375        &sensor_dev_attr_in0_alarm.dev_attr.attr,
 376        &sensor_dev_attr_in1_alarm.dev_attr.attr,
 377        &sensor_dev_attr_in2_alarm.dev_attr.attr,
 378        &sensor_dev_attr_in3_alarm.dev_attr.attr,
 379        &sensor_dev_attr_in5_alarm.dev_attr.attr,
 380        &sensor_dev_attr_temp1_input.dev_attr.attr,
 381        &sensor_dev_attr_temp2_input.dev_attr.attr,
 382        &sensor_dev_attr_temp1_min.dev_attr.attr,
 383        &sensor_dev_attr_temp2_min.dev_attr.attr,
 384        &sensor_dev_attr_temp1_max.dev_attr.attr,
 385        &sensor_dev_attr_temp2_max.dev_attr.attr,
 386        &sensor_dev_attr_temp1_alarm.dev_attr.attr,
 387        &sensor_dev_attr_temp2_alarm.dev_attr.attr,
 388        &sensor_dev_attr_temp1_fault.dev_attr.attr,
 389        &dev_attr_alarms.attr,
 390        &dev_attr_cpu0_vid.attr,
 391        &dev_attr_vrm.attr,
 392        NULL
 393};
 394
 395static const struct attribute_group adm1025_group = {
 396        .attrs = adm1025_attributes,
 397};
 398
 399static struct attribute *adm1025_attributes_in4[] = {
 400        &sensor_dev_attr_in4_input.dev_attr.attr,
 401        &sensor_dev_attr_in4_min.dev_attr.attr,
 402        &sensor_dev_attr_in4_max.dev_attr.attr,
 403        &sensor_dev_attr_in4_alarm.dev_attr.attr,
 404        NULL
 405};
 406
 407static const struct attribute_group adm1025_group_in4 = {
 408        .attrs = adm1025_attributes_in4,
 409};
 410
 411/* Return 0 if detection is successful, -ENODEV otherwise */
 412static int adm1025_detect(struct i2c_client *client, int kind,
 413                          struct i2c_board_info *info)
 414{
 415        struct i2c_adapter *adapter = client->adapter;
 416        const char *name = "";
 417        u8 config;
 418
 419        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 420                return -ENODEV;
 421
 422        /*
 423         * Now we do the remaining detection. A negative kind means that
 424         * the driver was loaded with no force parameter (default), so we
 425         * must both detect and identify the chip. A zero kind means that
 426         * the driver was loaded with the force parameter, the detection
 427         * step shall be skipped. A positive kind means that the driver
 428         * was loaded with the force parameter and a given kind of chip is
 429         * requested, so both the detection and the identification steps
 430         * are skipped.
 431         */
 432        config = i2c_smbus_read_byte_data(client, ADM1025_REG_CONFIG);
 433        if (kind < 0) { /* detection */
 434                if ((config & 0x80) != 0x00
 435                 || (i2c_smbus_read_byte_data(client,
 436                     ADM1025_REG_STATUS1) & 0xC0) != 0x00
 437                 || (i2c_smbus_read_byte_data(client,
 438                     ADM1025_REG_STATUS2) & 0xBC) != 0x00) {
 439                        dev_dbg(&adapter->dev,
 440                                "ADM1025 detection failed at 0x%02x.\n",
 441                                client->addr);
 442                        return -ENODEV;
 443                }
 444        }
 445
 446        if (kind <= 0) { /* identification */
 447                u8 man_id, chip_id;
 448
 449                man_id = i2c_smbus_read_byte_data(client, ADM1025_REG_MAN_ID);
 450                chip_id = i2c_smbus_read_byte_data(client, ADM1025_REG_CHIP_ID);
 451
 452                if (man_id == 0x41) { /* Analog Devices */
 453                        if ((chip_id & 0xF0) == 0x20) { /* ADM1025/ADM1025A */
 454                                kind = adm1025;
 455                        }
 456                } else
 457                if (man_id == 0xA1) { /* Philips */
 458                        if (client->addr != 0x2E
 459                         && (chip_id & 0xF0) == 0x20) { /* NE1619 */
 460                                kind = ne1619;
 461                        }
 462                }
 463
 464                if (kind <= 0) { /* identification failed */
 465                        dev_info(&adapter->dev,
 466                            "Unsupported chip (man_id=0x%02X, "
 467                            "chip_id=0x%02X).\n", man_id, chip_id);
 468                        return -ENODEV;
 469                }
 470        }
 471
 472        if (kind == adm1025) {
 473                name = "adm1025";
 474        } else if (kind == ne1619) {
 475                name = "ne1619";
 476        }
 477        strlcpy(info->type, name, I2C_NAME_SIZE);
 478
 479        return 0;
 480}
 481
 482static int adm1025_probe(struct i2c_client *client,
 483                         const struct i2c_device_id *id)
 484{
 485        struct adm1025_data *data;
 486        int err;
 487        u8 config;
 488
 489        data = kzalloc(sizeof(struct adm1025_data), GFP_KERNEL);
 490        if (!data) {
 491                err = -ENOMEM;
 492                goto exit;
 493        }
 494
 495        i2c_set_clientdata(client, data);
 496        mutex_init(&data->update_lock);
 497
 498        /* Initialize the ADM1025 chip */
 499        adm1025_init_client(client);
 500
 501        /* Register sysfs hooks */
 502        if ((err = sysfs_create_group(&client->dev.kobj, &adm1025_group)))
 503                goto exit_free;
 504
 505        /* Pin 11 is either in4 (+12V) or VID4 */
 506        config = i2c_smbus_read_byte_data(client, ADM1025_REG_CONFIG);
 507        if (!(config & 0x20)) {
 508                if ((err = sysfs_create_group(&client->dev.kobj,
 509                                              &adm1025_group_in4)))
 510                        goto exit_remove;
 511        }
 512
 513        data->hwmon_dev = hwmon_device_register(&client->dev);
 514        if (IS_ERR(data->hwmon_dev)) {
 515                err = PTR_ERR(data->hwmon_dev);
 516                goto exit_remove;
 517        }
 518
 519        return 0;
 520
 521exit_remove:
 522        sysfs_remove_group(&client->dev.kobj, &adm1025_group);
 523        sysfs_remove_group(&client->dev.kobj, &adm1025_group_in4);
 524exit_free:
 525        kfree(data);
 526exit:
 527        return err;
 528}
 529
 530static void adm1025_init_client(struct i2c_client *client)
 531{
 532        u8 reg;
 533        struct adm1025_data *data = i2c_get_clientdata(client);
 534        int i;
 535
 536        data->vrm = vid_which_vrm();
 537
 538        /*
 539         * Set high limits
 540         * Usually we avoid setting limits on driver init, but it happens
 541         * that the ADM1025 comes with stupid default limits (all registers
 542         * set to 0). In case the chip has not gone through any limit
 543         * setting yet, we better set the high limits to the max so that
 544         * no alarm triggers.
 545         */
 546        for (i=0; i<6; i++) {
 547                reg = i2c_smbus_read_byte_data(client,
 548                                               ADM1025_REG_IN_MAX(i));
 549                if (reg == 0)
 550                        i2c_smbus_write_byte_data(client,
 551                                                  ADM1025_REG_IN_MAX(i),
 552                                                  0xFF);
 553        }
 554        for (i=0; i<2; i++) {
 555                reg = i2c_smbus_read_byte_data(client,
 556                                               ADM1025_REG_TEMP_HIGH(i));
 557                if (reg == 0)
 558                        i2c_smbus_write_byte_data(client,
 559                                                  ADM1025_REG_TEMP_HIGH(i),
 560                                                  0x7F);
 561        }
 562
 563        /*
 564         * Start the conversions
 565         */
 566        reg = i2c_smbus_read_byte_data(client, ADM1025_REG_CONFIG);
 567        if (!(reg & 0x01))
 568                i2c_smbus_write_byte_data(client, ADM1025_REG_CONFIG,
 569                                          (reg&0x7E)|0x01);
 570}
 571
 572static int adm1025_remove(struct i2c_client *client)
 573{
 574        struct adm1025_data *data = i2c_get_clientdata(client);
 575
 576        hwmon_device_unregister(data->hwmon_dev);
 577        sysfs_remove_group(&client->dev.kobj, &adm1025_group);
 578        sysfs_remove_group(&client->dev.kobj, &adm1025_group_in4);
 579
 580        kfree(data);
 581        return 0;
 582}
 583
 584static struct adm1025_data *adm1025_update_device(struct device *dev)
 585{
 586        struct i2c_client *client = to_i2c_client(dev);
 587        struct adm1025_data *data = i2c_get_clientdata(client);
 588
 589        mutex_lock(&data->update_lock);
 590
 591        if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) {
 592                int i;
 593
 594                dev_dbg(&client->dev, "Updating data.\n");
 595                for (i=0; i<6; i++) {
 596                        data->in[i] = i2c_smbus_read_byte_data(client,
 597                                      ADM1025_REG_IN(i));
 598                        data->in_min[i] = i2c_smbus_read_byte_data(client,
 599                                          ADM1025_REG_IN_MIN(i));
 600                        data->in_max[i] = i2c_smbus_read_byte_data(client,
 601                                          ADM1025_REG_IN_MAX(i));
 602                }
 603                for (i=0; i<2; i++) {
 604                        data->temp[i] = i2c_smbus_read_byte_data(client,
 605                                        ADM1025_REG_TEMP(i));
 606                        data->temp_min[i] = i2c_smbus_read_byte_data(client,
 607                                            ADM1025_REG_TEMP_LOW(i));
 608                        data->temp_max[i] = i2c_smbus_read_byte_data(client,
 609                                            ADM1025_REG_TEMP_HIGH(i));
 610                }
 611                data->alarms = i2c_smbus_read_byte_data(client,
 612                               ADM1025_REG_STATUS1)
 613                             | (i2c_smbus_read_byte_data(client,
 614                                ADM1025_REG_STATUS2) << 8);
 615                data->vid = (i2c_smbus_read_byte_data(client,
 616                             ADM1025_REG_VID) & 0x0f)
 617                          | ((i2c_smbus_read_byte_data(client,
 618                              ADM1025_REG_VID4) & 0x01) << 4);
 619
 620                data->last_updated = jiffies;
 621                data->valid = 1;
 622        }
 623
 624        mutex_unlock(&data->update_lock);
 625
 626        return data;
 627}
 628
 629static int __init sensors_adm1025_init(void)
 630{
 631        return i2c_add_driver(&adm1025_driver);
 632}
 633
 634static void __exit sensors_adm1025_exit(void)
 635{
 636        i2c_del_driver(&adm1025_driver);
 637}
 638
 639MODULE_AUTHOR("Jean Delvare <khali@linux-fr.org>");
 640MODULE_DESCRIPTION("ADM1025 driver");
 641MODULE_LICENSE("GPL");
 642
 643module_init(sensors_adm1025_init);
 644module_exit(sensors_adm1025_exit);
 645