linux/drivers/hwmon/lm92.c
<<
>>
Prefs
   1/*
   2 * lm92 - Hardware monitoring driver
   3 * Copyright (C) 2005-2008  Jean Delvare <jdelvare@suse.de>
   4 *
   5 * Based on the lm90 driver, with some ideas taken from the lm_sensors
   6 * lm92 driver as well.
   7 *
   8 * The LM92 is a sensor chip made by National Semiconductor. It reports
   9 * its own temperature with a 0.0625 deg resolution and a 0.33 deg
  10 * accuracy. Complete datasheet can be obtained from National's website
  11 * at:
  12 *   http://www.national.com/pf/LM/LM92.html
  13 *
  14 * This driver also supports the MAX6635 sensor chip made by Maxim.
  15 * This chip is compatible with the LM92, but has a lesser accuracy
  16 * (1.0 deg). Complete datasheet can be obtained from Maxim's website
  17 * at:
  18 *   http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3074
  19 *
  20 * Since the LM92 was the first chipset supported by this driver, most
  21 * comments will refer to this chipset, but are actually general and
  22 * concern all supported chipsets, unless mentioned otherwise.
  23 *
  24 * Support could easily be added for the National Semiconductor LM76
  25 * and Maxim MAX6633 and MAX6634 chips, which are mostly compatible
  26 * with the LM92.
  27 *
  28 * This program is free software; you can redistribute it and/or modify
  29 * it under the terms of the GNU General Public License as published by
  30 * the Free Software Foundation; either version 2 of the License, or
  31 * (at your option) any later version.
  32 *
  33 * This program is distributed in the hope that it will be useful,
  34 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  35 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  36 * GNU General Public License for more details.
  37 */
  38
  39#include <linux/module.h>
  40#include <linux/init.h>
  41#include <linux/slab.h>
  42#include <linux/i2c.h>
  43#include <linux/hwmon.h>
  44#include <linux/hwmon-sysfs.h>
  45#include <linux/err.h>
  46#include <linux/mutex.h>
  47#include <linux/jiffies.h>
  48
  49/*
  50 * The LM92 and MAX6635 have 2 two-state pins for address selection,
  51 * resulting in 4 possible addresses.
  52 */
  53static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b,
  54                                                I2C_CLIENT_END };
  55
  56/* The LM92 registers */
  57#define LM92_REG_CONFIG                 0x01 /* 8-bit, RW */
  58#define LM92_REG_TEMP                   0x00 /* 16-bit, RO */
  59#define LM92_REG_TEMP_HYST              0x02 /* 16-bit, RW */
  60#define LM92_REG_TEMP_CRIT              0x03 /* 16-bit, RW */
  61#define LM92_REG_TEMP_LOW               0x04 /* 16-bit, RW */
  62#define LM92_REG_TEMP_HIGH              0x05 /* 16-bit, RW */
  63#define LM92_REG_MAN_ID                 0x07 /* 16-bit, RO, LM92 only */
  64
  65/*
  66 * The LM92 uses signed 13-bit values with LSB = 0.0625 degree Celsius,
  67 * left-justified in 16-bit registers. No rounding is done, with such
  68 * a resolution it's just not worth it. Note that the MAX6635 doesn't
  69 * make use of the 4 lower bits for limits (i.e. effective resolution
  70 * for limits is 1 degree Celsius).
  71 */
  72static inline int TEMP_FROM_REG(s16 reg)
  73{
  74        return reg / 8 * 625 / 10;
  75}
  76
  77static inline s16 TEMP_TO_REG(long val)
  78{
  79        val = clamp_val(val, -60000, 160000);
  80        return val * 10 / 625 * 8;
  81}
  82
  83/* Alarm flags are stored in the 3 LSB of the temperature register */
  84static inline u8 ALARMS_FROM_REG(s16 reg)
  85{
  86        return reg & 0x0007;
  87}
  88
  89enum temp_index {
  90        t_input,
  91        t_crit,
  92        t_min,
  93        t_max,
  94        t_hyst,
  95        t_num_regs
  96};
  97
  98static const u8 regs[t_num_regs] = {
  99        [t_input] = LM92_REG_TEMP,
 100        [t_crit] = LM92_REG_TEMP_CRIT,
 101        [t_min] = LM92_REG_TEMP_LOW,
 102        [t_max] = LM92_REG_TEMP_HIGH,
 103        [t_hyst] = LM92_REG_TEMP_HYST,
 104};
 105
 106/* Client data (each client gets its own) */
 107struct lm92_data {
 108        struct i2c_client *client;
 109        struct mutex update_lock;
 110        char valid; /* zero until following fields are valid */
 111        unsigned long last_updated; /* in jiffies */
 112
 113        /* registers values */
 114        s16 temp[t_num_regs];   /* index with enum temp_index */
 115};
 116
 117/*
 118 * Sysfs attributes and callback functions
 119 */
 120
 121static struct lm92_data *lm92_update_device(struct device *dev)
 122{
 123        struct lm92_data *data = dev_get_drvdata(dev);
 124        struct i2c_client *client = data->client;
 125        int i;
 126
 127        mutex_lock(&data->update_lock);
 128
 129        if (time_after(jiffies, data->last_updated + HZ)
 130         || !data->valid) {
 131                dev_dbg(&client->dev, "Updating lm92 data\n");
 132                for (i = 0; i < t_num_regs; i++) {
 133                        data->temp[i] =
 134                                i2c_smbus_read_word_swapped(client, regs[i]);
 135                }
 136                data->last_updated = jiffies;
 137                data->valid = 1;
 138        }
 139
 140        mutex_unlock(&data->update_lock);
 141
 142        return data;
 143}
 144
 145static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
 146                         char *buf)
 147{
 148        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 149        struct lm92_data *data = lm92_update_device(dev);
 150
 151        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[attr->index]));
 152}
 153
 154static ssize_t set_temp(struct device *dev, struct device_attribute *devattr,
 155                           const char *buf, size_t count)
 156{
 157        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 158        struct lm92_data *data = dev_get_drvdata(dev);
 159        struct i2c_client *client = data->client;
 160        int nr = attr->index;
 161        long val;
 162        int err;
 163        
 164        err = kstrtol(buf, 10, &val);
 165        if (err)
 166                return err;
 167
 168        mutex_lock(&data->update_lock);
 169        data->temp[nr] = TEMP_TO_REG(val);
 170        i2c_smbus_write_word_swapped(client, regs[nr], data->temp[nr]);
 171        mutex_unlock(&data->update_lock);
 172        return count;
 173}
 174
 175static ssize_t show_temp_hyst(struct device *dev,
 176                              struct device_attribute *devattr, char *buf)
 177{
 178        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 179        struct lm92_data *data = lm92_update_device(dev);
 180        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[attr->index])
 181                       - TEMP_FROM_REG(data->temp[t_hyst]));
 182}
 183
 184static ssize_t show_temp_min_hyst(struct device *dev,
 185                                  struct device_attribute *attr, char *buf)
 186{
 187        struct lm92_data *data = lm92_update_device(dev);
 188        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[t_min])
 189                       + TEMP_FROM_REG(data->temp[t_hyst]));
 190}
 191
 192static ssize_t set_temp_hyst(struct device *dev,
 193                             struct device_attribute *devattr,
 194                             const char *buf, size_t count)
 195{
 196        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 197        struct lm92_data *data = dev_get_drvdata(dev);
 198        struct i2c_client *client = data->client;
 199        long val;
 200        int err;
 201
 202        err = kstrtol(buf, 10, &val);
 203        if (err)
 204                return err;
 205
 206        val = clamp_val(val, -120000, 220000);
 207        mutex_lock(&data->update_lock);
 208         data->temp[t_hyst] =
 209                TEMP_TO_REG(TEMP_FROM_REG(data->temp[attr->index]) - val);
 210        i2c_smbus_write_word_swapped(client, LM92_REG_TEMP_HYST,
 211                                     data->temp[t_hyst]);
 212        mutex_unlock(&data->update_lock);
 213        return count;
 214}
 215
 216static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
 217                           char *buf)
 218{
 219        struct lm92_data *data = lm92_update_device(dev);
 220        return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->temp[t_input]));
 221}
 222
 223static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
 224                          char *buf)
 225{
 226        int bitnr = to_sensor_dev_attr(attr)->index;
 227        struct lm92_data *data = lm92_update_device(dev);
 228        return sprintf(buf, "%d\n", (data->temp[t_input] >> bitnr) & 1);
 229}
 230
 231static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, t_input);
 232static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp, set_temp,
 233                          t_crit);
 234static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temp_hyst,
 235                          set_temp_hyst, t_crit);
 236static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp, set_temp,
 237                          t_min);
 238static DEVICE_ATTR(temp1_min_hyst, S_IRUGO, show_temp_min_hyst, NULL);
 239static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp, set_temp,
 240                          t_max);
 241static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_temp_hyst, NULL, t_max);
 242static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 243static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 2);
 244static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 0);
 245static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 1);
 246
 247/*
 248 * Detection and registration
 249 */
 250
 251static void lm92_init_client(struct i2c_client *client)
 252{
 253        u8 config;
 254
 255        /* Start the conversions if needed */
 256        config = i2c_smbus_read_byte_data(client, LM92_REG_CONFIG);
 257        if (config & 0x01)
 258                i2c_smbus_write_byte_data(client, LM92_REG_CONFIG,
 259                                          config & 0xFE);
 260}
 261
 262/*
 263 * The MAX6635 has no identification register, so we have to use tricks
 264 * to identify it reliably. This is somewhat slow.
 265 * Note that we do NOT rely on the 2 MSB of the configuration register
 266 * always reading 0, as suggested by the datasheet, because it was once
 267 * reported not to be true.
 268 */
 269static int max6635_check(struct i2c_client *client)
 270{
 271        u16 temp_low, temp_high, temp_hyst, temp_crit;
 272        u8 conf;
 273        int i;
 274
 275        /*
 276         * No manufacturer ID register, so a read from this address will
 277         * always return the last read value.
 278         */
 279        temp_low = i2c_smbus_read_word_data(client, LM92_REG_TEMP_LOW);
 280        if (i2c_smbus_read_word_data(client, LM92_REG_MAN_ID) != temp_low)
 281                return 0;
 282        temp_high = i2c_smbus_read_word_data(client, LM92_REG_TEMP_HIGH);
 283        if (i2c_smbus_read_word_data(client, LM92_REG_MAN_ID) != temp_high)
 284                return 0;
 285
 286        /* Limits are stored as integer values (signed, 9-bit). */
 287        if ((temp_low & 0x7f00) || (temp_high & 0x7f00))
 288                return 0;
 289        temp_hyst = i2c_smbus_read_word_data(client, LM92_REG_TEMP_HYST);
 290        temp_crit = i2c_smbus_read_word_data(client, LM92_REG_TEMP_CRIT);
 291        if ((temp_hyst & 0x7f00) || (temp_crit & 0x7f00))
 292                return 0;
 293
 294        /*
 295         * Registers addresses were found to cycle over 16-byte boundaries.
 296         * We don't test all registers with all offsets so as to save some
 297         * reads and time, but this should still be sufficient to dismiss
 298         * non-MAX6635 chips.
 299         */
 300        conf = i2c_smbus_read_byte_data(client, LM92_REG_CONFIG);
 301        for (i = 16; i < 96; i *= 2) {
 302                if (temp_hyst != i2c_smbus_read_word_data(client,
 303                                 LM92_REG_TEMP_HYST + i - 16)
 304                 || temp_crit != i2c_smbus_read_word_data(client,
 305                                 LM92_REG_TEMP_CRIT + i)
 306                 || temp_low != i2c_smbus_read_word_data(client,
 307                                LM92_REG_TEMP_LOW + i + 16)
 308                 || temp_high != i2c_smbus_read_word_data(client,
 309                                 LM92_REG_TEMP_HIGH + i + 32)
 310                 || conf != i2c_smbus_read_byte_data(client,
 311                            LM92_REG_CONFIG + i))
 312                        return 0;
 313        }
 314
 315        return 1;
 316}
 317
 318static struct attribute *lm92_attrs[] = {
 319        &sensor_dev_attr_temp1_input.dev_attr.attr,
 320        &sensor_dev_attr_temp1_crit.dev_attr.attr,
 321        &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr,
 322        &sensor_dev_attr_temp1_min.dev_attr.attr,
 323        &dev_attr_temp1_min_hyst.attr,
 324        &sensor_dev_attr_temp1_max.dev_attr.attr,
 325        &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
 326        &dev_attr_alarms.attr,
 327        &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
 328        &sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
 329        &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
 330        NULL
 331};
 332ATTRIBUTE_GROUPS(lm92);
 333
 334/* Return 0 if detection is successful, -ENODEV otherwise */
 335static int lm92_detect(struct i2c_client *new_client,
 336                       struct i2c_board_info *info)
 337{
 338        struct i2c_adapter *adapter = new_client->adapter;
 339        u8 config;
 340        u16 man_id;
 341
 342        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
 343                                            | I2C_FUNC_SMBUS_WORD_DATA))
 344                return -ENODEV;
 345
 346        config = i2c_smbus_read_byte_data(new_client, LM92_REG_CONFIG);
 347        man_id = i2c_smbus_read_word_data(new_client, LM92_REG_MAN_ID);
 348
 349        if ((config & 0xe0) == 0x00 && man_id == 0x0180)
 350                pr_info("lm92: Found National Semiconductor LM92 chip\n");
 351        else if (max6635_check(new_client))
 352                pr_info("lm92: Found Maxim MAX6635 chip\n");
 353        else
 354                return -ENODEV;
 355
 356        strlcpy(info->type, "lm92", I2C_NAME_SIZE);
 357
 358        return 0;
 359}
 360
 361static int lm92_probe(struct i2c_client *new_client,
 362                      const struct i2c_device_id *id)
 363{
 364        struct device *hwmon_dev;
 365        struct lm92_data *data;
 366
 367        data = devm_kzalloc(&new_client->dev, sizeof(struct lm92_data),
 368                            GFP_KERNEL);
 369        if (!data)
 370                return -ENOMEM;
 371
 372        data->client = new_client;
 373        mutex_init(&data->update_lock);
 374
 375        /* Initialize the chipset */
 376        lm92_init_client(new_client);
 377
 378        hwmon_dev = devm_hwmon_device_register_with_groups(&new_client->dev,
 379                                                           new_client->name,
 380                                                           data, lm92_groups);
 381        return PTR_ERR_OR_ZERO(hwmon_dev);
 382}
 383
 384
 385/*
 386 * Module and driver stuff
 387 */
 388
 389static const struct i2c_device_id lm92_id[] = {
 390        { "lm92", 0 },
 391        /* max6635 could be added here */
 392        { }
 393};
 394MODULE_DEVICE_TABLE(i2c, lm92_id);
 395
 396static struct i2c_driver lm92_driver = {
 397        .class          = I2C_CLASS_HWMON,
 398        .driver = {
 399                .name   = "lm92",
 400        },
 401        .probe          = lm92_probe,
 402        .id_table       = lm92_id,
 403        .detect         = lm92_detect,
 404        .address_list   = normal_i2c,
 405};
 406
 407module_i2c_driver(lm92_driver);
 408
 409MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
 410MODULE_DESCRIPTION("LM92/MAX6635 driver");
 411MODULE_LICENSE("GPL");
 412