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