add sensor type selection in /proc for it87

git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2053 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Mark D. Studebaker committed 2003-11-12 01:36:12 +00:00
1 parent 3a0da75647
commit b1741b5366
6 files changed
+97 -3

No files matched your search

+1
View File
@@ -30,6 +30,7 @@ ask CVS about it:
Module i2c-sis630: Sync with 2.6.0-X driver version
Module it87: Add pwm and "smart guardian" support
Module lm90: Add ADM1032 support
Module w83781d: Fix 791d and 627hf detection
Program pwmconfig: Handle multiple fans controlled by a single pwm
Program sensors: Add ADM1032 support
Program sensors-detect: Prefer Super I/O drivers;
+7
View File
@@ -62,6 +62,7 @@ Module Parameters
thermistor diode thermistor 0x2a ** default
thermistor thermistor diode 0x1c
thermistor thermistor thermistor 0x38
As of release 2.8.2 the sensor type can be set at runtime. See below.
* reset_it87: integer 1 if the registers of the chip should be reset at
module load time, 0 to not reset the registers. Default is 0.
* init: integer 1 if the registers should be initialized with the module's
@@ -123,6 +124,12 @@ miss once-only alarms.
The IT87xx only updates its values each 1.5 seconds; reading it more often
will do no harm, but will return 'old' values.
The sensor type can be set at runtime as of release 2.8.2.
To change sensor x to a thermistor, 'echo 2 > sensorx'
where x is 1, 2, or 3.
To change sensor x to a thermal diode, 'echo 3 > sensorx'.
Any other value is invalid.
The fan speed control features can be enabled by setting the bits 0-2 of
the fan_ctl register to 1. (Note: bits 6-4 of this register must be set to
1 to enable the fan monitoring).
+70 -2
View File
@@ -132,6 +132,10 @@ static int init = 1;
#define IT87_REG_CHIPID 0x58
/* sensor pin types */
#define INVALID 0
#define THERMISTOR 2
#define PIIDIODE 3
/* Conversions. Rounding and limit checking is only done on the TO_REG
variants. Note that you should be a bit careful with which arguments
@@ -267,6 +271,8 @@ struct it87_data {
u8 fan_ctl[2]; /* Register encoding */
u8 sg_tl[3][5]; /* Register value */
u8 sg_pwm[3][3]; /* Register value */
u8 sens[3]; /* 2 = Thermistor,
3 = PII/Celeron diode */
};
@@ -302,6 +308,8 @@ static void it87_sgpwm(struct i2c_client *client, int operation,
int ctl_name, int *nrels_mag, long *results);
static void it87_sgtl(struct i2c_client *client, int operation,
int ctl_name, int *nrels_mag, long *results);
static void it87_sens(struct i2c_client *client, int operation,
int ctl_name, int *nrels_mag, long *results);
static struct i2c_driver it87_driver = {
.owner = THIS_MODULE,
@@ -341,7 +349,9 @@ static int it87_id = 0;
#define IT87_SYSCTL_PWM3 1403
#define IT87_SYSCTL_FAN_CTL 1501
#define IT87_SYSCTL_FAN_ON_OFF 1502
#define IT87_SYSCTL_SENS1 1601 /* 1, 2, or Beta (3000-5000) */
#define IT87_SYSCTL_SENS2 1602
#define IT87_SYSCTL_SENS3 1603
#define IT87_ALARM_IN0 0x000100
#define IT87_ALARM_IN1 0x000200
@@ -424,6 +434,12 @@ static ctl_table it87_dir_table_template[] = {
&i2c_sysctl_real, NULL, &it87_sgtl},
{IT87_SYSCTL_PWM3, "sg_tl3", NULL, 0, 0444, NULL, &i2c_proc_real,
&i2c_sysctl_real, NULL, &it87_sgtl},
{IT87_SYSCTL_SENS1, "sensor1", NULL, 0, 0644, NULL, &i2c_proc_real,
&i2c_sysctl_real, NULL, &it87_sens},
{IT87_SYSCTL_SENS2, "sensor2", NULL, 0, 0644, NULL, &i2c_proc_real,
&i2c_sysctl_real, NULL, &it87_sens},
{IT87_SYSCTL_SENS3, "sensor3", NULL, 0, 0644, NULL, &i2c_proc_real,
&i2c_sysctl_real, NULL, &it87_sens},
{0}
};
@@ -735,7 +751,7 @@ static void it87_init_client(struct i2c_client *client)
static void it87_update_client(struct i2c_client *client)
{
struct it87_data *data = client->data;
int i;
int i, tmp, tmp2;
down(&data->update_lock);
@@ -809,6 +825,18 @@ static void it87_update_client(struct i2c_client *client)
(it87_read_value(client, IT87_REG_ALARM3) << 16);
data->fan_ctl[0] = it87_read_value(client, IT87_REG_FAN_CTRL);
data->fan_ctl[1] = it87_read_value(client, IT87_REG_FAN_ONOFF);
tmp = it87_read_value(client, IT87_REG_TEMP_ENABLE);
for(i = 0; i < 3; i++) {
tmp2 = (tmp >> i) & 0x09;
if(tmp2 == 0x01)
data->sens[i] = PIIDIODE;
else if(tmp2 == 0x09)
data->sens[i] = THERMISTOR;
else
data->sens[i] = INVALID;
}
data->last_updated = jiffies;
data->valid = 1;
}
@@ -1084,6 +1112,46 @@ void it87_fan_ctl(struct i2c_client *client, int operation, int ctl_name,
}
}
void it87_sens(struct i2c_client *client, int operation, int ctl_name,
int *nrels_mag, long *results)
{
struct it87_data *data = client->data;
int nr = 1 + ctl_name - IT87_SYSCTL_SENS1;
u8 tmp, val1, val2;
if (operation == SENSORS_PROC_REAL_INFO)
*nrels_mag = 0;
else if (operation == SENSORS_PROC_REAL_READ) {
results[0] = data->sens[nr - 1];
*nrels_mag = 1;
} else if (operation == SENSORS_PROC_REAL_WRITE) {
if (*nrels_mag >= 1) {
val1 = 0x01 << (nr - 1);
val2 = 0x08 << (nr - 1);
tmp = it87_read_value(client, IT87_REG_TEMP_ENABLE);
switch (results[0]) {
case PIIDIODE:
tmp &= ~ val2;
tmp |= val1;
break;
case THERMISTOR:
tmp &= ~ val1;
tmp |= val2;
break;
default:
printk
(KERN_ERR
"it87.o: Invalid sensor type %ld; must be 2 (thermistor) or 3 (diode)\n",
results[0]);
return;
}
it87_write_value(client,
IT87_REG_TEMP_ENABLE, tmp);
data->sens[nr - 1] = results[0];
}
}
}
static int __init sm_it87_init(void)
{
printk("it87.o version %s (%s)\n", LM_VERSION, LM_DATE);
+6
View File
@@ -3766,6 +3766,12 @@ static sensors_chip_feature it87_features[] =
0 },
{ SENSORS_IT87_ALARMS, "alarms", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING,
SENSORS_MODE_R, IT87_SYSCTL_ALARMS, VALUE(1), 0 },
{ SENSORS_IT87_SENS1, "sensor1", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING,
SENSORS_MODE_RW, IT87_SYSCTL_SENS1, VALUE(1), 0 },
{ SENSORS_IT87_SENS2, "sensor2", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING,
SENSORS_MODE_RW, IT87_SYSCTL_SENS2, VALUE(1), 0 },
{ SENSORS_IT87_SENS3, "sensor3", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING,
SENSORS_MODE_RW, IT87_SYSCTL_SENS3, VALUE(1), 0 },
{ 0 }
};
+3
View File
@@ -1399,6 +1399,9 @@
#define SENSORS_IT87_ALARMS_VIN 82 /* R */
#define SENSORS_IT87_ALARMS_TEMP 83 /* R */
#define SENSORS_IT87_ALARMS 84 /* R */
#define SENSORS_IT87_SENS1 91 /* RW */
#define SENSORS_IT87_SENS2 92 /* RW */
#define SENSORS_IT87_SENS3 93 /* RW */
/* fsc poseidon chip */
+10 -1
View File
@@ -3019,7 +3019,7 @@ void print_eeprom(const sensors_chip_name *name)
void print_it87(const sensors_chip_name *name)
{
char *label = NULL;
double cur, min, max, fdiv;
double cur, min, max, fdiv, sens;
int alarms, valid;
if (!sensors_get_feature(*name,SENSORS_IT87_ALARMS, &cur)) {
@@ -3176,10 +3176,13 @@ void print_it87(const sensors_chip_name *name)
if (!sensors_get_label_and_valid(*name,SENSORS_IT87_TEMP1,&label,&valid) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP1,&cur) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP1_LOW,&min) &&
!sensors_get_feature(*name,SENSORS_IT87_SENS1,&sens) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP1_HIGH,&max)) {
if (valid) {
print_label(label,10);
print_temp_info( cur, max, min, MINMAX, 0, 0);
printf(" sensor = %s ", (((int)sens)==3) ? "diode" :
(((int)sens)==2) ? "thermistor" : "invalid");
printf( " %s\n", alarms & IT87_ALARM_TEMP1 ? "ALARM" : "" );
}
} else
@@ -3188,10 +3191,13 @@ void print_it87(const sensors_chip_name *name)
if (!sensors_get_label_and_valid(*name,SENSORS_IT87_TEMP2,&label,&valid) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP2,&cur) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP2_LOW,&min) &&
!sensors_get_feature(*name,SENSORS_IT87_SENS2,&sens) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP2_HIGH,&max)) {
if (valid) {
print_label(label,10);
print_temp_info( cur, max, min, MINMAX, 0, 0);
printf(" sensor = %s ", (((int)sens)==3) ? "diode" :
(((int)sens)==2) ? "thermistor" : "invalid");
printf( " %s\n", alarms & IT87_ALARM_TEMP2 ? "ALARM" : "" );
}
} else
@@ -3200,10 +3206,13 @@ void print_it87(const sensors_chip_name *name)
if (!sensors_get_label_and_valid(*name,SENSORS_IT87_TEMP3,&label,&valid) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP3,&cur) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP3_LOW,&min) &&
!sensors_get_feature(*name,SENSORS_IT87_SENS3,&sens) &&
!sensors_get_feature(*name,SENSORS_IT87_TEMP3_HIGH,&max)) {
if (valid) {
print_label(label,10);
print_temp_info( cur, max, min, MINMAX, 0, 0);
printf(" sensor = %s ", (((int)sens)==3) ? "diode" :
(((int)sens)==2) ? "thermistor" : "invalid");
printf( " %s\n", alarms & IT87_ALARM_TEMP3 ? "ALARM" : "" );
}
} else