linux/drivers/hwmon/smsc47m1.c
<<
>>
Prefs
   1/*
   2    smsc47m1.c - Part of lm_sensors, Linux kernel modules
   3                 for hardware monitoring
   4
   5    Supports the SMSC LPC47B27x, LPC47M10x, LPC47M112, LPC47M13x,
   6    LPC47M14x, LPC47M15x, LPC47M192, LPC47M292 and LPC47M997
   7    Super-I/O chips.
   8
   9    Copyright (C) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
  10    Copyright (C) 2004-2007 Jean Delvare <khali@linux-fr.org>
  11    Ported to Linux 2.6 by Gabriele Gorla <gorlik@yahoo.com>
  12                        and Jean Delvare
  13
  14    This program is free software; you can redistribute it and/or modify
  15    it under the terms of the GNU General Public License as published by
  16    the Free Software Foundation; either version 2 of the License, or
  17    (at your option) any later version.
  18
  19    This program is distributed in the hope that it will be useful,
  20    but WITHOUT ANY WARRANTY; without even the implied warranty of
  21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22    GNU General Public License for more details.
  23
  24    You should have received a copy of the GNU General Public License
  25    along with this program; if not, write to the Free Software
  26    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27*/
  28
  29#include <linux/module.h>
  30#include <linux/slab.h>
  31#include <linux/ioport.h>
  32#include <linux/jiffies.h>
  33#include <linux/platform_device.h>
  34#include <linux/hwmon.h>
  35#include <linux/hwmon-sysfs.h>
  36#include <linux/err.h>
  37#include <linux/init.h>
  38#include <linux/mutex.h>
  39#include <linux/sysfs.h>
  40#include <linux/acpi.h>
  41#include <asm/io.h>
  42
  43static unsigned short force_id;
  44module_param(force_id, ushort, 0);
  45MODULE_PARM_DESC(force_id, "Override the detected device ID");
  46
  47static struct platform_device *pdev;
  48
  49#define DRVNAME "smsc47m1"
  50enum chips { smsc47m1, smsc47m2 };
  51
  52/* Super-I/0 registers and commands */
  53
  54#define REG     0x2e    /* The register to read/write */
  55#define VAL     0x2f    /* The value to read/write */
  56
  57static inline void
  58superio_outb(int reg, int val)
  59{
  60        outb(reg, REG);
  61        outb(val, VAL);
  62}
  63
  64static inline int
  65superio_inb(int reg)
  66{
  67        outb(reg, REG);
  68        return inb(VAL);
  69}
  70
  71/* logical device for fans is 0x0A */
  72#define superio_select() superio_outb(0x07, 0x0A)
  73
  74static inline void
  75superio_enter(void)
  76{
  77        outb(0x55, REG);
  78}
  79
  80static inline void
  81superio_exit(void)
  82{
  83        outb(0xAA, REG);
  84}
  85
  86#define SUPERIO_REG_ACT         0x30
  87#define SUPERIO_REG_BASE        0x60
  88#define SUPERIO_REG_DEVID       0x20
  89
  90/* Logical device registers */
  91
  92#define SMSC_EXTENT             0x80
  93
  94/* nr is 0 or 1 in the macros below */
  95#define SMSC47M1_REG_ALARM              0x04
  96#define SMSC47M1_REG_TPIN(nr)           (0x34 - (nr))
  97#define SMSC47M1_REG_PPIN(nr)           (0x36 - (nr))
  98#define SMSC47M1_REG_FANDIV             0x58
  99
 100static const u8 SMSC47M1_REG_FAN[3]             = { 0x59, 0x5a, 0x6b };
 101static const u8 SMSC47M1_REG_FAN_PRELOAD[3]     = { 0x5b, 0x5c, 0x6c };
 102static const u8 SMSC47M1_REG_PWM[3]             = { 0x56, 0x57, 0x69 };
 103
 104#define SMSC47M2_REG_ALARM6             0x09
 105#define SMSC47M2_REG_TPIN1              0x38
 106#define SMSC47M2_REG_TPIN2              0x37
 107#define SMSC47M2_REG_TPIN3              0x2d
 108#define SMSC47M2_REG_PPIN3              0x2c
 109#define SMSC47M2_REG_FANDIV3            0x6a
 110
 111#define MIN_FROM_REG(reg,div)           ((reg)>=192 ? 0 : \
 112                                         983040/((192-(reg))*(div)))
 113#define FAN_FROM_REG(reg,div,preload)   ((reg)<=(preload) || (reg)==255 ? 0 : \
 114                                         983040/(((reg)-(preload))*(div)))
 115#define DIV_FROM_REG(reg)               (1 << (reg))
 116#define PWM_FROM_REG(reg)               (((reg) & 0x7E) << 1)
 117#define PWM_EN_FROM_REG(reg)            ((~(reg)) & 0x01)
 118#define PWM_TO_REG(reg)                 (((reg) >> 1) & 0x7E)
 119
 120struct smsc47m1_data {
 121        unsigned short addr;
 122        const char *name;
 123        enum chips type;
 124        struct device *hwmon_dev;
 125
 126        struct mutex update_lock;
 127        unsigned long last_updated;     /* In jiffies */
 128
 129        u8 fan[3];              /* Register value */
 130        u8 fan_preload[3];      /* Register value */
 131        u8 fan_div[3];          /* Register encoding, shifted right */
 132        u8 alarms;              /* Register encoding */
 133        u8 pwm[3];              /* Register value (bit 0 is disable) */
 134};
 135
 136struct smsc47m1_sio_data {
 137        enum chips type;
 138};
 139
 140
 141static int smsc47m1_probe(struct platform_device *pdev);
 142static int __devexit smsc47m1_remove(struct platform_device *pdev);
 143static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
 144                int init);
 145
 146static inline int smsc47m1_read_value(struct smsc47m1_data *data, u8 reg)
 147{
 148        return inb_p(data->addr + reg);
 149}
 150
 151static inline void smsc47m1_write_value(struct smsc47m1_data *data, u8 reg,
 152                u8 value)
 153{
 154        outb_p(value, data->addr + reg);
 155}
 156
 157static struct platform_driver smsc47m1_driver = {
 158        .driver = {
 159                .owner  = THIS_MODULE,
 160                .name   = DRVNAME,
 161        },
 162        .probe          = smsc47m1_probe,
 163        .remove         = __devexit_p(smsc47m1_remove),
 164};
 165
 166static ssize_t get_fan(struct device *dev, struct device_attribute
 167                       *devattr, char *buf)
 168{
 169        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 170        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 171        int nr = attr->index;
 172        /* This chip (stupidly) stops monitoring fan speed if PWM is
 173           enabled and duty cycle is 0%. This is fine if the monitoring
 174           and control concern the same fan, but troublesome if they are
 175           not (which could as well happen). */
 176        int rpm = (data->pwm[nr] & 0x7F) == 0x00 ? 0 :
 177                  FAN_FROM_REG(data->fan[nr],
 178                               DIV_FROM_REG(data->fan_div[nr]),
 179                               data->fan_preload[nr]);
 180        return sprintf(buf, "%d\n", rpm);
 181}
 182
 183static ssize_t get_fan_min(struct device *dev, struct device_attribute
 184                           *devattr, char *buf)
 185{
 186        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 187        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 188        int nr = attr->index;
 189        int rpm = MIN_FROM_REG(data->fan_preload[nr],
 190                               DIV_FROM_REG(data->fan_div[nr]));
 191        return sprintf(buf, "%d\n", rpm);
 192}
 193
 194static ssize_t get_fan_div(struct device *dev, struct device_attribute
 195                           *devattr, char *buf)
 196{
 197        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 198        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 199        return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
 200}
 201
 202static ssize_t get_fan_alarm(struct device *dev, struct device_attribute
 203                             *devattr, char *buf)
 204{
 205        int bitnr = to_sensor_dev_attr(devattr)->index;
 206        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 207        return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
 208}
 209
 210static ssize_t get_pwm(struct device *dev, struct device_attribute
 211                       *devattr, char *buf)
 212{
 213        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 214        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 215        return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[attr->index]));
 216}
 217
 218static ssize_t get_pwm_en(struct device *dev, struct device_attribute
 219                          *devattr, char *buf)
 220{
 221        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 222        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 223        return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[attr->index]));
 224}
 225
 226static ssize_t get_alarms(struct device *dev, struct device_attribute
 227                          *devattr, char *buf)
 228{
 229        struct smsc47m1_data *data = smsc47m1_update_device(dev, 0);
 230        return sprintf(buf, "%d\n", data->alarms);
 231}
 232
 233static ssize_t set_fan_min(struct device *dev, struct device_attribute
 234                           *devattr, const char *buf, size_t count)
 235{
 236        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 237        struct smsc47m1_data *data = dev_get_drvdata(dev);
 238        int nr = attr->index;
 239        long rpmdiv, val = simple_strtol(buf, NULL, 10);
 240
 241        mutex_lock(&data->update_lock);
 242        rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]);
 243
 244        if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) {
 245                mutex_unlock(&data->update_lock);
 246                return -EINVAL;
 247        }
 248
 249        data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv);
 250        smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
 251                             data->fan_preload[nr]);
 252        mutex_unlock(&data->update_lock);
 253
 254        return count;
 255}
 256
 257/* Note: we save and restore the fan minimum here, because its value is
 258   determined in part by the fan clock divider.  This follows the principle
 259   of least surprise; the user doesn't expect the fan minimum to change just
 260   because the divider changed. */
 261static ssize_t set_fan_div(struct device *dev, struct device_attribute
 262                           *devattr, const char *buf, size_t count)
 263{
 264        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 265        struct smsc47m1_data *data = dev_get_drvdata(dev);
 266        int nr = attr->index;
 267        long new_div = simple_strtol(buf, NULL, 10), tmp;
 268        u8 old_div = DIV_FROM_REG(data->fan_div[nr]);
 269
 270        if (new_div == old_div) /* No change */
 271                return count;
 272
 273        mutex_lock(&data->update_lock);
 274        switch (new_div) {
 275        case 1: data->fan_div[nr] = 0; break;
 276        case 2: data->fan_div[nr] = 1; break;
 277        case 4: data->fan_div[nr] = 2; break;
 278        case 8: data->fan_div[nr] = 3; break;
 279        default:
 280                mutex_unlock(&data->update_lock);
 281                return -EINVAL;
 282        }
 283
 284        switch (nr) {
 285        case 0:
 286        case 1:
 287                tmp = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV)
 288                      & ~(0x03 << (4 + 2 * nr));
 289                tmp |= data->fan_div[nr] << (4 + 2 * nr);
 290                smsc47m1_write_value(data, SMSC47M1_REG_FANDIV, tmp);
 291                break;
 292        case 2:
 293                tmp = smsc47m1_read_value(data, SMSC47M2_REG_FANDIV3) & 0xCF;
 294                tmp |= data->fan_div[2] << 4;
 295                smsc47m1_write_value(data, SMSC47M2_REG_FANDIV3, tmp);
 296                break;
 297        }
 298
 299        /* Preserve fan min */
 300        tmp = 192 - (old_div * (192 - data->fan_preload[nr])
 301                     + new_div / 2) / new_div;
 302        data->fan_preload[nr] = SENSORS_LIMIT(tmp, 0, 191);
 303        smsc47m1_write_value(data, SMSC47M1_REG_FAN_PRELOAD[nr],
 304                             data->fan_preload[nr]);
 305        mutex_unlock(&data->update_lock);
 306
 307        return count;
 308}
 309
 310static ssize_t set_pwm(struct device *dev, struct device_attribute
 311                       *devattr, const char *buf, size_t count)
 312{
 313        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 314        struct smsc47m1_data *data = dev_get_drvdata(dev);
 315        int nr = attr->index;
 316        long val = simple_strtol(buf, NULL, 10);
 317
 318        if (val < 0 || val > 255)
 319                return -EINVAL;
 320
 321        mutex_lock(&data->update_lock);
 322        data->pwm[nr] &= 0x81; /* Preserve additional bits */
 323        data->pwm[nr] |= PWM_TO_REG(val);
 324        smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
 325                             data->pwm[nr]);
 326        mutex_unlock(&data->update_lock);
 327
 328        return count;
 329}
 330
 331static ssize_t set_pwm_en(struct device *dev, struct device_attribute
 332                          *devattr, const char *buf, size_t count)
 333{
 334        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 335        struct smsc47m1_data *data = dev_get_drvdata(dev);
 336        int nr = attr->index;
 337        long val = simple_strtol(buf, NULL, 10);
 338        
 339        if (val != 0 && val != 1)
 340                return -EINVAL;
 341
 342        mutex_lock(&data->update_lock);
 343        data->pwm[nr] &= 0xFE; /* preserve the other bits */
 344        data->pwm[nr] |= !val;
 345        smsc47m1_write_value(data, SMSC47M1_REG_PWM[nr],
 346                             data->pwm[nr]);
 347        mutex_unlock(&data->update_lock);
 348
 349        return count;
 350}
 351
 352#define fan_present(offset)                                             \
 353static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, get_fan,        \
 354                NULL, offset - 1);                                      \
 355static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR,         \
 356                get_fan_min, set_fan_min, offset - 1);                  \
 357static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR,         \
 358                get_fan_div, set_fan_div, offset - 1);                  \
 359static SENSOR_DEVICE_ATTR(fan##offset##_alarm, S_IRUGO, get_fan_alarm,  \
 360                NULL, offset - 1);                                      \
 361static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR,               \
 362                get_pwm, set_pwm, offset - 1);                          \
 363static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR,      \
 364                get_pwm_en, set_pwm_en, offset - 1)
 365
 366fan_present(1);
 367fan_present(2);
 368fan_present(3);
 369
 370static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL);
 371
 372static ssize_t show_name(struct device *dev, struct device_attribute
 373                         *devattr, char *buf)
 374{
 375        struct smsc47m1_data *data = dev_get_drvdata(dev);
 376
 377        return sprintf(buf, "%s\n", data->name);
 378}
 379static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 380
 381/* Almost all sysfs files may or may not be created depending on the chip
 382   setup so we create them individually. It is still convenient to define a
 383   group to remove them all at once. */
 384static struct attribute *smsc47m1_attributes[] = {
 385        &sensor_dev_attr_fan1_input.dev_attr.attr,
 386        &sensor_dev_attr_fan1_min.dev_attr.attr,
 387        &sensor_dev_attr_fan1_div.dev_attr.attr,
 388        &sensor_dev_attr_fan1_alarm.dev_attr.attr,
 389        &sensor_dev_attr_fan2_input.dev_attr.attr,
 390        &sensor_dev_attr_fan2_min.dev_attr.attr,
 391        &sensor_dev_attr_fan2_div.dev_attr.attr,
 392        &sensor_dev_attr_fan2_alarm.dev_attr.attr,
 393        &sensor_dev_attr_fan3_input.dev_attr.attr,
 394        &sensor_dev_attr_fan3_min.dev_attr.attr,
 395        &sensor_dev_attr_fan3_div.dev_attr.attr,
 396        &sensor_dev_attr_fan3_alarm.dev_attr.attr,
 397
 398        &sensor_dev_attr_pwm1.dev_attr.attr,
 399        &sensor_dev_attr_pwm1_enable.dev_attr.attr,
 400        &sensor_dev_attr_pwm2.dev_attr.attr,
 401        &sensor_dev_attr_pwm2_enable.dev_attr.attr,
 402        &sensor_dev_attr_pwm3.dev_attr.attr,
 403        &sensor_dev_attr_pwm3_enable.dev_attr.attr,
 404
 405        &dev_attr_alarms.attr,
 406        &dev_attr_name.attr,
 407        NULL
 408};
 409
 410static const struct attribute_group smsc47m1_group = {
 411        .attrs = smsc47m1_attributes,
 412};
 413
 414static int __init smsc47m1_find(unsigned short *addr,
 415                                struct smsc47m1_sio_data *sio_data)
 416{
 417        u8 val;
 418
 419        superio_enter();
 420        val = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
 421
 422        /*
 423         * SMSC LPC47M10x/LPC47M112/LPC47M13x (device id 0x59), LPC47M14x
 424         * (device id 0x5F) and LPC47B27x (device id 0x51) have fan control.
 425         * The LPC47M15x and LPC47M192 chips "with hardware monitoring block"
 426         * can do much more besides (device id 0x60).
 427         * The LPC47M997 is undocumented, but seems to be compatible with
 428         * the LPC47M192, and has the same device id.
 429         * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
 430         * supports a 3rd fan, and the pin configuration registers are
 431         * unfortunately different.
 432         */
 433        switch (val) {
 434        case 0x51:
 435                pr_info(DRVNAME ": Found SMSC LPC47B27x\n");
 436                sio_data->type = smsc47m1;
 437                break;
 438        case 0x59:
 439                pr_info(DRVNAME ": Found SMSC LPC47M10x/LPC47M112/LPC47M13x\n");
 440                sio_data->type = smsc47m1;
 441                break;
 442        case 0x5F:
 443                pr_info(DRVNAME ": Found SMSC LPC47M14x\n");
 444                sio_data->type = smsc47m1;
 445                break;
 446        case 0x60:
 447                pr_info(DRVNAME ": Found SMSC LPC47M15x/LPC47M192/LPC47M997\n");
 448                sio_data->type = smsc47m1;
 449                break;
 450        case 0x6B:
 451                pr_info(DRVNAME ": Found SMSC LPC47M292\n");
 452                sio_data->type = smsc47m2;
 453                break;
 454        default:
 455                superio_exit();
 456                return -ENODEV;
 457        }
 458
 459        superio_select();
 460        *addr = (superio_inb(SUPERIO_REG_BASE) << 8)
 461              |  superio_inb(SUPERIO_REG_BASE + 1);
 462        val = superio_inb(SUPERIO_REG_ACT);
 463        if (*addr == 0 || (val & 0x01) == 0) {
 464                pr_info(DRVNAME ": Device is disabled, will not use\n");
 465                superio_exit();
 466                return -ENODEV;
 467        }
 468
 469        superio_exit();
 470        return 0;
 471}
 472
 473static int __devinit smsc47m1_probe(struct platform_device *pdev)
 474{
 475        struct device *dev = &pdev->dev;
 476        struct smsc47m1_sio_data *sio_data = dev->platform_data;
 477        struct smsc47m1_data *data;
 478        struct resource *res;
 479        int err = 0;
 480        int fan1, fan2, fan3, pwm1, pwm2, pwm3;
 481
 482        static const char *names[] = {
 483                "smsc47m1",
 484                "smsc47m2",
 485        };
 486
 487        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 488        if (!request_region(res->start, SMSC_EXTENT, DRVNAME)) {
 489                dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
 490                        (unsigned long)res->start,
 491                        (unsigned long)res->end);
 492                return -EBUSY;
 493        }
 494
 495        if (!(data = kzalloc(sizeof(struct smsc47m1_data), GFP_KERNEL))) {
 496                err = -ENOMEM;
 497                goto error_release;
 498        }
 499
 500        data->addr = res->start;
 501        data->type = sio_data->type;
 502        data->name = names[sio_data->type];
 503        mutex_init(&data->update_lock);
 504        platform_set_drvdata(pdev, data);
 505
 506        /* If no function is properly configured, there's no point in
 507           actually registering the chip. */
 508        pwm1 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(0)) & 0x05)
 509               == 0x04;
 510        pwm2 = (smsc47m1_read_value(data, SMSC47M1_REG_PPIN(1)) & 0x05)
 511               == 0x04;
 512        if (data->type == smsc47m2) {
 513                fan1 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN1)
 514                        & 0x0d) == 0x09;
 515                fan2 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN2)
 516                        & 0x0d) == 0x09;
 517                fan3 = (smsc47m1_read_value(data, SMSC47M2_REG_TPIN3)
 518                        & 0x0d) == 0x0d;
 519                pwm3 = (smsc47m1_read_value(data, SMSC47M2_REG_PPIN3)
 520                        & 0x0d) == 0x08;
 521        } else {
 522                fan1 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(0))
 523                        & 0x05) == 0x05;
 524                fan2 = (smsc47m1_read_value(data, SMSC47M1_REG_TPIN(1))
 525                        & 0x05) == 0x05;
 526                fan3 = 0;
 527                pwm3 = 0;
 528        }
 529        if (!(fan1 || fan2 || fan3 || pwm1 || pwm2 || pwm3)) {
 530                dev_warn(dev, "Device not configured, will not use\n");
 531                err = -ENODEV;
 532                goto error_free;
 533        }
 534
 535        /* Some values (fan min, clock dividers, pwm registers) may be
 536           needed before any update is triggered, so we better read them
 537           at least once here. We don't usually do it that way, but in
 538           this particular case, manually reading 5 registers out of 8
 539           doesn't make much sense and we're better using the existing
 540           function. */
 541        smsc47m1_update_device(dev, 1);
 542
 543        /* Register sysfs hooks */
 544        if (fan1) {
 545                if ((err = device_create_file(dev,
 546                                &sensor_dev_attr_fan1_input.dev_attr))
 547                 || (err = device_create_file(dev,
 548                                &sensor_dev_attr_fan1_min.dev_attr))
 549                 || (err = device_create_file(dev,
 550                                &sensor_dev_attr_fan1_div.dev_attr))
 551                 || (err = device_create_file(dev,
 552                                &sensor_dev_attr_fan1_alarm.dev_attr)))
 553                        goto error_remove_files;
 554        } else
 555                dev_dbg(dev, "Fan 1 not enabled by hardware, skipping\n");
 556
 557        if (fan2) {
 558                if ((err = device_create_file(dev,
 559                                &sensor_dev_attr_fan2_input.dev_attr))
 560                 || (err = device_create_file(dev,
 561                                &sensor_dev_attr_fan2_min.dev_attr))
 562                 || (err = device_create_file(dev,
 563                                &sensor_dev_attr_fan2_div.dev_attr))
 564                 || (err = device_create_file(dev,
 565                                &sensor_dev_attr_fan2_alarm.dev_attr)))
 566                        goto error_remove_files;
 567        } else
 568                dev_dbg(dev, "Fan 2 not enabled by hardware, skipping\n");
 569
 570        if (fan3) {
 571                if ((err = device_create_file(dev,
 572                                &sensor_dev_attr_fan3_input.dev_attr))
 573                 || (err = device_create_file(dev,
 574                                &sensor_dev_attr_fan3_min.dev_attr))
 575                 || (err = device_create_file(dev,
 576                                &sensor_dev_attr_fan3_div.dev_attr))
 577                 || (err = device_create_file(dev,
 578                                &sensor_dev_attr_fan3_alarm.dev_attr)))
 579                        goto error_remove_files;
 580        } else if (data->type == smsc47m2)
 581                dev_dbg(dev, "Fan 3 not enabled by hardware, skipping\n");
 582
 583        if (pwm1) {
 584                if ((err = device_create_file(dev,
 585                                &sensor_dev_attr_pwm1.dev_attr))
 586                 || (err = device_create_file(dev,
 587                                &sensor_dev_attr_pwm1_enable.dev_attr)))
 588                        goto error_remove_files;
 589        } else
 590                dev_dbg(dev, "PWM 1 not enabled by hardware, skipping\n");
 591
 592        if (pwm2) {
 593                if ((err = device_create_file(dev,
 594                                &sensor_dev_attr_pwm2.dev_attr))
 595                 || (err = device_create_file(dev,
 596                                &sensor_dev_attr_pwm2_enable.dev_attr)))
 597                        goto error_remove_files;
 598        } else
 599                dev_dbg(dev, "PWM 2 not enabled by hardware, skipping\n");
 600
 601        if (pwm3) {
 602                if ((err = device_create_file(dev,
 603                                &sensor_dev_attr_pwm3.dev_attr))
 604                 || (err = device_create_file(dev,
 605                                &sensor_dev_attr_pwm3_enable.dev_attr)))
 606                        goto error_remove_files;
 607        } else if (data->type == smsc47m2)
 608                dev_dbg(dev, "PWM 3 not enabled by hardware, skipping\n");
 609
 610        if ((err = device_create_file(dev, &dev_attr_alarms)))
 611                goto error_remove_files;
 612        if ((err = device_create_file(dev, &dev_attr_name)))
 613                goto error_remove_files;
 614
 615        data->hwmon_dev = hwmon_device_register(dev);
 616        if (IS_ERR(data->hwmon_dev)) {
 617                err = PTR_ERR(data->hwmon_dev);
 618                goto error_remove_files;
 619        }
 620
 621        return 0;
 622
 623error_remove_files:
 624        sysfs_remove_group(&dev->kobj, &smsc47m1_group);
 625error_free:
 626        platform_set_drvdata(pdev, NULL);
 627        kfree(data);
 628error_release:
 629        release_region(res->start, SMSC_EXTENT);
 630        return err;
 631}
 632
 633static int __devexit smsc47m1_remove(struct platform_device *pdev)
 634{
 635        struct smsc47m1_data *data = platform_get_drvdata(pdev);
 636        struct resource *res;
 637
 638        hwmon_device_unregister(data->hwmon_dev);
 639        sysfs_remove_group(&pdev->dev.kobj, &smsc47m1_group);
 640
 641        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 642        release_region(res->start, SMSC_EXTENT);
 643        platform_set_drvdata(pdev, NULL);
 644        kfree(data);
 645
 646        return 0;
 647}
 648
 649static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
 650                int init)
 651{
 652        struct smsc47m1_data *data = dev_get_drvdata(dev);
 653
 654        mutex_lock(&data->update_lock);
 655
 656        if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) {
 657                int i, fan_nr;
 658                fan_nr = data->type == smsc47m2 ? 3 : 2;
 659
 660                for (i = 0; i < fan_nr; i++) {
 661                        data->fan[i] = smsc47m1_read_value(data,
 662                                       SMSC47M1_REG_FAN[i]);
 663                        data->fan_preload[i] = smsc47m1_read_value(data,
 664                                               SMSC47M1_REG_FAN_PRELOAD[i]);
 665                        data->pwm[i] = smsc47m1_read_value(data,
 666                                       SMSC47M1_REG_PWM[i]);
 667                }
 668
 669                i = smsc47m1_read_value(data, SMSC47M1_REG_FANDIV);
 670                data->fan_div[0] = (i >> 4) & 0x03;
 671                data->fan_div[1] = i >> 6;
 672
 673                data->alarms = smsc47m1_read_value(data,
 674                               SMSC47M1_REG_ALARM) >> 6;
 675                /* Clear alarms if needed */
 676                if (data->alarms)
 677                        smsc47m1_write_value(data, SMSC47M1_REG_ALARM, 0xC0);
 678
 679                if (fan_nr >= 3) {
 680                        data->fan_div[2] = (smsc47m1_read_value(data,
 681                                            SMSC47M2_REG_FANDIV3) >> 4) & 0x03;
 682                        data->alarms |= (smsc47m1_read_value(data,
 683                                         SMSC47M2_REG_ALARM6) & 0x40) >> 4;
 684                        /* Clear alarm if needed */
 685                        if (data->alarms & 0x04)
 686                                smsc47m1_write_value(data,
 687                                                     SMSC47M2_REG_ALARM6,
 688                                                     0x40);
 689                }
 690
 691                data->last_updated = jiffies;
 692        }
 693
 694        mutex_unlock(&data->update_lock);
 695        return data;
 696}
 697
 698static int __init smsc47m1_device_add(unsigned short address,
 699                                      const struct smsc47m1_sio_data *sio_data)
 700{
 701        struct resource res = {
 702                .start  = address,
 703                .end    = address + SMSC_EXTENT - 1,
 704                .name   = DRVNAME,
 705                .flags  = IORESOURCE_IO,
 706        };
 707        int err;
 708
 709        err = acpi_check_resource_conflict(&res);
 710        if (err)
 711                goto exit;
 712
 713        pdev = platform_device_alloc(DRVNAME, address);
 714        if (!pdev) {
 715                err = -ENOMEM;
 716                printk(KERN_ERR DRVNAME ": Device allocation failed\n");
 717                goto exit;
 718        }
 719
 720        err = platform_device_add_resources(pdev, &res, 1);
 721        if (err) {
 722                printk(KERN_ERR DRVNAME ": Device resource addition failed "
 723                       "(%d)\n", err);
 724                goto exit_device_put;
 725        }
 726
 727        err = platform_device_add_data(pdev, sio_data,
 728                                       sizeof(struct smsc47m1_sio_data));
 729        if (err) {
 730                printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
 731                goto exit_device_put;
 732        }
 733
 734        err = platform_device_add(pdev);
 735        if (err) {
 736                printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
 737                       err);
 738                goto exit_device_put;
 739        }
 740
 741        return 0;
 742
 743exit_device_put:
 744        platform_device_put(pdev);
 745exit:
 746        return err;
 747}
 748
 749static int __init sm_smsc47m1_init(void)
 750{
 751        int err;
 752        unsigned short address;
 753        struct smsc47m1_sio_data sio_data;
 754
 755        if (smsc47m1_find(&address, &sio_data))
 756                return -ENODEV;
 757
 758        err = platform_driver_register(&smsc47m1_driver);
 759        if (err)
 760                goto exit;
 761
 762        /* Sets global pdev as a side effect */
 763        err = smsc47m1_device_add(address, &sio_data);
 764        if (err)
 765                goto exit_driver;
 766
 767        return 0;
 768
 769exit_driver:
 770        platform_driver_unregister(&smsc47m1_driver);
 771exit:
 772        return err;
 773}
 774
 775static void __exit sm_smsc47m1_exit(void)
 776{
 777        platform_device_unregister(pdev);
 778        platform_driver_unregister(&smsc47m1_driver);
 779}
 780
 781MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>");
 782MODULE_DESCRIPTION("SMSC LPC47M1xx fan sensors driver");
 783MODULE_LICENSE("GPL");
 784
 785module_init(sm_smsc47m1_init);
 786module_exit(sm_smsc47m1_exit);
 787