diff options
| author | Darrick J. Wong <djwong@us.ibm.com> | 2008-11-12 16:27:03 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-12 20:17:17 -0500 |
| commit | c0b4e3ab0c769913438aeb078535ff117eeba5fb (patch) | |
| tree | aef089b13f7850971025851dedd958f10bdf928a | |
| parent | 455fbdd376c3ed3a5be8c039348896fdd87e9930 (diff) | |
adt7462: new hwmon driver
New driver to play with. As Jean mentioned a couple of years ago, this
chip is a beast with odd combinations of 8 fans, 4 temperatures, and 13
voltage sensors. This driver has been tested on an IntelliStation Z30.
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Cc: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | Documentation/hwmon/adt7462 | 67 | ||||
| -rw-r--r-- | drivers/hwmon/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/hwmon/Makefile | 1 | ||||
| -rw-r--r-- | drivers/hwmon/adt7462.c | 2002 |
4 files changed, 2080 insertions, 0 deletions
diff --git a/Documentation/hwmon/adt7462 b/Documentation/hwmon/adt7462 new file mode 100644 index 000000000000..ec660b328275 --- /dev/null +++ b/Documentation/hwmon/adt7462 | |||
| @@ -0,0 +1,67 @@ | |||
| 1 | Kernel driver adt7462 | ||
| 2 | ====================== | ||
| 3 | |||
| 4 | Supported chips: | ||
| 5 | * Analog Devices ADT7462 | ||
| 6 | Prefix: 'adt7462' | ||
| 7 | Addresses scanned: I2C 0x58, 0x5C | ||
| 8 | Datasheet: Publicly available at the Analog Devices website | ||
| 9 | |||
| 10 | Author: Darrick J. Wong | ||
| 11 | |||
| 12 | Description | ||
| 13 | ----------- | ||
| 14 | |||
| 15 | This driver implements support for the Analog Devices ADT7462 chip family. | ||
| 16 | |||
| 17 | This chip is a bit of a beast. It has 8 counters for measuring fan speed. It | ||
| 18 | can also measure 13 voltages or 4 temperatures, or various combinations of the | ||
| 19 | two. See the chip documentation for more details about the exact set of | ||
| 20 | configurations. This driver does not allow one to configure the chip; that is | ||
| 21 | left to the system designer. | ||
| 22 | |||
| 23 | A sophisticated control system for the PWM outputs is designed into the ADT7462 | ||
| 24 | that allows fan speed to be adjusted automatically based on any of the three | ||
| 25 | temperature sensors. Each PWM output is individually adjustable and | ||
| 26 | programmable. Once configured, the ADT7462 will adjust the PWM outputs in | ||
| 27 | response to the measured temperatures without further host intervention. This | ||
| 28 | feature can also be disabled for manual control of the PWM's. | ||
| 29 | |||
| 30 | Each of the measured inputs (voltage, temperature, fan speed) has | ||
| 31 | corresponding high/low limit values. The ADT7462 will signal an ALARM if | ||
| 32 | any measured value exceeds either limit. | ||
| 33 | |||
| 34 | The ADT7462 samples all inputs continuously. The driver will not read | ||
| 35 | the registers more often than once every other second. Further, | ||
| 36 | configuration data is only read once per minute. | ||
| 37 | |||
| 38 | Special Features | ||
| 39 | ---------------- | ||
| 40 | |||
| 41 | The ADT7462 have a 10-bit ADC and can therefore measure temperatures | ||
| 42 | with 0.25 degC resolution. | ||
| 43 | |||
| 44 | The Analog Devices datasheet is very detailed and describes a procedure for | ||
| 45 | determining an optimal configuration for the automatic PWM control. | ||
| 46 | |||
| 47 | The driver will report sensor labels when it is able to determine that | ||
| 48 | information from the configuration registers. | ||
| 49 | |||
| 50 | Configuration Notes | ||
| 51 | ------------------- | ||
| 52 | |||
| 53 | Besides standard interfaces driver adds the following: | ||
| 54 | |||
| 55 | * PWM Control | ||
| 56 | |||
| 57 | * pwm#_auto_point1_pwm and temp#_auto_point1_temp and | ||
| 58 | * pwm#_auto_point2_pwm and temp#_auto_point2_temp - | ||
| 59 | |||
| 60 | point1: Set the pwm speed at a lower temperature bound. | ||
| 61 | point2: Set the pwm speed at a higher temperature bound. | ||
| 62 | |||
| 63 | The ADT7462 will scale the pwm between the lower and higher pwm speed when | ||
| 64 | the temperature is between the two temperature boundaries. PWM values range | ||
| 65 | from 0 (off) to 255 (full speed). Fan speed will be set to maximum when the | ||
| 66 | temperature sensor associated with the PWM control exceeds temp#_max. | ||
| 67 | |||
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 1c44f5c47aab..c709e821f04b 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
| @@ -159,6 +159,16 @@ config SENSORS_ADM9240 | |||
| 159 | This driver can also be built as a module. If so, the module | 159 | This driver can also be built as a module. If so, the module |
| 160 | will be called adm9240. | 160 | will be called adm9240. |
| 161 | 161 | ||
| 162 | config SENSORS_ADT7462 | ||
| 163 | tristate "Analog Devices ADT7462" | ||
| 164 | depends on I2C && EXPERIMENTAL | ||
| 165 | help | ||
| 166 | If you say yes here you get support for the Analog Devices | ||
| 167 | ADT7462 temperature monitoring chips. | ||
| 168 | |||
| 169 | This driver can also be built as a module. If so, the module | ||
| 170 | will be called adt7462. | ||
| 171 | |||
| 162 | config SENSORS_ADT7470 | 172 | config SENSORS_ADT7470 |
| 163 | tristate "Analog Devices ADT7470" | 173 | tristate "Analog Devices ADT7470" |
| 164 | depends on I2C && EXPERIMENTAL | 174 | depends on I2C && EXPERIMENTAL |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index e0d90a68bea0..58fc5be5355d 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
| @@ -25,6 +25,7 @@ obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o | |||
| 25 | obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o | 25 | obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o |
| 26 | obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o | 26 | obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o |
| 27 | obj-$(CONFIG_SENSORS_ADS7828) += ads7828.o | 27 | obj-$(CONFIG_SENSORS_ADS7828) += ads7828.o |
| 28 | obj-$(CONFIG_SENSORS_ADT7462) += adt7462.o | ||
| 28 | obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o | 29 | obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o |
| 29 | obj-$(CONFIG_SENSORS_ADT7473) += adt7473.o | 30 | obj-$(CONFIG_SENSORS_ADT7473) += adt7473.o |
| 30 | obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o | 31 | obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o |
diff --git a/drivers/hwmon/adt7462.c b/drivers/hwmon/adt7462.c new file mode 100644 index 000000000000..66107b4dc12a --- /dev/null +++ b/drivers/hwmon/adt7462.c | |||
| @@ -0,0 +1,2002 @@ | |||
| 1 | /* | ||
| 2 | * A hwmon driver for the Analog Devices ADT7462 | ||
| 3 | * Copyright (C) 2008 IBM | ||
| 4 | * | ||
| 5 | * Author: Darrick J. Wong <djwong@us.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | #include <linux/module.h> | ||
| 23 | #include <linux/jiffies.h> | ||
| 24 | #include <linux/i2c.h> | ||
| 25 | #include <linux/hwmon.h> | ||
| 26 | #include <linux/hwmon-sysfs.h> | ||
| 27 | #include <linux/err.h> | ||
| 28 | #include <linux/mutex.h> | ||
| 29 | #include <linux/delay.h> | ||
| 30 | #include <linux/log2.h> | ||
| 31 | |||
| 32 | /* Addresses to scan */ | ||
| 33 | static const unsigned short normal_i2c[] = { 0x58, 0x5C, I2C_CLIENT_END }; | ||
| 34 | |||
| 35 | /* Insmod parameters */ | ||
| 36 | I2C_CLIENT_INSMOD_1(adt7462); | ||
| 37 | |||
| 38 | /* ADT7462 registers */ | ||
| 39 | #define ADT7462_REG_DEVICE 0x3D | ||
| 40 | #define ADT7462_REG_VENDOR 0x3E | ||
| 41 | #define ADT7462_REG_REVISION 0x3F | ||
| 42 | |||
| 43 | #define ADT7462_REG_MIN_TEMP_BASE_ADDR 0x44 | ||
| 44 | #define ADT7462_REG_MIN_TEMP_MAX_ADDR 0x47 | ||
| 45 | #define ADT7462_REG_MAX_TEMP_BASE_ADDR 0x48 | ||
| 46 | #define ADT7462_REG_MAX_TEMP_MAX_ADDR 0x4B | ||
| 47 | #define ADT7462_REG_TEMP_BASE_ADDR 0x88 | ||
| 48 | #define ADT7462_REG_TEMP_MAX_ADDR 0x8F | ||
| 49 | |||
| 50 | #define ADT7462_REG_FAN_BASE_ADDR 0x98 | ||
| 51 | #define ADT7462_REG_FAN_MAX_ADDR 0x9F | ||
| 52 | #define ADT7462_REG_FAN2_BASE_ADDR 0xA2 | ||
| 53 | #define ADT7462_REG_FAN2_MAX_ADDR 0xA9 | ||
| 54 | #define ADT7462_REG_FAN_ENABLE 0x07 | ||
| 55 | #define ADT7462_REG_FAN_MIN_BASE_ADDR 0x78 | ||
| 56 | #define ADT7462_REG_FAN_MIN_MAX_ADDR 0x7F | ||
| 57 | |||
| 58 | #define ADT7462_REG_CFG2 0x02 | ||
| 59 | #define ADT7462_FSPD_MASK 0x20 | ||
| 60 | |||
| 61 | #define ADT7462_REG_PWM_BASE_ADDR 0xAA | ||
| 62 | #define ADT7462_REG_PWM_MAX_ADDR 0xAD | ||
| 63 | #define ADT7462_REG_PWM_MIN_BASE_ADDR 0x28 | ||
| 64 | #define ADT7462_REG_PWM_MIN_MAX_ADDR 0x2B | ||
| 65 | #define ADT7462_REG_PWM_MAX 0x2C | ||
| 66 | #define ADT7462_REG_PWM_TEMP_MIN_BASE_ADDR 0x5C | ||
| 67 | #define ADT7462_REG_PWM_TEMP_MIN_MAX_ADDR 0x5F | ||
| 68 | #define ADT7462_REG_PWM_TEMP_RANGE_BASE_ADDR 0x60 | ||
| 69 | #define ADT7462_REG_PWM_TEMP_RANGE_MAX_ADDR 0x63 | ||
| 70 | #define ADT7462_PWM_HYST_MASK 0x0F | ||
| 71 | #define ADT7462_PWM_RANGE_MASK 0xF0 | ||
| 72 | #define ADT7462_PWM_RANGE_SHIFT 4 | ||
| 73 | #define ADT7462_REG_PWM_CFG_BASE_ADDR 0x21 | ||
| 74 | #define ADT7462_REG_PWM_CFG_MAX_ADDR 0x24 | ||
| 75 | #define ADT7462_PWM_CHANNEL_MASK 0xE0 | ||
| 76 | #define ADT7462_PWM_CHANNEL_SHIFT 5 | ||
| 77 | |||
| 78 | #define ADT7462_REG_PIN_CFG_BASE_ADDR 0x10 | ||
| 79 | #define ADT7462_REG_PIN_CFG_MAX_ADDR 0x13 | ||
| 80 | #define ADT7462_PIN7_INPUT 0x01 /* cfg0 */ | ||
| 81 | #define ADT7462_DIODE3_INPUT 0x20 | ||
| 82 | #define ADT7462_DIODE1_INPUT 0x40 | ||
| 83 | #define ADT7462_VID_INPUT 0x80 | ||
| 84 | #define ADT7462_PIN22_INPUT 0x04 /* cfg1 */ | ||
| 85 | #define ADT7462_PIN21_INPUT 0x08 | ||
| 86 | #define ADT7462_PIN19_INPUT 0x10 | ||
| 87 | #define ADT7462_ | ||
