2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-08-31 14:25:39 +00:00

Add 2.4 kernel and user-space support for the Winbond W83687THF

chip. Needs testing.


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@3226 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare
2006-01-10 11:17:17 +00:00
parent 9f9be64fab
commit b36654cb3b
11 changed files with 86 additions and 26 deletions

2
README
View File

@@ -97,7 +97,7 @@ At least the following hardware sensor chips are supported:
TI THMC10 and THMC50
VIA Technologies VT1211, VT8231 and VT82C686A/B embedded sensors
Winbond W83781D, W83782D, W83783S, W83791D, W83792D,
W83627HF, W83627THF, W83637HF, and W83697HF
W83627HF, W83627THF, W83637HF, W83687THF and W83697HF
We also support some miscellaneous chips:

View File

@@ -235,8 +235,9 @@ vt8231
w83627hf
w83627hf 3 9 3 2 pwm no yes (LPC)
w83627thf 3 7 3 3 pwm no yes (LPC)
w83627thf 3 7 3 3 dac no yes (LPC)
w83637hf 3 7 2 3 pwm no yes (LPC)
w83687thf 3 7 3 3 pw/da no yes (LPC)
w83697hf 2 8 2 2 pwm no yes (LPC)
w83781d

View File

@@ -20,6 +20,10 @@ Supported chips:
Prefix: 'w83637hf'
Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: http://www.winbond.com/PDF/sheet/w83637hf.pdf
* Winbond W83687THF
Prefix: 'w83687thf'
Addresses scanned: ISA address retrieved from Super I/O registers
Datasheet: Provided by Winbond on request
Authors: Frodo Looijaard <frodol@dds.nl>, Philip Edelbrock <phil@netroedge.com>,
and Mark Studebaker <mdsxyz123@yahoo.com>
@@ -46,6 +50,9 @@ Module Parameters
* force_w83637hf: short array (min = 1, max = 48)
List of adapter,address pairs which are unquestionably assumed to contain
a `w83637hf' chip
* force_w83687thf: short array (min = 1, max = 48)
List of adapter,address pairs which are unquestionably assumed to contain
a `w83687thf' chip
* ignore: short array (min = 1, max = 48)
List of adapter,address pairs not to scan
* ignore_range: short array (min = 1, max = 48)
@@ -63,8 +70,8 @@ Description
-----------
This driver implements support for ISA accesses *only* for
the Winbond W83627HF, W83627THF, W83697HF and W83637HF Super I/O chips.
We will refer to them collectively as Winbond chips.
the Winbond W83627HF, W83627THF, W83697HF, W83637HF and W83687THF
Super I/O chips. We will refer to them collectively as Winbond chips.
This driver supports ISA accesses, which should be more reliable
than i2c accesses. Also, for Tyan boards which contain both a

View File

@@ -27,6 +27,7 @@
w83627hf 9 3 2 3 0x20 0x5ca3 no yes(LPC)
w83627thf 7 3 3 3 0x90 0x5ca3 no yes(LPC)
w83637hf 7 3 3 3 0x80 0x5ca3 no yes(LPC)
w83687thf 7 3 3 3 0x90 0x5ca3 no yes(LPC)
w83697hf 8 2 2 2 0x60 0x5ca3 no yes(LPC)
For other winbond chips, and for i2c support in the above chips,
@@ -63,7 +64,7 @@ static unsigned int normal_isa[] = { 0, SENSORS_ISA_END };
static unsigned int normal_isa_range[] = { SENSORS_ISA_END };
/* Insmod parameters */
SENSORS_INSMOD_4(w83627hf, w83627thf, w83697hf, w83637hf);
SENSORS_INSMOD_5(w83627hf, w83627thf, w83697hf, w83637hf, w83687thf);
static int init = 1;
MODULE_PARM(init, "i");
@@ -97,6 +98,10 @@ static int VAL; /* The value to read/write */
#define W83627THF_GPIO5_IOSR 0xf3 /* w83627thf only */
#define W83627THF_GPIO5_DR 0xf4 /* w83627thf only */
#define W83687THF_VID_EN 0x29 /* w83687thf only */
#define W83687THF_VID_CFG 0xF0 /* w83687thf only */
#define W83687THF_VID_DATA 0xF1 /* w83687thf only */
static inline void
superio_outb(int reg, int val)
{
@@ -135,6 +140,7 @@ superio_exit(void)
#define W627THF_DEVID 0x82
#define W697_DEVID 0x60
#define W637_DEVID 0x70
#define W687THF_DEVID 0x85
#define WINB_ACT_REG 0x30
#define WINB_BASE_REG 0x60
/* Constants specified below */
@@ -194,11 +200,11 @@ superio_exit(void)
#define W83627HF_REG_PWM1 0x5A
#define W83627HF_REG_PWM2 0x5B
#define W83627THF_REG_PWM1 0x01 /* 697HF and 637HF too */
#define W83627THF_REG_PWM2 0x03 /* 697HF and 637HF too */
#define W83627THF_REG_PWM3 0x11 /* 637HF too */
#define W83627THF_REG_PWM1 0x01 /* 697HF/637HF/687THF too */
#define W83627THF_REG_PWM2 0x03 /* 697HF/637HF/687THF too */
#define W83627THF_REG_PWM3 0x11 /* 637HF/687THF too */
#define W83627THF_REG_VRM_OVT_CFG 0x18 /* 637HF too */
#define W83627THF_REG_VRM_OVT_CFG 0x18 /* 637HF/687THF too */
static const u8 regpwm_627hf[] = { W83627HF_REG_PWM1, W83627HF_REG_PWM2 };
static const u8 regpwm[] = { W83627THF_REG_PWM1, W83627THF_REG_PWM2,
@@ -314,7 +320,7 @@ struct w83627hf_data {
Default = 3435.
Other Betas unimplemented */
u8 vrm;
u8 vrm_ovt; /* Register value, 627thf & 637hf only */
u8 vrm_ovt; /* Register value, 627THF/637HF/687THF only */
};
@@ -363,7 +369,7 @@ static struct i2c_driver w83627hf_driver = {
/* The /proc/sys entries */
/* WARNING these are copied from w83781d.c and have not been renamed.
Note that the 627hf and 697hf are supported by both drivers.
Note that the 627hf is supported by both drivers.
Do not make incompatible changes here or we will have errors
in the generated file ../include/sensors.h !!!
*/
@@ -522,7 +528,7 @@ static ctl_table w83697hf_dir_table_template[] = {
};
/* no in5 and in6 */
/* We use this one for W83637HF too */
/* We use this one for W83637HF and W83687THF too */
static ctl_table w83627thf_dir_table_template[] = {
{W83781D_SYSCTL_IN0, "in0", NULL, 0, 0644, NULL, &i2c_proc_real,
&i2c_sysctl_real, NULL, &w83627hf_in},
@@ -594,7 +600,8 @@ static int __init w83627hf_find(int sioaddr, int *address)
superio_enter();
val= superio_inb(DEVID);
if(val != W627_DEVID && val !=W627THF_DEVID && val != W697_DEVID && val != W637_DEVID) {
if (val != W627_DEVID && val != W627THF_DEVID && val != W697_DEVID
&& val != W637_DEVID && val != W687THF_DEVID) {
superio_exit();
return -ENODEV;
}
@@ -653,6 +660,8 @@ int w83627hf_detect(struct i2c_adapter *adapter, int address,
kind = w83627thf;
else if(val == W637_DEVID)
kind = w83637hf;
else if (val == W687THF_DEVID)
kind = w83687thf;
superio_select(W83627HF_LD_HWM);
if((val = 0x01 & superio_inb(WINB_ACT_REG)) == 0)
@@ -689,6 +698,9 @@ int w83627hf_detect(struct i2c_adapter *adapter, int address,
} else if (kind == w83637hf) {
type_name = "w83637hf";
client_name = "W83637HF chip";
} else if (kind == w83687thf) {
type_name = "w83687thf";
client_name = "W83687THF chip";
} else {
goto ERROR1;
}
@@ -714,7 +726,8 @@ int w83627hf_detect(struct i2c_adapter *adapter, int address,
w83697hf_dir_table_template :
(kind == w83627hf) ?
w83627hf_dir_table_template :
/* w83627thf table also used for 637 */
/* w83627thf table also used for 637HF
and 687THF */
w83627thf_dir_table_template,
THIS_MODULE)) < 0) {
err = i;
@@ -834,6 +847,38 @@ exit:
return res;
}
static int w83687thf_read_vid(struct i2c_client *client)
{
int res = 0xff;
superio_enter();
superio_select(W83627HF_LD_HWM);
/* Make sure these GPIO pins are enabled */
if (!(superio_inb(W83687THF_VID_EN) & (1 << 2))) {
#ifdef DEBUG
printk(KERN_DEBUG "w83627hf: VID disabled, no VID "
"function\n");
#endif
goto exit;
}
/* Make sure the pins are configured for input */
if (!(superio_inb(W83687THF_VID_CFG) & (1 << 4))) {
#ifdef DEBUG
printk(KERN_DEBUG "w83627hf: VID configured as output, "
"no VID function\n");
#endif
goto exit;
}
res = superio_inb(W83687THF_VID_DATA) & 0x3f;
exit:
superio_exit();
return res;
}
static int w83627hf_write_value(struct i2c_client *client, u16 reg, u16 value)
{
int word_sized;
@@ -888,10 +933,13 @@ static void w83627hf_init_client(struct i2c_client *client)
data->vid = (lo & 0x0f) | ((hi & 0x01) << 4);
} else if (w83627thf == data->type) {
data->vid = w83627thf_read_gpio5(client);
} else if (w83687thf == data->type) {
data->vid = w83687thf_read_vid(client);
}
/* Read VRM & OVT Config only once */
if (w83627thf == data->type || w83637hf == data->type)
if (w83627thf == data->type || w83637hf == data->type
|| w83687thf == data->type)
data->vrm_ovt =
w83627hf_read_value(client, W83627THF_REG_VRM_OVT_CFG);
else
@@ -959,8 +1007,8 @@ static void w83627hf_update_client(struct i2c_client *client)
for (i = 0; i <= 8; i++) {
/* skip missing sensors */
if (((data->type == w83697hf) && (i == 1)) ||
((data->type == w83627thf || data->type == w83637hf) &&
(i == 5 || i == 6)))
((data->type == w83627thf || data->type == w83637hf
|| data->type == w83687thf) && (i == 5 || i == 6)))
continue;
data->in[i] =
w83627hf_read_value(client, W83781D_REG_IN(i));

View File

@@ -5568,6 +5568,7 @@ sensors_chip_features sensors_chip_features_list[] =
{ SENSORS_W83627THF_PREFIX, w83782d_features },
/* Cheat on 83637HF for now - no separate #defines */
{ SENSORS_W83637HF_PREFIX, w83782d_features },
{ SENSORS_W83687THF_PREFIX, w83782d_features }, /* Same as W83627THF */
{ SENSORS_W83791D_PREFIX, w83791d_features },
{ SENSORS_W83792D_PREFIX, w83792d_features },
{ SENSORS_W83L785TS_PREFIX, w83l785ts_features },

View File

@@ -575,6 +575,7 @@
#define SENSORS_W83627HF_PREFIX "w83627hf"
#define SENSORS_W83627THF_PREFIX "w83627thf"
#define SENSORS_W83637HF_PREFIX "w83637hf"
#define SENSORS_W83687THF_PREFIX "w83687thf"
#define SENSORS_W83791D_PREFIX "w83791d"

View File

@@ -51,7 +51,7 @@ if [ "$CONFIG_I2C_PROC" = "m" -o "$CONFIG_I2C_PROC" = "y" ] ; then
dep_tristate ' VIA VT8231 Integrated Sensors' CONFIG_SENSORS_VT8231 $CONFIG_I2C $CONFIG_I2C_PROC $CONFIG_I2C_ISA
dep_tristate ' Winbond W83781D, W83782D, W83783S, W83627HF, Asus AS99127F' CONFIG_SENSORS_W83781D $CONFIG_I2C $CONFIG_I2C_PROC
dep_tristate ' Winbond W83792D' CONFIG_SENSORS_W83792D $CONFIG_I2C $CONFIG_I2C_PROC
dep_tristate ' Winbond W83627HF, W83627THF, W83697HF' CONFIG_SENSORS_W83627HF $CONFIG_I2C $CONFIG_I2C_PROC $CONFIG_I2C_ISA
dep_tristate ' Winbond W83627HF, W83627THF, W83637HF, W83687THF, W83697HF' CONFIG_SENSORS_W83627HF $CONFIG_I2C $CONFIG_I2C_PROC $CONFIG_I2C_ISA
dep_tristate ' Winbond W83L785TS-S' CONFIG_SENSORS_W83L785TS $CONFIG_I2C $CONFIG_I2C_PROC
bool 'Other I2C devices' CONFIG_SENSORS_OTHER
if [ "$CONFIG_SENSORS_OTHER" = "y" ] ; then

View File

@@ -716,12 +716,12 @@ CONFIG_SENSORS_W83792D
in the lm_sensors package, which you can download at
http://www.lm-sensors.nu/
Winbond W83627HF, W83627THF, W83637HF, W83697HF
Winbond W83627HF, W83627THF, W83637HF, W83687THF, W83697HF
CONFIG_SENSORS_W83627HF
If you say yes here you get support for the Winbond W836x7 series
of sensor chips: the W83627HF, W83627THF, W83637HF and W83697HF.
This can also be built as a module which can be inserted and removed
while the kernel is running.
of sensor chips: the W83627HF, W83627THF, W83637HF, W83687THF and
W83697HF. This can also be built as a module which can be inserted
and removed while the kernel is running.
You will also need the latest user-space utilities: you can find
them in the lm_sensors package, which you can download at

View File

@@ -1807,8 +1807,7 @@ use subs qw(mtp008_detect lm78_detect lm78_isa_detect lm78_alias_detect
},
{
name => "Winbond W83687THF Super IO Sensors",
driver => "to-be-written", # w83627hf
# A datasheet would be needed to confirm this
driver => "w83627hf",
devid => 0x85,
logdev => 0x0b,
},

View File

@@ -2193,10 +2193,12 @@ void print_w83781d(const sensors_chip_name *name)
is82d = (!strcmp(name->prefix,"w83782d")) ||
(!strcmp(name->prefix,"w83627hf")) ||
(!strcmp(name->prefix,"w83637hf")) ||
(!strcmp(name->prefix,"w83627thf"));
(!strcmp(name->prefix, "w83627thf")) ||
(!strcmp(name->prefix, "w83687thf"));
is83s = !strcmp(name->prefix,"w83783s");
is627thf = (!strcmp(name->prefix,"w83627thf")) ||
(!strcmp(name->prefix,"w83637hf"));
(!strcmp(name->prefix, "w83637hf")) ||
(!strcmp(name->prefix, "w83687thf"));
is697hf = !strcmp(name->prefix,"w83697hf");
if (!sensors_get_feature(*name,SENSORS_W83781D_ALARMS,&cur))

View File

@@ -368,6 +368,7 @@ struct match matches[] = {
{ "w83627thf", print_w83781d },
{ "w83637hf", print_w83781d },
{ "w83697hf", print_w83781d },
{ "w83687thf", print_w83781d },
{ "w83627ehf", print_w83627ehf },
{ "w83791d", print_w83781d },
{ "w83792d", print_w83792d },