2  * f71805f.c - driver for the Fintek F71805F/FG and F71872F/FG Super-I/O
 
   3  *             chips integrated hardware monitoring features
 
   4  * Copyright (C) 2005-2006  Jean Delvare <khali@linux-fr.org>
 
   6  * The F71805F/FG is a LPC Super-I/O chip made by Fintek. It integrates
 
   7  * complete hardware monitoring features: voltage, fan and temperature
 
   8  * sensors, and manual and automatic fan speed control.
 
  10  * The F71872F/FG is almost the same, with two more voltages monitored,
 
  13  * The F71806F/FG is essentially the same as the F71872F/FG. It even has
 
  14  * the same chip ID, so the driver can't differentiate between.
 
  16  * This program is free software; you can redistribute it and/or modify
 
  17  * it under the terms of the GNU General Public License as published by
 
  18  * the Free Software Foundation; either version 2 of the License, or
 
  19  * (at your option) any later version.
 
  21  * This program is distributed in the hope that it will be useful,
 
  22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  24  * GNU General Public License for more details.
 
  26  * You should have received a copy of the GNU General Public License
 
  27  * along with this program; if not, write to the Free Software
 
  28  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
  31 #include <linux/module.h>
 
  32 #include <linux/init.h>
 
  33 #include <linux/slab.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/mutex.h>
 
  40 #include <linux/sysfs.h>
 
  41 #include <linux/ioport.h>
 
  44 static unsigned short force_id;
 
  45 module_param(force_id, ushort, 0);
 
  46 MODULE_PARM_DESC(force_id, "Override the detected device ID");
 
  48 static struct platform_device *pdev;
 
  50 #define DRVNAME "f71805f"
 
  51 enum kinds { f71805f, f71872f };
 
  54  * Super-I/O constants and functions
 
  57 #define F71805F_LD_HWM          0x04
 
  59 #define SIO_REG_LDSEL           0x07    /* Logical device select */
 
  60 #define SIO_REG_DEVID           0x20    /* Device ID (2 bytes) */
 
  61 #define SIO_REG_DEVREV          0x22    /* Device revision */
 
  62 #define SIO_REG_MANID           0x23    /* Fintek ID (2 bytes) */
 
  63 #define SIO_REG_FNSEL1          0x29    /* Multi Function Select 1 (F71872F) */
 
  64 #define SIO_REG_ENABLE          0x30    /* Logical device enable */
 
  65 #define SIO_REG_ADDR            0x60    /* Logical device address (2 bytes) */
 
  67 #define SIO_FINTEK_ID           0x1934
 
  68 #define SIO_F71805F_ID          0x0406
 
  69 #define SIO_F71872F_ID          0x0341
 
  72 superio_inb(int base, int reg)
 
  79 superio_inw(int base, int reg)
 
  83         val = inb(base + 1) << 8;
 
  90 superio_select(int base, int ld)
 
  92         outb(SIO_REG_LDSEL, base);
 
  97 superio_enter(int base)
 
 104 superio_exit(int base)
 
 113 #define REGION_LENGTH           8
 
 114 #define ADDR_REG_OFFSET         5
 
 115 #define DATA_REG_OFFSET         6
 
 121 /* in nr from 0 to 10 (8-bit values) */
 
 122 #define F71805F_REG_IN(nr)              (0x10 + (nr))
 
 123 #define F71805F_REG_IN_HIGH(nr)         ((nr) < 10 ? 0x40 + 2 * (nr) : 0x2E)
 
 124 #define F71805F_REG_IN_LOW(nr)          ((nr) < 10 ? 0x41 + 2 * (nr) : 0x2F)
 
 125 /* fan nr from 0 to 2 (12-bit values, two registers) */
 
 126 #define F71805F_REG_FAN(nr)             (0x20 + 2 * (nr))
 
 127 #define F71805F_REG_FAN_LOW(nr)         (0x28 + 2 * (nr))
 
 128 #define F71805F_REG_FAN_TARGET(nr)      (0x69 + 16 * (nr))
 
 129 #define F71805F_REG_FAN_CTRL(nr)        (0x60 + 16 * (nr))
 
 130 #define F71805F_REG_PWM_FREQ(nr)        (0x63 + 16 * (nr))
 
 131 #define F71805F_REG_PWM_DUTY(nr)        (0x6B + 16 * (nr))
 
 132 /* temp nr from 0 to 2 (8-bit values) */
 
 133 #define F71805F_REG_TEMP(nr)            (0x1B + (nr))
 
 134 #define F71805F_REG_TEMP_HIGH(nr)       (0x54 + 2 * (nr))
 
 135 #define F71805F_REG_TEMP_HYST(nr)       (0x55 + 2 * (nr))
 
 136 #define F71805F_REG_TEMP_MODE           0x01
 
 137 /* pwm/fan pwmnr from 0 to 2, auto point apnr from 0 to 2 */
 
 138 /* map Fintek numbers to our numbers as follows: 9->0, 5->1, 1->2 */
 
 139 #define F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr) \
 
 140                                         (0xA0 + 0x10 * (pwmnr) + (2 - (apnr)))
 
 141 #define F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr) \
 
 142                                         (0xA4 + 0x10 * (pwmnr) + \
 
 145 #define F71805F_REG_START               0x00
 
 146 /* status nr from 0 to 2 */
 
 147 #define F71805F_REG_STATUS(nr)          (0x36 + (nr))
 
 149 /* individual register bits */
 
 150 #define FAN_CTRL_DC_MODE                0x10
 
 151 #define FAN_CTRL_LATCH_FULL             0x08
 
 152 #define FAN_CTRL_MODE_MASK              0x03
 
 153 #define FAN_CTRL_MODE_SPEED             0x00
 
 154 #define FAN_CTRL_MODE_TEMPERATURE       0x01
 
 155 #define FAN_CTRL_MODE_MANUAL            0x02
 
 158  * Data structures and manipulation thereof
 
 161 struct f71805f_auto_point {
 
 166 struct f71805f_data {
 
 169         struct device *hwmon_dev;
 
 171         struct mutex update_lock;
 
 172         char valid;             /* !=0 if following fields are valid */
 
 173         unsigned long last_updated;     /* In jiffies */
 
 174         unsigned long last_limits;      /* In jiffies */
 
 176         /* Register values */
 
 191         unsigned long alarms;
 
 192         struct f71805f_auto_point auto_points[3];
 
 195 struct f71805f_sio_data {
 
 200 static inline long in_from_reg(u8 reg)
 
 205 /* The 2 least significant bits are not used */
 
 206 static inline u8 in_to_reg(long val)
 
 212         return (((val + 16) / 32) << 2);
 
 215 /* in0 is downscaled by a factor 2 internally */
 
 216 static inline long in0_from_reg(u8 reg)
 
 221 static inline u8 in0_to_reg(long val)
 
 227         return (((val + 32) / 64) << 2);
 
 230 /* The 4 most significant bits are not used */
 
 231 static inline long fan_from_reg(u16 reg)
 
 234         if (!reg || reg == 0xfff)
 
 236         return (1500000 / reg);
 
 239 static inline u16 fan_to_reg(long rpm)
 
 241         /* If the low limit is set below what the chip can measure,
 
 242            store the largest possible 12-bit value in the registers,
 
 243            so that no alarm will ever trigger. */
 
 246         return (1500000 / rpm);
 
 249 static inline unsigned long pwm_freq_from_reg(u8 reg)
 
 251         unsigned long clock = (reg & 0x80) ? 48000000UL : 1000000UL;
 
 256         return clock / (reg << 8);
 
 259 static inline u8 pwm_freq_to_reg(unsigned long val)
 
 261         if (val >= 187500)      /* The highest we can do */
 
 263         if (val >= 1475)        /* Use 48 MHz clock */
 
 264                 return 0x80 | (48000000UL / (val << 8));
 
 265         if (val < 31)           /* The lowest we can do */
 
 267         else                    /* Use 1 MHz clock */
 
 268                 return 1000000UL / (val << 8);
 
 271 static inline int pwm_mode_from_reg(u8 reg)
 
 273         return !(reg & FAN_CTRL_DC_MODE);
 
 276 static inline long temp_from_reg(u8 reg)
 
 281 static inline u8 temp_to_reg(long val)
 
 285         else if (val > 1000 * 0xff)
 
 287         return ((val + 500) / 1000);
 
 294 /* Must be called with data->update_lock held, except during initialization */
 
 295 static u8 f71805f_read8(struct f71805f_data *data, u8 reg)
 
 297         outb(reg, data->addr + ADDR_REG_OFFSET);
 
 298         return inb(data->addr + DATA_REG_OFFSET);
 
 301 /* Must be called with data->update_lock held, except during initialization */
 
 302 static void f71805f_write8(struct f71805f_data *data, u8 reg, u8 val)
 
 304         outb(reg, data->addr + ADDR_REG_OFFSET);
 
 305         outb(val, data->addr + DATA_REG_OFFSET);
 
 308 /* It is important to read the MSB first, because doing so latches the
 
 309    value of the LSB, so we are sure both bytes belong to the same value.
 
 310    Must be called with data->update_lock held, except during initialization */
 
 311 static u16 f71805f_read16(struct f71805f_data *data, u8 reg)
 
 315         outb(reg, data->addr + ADDR_REG_OFFSET);
 
 316         val = inb(data->addr + DATA_REG_OFFSET) << 8;
 
 317         outb(++reg, data->addr + ADDR_REG_OFFSET);
 
 318         val |= inb(data->addr + DATA_REG_OFFSET);
 
 323 /* Must be called with data->update_lock held, except during initialization */
 
 324 static void f71805f_write16(struct f71805f_data *data, u8 reg, u16 val)
 
 326         outb(reg, data->addr + ADDR_REG_OFFSET);
 
 327         outb(val >> 8, data->addr + DATA_REG_OFFSET);
 
 328         outb(++reg, data->addr + ADDR_REG_OFFSET);
 
 329         outb(val & 0xff, data->addr + DATA_REG_OFFSET);
 
 332 static struct f71805f_data *f71805f_update_device(struct device *dev)
 
 334         struct f71805f_data *data = dev_get_drvdata(dev);
 
 337         mutex_lock(&data->update_lock);
 
 339         /* Limit registers cache is refreshed after 60 seconds */
 
 340         if (time_after(jiffies, data->last_updated + 60 * HZ)
 
 342                 for (nr = 0; nr < 11; nr++) {
 
 343                         if (!(data->has_in & (1 << nr)))
 
 345                         data->in_high[nr] = f71805f_read8(data,
 
 346                                             F71805F_REG_IN_HIGH(nr));
 
 347                         data->in_low[nr] = f71805f_read8(data,
 
 348                                            F71805F_REG_IN_LOW(nr));
 
 350                 for (nr = 0; nr < 3; nr++) {
 
 351                         data->fan_low[nr] = f71805f_read16(data,
 
 352                                             F71805F_REG_FAN_LOW(nr));
 
 353                         data->fan_target[nr] = f71805f_read16(data,
 
 354                                                F71805F_REG_FAN_TARGET(nr));
 
 355                         data->pwm_freq[nr] = f71805f_read8(data,
 
 356                                              F71805F_REG_PWM_FREQ(nr));
 
 358                 for (nr = 0; nr < 3; nr++) {
 
 359                         data->temp_high[nr] = f71805f_read8(data,
 
 360                                               F71805F_REG_TEMP_HIGH(nr));
 
 361                         data->temp_hyst[nr] = f71805f_read8(data,
 
 362                                               F71805F_REG_TEMP_HYST(nr));
 
 364                 data->temp_mode = f71805f_read8(data, F71805F_REG_TEMP_MODE);
 
 365                 for (nr = 0; nr < 3; nr++) {
 
 366                         for (apnr = 0; apnr < 3; apnr++) {
 
 367                                 data->auto_points[nr].temp[apnr] =
 
 369                                         F71805F_REG_PWM_AUTO_POINT_TEMP(nr,
 
 371                                 data->auto_points[nr].fan[apnr] =
 
 373                                         F71805F_REG_PWM_AUTO_POINT_FAN(nr,
 
 378                 data->last_limits = jiffies;
 
 381         /* Measurement registers cache is refreshed after 1 second */
 
 382         if (time_after(jiffies, data->last_updated + HZ)
 
 384                 for (nr = 0; nr < 11; nr++) {
 
 385                         if (!(data->has_in & (1 << nr)))
 
 387                         data->in[nr] = f71805f_read8(data,
 
 390                 for (nr = 0; nr < 3; nr++) {
 
 391                         data->fan[nr] = f71805f_read16(data,
 
 392                                         F71805F_REG_FAN(nr));
 
 393                         data->fan_ctrl[nr] = f71805f_read8(data,
 
 394                                              F71805F_REG_FAN_CTRL(nr));
 
 395                         data->pwm[nr] = f71805f_read8(data,
 
 396                                         F71805F_REG_PWM_DUTY(nr));
 
 398                 for (nr = 0; nr < 3; nr++) {
 
 399                         data->temp[nr] = f71805f_read8(data,
 
 400                                          F71805F_REG_TEMP(nr));
 
 402                 data->alarms = f71805f_read8(data, F71805F_REG_STATUS(0))
 
 403                         + (f71805f_read8(data, F71805F_REG_STATUS(1)) << 8)
 
 404                         + (f71805f_read8(data, F71805F_REG_STATUS(2)) << 16);
 
 406                 data->last_updated = jiffies;
 
 410         mutex_unlock(&data->update_lock);
 
 419 static ssize_t show_in0(struct device *dev, struct device_attribute *devattr,
 
 422         struct f71805f_data *data = f71805f_update_device(dev);
 
 423         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 424         int nr = attr->index;
 
 426         return sprintf(buf, "%ld\n", in0_from_reg(data->in[nr]));
 
 429 static ssize_t show_in0_max(struct device *dev, struct device_attribute
 
 432         struct f71805f_data *data = f71805f_update_device(dev);
 
 433         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 434         int nr = attr->index;
 
 436         return sprintf(buf, "%ld\n", in0_from_reg(data->in_high[nr]));
 
 439 static ssize_t show_in0_min(struct device *dev, struct device_attribute
 
 442         struct f71805f_data *data = f71805f_update_device(dev);
 
 443         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 444         int nr = attr->index;
 
 446         return sprintf(buf, "%ld\n", in0_from_reg(data->in_low[nr]));
 
 449 static ssize_t set_in0_max(struct device *dev, struct device_attribute
 
 450                            *devattr, const char *buf, size_t count)
 
 452         struct f71805f_data *data = dev_get_drvdata(dev);
 
 453         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 454         int nr = attr->index;
 
 455         long val = simple_strtol(buf, NULL, 10);
 
 457         mutex_lock(&data->update_lock);
 
 458         data->in_high[nr] = in0_to_reg(val);
 
 459         f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
 
 460         mutex_unlock(&data->update_lock);
 
 465 static ssize_t set_in0_min(struct device *dev, struct device_attribute
 
 466                            *devattr, const char *buf, size_t count)
 
 468         struct f71805f_data *data = dev_get_drvdata(dev);
 
 469         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 470         int nr = attr->index;
 
 471         long val = simple_strtol(buf, NULL, 10);
 
 473         mutex_lock(&data->update_lock);
 
 474         data->in_low[nr] = in0_to_reg(val);
 
 475         f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
 
 476         mutex_unlock(&data->update_lock);
 
 481 static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
 
 484         struct f71805f_data *data = f71805f_update_device(dev);
 
 485         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 486         int nr = attr->index;
 
 488         return sprintf(buf, "%ld\n", in_from_reg(data->in[nr]));
 
 491 static ssize_t show_in_max(struct device *dev, struct device_attribute
 
 494         struct f71805f_data *data = f71805f_update_device(dev);
 
 495         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 496         int nr = attr->index;
 
 498         return sprintf(buf, "%ld\n", in_from_reg(data->in_high[nr]));
 
 501 static ssize_t show_in_min(struct device *dev, struct device_attribute
 
 504         struct f71805f_data *data = f71805f_update_device(dev);
 
 505         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 506         int nr = attr->index;
 
 508         return sprintf(buf, "%ld\n", in_from_reg(data->in_low[nr]));
 
 511 static ssize_t set_in_max(struct device *dev, struct device_attribute
 
 512                           *devattr, const char *buf, size_t count)
 
 514         struct f71805f_data *data = dev_get_drvdata(dev);
 
 515         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 516         int nr = attr->index;
 
 517         long val = simple_strtol(buf, NULL, 10);
 
 519         mutex_lock(&data->update_lock);
 
 520         data->in_high[nr] = in_to_reg(val);
 
 521         f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]);
 
 522         mutex_unlock(&data->update_lock);
 
 527 static ssize_t set_in_min(struct device *dev, struct device_attribute
 
 528                           *devattr, const char *buf, size_t count)
 
 530         struct f71805f_data *data = dev_get_drvdata(dev);
 
 531         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 532         int nr = attr->index;
 
 533         long val = simple_strtol(buf, NULL, 10);
 
 535         mutex_lock(&data->update_lock);
 
 536         data->in_low[nr] = in_to_reg(val);
 
 537         f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]);
 
 538         mutex_unlock(&data->update_lock);
 
 543 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
 
 546         struct f71805f_data *data = f71805f_update_device(dev);
 
 547         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 548         int nr = attr->index;
 
 550         return sprintf(buf, "%ld\n", fan_from_reg(data->fan[nr]));
 
 553 static ssize_t show_fan_min(struct device *dev, struct device_attribute
 
 556         struct f71805f_data *data = f71805f_update_device(dev);
 
 557         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 558         int nr = attr->index;
 
 560         return sprintf(buf, "%ld\n", fan_from_reg(data->fan_low[nr]));
 
 563 static ssize_t show_fan_target(struct device *dev, struct device_attribute
 
 566         struct f71805f_data *data = f71805f_update_device(dev);
 
 567         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 568         int nr = attr->index;
 
 570         return sprintf(buf, "%ld\n", fan_from_reg(data->fan_target[nr]));
 
 573 static ssize_t set_fan_min(struct device *dev, struct device_attribute
 
 574                            *devattr, const char *buf, size_t count)
 
 576         struct f71805f_data *data = dev_get_drvdata(dev);
 
 577         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 578         int nr = attr->index;
 
 579         long val = simple_strtol(buf, NULL, 10);
 
 581         mutex_lock(&data->update_lock);
 
 582         data->fan_low[nr] = fan_to_reg(val);
 
 583         f71805f_write16(data, F71805F_REG_FAN_LOW(nr), data->fan_low[nr]);
 
 584         mutex_unlock(&data->update_lock);
 
 589 static ssize_t set_fan_target(struct device *dev, struct device_attribute
 
 590                               *devattr, const char *buf, size_t count)
 
 592         struct f71805f_data *data = dev_get_drvdata(dev);
 
 593         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 594         int nr = attr->index;
 
 595         long val = simple_strtol(buf, NULL, 10);
 
 597         mutex_lock(&data->update_lock);
 
 598         data->fan_target[nr] = fan_to_reg(val);
 
 599         f71805f_write16(data, F71805F_REG_FAN_TARGET(nr),
 
 600                         data->fan_target[nr]);
 
 601         mutex_unlock(&data->update_lock);
 
 606 static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
 
 609         struct f71805f_data *data = f71805f_update_device(dev);
 
 610         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 611         int nr = attr->index;
 
 613         return sprintf(buf, "%d\n", (int)data->pwm[nr]);
 
 616 static ssize_t show_pwm_enable(struct device *dev, struct device_attribute
 
 619         struct f71805f_data *data = f71805f_update_device(dev);
 
 620         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 621         int nr = attr->index;
 
 624         switch (data->fan_ctrl[nr] & FAN_CTRL_MODE_MASK) {
 
 625         case FAN_CTRL_MODE_SPEED:
 
 628         case FAN_CTRL_MODE_TEMPERATURE:
 
 631         default: /* MANUAL */
 
 635         return sprintf(buf, "%d\n", mode);
 
 638 static ssize_t show_pwm_freq(struct device *dev, struct device_attribute
 
 641         struct f71805f_data *data = f71805f_update_device(dev);
 
 642         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 643         int nr = attr->index;
 
 645         return sprintf(buf, "%lu\n", pwm_freq_from_reg(data->pwm_freq[nr]));
 
 648 static ssize_t show_pwm_mode(struct device *dev, struct device_attribute
 
 651         struct f71805f_data *data = f71805f_update_device(dev);
 
 652         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 653         int nr = attr->index;
 
 655         return sprintf(buf, "%d\n", pwm_mode_from_reg(data->fan_ctrl[nr]));
 
 658 static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr,
 
 659                        const char *buf, size_t count)
 
 661         struct f71805f_data *data = dev_get_drvdata(dev);
 
 662         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 663         int nr = attr->index;
 
 664         unsigned long val = simple_strtoul(buf, NULL, 10);
 
 669         mutex_lock(&data->update_lock);
 
 671         f71805f_write8(data, F71805F_REG_PWM_DUTY(nr), data->pwm[nr]);
 
 672         mutex_unlock(&data->update_lock);
 
 677 static struct attribute *f71805f_attr_pwm[];
 
 679 static ssize_t set_pwm_enable(struct device *dev, struct device_attribute
 
 680                               *devattr, const char *buf, size_t count)
 
 682         struct f71805f_data *data = dev_get_drvdata(dev);
 
 683         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 684         int nr = attr->index;
 
 685         unsigned long val = simple_strtoul(buf, NULL, 10);
 
 688         if (val < 1 || val > 3)
 
 691         if (val > 1) { /* Automatic mode, user can't set PWM value */
 
 692                 if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
 
 694                         dev_dbg(dev, "chmod -w pwm%d failed\n", nr + 1);
 
 697         mutex_lock(&data->update_lock);
 
 698         reg = f71805f_read8(data, F71805F_REG_FAN_CTRL(nr))
 
 699             & ~FAN_CTRL_MODE_MASK;
 
 702                 reg |= FAN_CTRL_MODE_MANUAL;
 
 705                 reg |= FAN_CTRL_MODE_TEMPERATURE;
 
 708                 reg |= FAN_CTRL_MODE_SPEED;
 
 711         data->fan_ctrl[nr] = reg;
 
 712         f71805f_write8(data, F71805F_REG_FAN_CTRL(nr), reg);
 
 713         mutex_unlock(&data->update_lock);
 
 715         if (val == 1) { /* Manual mode, user can set PWM value */
 
 716                 if (sysfs_chmod_file(&dev->kobj, f71805f_attr_pwm[nr],
 
 718                         dev_dbg(dev, "chmod +w pwm%d failed\n", nr + 1);
 
 724 static ssize_t set_pwm_freq(struct device *dev, struct device_attribute
 
 725                             *devattr, const char *buf, size_t count)
 
 727         struct f71805f_data *data = dev_get_drvdata(dev);
 
 728         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 729         int nr = attr->index;
 
 730         unsigned long val = simple_strtoul(buf, NULL, 10);
 
 732         mutex_lock(&data->update_lock);
 
 733         data->pwm_freq[nr] = pwm_freq_to_reg(val);
 
 734         f71805f_write8(data, F71805F_REG_PWM_FREQ(nr), data->pwm_freq[nr]);
 
 735         mutex_unlock(&data->update_lock);
 
 740 static ssize_t show_pwm_auto_point_temp(struct device *dev,
 
 741                                         struct device_attribute *devattr,
 
 744         struct f71805f_data *data = dev_get_drvdata(dev);
 
 745         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
 
 746         int pwmnr = attr->nr;
 
 747         int apnr = attr->index;
 
 749         return sprintf(buf, "%ld\n",
 
 750                        temp_from_reg(data->auto_points[pwmnr].temp[apnr]));
 
 753 static ssize_t set_pwm_auto_point_temp(struct device *dev,
 
 754                                        struct device_attribute *devattr,
 
 755                                        const char* buf, size_t count)
 
 757         struct f71805f_data *data = dev_get_drvdata(dev);
 
 758         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
 
 759         int pwmnr = attr->nr;
 
 760         int apnr = attr->index;
 
 761         unsigned long val = simple_strtol(buf, NULL, 10);
 
 763         mutex_lock(&data->update_lock);
 
 764         data->auto_points[pwmnr].temp[apnr] = temp_to_reg(val);
 
 765         f71805f_write8(data, F71805F_REG_PWM_AUTO_POINT_TEMP(pwmnr, apnr),
 
 766                        data->auto_points[pwmnr].temp[apnr]);
 
 767         mutex_unlock(&data->update_lock);
 
 772 static ssize_t show_pwm_auto_point_fan(struct device *dev,
 
 773                                        struct device_attribute *devattr,
 
 776         struct f71805f_data *data = dev_get_drvdata(dev);
 
 777         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
 
 778         int pwmnr = attr->nr;
 
 779         int apnr = attr->index;
 
 781         return sprintf(buf, "%ld\n",
 
 782                        fan_from_reg(data->auto_points[pwmnr].fan[apnr]));
 
 785 static ssize_t set_pwm_auto_point_fan(struct device *dev,
 
 786                                       struct device_attribute *devattr,
 
 787                                       const char* buf, size_t count)
 
 789         struct f71805f_data *data = dev_get_drvdata(dev);
 
 790         struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
 
 791         int pwmnr = attr->nr;
 
 792         int apnr = attr->index;
 
 793         unsigned long val = simple_strtoul(buf, NULL, 10);
 
 795         mutex_lock(&data->update_lock);
 
 796         data->auto_points[pwmnr].fan[apnr] = fan_to_reg(val);
 
 797         f71805f_write16(data, F71805F_REG_PWM_AUTO_POINT_FAN(pwmnr, apnr),
 
 798                         data->auto_points[pwmnr].fan[apnr]);
 
 799         mutex_unlock(&data->update_lock);
 
 804 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
 
 807         struct f71805f_data *data = f71805f_update_device(dev);
 
 808         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 809         int nr = attr->index;
 
 811         return sprintf(buf, "%ld\n", temp_from_reg(data->temp[nr]));
 
 814 static ssize_t show_temp_max(struct device *dev, struct device_attribute
 
 817         struct f71805f_data *data = f71805f_update_device(dev);
 
 818         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 819         int nr = attr->index;
 
 821         return sprintf(buf, "%ld\n", temp_from_reg(data->temp_high[nr]));
 
 824 static ssize_t show_temp_hyst(struct device *dev, struct device_attribute
 
 827         struct f71805f_data *data = f71805f_update_device(dev);
 
 828         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 829         int nr = attr->index;
 
 831         return sprintf(buf, "%ld\n", temp_from_reg(data->temp_hyst[nr]));
 
 834 static ssize_t show_temp_type(struct device *dev, struct device_attribute
 
 837         struct f71805f_data *data = f71805f_update_device(dev);
 
 838         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 839         int nr = attr->index;
 
 841         /* 3 is diode, 4 is thermistor */
 
 842         return sprintf(buf, "%u\n", (data->temp_mode & (1 << nr)) ? 3 : 4);
 
 845 static ssize_t set_temp_max(struct device *dev, struct device_attribute
 
 846                             *devattr, const char *buf, size_t count)
 
 848         struct f71805f_data *data = dev_get_drvdata(dev);
 
 849         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 850         int nr = attr->index;
 
 851         long val = simple_strtol(buf, NULL, 10);
 
 853         mutex_lock(&data->update_lock);
 
 854         data->temp_high[nr] = temp_to_reg(val);
 
 855         f71805f_write8(data, F71805F_REG_TEMP_HIGH(nr), data->temp_high[nr]);
 
 856         mutex_unlock(&data->update_lock);
 
 861 static ssize_t set_temp_hyst(struct device *dev, struct device_attribute
 
 862                              *devattr, const char *buf, size_t count)
 
 864         struct f71805f_data *data = dev_get_drvdata(dev);
 
 865         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 866         int nr = attr->index;
 
 867         long val = simple_strtol(buf, NULL, 10);
 
 869         mutex_lock(&data->update_lock);
 
 870         data->temp_hyst[nr] = temp_to_reg(val);
 
 871         f71805f_write8(data, F71805F_REG_TEMP_HYST(nr), data->temp_hyst[nr]);
 
 872         mutex_unlock(&data->update_lock);
 
 877 static ssize_t show_alarms_in(struct device *dev, struct device_attribute
 
 880         struct f71805f_data *data = f71805f_update_device(dev);
 
 882         return sprintf(buf, "%lu\n", data->alarms & 0x7ff);
 
 885 static ssize_t show_alarms_fan(struct device *dev, struct device_attribute
 
 888         struct f71805f_data *data = f71805f_update_device(dev);
 
 890         return sprintf(buf, "%lu\n", (data->alarms >> 16) & 0x07);
 
 893 static ssize_t show_alarms_temp(struct device *dev, struct device_attribute
 
 896         struct f71805f_data *data = f71805f_update_device(dev);
 
 898         return sprintf(buf, "%lu\n", (data->alarms >> 11) & 0x07);
 
 901 static ssize_t show_alarm(struct device *dev, struct device_attribute
 
 904         struct f71805f_data *data = f71805f_update_device(dev);
 
 905         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
 
 906         int bitnr = attr->index;
 
 908         return sprintf(buf, "%lu\n", (data->alarms >> bitnr) & 1);
 
 911 static ssize_t show_name(struct device *dev, struct device_attribute
 
 914         struct f71805f_data *data = dev_get_drvdata(dev);
 
 916         return sprintf(buf, "%s\n", data->name);
 
 919 static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL, 0);
 
 920 static SENSOR_DEVICE_ATTR(in0_max, S_IRUGO| S_IWUSR,
 
 921                           show_in0_max, set_in0_max, 0);
 
 922 static SENSOR_DEVICE_ATTR(in0_min, S_IRUGO| S_IWUSR,
 
 923                           show_in0_min, set_in0_min, 0);
 
 924 static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
 
 925 static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR,
 
 926                           show_in_max, set_in_max, 1);
 
 927 static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR,
 
 928                           show_in_min, set_in_min, 1);
 
 929 static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
 
 930 static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR,
 
 931                           show_in_max, set_in_max, 2);
 
 932 static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR,
 
 933                           show_in_min, set_in_min, 2);
 
 934 static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
 
 935 static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO | S_IWUSR,
 
 936                           show_in_max, set_in_max, 3);
 
 937 static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO | S_IWUSR,
 
 938                           show_in_min, set_in_min, 3);
 
 939 static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
 
 940 static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
 
 941                           show_in_max, set_in_max, 4);
 
 942 static SENSOR_DEVICE_ATTR(in4_min, S_IRUGO | S_IWUSR,
 
 943                           show_in_min, set_in_min, 4);
 
 944 static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
 
 945 static SENSOR_DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR,
 
 946                           show_in_max, set_in_max, 5);
 
 947 static SENSOR_DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR,
 
 948                           show_in_min, set_in_min, 5);
 
 949 static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
 
 950 static SENSOR_DEVICE_ATTR(in6_max, S_IRUGO | S_IWUSR,
 
 951                           show_in_max, set_in_max, 6);
 
 952 static SENSOR_DEVICE_ATTR(in6_min, S_IRUGO | S_IWUSR,
 
 953                           show_in_min, set_in_min, 6);
 
 954 static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
 
 955 static SENSOR_DEVICE_ATTR(in7_max, S_IRUGO | S_IWUSR,
 
 956                           show_in_max, set_in_max, 7);
 
 957 static SENSOR_DEVICE_ATTR(in7_min, S_IRUGO | S_IWUSR,
 
 958                           show_in_min, set_in_min, 7);
 
 959 static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
 
 960 static SENSOR_DEVICE_ATTR(in8_max, S_IRUGO | S_IWUSR,
 
 961                           show_in_max, set_in_max, 8);
 
 962 static SENSOR_DEVICE_ATTR(in8_min, S_IRUGO | S_IWUSR,
 
 963                           show_in_min, set_in_min, 8);
 
 964 static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, show_in0, NULL, 9);
 
 965 static SENSOR_DEVICE_ATTR(in9_max, S_IRUGO | S_IWUSR,
 
 966                           show_in0_max, set_in0_max, 9);
 
 967 static SENSOR_DEVICE_ATTR(in9_min, S_IRUGO | S_IWUSR,
 
 968                           show_in0_min, set_in0_min, 9);
 
 969 static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, show_in0, NULL, 10);
 
 970 static SENSOR_DEVICE_ATTR(in10_max, S_IRUGO | S_IWUSR,
 
 971                           show_in0_max, set_in0_max, 10);
 
 972 static SENSOR_DEVICE_ATTR(in10_min, S_IRUGO | S_IWUSR,
 
 973                           show_in0_min, set_in0_min, 10);
 
 975 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
 
 976 static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR,
 
 977                           show_fan_min, set_fan_min, 0);
 
 978 static SENSOR_DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR,
 
 979                           show_fan_target, set_fan_target, 0);
 
 980 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
 
 981 static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR,
 
 982                           show_fan_min, set_fan_min, 1);
 
 983 static SENSOR_DEVICE_ATTR(fan2_target, S_IRUGO | S_IWUSR,
 
 984                           show_fan_target, set_fan_target, 1);
 
 985 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
 
 986 static SENSOR_DEVICE_ATTR(fan3_min, S_IRUGO | S_IWUSR,
 
 987                           show_fan_min, set_fan_min, 2);
 
 988 static SENSOR_DEVICE_ATTR(fan3_target, S_IRUGO | S_IWUSR,
 
 989                           show_fan_target, set_fan_target, 2);
 
 991 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
 
 992 static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
 
 993                     show_temp_max, set_temp_max, 0);
 
 994 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
 
 995                     show_temp_hyst, set_temp_hyst, 0);
 
 996 static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0);
 
 997 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
 
 998 static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR,
 
 999                     show_temp_max, set_temp_max, 1);
 
1000 static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
 
1001                     show_temp_hyst, set_temp_hyst, 1);
 
1002 static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1);
 
1003 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
 
1004 static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR,
 
1005                     show_temp_max, set_temp_max, 2);
 
1006 static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR,
 
1007                     show_temp_hyst, set_temp_hyst, 2);
 
1008 static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2);
 
1010 /* pwm (value) files are created read-only, write permission is
 
1011    then added or removed dynamically as needed */
 
1012 static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO, show_pwm, set_pwm, 0);
 
1013 static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
 
1014                           show_pwm_enable, set_pwm_enable, 0);
 
1015 static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO | S_IWUSR,
 
1016                           show_pwm_freq, set_pwm_freq, 0);
 
1017 static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL, 0);
 
1018 static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO, show_pwm, set_pwm, 1);
 
1019 static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR,
 
1020                           show_pwm_enable, set_pwm_enable, 1);
 
1021 static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO | S_IWUSR,
 
1022                           show_pwm_freq, set_pwm_freq, 1);
 
1023 static SENSOR_DEVICE_ATTR(pwm2_mode, S_IRUGO, show_pwm_mode, NULL, 1);
 
1024 static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO, show_pwm, set_pwm, 2);
 
1025 static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR,
 
1026                           show_pwm_enable, set_pwm_enable, 2);
 
1027 static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO | S_IWUSR,
 
1028                           show_pwm_freq, set_pwm_freq, 2);
 
1029 static SENSOR_DEVICE_ATTR(pwm3_mode, S_IRUGO, show_pwm_mode, NULL, 2);
 
1031 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp, S_IRUGO | S_IWUSR,
 
1032                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1034 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_fan, S_IRUGO | S_IWUSR,
 
1035                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1037 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_temp, S_IRUGO | S_IWUSR,
 
1038                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1040 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_fan, S_IRUGO | S_IWUSR,
 
1041                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1043 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp, S_IRUGO | S_IWUSR,
 
1044                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1046 static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_fan, S_IRUGO | S_IWUSR,
 
1047                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1050 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp, S_IRUGO | S_IWUSR,
 
1051                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1053 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_fan, S_IRUGO | S_IWUSR,
 
1054                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1056 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_temp, S_IRUGO | S_IWUSR,
 
1057                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1059 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_fan, S_IRUGO | S_IWUSR,
 
1060                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1062 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp, S_IRUGO | S_IWUSR,
 
1063                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1065 static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_fan, S_IRUGO | S_IWUSR,
 
1066                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1069 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp, S_IRUGO | S_IWUSR,
 
1070                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1072 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_fan, S_IRUGO | S_IWUSR,
 
1073                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1075 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_temp, S_IRUGO | S_IWUSR,
 
1076                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1078 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_fan, S_IRUGO | S_IWUSR,
 
1079                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1081 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp, S_IRUGO | S_IWUSR,
 
1082                             show_pwm_auto_point_temp, set_pwm_auto_point_temp,
 
1084 static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_fan, S_IRUGO | S_IWUSR,
 
1085                             show_pwm_auto_point_fan, set_pwm_auto_point_fan,
 
1088 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
 
1089 static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
 
1090 static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
 
1091 static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
 
1092 static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4);
 
1093 static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5);
 
1094 static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6);
 
1095 static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7);
 
1096 static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8);
 
1097 static SENSOR_DEVICE_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 9);
 
1098 static SENSOR_DEVICE_ATTR(in10_alarm, S_IRUGO, show_alarm, NULL, 10);
 
1099 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11);
 
1100 static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12);
 
1101 static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
 
1102 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16);
 
1103 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17);
 
1104 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18);
 
1105 static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL);
 
1106 static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL);
 
1107 static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL);
 
1109 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
 
1111 static struct attribute *f71805f_attributes[] = {
 
1112         &sensor_dev_attr_in0_input.dev_attr.attr,
 
1113         &sensor_dev_attr_in0_max.dev_attr.attr,
 
1114         &sensor_dev_attr_in0_min.dev_attr.attr,
 
1115         &sensor_dev_attr_in1_input.dev_attr.attr,
 
1116         &sensor_dev_attr_in1_max.dev_attr.attr,
 
1117         &sensor_dev_attr_in1_min.dev_attr.attr,
 
1118         &sensor_dev_attr_in2_input.dev_attr.attr,
 
1119         &sensor_dev_attr_in2_max.dev_attr.attr,
 
1120         &sensor_dev_attr_in2_min.dev_attr.attr,
 
1121         &sensor_dev_attr_in3_input.dev_attr.attr,
 
1122         &sensor_dev_attr_in3_max.dev_attr.attr,
 
1123         &sensor_dev_attr_in3_min.dev_attr.attr,
 
1124         &sensor_dev_attr_in5_input.dev_attr.attr,
 
1125         &sensor_dev_attr_in5_max.dev_attr.attr,
 
1126         &sensor_dev_attr_in5_min.dev_attr.attr,
 
1127         &sensor_dev_attr_in6_input.dev_attr.attr,
 
1128         &sensor_dev_attr_in6_max.dev_attr.attr,
 
1129         &sensor_dev_attr_in6_min.dev_attr.attr,
 
1130         &sensor_dev_attr_in7_input.dev_attr.attr,
 
1131         &sensor_dev_attr_in7_max.dev_attr.attr,
 
1132         &sensor_dev_attr_in7_min.dev_attr.attr,
 
1134         &sensor_dev_attr_fan1_input.dev_attr.attr,
 
1135         &sensor_dev_attr_fan1_min.dev_attr.attr,
 
1136         &sensor_dev_attr_fan1_alarm.dev_attr.attr,
 
1137         &sensor_dev_attr_fan1_target.dev_attr.attr,
 
1138         &sensor_dev_attr_fan2_input.dev_attr.attr,
 
1139         &sensor_dev_attr_fan2_min.dev_attr.attr,
 
1140         &sensor_dev_attr_fan2_alarm.dev_attr.attr,
 
1141         &sensor_dev_attr_fan2_target.dev_attr.attr,
 
1142         &sensor_dev_attr_fan3_input.dev_attr.attr,
 
1143         &sensor_dev_attr_fan3_min.dev_attr.attr,
 
1144         &sensor_dev_attr_fan3_alarm.dev_attr.attr,
 
1145         &sensor_dev_attr_fan3_target.dev_attr.attr,
 
1147         &sensor_dev_attr_pwm1.dev_attr.attr,
 
1148         &sensor_dev_attr_pwm1_enable.dev_attr.attr,
 
1149         &sensor_dev_attr_pwm1_mode.dev_attr.attr,
 
1150         &sensor_dev_attr_pwm2.dev_attr.attr,
 
1151         &sensor_dev_attr_pwm2_enable.dev_attr.attr,
 
1152         &sensor_dev_attr_pwm2_mode.dev_attr.attr,
 
1153         &sensor_dev_attr_pwm3.dev_attr.attr,
 
1154         &sensor_dev_attr_pwm3_enable.dev_attr.attr,
 
1155         &sensor_dev_attr_pwm3_mode.dev_attr.attr,
 
1157         &sensor_dev_attr_temp1_input.dev_attr.attr,
 
1158         &sensor_dev_attr_temp1_max.dev_attr.attr,
 
1159         &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
 
1160         &sensor_dev_attr_temp1_type.dev_attr.attr,
 
1161         &sensor_dev_attr_temp2_input.dev_attr.attr,
 
1162         &sensor_dev_attr_temp2_max.dev_attr.attr,
 
1163         &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
 
1164         &sensor_dev_attr_temp2_type.dev_attr.attr,
 
1165         &sensor_dev_attr_temp3_input.dev_attr.attr,
 
1166         &sensor_dev_attr_temp3_max.dev_attr.attr,
 
1167         &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
 
1168         &sensor_dev_attr_temp3_type.dev_attr.attr,
 
1170         &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
 
1171         &sensor_dev_attr_pwm1_auto_point1_fan.dev_attr.attr,
 
1172         &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
 
1173         &sensor_dev_attr_pwm1_auto_point2_fan.dev_attr.attr,
 
1174         &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
 
1175         &sensor_dev_attr_pwm1_auto_point3_fan.dev_attr.attr,
 
1176         &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
 
1177         &sensor_dev_attr_pwm2_auto_point1_fan.dev_attr.attr,
 
1178         &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
 
1179         &sensor_dev_attr_pwm2_auto_point2_fan.dev_attr.attr,
 
1180         &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
 
1181         &sensor_dev_attr_pwm2_auto_point3_fan.dev_attr.attr,
 
1182         &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
 
1183         &sensor_dev_attr_pwm3_auto_point1_fan.dev_attr.attr,
 
1184         &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
 
1185         &sensor_dev_attr_pwm3_auto_point2_fan.dev_attr.attr,
 
1186         &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
 
1187         &sensor_dev_attr_pwm3_auto_point3_fan.dev_attr.attr,
 
1189         &sensor_dev_attr_in0_alarm.dev_attr.attr,
 
1190         &sensor_dev_attr_in1_alarm.dev_attr.attr,
 
1191         &sensor_dev_attr_in2_alarm.dev_attr.attr,
 
1192         &sensor_dev_attr_in3_alarm.dev_attr.attr,
 
1193         &sensor_dev_attr_in5_alarm.dev_attr.attr,
 
1194         &sensor_dev_attr_in6_alarm.dev_attr.attr,
 
1195         &sensor_dev_attr_in7_alarm.dev_attr.attr,
 
1196         &dev_attr_alarms_in.attr,
 
1197         &sensor_dev_attr_temp1_alarm.dev_attr.attr,
 
1198         &sensor_dev_attr_temp2_alarm.dev_attr.attr,
 
1199         &sensor_dev_attr_temp3_alarm.dev_attr.attr,
 
1200         &dev_attr_alarms_temp.attr,
 
1201         &dev_attr_alarms_fan.attr,
 
1203         &dev_attr_name.attr,
 
1207 static const struct attribute_group f71805f_group = {
 
1208         .attrs = f71805f_attributes,
 
1211 static struct attribute *f71805f_attributes_optin[4][5] = {
 
1213                 &sensor_dev_attr_in4_input.dev_attr.attr,
 
1214                 &sensor_dev_attr_in4_max.dev_attr.attr,
 
1215                 &sensor_dev_attr_in4_min.dev_attr.attr,
 
1216                 &sensor_dev_attr_in4_alarm.dev_attr.attr,
 
1219                 &sensor_dev_attr_in8_input.dev_attr.attr,
 
1220                 &sensor_dev_attr_in8_max.dev_attr.attr,
 
1221                 &sensor_dev_attr_in8_min.dev_attr.attr,
 
1222                 &sensor_dev_attr_in8_alarm.dev_attr.attr,
 
1225                 &sensor_dev_attr_in9_input.dev_attr.attr,
 
1226                 &sensor_dev_attr_in9_max.dev_attr.attr,
 
1227                 &sensor_dev_attr_in9_min.dev_attr.attr,
 
1228                 &sensor_dev_attr_in9_alarm.dev_attr.attr,
 
1231                 &sensor_dev_attr_in10_input.dev_attr.attr,
 
1232                 &sensor_dev_attr_in10_max.dev_attr.attr,
 
1233                 &sensor_dev_attr_in10_min.dev_attr.attr,
 
1234                 &sensor_dev_attr_in10_alarm.dev_attr.attr,
 
1239 static const struct attribute_group f71805f_group_optin[4] = {
 
1240         { .attrs = f71805f_attributes_optin[0] },
 
1241         { .attrs = f71805f_attributes_optin[1] },
 
1242         { .attrs = f71805f_attributes_optin[2] },
 
1243         { .attrs = f71805f_attributes_optin[3] },
 
1246 /* We don't include pwm_freq files in the arrays above, because they must be
 
1247    created conditionally (only if pwm_mode is 1 == PWM) */
 
1248 static struct attribute *f71805f_attributes_pwm_freq[] = {
 
1249         &sensor_dev_attr_pwm1_freq.dev_attr.attr,
 
1250         &sensor_dev_attr_pwm2_freq.dev_attr.attr,
 
1251         &sensor_dev_attr_pwm3_freq.dev_attr.attr,
 
1255 static const struct attribute_group f71805f_group_pwm_freq = {
 
1256         .attrs = f71805f_attributes_pwm_freq,
 
1259 /* We also need an indexed access to pwmN files to toggle writability */
 
1260 static struct attribute *f71805f_attr_pwm[] = {
 
1261         &sensor_dev_attr_pwm1.dev_attr.attr,
 
1262         &sensor_dev_attr_pwm2.dev_attr.attr,
 
1263         &sensor_dev_attr_pwm3.dev_attr.attr,
 
1267  * Device registration and initialization
 
1270 static void __devinit f71805f_init_device(struct f71805f_data *data)
 
1275         reg = f71805f_read8(data, F71805F_REG_START);
 
1276         if ((reg & 0x41) != 0x01) {
 
1277                 printk(KERN_DEBUG DRVNAME ": Starting monitoring "
 
1279                 f71805f_write8(data, F71805F_REG_START, (reg | 0x01) & ~0x40);
 
1282         /* Fan monitoring can be disabled. If it is, we won't be polling
 
1283            the register values, and won't create the related sysfs files. */
 
1284         for (i = 0; i < 3; i++) {
 
1285                 data->fan_ctrl[i] = f71805f_read8(data,
 
1286                                                   F71805F_REG_FAN_CTRL(i));
 
1287                 /* Clear latch full bit, else "speed mode" fan speed control
 
1289                 if (data->fan_ctrl[i] & FAN_CTRL_LATCH_FULL) {
 
1290                         data->fan_ctrl[i] &= ~FAN_CTRL_LATCH_FULL;
 
1291                         f71805f_write8(data, F71805F_REG_FAN_CTRL(i),
 
1297 static int __devinit f71805f_probe(struct platform_device *pdev)
 
1299         struct f71805f_sio_data *sio_data = pdev->dev.platform_data;
 
1300         struct f71805f_data *data;
 
1301         struct resource *res;
 
1304         static const char *names[] = {
 
1309         if (!(data = kzalloc(sizeof(struct f71805f_data), GFP_KERNEL))) {
 
1311                 printk(KERN_ERR DRVNAME ": Out of memory\n");
 
1315         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 
1316         if (!request_region(res->start + ADDR_REG_OFFSET, 2, DRVNAME)) {
 
1318                 dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
 
1319                         (unsigned long)(res->start + ADDR_REG_OFFSET),
 
1320                         (unsigned long)(res->start + ADDR_REG_OFFSET + 1));
 
1323         data->addr = res->start;
 
1324         data->name = names[sio_data->kind];
 
1325         mutex_init(&data->update_lock);
 
1327         platform_set_drvdata(pdev, data);
 
1329         /* Some voltage inputs depend on chip model and configuration */
 
1330         switch (sio_data->kind) {
 
1332                 data->has_in = 0x1ff;
 
1335                 data->has_in = 0x6ef;
 
1336                 if (sio_data->fnsel1 & 0x01)
 
1337                         data->has_in |= (1 << 4); /* in4 */
 
1338                 if (sio_data->fnsel1 & 0x02)
 
1339                         data->has_in |= (1 << 8); /* in8 */
 
1343         /* Initialize the F71805F chip */
 
1344         f71805f_init_device(data);
 
1346         /* Register sysfs interface files */
 
1347         if ((err = sysfs_create_group(&pdev->dev.kobj, &f71805f_group)))
 
1348                 goto exit_release_region;
 
1349         if (data->has_in & (1 << 4)) { /* in4 */
 
1350                 if ((err = sysfs_create_group(&pdev->dev.kobj,
 
1351                                               &f71805f_group_optin[0])))
 
1352                         goto exit_remove_files;
 
1354         if (data->has_in & (1 << 8)) { /* in8 */
 
1355                 if ((err = sysfs_create_group(&pdev->dev.kobj,
 
1356                                               &f71805f_group_optin[1])))
 
1357                         goto exit_remove_files;
 
1359         if (data->has_in & (1 << 9)) { /* in9 (F71872F/FG only) */
 
1360                 if ((err = sysfs_create_group(&pdev->dev.kobj,
 
1361                                               &f71805f_group_optin[2])))
 
1362                         goto exit_remove_files;
 
1364         if (data->has_in & (1 << 10)) { /* in9 (F71872F/FG only) */
 
1365                 if ((err = sysfs_create_group(&pdev->dev.kobj,
 
1366                                               &f71805f_group_optin[3])))
 
1367                         goto exit_remove_files;
 
1369         for (i = 0; i < 3; i++) {
 
1370                 /* If control mode is PWM, create pwm_freq file */
 
1371                 if (!(data->fan_ctrl[i] & FAN_CTRL_DC_MODE)) {
 
1372                         if ((err = sysfs_create_file(&pdev->dev.kobj,
 
1373                                         f71805f_attributes_pwm_freq[i])))
 
1374                                 goto exit_remove_files;
 
1376                 /* If PWM is in manual mode, add write permission */
 
1377                 if (data->fan_ctrl[i] & FAN_CTRL_MODE_MANUAL) {
 
1378                         if ((err = sysfs_chmod_file(&pdev->dev.kobj,
 
1379                                                     f71805f_attr_pwm[i],
 
1380                                                     S_IRUGO | S_IWUSR))) {
 
1381                                 dev_err(&pdev->dev, "chmod +w pwm%d failed\n",
 
1383                                 goto exit_remove_files;
 
1388         data->hwmon_dev = hwmon_device_register(&pdev->dev);
 
1389         if (IS_ERR(data->hwmon_dev)) {
 
1390                 err = PTR_ERR(data->hwmon_dev);
 
1391                 dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
 
1392                 goto exit_remove_files;
 
1398         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
 
1399         for (i = 0; i < 4; i++)
 
1400                 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
 
1401         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
 
1402 exit_release_region:
 
1403         release_region(res->start + ADDR_REG_OFFSET, 2);
 
1405         platform_set_drvdata(pdev, NULL);
 
1411 static int __devexit f71805f_remove(struct platform_device *pdev)
 
1413         struct f71805f_data *data = platform_get_drvdata(pdev);
 
1414         struct resource *res;
 
1417         hwmon_device_unregister(data->hwmon_dev);
 
1418         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group);
 
1419         for (i = 0; i < 4; i++)
 
1420                 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
 
1421         sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
 
1422         platform_set_drvdata(pdev, NULL);
 
1425         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 
1426         release_region(res->start + ADDR_REG_OFFSET, 2);
 
1431 static struct platform_driver f71805f_driver = {
 
1433                 .owner  = THIS_MODULE,
 
1436         .probe          = f71805f_probe,
 
1437         .remove         = __devexit_p(f71805f_remove),
 
1440 static int __init f71805f_device_add(unsigned short address,
 
1441                                      const struct f71805f_sio_data *sio_data)
 
1443         struct resource res = {
 
1445                 .end    = address + REGION_LENGTH - 1,
 
1446                 .flags  = IORESOURCE_IO,
 
1450         pdev = platform_device_alloc(DRVNAME, address);
 
1453                 printk(KERN_ERR DRVNAME ": Device allocation failed\n");
 
1457         res.name = pdev->name;
 
1458         err = platform_device_add_resources(pdev, &res, 1);
 
1460                 printk(KERN_ERR DRVNAME ": Device resource addition failed "
 
1462                 goto exit_device_put;
 
1465         err = platform_device_add_data(pdev, sio_data,
 
1466                                        sizeof(struct f71805f_sio_data));
 
1468                 printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
 
1469                 goto exit_device_put;
 
1472         err = platform_device_add(pdev);
 
1474                 printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
 
1476                 goto exit_device_put;
 
1482         platform_device_put(pdev);
 
1487 static int __init f71805f_find(int sioaddr, unsigned short *address,
 
1488                                struct f71805f_sio_data *sio_data)
 
1493         static const char *names[] = {
 
1495                 "F71872F/FG or F71806F/FG",
 
1498         superio_enter(sioaddr);
 
1500         devid = superio_inw(sioaddr, SIO_REG_MANID);
 
1501         if (devid != SIO_FINTEK_ID)
 
1504         devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID);
 
1506         case SIO_F71805F_ID:
 
1507                 sio_data->kind = f71805f;
 
1509         case SIO_F71872F_ID:
 
1510                 sio_data->kind = f71872f;
 
1511                 sio_data->fnsel1 = superio_inb(sioaddr, SIO_REG_FNSEL1);
 
1514                 printk(KERN_INFO DRVNAME ": Unsupported Fintek device, "
 
1519         superio_select(sioaddr, F71805F_LD_HWM);
 
1520         if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
 
1521                 printk(KERN_WARNING DRVNAME ": Device not activated, "
 
1526         *address = superio_inw(sioaddr, SIO_REG_ADDR);
 
1527         if (*address == 0) {
 
1528                 printk(KERN_WARNING DRVNAME ": Base address not set, "
 
1532         *address &= ~(REGION_LENGTH - 1);       /* Ignore 3 LSB */
 
1535         printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %u\n",
 
1536                names[sio_data->kind], *address,
 
1537                superio_inb(sioaddr, SIO_REG_DEVREV));
 
1540         superio_exit(sioaddr);
 
1544 static int __init f71805f_init(void)
 
1547         unsigned short address;
 
1548         struct f71805f_sio_data sio_data;
 
1550         if (f71805f_find(0x2e, &address, &sio_data)
 
1551          && f71805f_find(0x4e, &address, &sio_data))
 
1554         err = platform_driver_register(&f71805f_driver);
 
1558         /* Sets global pdev as a side effect */
 
1559         err = f71805f_device_add(address, &sio_data);
 
1566         platform_driver_unregister(&f71805f_driver);
 
1571 static void __exit f71805f_exit(void)
 
1573         platform_device_unregister(pdev);
 
1574         platform_driver_unregister(&f71805f_driver);
 
1577 MODULE_AUTHOR("Jean Delvare <khali@linux-fr>");
 
1578 MODULE_LICENSE("GPL");
 
1579 MODULE_DESCRIPTION("F71805F/F71872F hardware monitoring driver");
 
1581 module_init(f71805f_init);
 
1582 module_exit(f71805f_exit);