linux/drivers/hwmon/lm78.c
<<
>>
Prefs
   1/*
   2    lm78.c - Part of lm_sensors, Linux kernel modules for hardware
   3             monitoring
   4    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl> 
   5    Copyright (c) 2007        Jean Delvare <khali@linux-fr.org>
   6
   7    This program is free software; you can redistribute it and/or modify
   8    it under the terms of the GNU General Public License as published by
   9    the Free Software Foundation; either version 2 of the License, or
  10    (at your option) any later version.
  11
  12    This program is distributed in the hope that it will be useful,
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15    GNU General Public License for more details.
  16
  17    You should have received a copy of the GNU General Public License
  18    along with this program; if not, write to the Free Software
  19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20*/
  21
  22#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  23
  24#include <linux/module.h>
  25#include <linux/init.h>
  26#include <linux/slab.h>
  27#include <linux/jiffies.h>
  28#include <linux/i2c.h>
  29#include <linux/platform_device.h>
  30#include <linux/ioport.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/io.h>
  37
  38/* ISA device, if found */
  39static struct platform_device *pdev;
  40
  41/* Addresses to scan */
  42static const unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
  43                                                0x2e, 0x2f, I2C_CLIENT_END };
  44static unsigned short isa_address = 0x290;
  45
  46enum chips { lm78, lm79 };
  47
  48/* Many LM78 constants specified below */
  49
  50/* Length of ISA address segment */
  51#define LM78_EXTENT 8
  52
  53/* Where are the ISA address/data registers relative to the base address */
  54#define LM78_ADDR_REG_OFFSET 5
  55#define LM78_DATA_REG_OFFSET 6
  56
  57/* The LM78 registers */
  58#define LM78_REG_IN_MAX(nr) (0x2b + (nr) * 2)
  59#define LM78_REG_IN_MIN(nr) (0x2c + (nr) * 2)
  60#define LM78_REG_IN(nr) (0x20 + (nr))
  61
  62#define LM78_REG_FAN_MIN(nr) (0x3b + (nr))
  63#define LM78_REG_FAN(nr) (0x28 + (nr))
  64
  65#define LM78_REG_TEMP 0x27
  66#define LM78_REG_TEMP_OVER 0x39
  67#define LM78_REG_TEMP_HYST 0x3a
  68
  69#define LM78_REG_ALARM1 0x41
  70#define LM78_REG_ALARM2 0x42
  71
  72#define LM78_REG_VID_FANDIV 0x47
  73
  74#define LM78_REG_CONFIG 0x40
  75#define LM78_REG_CHIPID 0x49
  76#define LM78_REG_I2C_ADDR 0x48
  77
  78
  79/* Conversions. Rounding and limit checking is only done on the TO_REG 
  80   variants. */
  81
  82/* IN: mV, (0V to 4.08V)
  83   REG: 16mV/bit */
  84static inline u8 IN_TO_REG(unsigned long val)
  85{
  86        unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
  87        return (nval + 8) / 16;
  88}
  89#define IN_FROM_REG(val) ((val) *  16)
  90
  91static inline u8 FAN_TO_REG(long rpm, int div)
  92{
  93        if (rpm <= 0)
  94                return 255;
  95        return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
  96}
  97
  98static inline int FAN_FROM_REG(u8 val, int div)
  99{
 100        return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
 101}
 102
 103/* TEMP: mC (-128C to +127C)
 104   REG: 1C/bit, two's complement */
 105static inline s8 TEMP_TO_REG(int val)
 106{
 107        int nval = SENSORS_LIMIT(val, -128000, 127000) ;
 108        return nval<0 ? (nval-500)/1000 : (nval+500)/1000;
 109}
 110
 111static inline int TEMP_FROM_REG(s8 val)
 112{
 113        return val * 1000;
 114}
 115
 116#define DIV_FROM_REG(val) (1 << (val))
 117
 118struct lm78_data {
 119        struct i2c_client *client;
 120        struct device *hwmon_dev;
 121        struct mutex lock;
 122        enum chips type;
 123
 124        /* For ISA device only */
 125        const char *name;
 126        int isa_addr;
 127
 128        struct mutex update_lock;
 129        char valid;             /* !=0 if following fields are valid */
 130        unsigned long last_updated;     /* In jiffies */
 131
 132        u8 in[7];               /* Register value */
 133        u8 in_max[7];           /* Register value */
 134        u8 in_min[7];           /* Register value */
 135        u8 fan[3];              /* Register value */
 136        u8 fan_min[3];          /* Register value */
 137        s8 temp;                /* Register value */
 138        s8 temp_over;           /* Register value */
 139        s8 temp_hyst;           /* Register value */
 140        u8 fan_div[3];          /* Register encoding, shifted right */
 141        u8 vid;                 /* Register encoding, combined */
 142        u16 alarms;             /* Register encoding, combined */
 143};
 144
 145
 146static int lm78_i2c_detect(struct i2c_client *client,
 147                           struct i2c_board_info *info);
 148static int lm78_i2c_probe(struct i2c_client *client,
 149                          const struct i2c_device_id *id);
 150static int lm78_i2c_remove(struct i2c_client *client);
 151
 152static int __devinit lm78_isa_probe(struct platform_device *pdev);
 153static int __devexit lm78_isa_remove(struct platform_device *pdev);
 154
 155static int lm78_read_value(struct lm78_data *data, u8 reg);
 156static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value);
 157static struct lm78_data *lm78_update_device(struct device *dev);
 158static void lm78_init_device(struct lm78_data *data);
 159
 160
 161static const struct i2c_device_id lm78_i2c_id[] = {
 162        { "lm78", lm78 },
 163        { "lm79", lm79 },
 164        { }
 165};
 166MODULE_DEVICE_TABLE(i2c, lm78_i2c_id);
 167
 168static struct i2c_driver lm78_driver = {
 169        .class          = I2C_CLASS_HWMON,
 170        .driver = {
 171                .name   = "lm78",
 172        },
 173        .probe          = lm78_i2c_probe,
 174        .remove         = lm78_i2c_remove,
 175        .id_table       = lm78_i2c_id,
 176        .detect         = lm78_i2c_detect,
 177        .address_list   = normal_i2c,
 178};
 179
 180static struct platform_driver lm78_isa_driver = {
 181        .driver = {
 182                .owner  = THIS_MODULE,
 183                .name   = "lm78",
 184        },
 185        .probe          = lm78_isa_probe,
 186        .remove         = __devexit_p(lm78_isa_remove),
 187};
 188
 189
 190/* 7 Voltages */
 191static ssize_t show_in(struct device *dev, struct device_attribute *da,
 192                       char *buf)
 193{
 194        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 195        struct lm78_data *data = lm78_update_device(dev);
 196        return sprintf(buf, "%d\n", IN_FROM_REG(data->in[attr->index]));
 197}
 198
 199static ssize_t show_in_min(struct device *dev, struct device_attribute *da,
 200                           char *buf)
 201{
 202        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 203        struct lm78_data *data = lm78_update_device(dev);
 204        return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[attr->index]));
 205}
 206
 207static ssize_t show_in_max(struct device *dev, struct device_attribute *da,
 208                           char *buf)
 209{
 210        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 211        struct lm78_data *data = lm78_update_device(dev);
 212        return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[attr->index]));
 213}
 214
 215static ssize_t set_in_min(struct device *dev, struct device_attribute *da,
 216                          const char *buf, size_t count)
 217{
 218        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 219        struct lm78_data *data = dev_get_drvdata(dev);
 220        unsigned long val = simple_strtoul(buf, NULL, 10);
 221        int nr = attr->index;
 222
 223        mutex_lock(&data->update_lock);
 224        data->in_min[nr] = IN_TO_REG(val);
 225        lm78_write_value(data, LM78_REG_IN_MIN(nr), data->in_min[nr]);
 226        mutex_unlock(&data->update_lock);
 227        return count;
 228}
 229
 230static ssize_t set_in_max(struct device *dev, struct device_attribute *da,
 231                          const char *buf, size_t count)
 232{
 233        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 234        struct lm78_data *data = dev_get_drvdata(dev);
 235        unsigned long val = simple_strtoul(buf, NULL, 10);
 236        int nr = attr->index;
 237
 238        mutex_lock(&data->update_lock);
 239        data->in_max[nr] = IN_TO_REG(val);
 240        lm78_write_value(data, LM78_REG_IN_MAX(nr), data->in_max[nr]);
 241        mutex_unlock(&data->update_lock);
 242        return count;
 243}
 244        
 245#define show_in_offset(offset)                                  \
 246static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO,          \
 247                show_in, NULL, offset);                         \
 248static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,  \
 249                show_in_min, set_in_min, offset);               \
 250static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,  \
 251                show_in_max, set_in_max, offset);
 252
 253show_in_offset(0);
 254show_in_offset(1);
 255show_in_offset(2);
 256show_in_offset(3);
 257show_in_offset(4);
 258show_in_offset(5);
 259show_in_offset(6);
 260
 261/* Temperature */
 262static ssize_t show_temp(struct device *dev, struct device_attribute *da,
 263                         char *buf)
 264{
 265        struct lm78_data *data = lm78_update_device(dev);
 266        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
 267}
 268
 269static ssize_t show_temp_over(struct device *dev, struct device_attribute *da,
 270                              char *buf)
 271{
 272        struct lm78_data *data = lm78_update_device(dev);
 273        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
 274}
 275
 276static ssize_t set_temp_over(struct device *dev, struct device_attribute *da,
 277                             const char *buf, size_t count)
 278{
 279        struct lm78_data *data = dev_get_drvdata(dev);
 280        long val = simple_strtol(buf, NULL, 10);
 281
 282        mutex_lock(&data->update_lock);
 283        data->temp_over = TEMP_TO_REG(val);
 284        lm78_write_value(data, LM78_REG_TEMP_OVER, data->temp_over);
 285        mutex_unlock(&data->update_lock);
 286        return count;
 287}
 288
 289static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *da,
 290                              char *buf)
 291{
 292        struct lm78_data *data = lm78_update_device(dev);
 293        return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
 294}
 295
 296static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *da,
 297                             const char *buf, size_t count)
 298{
 299        struct lm78_data *data = dev_get_drvdata(dev);
 300        long val = simple_strtol(buf, NULL, 10);
 301
 302        mutex_lock(&data->update_lock);
 303        data->temp_hyst = TEMP_TO_REG(val);
 304        lm78_write_value(data, LM78_REG_TEMP_HYST, data->temp_hyst);
 305        mutex_unlock(&data->update_lock);
 306        return count;
 307}
 308
 309static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
 310static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
 311                show_temp_over, set_temp_over);
 312static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
 313                show_temp_hyst, set_temp_hyst);
 314
 315/* 3 Fans */
 316static ssize_t show_fan(struct device *dev, struct device_attribute *da,
 317                        char *buf)
 318{
 319        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 320        struct lm78_data *data = lm78_update_device(dev);
 321        int nr = attr->index;
 322        return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
 323                DIV_FROM_REG(data->fan_div[nr])) );
 324}
 325
 326static ssize_t show_fan_min(struct device *dev, struct device_attribute *da,
 327                            char *buf)
 328{
 329        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 330        struct lm78_data *data = lm78_update_device(dev);
 331        int nr = attr->index;
 332        return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
 333                DIV_FROM_REG(data->fan_div[nr])) );
 334}
 335
 336static ssize_t set_fan_min(struct device *dev, struct device_attribute *da,
 337                           const char *buf, size_t count)
 338{
 339        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 340        struct lm78_data *data = dev_get_drvdata(dev);
 341        int nr = attr->index;
 342        unsigned long val = simple_strtoul(buf, NULL, 10);
 343
 344        mutex_lock(&data->update_lock);
 345        data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
 346        lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
 347        mutex_unlock(&data->update_lock);
 348        return count;
 349}
 350
 351static ssize_t show_fan_div(struct device *dev, struct device_attribute *da,
 352                            char *buf)
 353{
 354        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 355        struct lm78_data *data = lm78_update_device(dev);
 356        return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
 357}
 358
 359/* Note: we save and restore the fan minimum here, because its value is
 360   determined in part by the fan divisor.  This follows the principle of
 361   least surprise; the user doesn't expect the fan minimum to change just
 362   because the divisor changed. */
 363static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
 364                           const char *buf, size_t count)
 365{
 366        struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
 367        struct lm78_data *data = dev_get_drvdata(dev);
 368        int nr = attr->index;
 369        unsigned long val = simple_strtoul(buf, NULL, 10);
 370        unsigned long min;
 371        u8 reg;
 372
 373        mutex_lock(&data->update_lock);
 374        min = FAN_FROM_REG(data->fan_min[nr],
 375                           DIV_FROM_REG(data->fan_div[nr]));
 376
 377        switch (val) {
 378        case 1: data->fan_div[nr] = 0; break;
 379        case 2: data->fan_div[nr] = 1; break;
 380        case 4: data->fan_div[nr] = 2; break;
 381        case 8: data->fan_div[nr] = 3; break;
 382        default:
 383                dev_err(dev, "fan_div value %ld not "
 384                        "supported. Choose one of 1, 2, 4 or 8!\n", val);
 385                mutex_unlock(&data->update_lock);
 386                return -EINVAL;
 387        }
 388
 389        reg = lm78_read_value(data, LM78_REG_VID_FANDIV);
 390        switch (nr) {
 391        case 0:
 392                reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
 393                break;
 394        case 1:
 395                reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
 396                break;
 397        }
 398        lm78_write_value(data, LM78_REG_VID_FANDIV, reg);
 399
 400        data->fan_min[nr] =
 401                FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
 402        lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
 403        mutex_unlock(&data->update_lock);
 404
 405        return count;
 406}
 407
 408#define show_fan_offset(offset)                         \
 409static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,         \
 410                show_fan, NULL, offset - 1);                    \
 411static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
 412                show_fan_min, set_fan_min, offset - 1);
 413
 414show_fan_offset(1);
 415show_fan_offset(2);
 416show_fan_offset(3);
 417
 418/* Fan 3 divisor is locked in H/W */
 419static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
 420                show_fan_div, set_fan_div, 0);
 421static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
 422                show_fan_div, set_fan_div, 1);
 423static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2);
 424
 425/* VID */
 426static ssize_t show_vid(struct device *dev, struct device_attribute *da,
 427                        char *buf)
 428{
 429        struct lm78_data *data = lm78_update_device(dev);
 430        return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
 431}
 432static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
 433
 434/* Alarms */
 435static ssize_t show_alarms(struct device *dev, struct device_attribute *da,
 436                           char *buf)
 437{
 438        struct lm78_data *data = lm78_update_device(dev);
 439        return sprintf(buf, "%u\n", data->alarms);
 440}
 441static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
 442
 443static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
 444                          char *buf)
 445{
 446        struct lm78_data *data = lm78_update_device(dev);
 447        int nr = to_sensor_dev_attr(da)->index;
 448        return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
 449}
 450static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
 451static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
 452static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
 453static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
 454static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
 455static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
 456static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10);
 457static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
 458static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
 459static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11);
 460static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
 461
 462static struct attribute *lm78_attributes[] = {
 463        &sensor_dev_attr_in0_input.dev_attr.attr,
 464        &sensor_dev_attr_in0_min.dev_attr.attr,
 465        &sensor_dev_attr_in0_max.dev_attr.attr,
 466        &sensor_dev_attr_in0_alarm.dev_attr.attr,
 467        &sensor_dev_attr_in1_input.dev_attr.attr,
 468        &sensor_dev_attr_in1_min.dev_attr.attr,
 469        &sensor_dev_attr_in1_max.dev_attr.attr,
 470        &sensor_dev_attr_in1_alarm.dev_attr.attr,
 471        &sensor_dev_attr_in2_input.dev_attr.attr,
 472        &sensor_dev_attr_in2_min.dev_attr.attr,
 473        &sensor_dev_attr_in2_max.dev_attr.attr,
 474        &sensor_dev_attr_in2_alarm.dev_attr.attr,
 475        &sensor_dev_attr_in3_input.dev_attr.attr,
 476        &sensor_dev_attr_in3_min.dev_attr.attr,
 477        &sensor_dev_attr_in3_max.dev_attr.attr,
 478        &sensor_dev_attr_in3_alarm.dev_attr.attr,
 479        &sensor_dev_attr_in4_input.dev_attr.attr,
 480        &sensor_dev_attr_in4_min.dev_attr.attr,
 481        &sensor_dev_attr_in4_max.dev_attr.attr,
 482        &sensor_dev_attr_in4_alarm.dev_attr.attr,
 483        &sensor_dev_attr_in5_input.dev_attr.attr,
 484        &sensor_dev_attr_in5_min.dev_attr.attr,
 485        &sensor_dev_attr_in5_max.dev_attr.attr,
 486        &sensor_dev_attr_in5_alarm.dev_attr.attr,
 487        &sensor_dev_attr_in6_input.dev_attr.attr,
 488        &sensor_dev_attr_in6_min.dev_attr.attr,
 489        &sensor_dev_attr_in6_max.dev_attr.attr,
 490        &sensor_dev_attr_in6_alarm.dev_attr.attr,
 491        &dev_attr_temp1_input.attr,
 492        &dev_attr_temp1_max.attr,
 493        &dev_attr_temp1_max_hyst.attr,
 494        &sensor_dev_attr_temp1_alarm.dev_attr.attr,
 495        &sensor_dev_attr_fan1_input.dev_attr.attr,
 496        &sensor_dev_attr_fan1_min.dev_attr.attr,
 497        &sensor_dev_attr_fan1_div.dev_attr.attr,
 498        &sensor_dev_attr_fan1_alarm.dev_attr.attr,
 499        &sensor_dev_attr_fan2_input.dev_attr.attr,
 500        &sensor_dev_attr_fan2_min.dev_attr.attr,
 501        &sensor_dev_attr_fan2_div.dev_attr.attr,
 502        &sensor_dev_attr_fan2_alarm.dev_attr.attr,
 503        &sensor_dev_attr_fan3_input.dev_attr.attr,
 504        &sensor_dev_attr_fan3_min.dev_attr.attr,
 505        &sensor_dev_attr_fan3_div.dev_attr.attr,
 506        &sensor_dev_attr_fan3_alarm.dev_attr.attr,
 507        &dev_attr_alarms.attr,
 508        &dev_attr_cpu0_vid.attr,
 509
 510        NULL
 511};
 512
 513static const struct attribute_group lm78_group = {
 514        .attrs = lm78_attributes,
 515};
 516
 517/* I2C devices get this name attribute automatically, but for ISA devices
 518   we must create it by ourselves. */
 519static ssize_t show_name(struct device *dev, struct device_attribute
 520                         *devattr, char *buf)
 521{
 522        struct lm78_data *data = dev_get_drvdata(dev);
 523
 524        return sprintf(buf, "%s\n", data->name);
 525}
 526static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 527
 528/* Returns 1 if the I2C chip appears to be an alias of the ISA chip */
 529static int lm78_alias_detect(struct i2c_client *client, u8 chipid)
 530{
 531        struct lm78_data *isa;
 532        int i;
 533
 534        if (!pdev)      /* No ISA chip */
 535                return 0;
 536        isa = platform_get_drvdata(pdev);
 537
 538        if (lm78_read_value(isa, LM78_REG_I2C_ADDR) != client->addr)
 539                return 0;       /* Address doesn't match */
 540        if ((lm78_read_value(isa, LM78_REG_CHIPID) & 0xfe) != (chipid & 0xfe))
 541                return 0;       /* Chip type doesn't match */
 542
 543        /* We compare all the limit registers, the config register and the
 544         * interrupt mask registers */
 545        for (i = 0x2b; i <= 0x3d; i++) {
 546                if (lm78_read_value(isa, i) !=
 547                    i2c_smbus_read_byte_data(client, i))
 548                        return 0;
 549        }
 550        if (lm78_read_value(isa, LM78_REG_CONFIG) !=
 551            i2c_smbus_read_byte_data(client, LM78_REG_CONFIG))
 552                return 0;
 553        for (i = 0x43; i <= 0x46; i++) {
 554                if (lm78_read_value(isa, i) !=
 555                    i2c_smbus_read_byte_data(client, i))
 556                        return 0;
 557        }
 558
 559        return 1;
 560}
 561
 562static int lm78_i2c_detect(struct i2c_client *client,
 563                           struct i2c_board_info *info)
 564{
 565        int i;
 566        struct lm78_data *isa = pdev ? platform_get_drvdata(pdev) : NULL;
 567        const char *client_name;
 568        struct i2c_adapter *adapter = client->adapter;
 569        int address = client->addr;
 570
 571        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 572                return -ENODEV;
 573
 574        /* We block updates of the ISA device to minimize the risk of
 575           concurrent access to the same LM78 chip through different
 576           interfaces. */
 577        if (isa)
 578                mutex_lock(&isa->update_lock);
 579
 580        if ((i2c_smbus_read_byte_data(client, LM78_REG_CONFIG) & 0x80)
 581         || i2c_smbus_read_byte_data(client, LM78_REG_I2C_ADDR) != address)
 582                goto err_nodev;
 583
 584        /* Explicitly prevent the misdetection of Winbond chips */
 585        i = i2c_smbus_read_byte_data(client, 0x4f);
 586        if (i == 0xa3 || i == 0x5c)
 587                goto err_nodev;
 588
 589        /* Determine the chip type. */
 590        i = i2c_smbus_read_byte_data(client, LM78_REG_CHIPID);
 591        if (i == 0x00 || i == 0x20      /* LM78 */
 592         || i == 0x40)                  /* LM78-J */
 593                client_name = "lm78";
 594        else if ((i & 0xfe) == 0xc0)
 595                client_name = "lm79";
 596        else
 597                goto err_nodev;
 598
 599        if (lm78_alias_detect(client, i)) {
 600                dev_dbg(&adapter->dev, "Device at 0x%02x appears to "
 601                        "be the same as ISA device\n", address);
 602                goto err_nodev;
 603        }
 604
 605        if (isa)
 606                mutex_unlock(&isa->update_lock);
 607
 608        strlcpy(info->type, client_name, I2C_NAME_SIZE);
 609
 610        return 0;
 611
 612 err_nodev:
 613        if (isa)
 614                mutex_unlock(&isa->update_lock);
 615        return -ENODEV;
 616}
 617
 618static int lm78_i2c_probe(struct i2c_client *client,
 619                          const struct i2c_device_id *id)
 620{
 621        struct lm78_data *data;
 622        int err;
 623
 624        data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL);
 625        if (!data)
 626                return -ENOMEM;
 627
 628        i2c_set_clientdata(client, data);
 629        data->client = client;
 630        data->type = id->driver_data;
 631
 632        /* Initialize the LM78 chip */
 633        lm78_init_device(data);
 634
 635        /* Register sysfs hooks */
 636        err = sysfs_create_group(&client->dev.kobj, &lm78_group);
 637        if (err)
 638                goto ERROR3;
 639
 640        data->hwmon_dev = hwmon_device_register(&client->dev);
 641        if (IS_ERR(data->hwmon_dev)) {
 642                err = PTR_ERR(data->hwmon_dev);
 643                goto ERROR4;
 644        }
 645
 646        return 0;
 647
 648ERROR4:
 649        sysfs_remove_group(&client->dev.kobj, &lm78_group);
 650ERROR3:
 651        kfree(data);
 652        return err;
 653}
 654
 655static int lm78_i2c_remove(struct i2c_client *client)
 656{
 657        struct lm78_data *data = i2c_get_clientdata(client);
 658
 659        hwmon_device_unregister(data->hwmon_dev);
 660        sysfs_remove_group(&client->dev.kobj, &lm78_group);
 661        kfree(data);
 662
 663        return 0;
 664}
 665
 666static int __devinit lm78_isa_probe(struct platform_device *pdev)
 667{
 668        int err;
 669        struct lm78_data *data;
 670        struct resource *res;
 671
 672        /* Reserve the ISA region */
 673        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 674        if (!request_region(res->start + LM78_ADDR_REG_OFFSET, 2, "lm78")) {
 675                err = -EBUSY;
 676                goto exit;
 677        }
 678
 679        if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
 680                err = -ENOMEM;
 681                goto exit_release_region;
 682        }
 683        mutex_init(&data->lock);
 684        data->isa_addr = res->start;
 685        platform_set_drvdata(pdev, data);
 686
 687        if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
 688                data->type = lm79;
 689                data->name = "lm79";
 690        } else {
 691                data->type = lm78;
 692                data->name = "lm78";
 693        }
 694
 695        /* Initialize the LM78 chip */
 696        lm78_init_device(data);
 697
 698        /* Register sysfs hooks */
 699        if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
 700         || (err = device_create_file(&pdev->dev, &dev_attr_name)))
 701                goto exit_remove_files;
 702
 703        data->hwmon_dev = hwmon_device_register(&pdev->dev);
 704        if (IS_ERR(data->hwmon_dev)) {
 705                err = PTR_ERR(data->hwmon_dev);
 706                goto exit_remove_files;
 707        }
 708
 709        return 0;
 710
 711 exit_remove_files:
 712        sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
 713        device_remove_file(&pdev->dev, &dev_attr_name);
 714        kfree(data);
 715 exit_release_region:
 716        release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
 717 exit:
 718        return err;
 719}
 720
 721static int __devexit lm78_isa_remove(struct platform_device *pdev)
 722{
 723        struct lm78_data *data = platform_get_drvdata(pdev);
 724        struct resource *res;
 725
 726        hwmon_device_unregister(data->hwmon_dev);
 727        sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
 728        device_remove_file(&pdev->dev, &dev_attr_name);
 729        kfree(data);
 730
 731        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 732        release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
 733
 734        return 0;
 735}
 736
 737/* The SMBus locks itself, but ISA access must be locked explicitly! 
 738   We don't want to lock the whole ISA bus, so we lock each client
 739   separately.
 740   We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
 741   would slow down the LM78 access and should not be necessary.  */
 742static int lm78_read_value(struct lm78_data *data, u8 reg)
 743{
 744        struct i2c_client *client = data->client;
 745
 746        if (!client) { /* ISA device */
 747                int res;
 748                mutex_lock(&data->lock);
 749                outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
 750                res = inb_p(data->isa_addr + LM78_DATA_REG_OFFSET);
 751                mutex_unlock(&data->lock);
 752                return res;
 753        } else
 754                return i2c_smbus_read_byte_data(client, reg);
 755}
 756
 757/* The SMBus locks itself, but ISA access muse be locked explicitly! 
 758   We don't want to lock the whole ISA bus, so we lock each client
 759   separately.
 760   We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
 761   would slow down the LM78 access and should not be necessary. 
 762   There are some ugly typecasts here, but the good new is - they should
 763   nowhere else be necessary! */
 764static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value)
 765{
 766        struct i2c_client *client = data->client;
 767
 768        if (!client) { /* ISA device */
 769                mutex_lock(&data->lock);
 770                outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
 771                outb_p(value, data->isa_addr + LM78_DATA_REG_OFFSET);
 772                mutex_unlock(&data->lock);
 773                return 0;
 774        } else
 775                return i2c_smbus_write_byte_data(client, reg, value);
 776}
 777
 778static void lm78_init_device(struct lm78_data *data)
 779{
 780        u8 config;
 781        int i;
 782
 783        /* Start monitoring */
 784        config = lm78_read_value(data, LM78_REG_CONFIG);
 785        if ((config & 0x09) != 0x01)
 786                lm78_write_value(data, LM78_REG_CONFIG,
 787                                 (config & 0xf7) | 0x01);
 788
 789        /* A few vars need to be filled upon startup */
 790        for (i = 0; i < 3; i++) {
 791                data->fan_min[i] = lm78_read_value(data,
 792                                        LM78_REG_FAN_MIN(i));
 793        }
 794
 795        mutex_init(&data->update_lock);
 796}
 797
 798static struct lm78_data *lm78_update_device(struct device *dev)
 799{
 800        struct lm78_data *data = dev_get_drvdata(dev);
 801        int i;
 802
 803        mutex_lock(&data->update_lock);
 804
 805        if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
 806            || !data->valid) {
 807
 808                dev_dbg(dev, "Starting lm78 update\n");
 809
 810                for (i = 0; i <= 6; i++) {
 811                        data->in[i] =
 812                            lm78_read_value(data, LM78_REG_IN(i));
 813                        data->in_min[i] =
 814                            lm78_read_value(data, LM78_REG_IN_MIN(i));
 815                        data->in_max[i] =
 816                            lm78_read_value(data, LM78_REG_IN_MAX(i));
 817                }
 818                for (i = 0; i < 3; i++) {
 819                        data->fan[i] =
 820                            lm78_read_value(data, LM78_REG_FAN(i));
 821                        data->fan_min[i] =
 822                            lm78_read_value(data, LM78_REG_FAN_MIN(i));
 823                }
 824                data->temp = lm78_read_value(data, LM78_REG_TEMP);
 825                data->temp_over =
 826                    lm78_read_value(data, LM78_REG_TEMP_OVER);
 827                data->temp_hyst =
 828                    lm78_read_value(data, LM78_REG_TEMP_HYST);
 829                i = lm78_read_value(data, LM78_REG_VID_FANDIV);
 830                data->vid = i & 0x0f;
 831                if (data->type == lm79)
 832                        data->vid |=
 833                            (lm78_read_value(data, LM78_REG_CHIPID) &
 834                             0x01) << 4;
 835                else
 836                        data->vid |= 0x10;
 837                data->fan_div[0] = (i >> 4) & 0x03;
 838                data->fan_div[1] = i >> 6;
 839                data->alarms = lm78_read_value(data, LM78_REG_ALARM1) +
 840                    (lm78_read_value(data, LM78_REG_ALARM2) << 8);
 841                data->last_updated = jiffies;
 842                data->valid = 1;
 843
 844                data->fan_div[2] = 1;
 845        }
 846
 847        mutex_unlock(&data->update_lock);
 848
 849        return data;
 850}
 851
 852/* return 1 if a supported chip is found, 0 otherwise */
 853static int __init lm78_isa_found(unsigned short address)
 854{
 855        int val, save, found = 0;
 856        int port;
 857
 858        /* Some boards declare base+0 to base+7 as a PNP device, some base+4
 859         * to base+7 and some base+5 to base+6. So we better request each port
 860         * individually for the probing phase. */
 861        for (port = address; port < address + LM78_EXTENT; port++) {
 862                if (!request_region(port, 1, "lm78")) {
 863                        pr_debug("Failed to request port 0x%x\n", port);
 864                        goto release;
 865                }
 866        }
 867
 868#define REALLY_SLOW_IO
 869        /* We need the timeouts for at least some LM78-like
 870           chips. But only if we read 'undefined' registers. */
 871        val = inb_p(address + 1);
 872        if (inb_p(address + 2) != val
 873         || inb_p(address + 3) != val
 874         || inb_p(address + 7) != val)
 875                goto release;
 876#undef REALLY_SLOW_IO
 877
 878        /* We should be able to change the 7 LSB of the address port. The
 879           MSB (busy flag) should be clear initially, set after the write. */
 880        save = inb_p(address + LM78_ADDR_REG_OFFSET);
 881        if (save & 0x80)
 882                goto release;
 883        val = ~save & 0x7f;
 884        outb_p(val, address + LM78_ADDR_REG_OFFSET);
 885        if (inb_p(address + LM78_ADDR_REG_OFFSET) != (val | 0x80)) {
 886                outb_p(save, address + LM78_ADDR_REG_OFFSET);
 887                goto release;
 888        }
 889
 890        /* We found a device, now see if it could be an LM78 */
 891        outb_p(LM78_REG_CONFIG, address + LM78_ADDR_REG_OFFSET);
 892        val = inb_p(address + LM78_DATA_REG_OFFSET);
 893        if (val & 0x80)
 894                goto release;
 895        outb_p(LM78_REG_I2C_ADDR, address + LM78_ADDR_REG_OFFSET);
 896        val = inb_p(address + LM78_DATA_REG_OFFSET);
 897        if (val < 0x03 || val > 0x77)   /* Not a valid I2C address */
 898                goto release;
 899
 900        /* The busy flag should be clear again */
 901        if (inb_p(address + LM78_ADDR_REG_OFFSET) & 0x80)
 902                goto release;
 903
 904        /* Explicitly prevent the misdetection of Winbond chips */
 905        outb_p(0x4f, address + LM78_ADDR_REG_OFFSET);
 906        val = inb_p(address + LM78_DATA_REG_OFFSET);
 907        if (val == 0xa3 || val == 0x5c)
 908                goto release;
 909
 910        /* Explicitly prevent the misdetection of ITE chips */
 911        outb_p(0x58, address + LM78_ADDR_REG_OFFSET);
 912        val = inb_p(address + LM78_DATA_REG_OFFSET);
 913        if (val == 0x90)
 914                goto release;
 915
 916        /* Determine the chip type */
 917        outb_p(LM78_REG_CHIPID, address + LM78_ADDR_REG_OFFSET);
 918        val = inb_p(address + LM78_DATA_REG_OFFSET);
 919        if (val == 0x00 || val == 0x20  /* LM78 */
 920         || val == 0x40                 /* LM78-J */
 921         || (val & 0xfe) == 0xc0)       /* LM79 */
 922                found = 1;
 923
 924        if (found)
 925                pr_info("Found an %s chip at %#x\n",
 926                        val & 0x80 ? "LM79" : "LM78", (int)address);
 927
 928 release:
 929        for (port--; port >= address; port--)
 930                release_region(port, 1);
 931        return found;
 932}
 933
 934static int __init lm78_isa_device_add(unsigned short address)
 935{
 936        struct resource res = {
 937                .start  = address,
 938                .end    = address + LM78_EXTENT - 1,
 939                .name   = "lm78",
 940                .flags  = IORESOURCE_IO,
 941        };
 942        int err;
 943
 944        pdev = platform_device_alloc("lm78", address);
 945        if (!pdev) {
 946                err = -ENOMEM;
 947                pr_err("Device allocation failed\n");
 948                goto exit;
 949        }
 950
 951        err = platform_device_add_resources(pdev, &res, 1);
 952        if (err) {
 953                pr_err("Device resource addition failed (%d)\n", err);
 954                goto exit_device_put;
 955        }
 956
 957        err = platform_device_add(pdev);
 958        if (err) {
 959                pr_err("Device addition failed (%d)\n", err);
 960                goto exit_device_put;
 961        }
 962
 963        return 0;
 964
 965 exit_device_put:
 966        platform_device_put(pdev);
 967 exit:
 968        pdev = NULL;
 969        return err;
 970}
 971
 972static int __init sm_lm78_init(void)
 973{
 974        int res;
 975
 976        /* We register the ISA device first, so that we can skip the
 977         * registration of an I2C interface to the same device. */
 978        if (lm78_isa_found(isa_address)) {
 979                res = platform_driver_register(&lm78_isa_driver);
 980                if (res)
 981                        goto exit;
 982
 983                /* Sets global pdev as a side effect */
 984                res = lm78_isa_device_add(isa_address);
 985                if (res)
 986                        goto exit_unreg_isa_driver;
 987        }
 988
 989        res = i2c_add_driver(&lm78_driver);
 990        if (res)
 991                goto exit_unreg_isa_device;
 992
 993        return 0;
 994
 995 exit_unreg_isa_device:
 996        platform_device_unregister(pdev);
 997 exit_unreg_isa_driver:
 998        platform_driver_unregister(&lm78_isa_driver);
 999 exit:
1000        return res;
1001}
1002
1003static void __exit sm_lm78_exit(void)
1004{
1005        if (pdev) {
1006                platform_device_unregister(pdev);
1007                platform_driver_unregister(&lm78_isa_driver);
1008        }
1009        i2c_del_driver(&lm78_driver);
1010}
1011
1012
1013
1014MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
1015MODULE_DESCRIPTION("LM78/LM79 driver");
1016MODULE_LICENSE("GPL");
1017
1018module_init(sm_lm78_init);
1019module_exit(sm_lm78_exit);
1020