mirror of
https://github.com/lm-sensors/lm-sensors.git
synced 2026-10-27 12:30:43 +00:00
(MK) Implement min/max statistics for temperatures.
git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@1227 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
1 parent
0e972677f2
commit
a5f7d7ad10
1 file changed
+40
-15
+40
-15
@@ -129,22 +129,22 @@ SENSORS_INSMOD_1(fscscy);
|
||||
/* sensor 0 */
|
||||
#define FSCSCY_REG_TEMP0_ACT 0x64
|
||||
#define FSCSCY_REG_TEMP0_STATE 0x71
|
||||
#define FSCSCY_REG_TEMP0_MAX 0x76
|
||||
#define FSCSCY_REG_TEMP0_LIM 0x76
|
||||
|
||||
/* sensor 1 */
|
||||
#define FSCSCY_REG_TEMP1_ACT 0xD0
|
||||
#define FSCSCY_REG_TEMP1_STATE 0xD1
|
||||
#define FSCSCY_REG_TEMP1_MAX 0xD6
|
||||
#define FSCSCY_REG_TEMP1_LIM 0xD6
|
||||
|
||||
/* sensor 2 */
|
||||
#define FSCSCY_REG_TEMP2_ACT 0x32
|
||||
#define FSCSCY_REG_TEMP2_STATE 0x81
|
||||
#define FSCSCY_REG_TEMP2_MAX 0x86
|
||||
#define FSCSCY_REG_TEMP2_LIM 0x86
|
||||
|
||||
/* sensor3 */
|
||||
#define FSCSCY_REG_TEMP3_ACT 0x35
|
||||
#define FSCSCY_REG_TEMP3_STATE 0x91
|
||||
#define FSCSCY_REG_TEMP3_MAX 0x96
|
||||
#define FSCSCY_REG_TEMP3_LIM 0x96
|
||||
|
||||
/* PCI Load */
|
||||
#define FSCSCY_REG_PCILOAD 0x1a
|
||||
@@ -185,8 +185,10 @@ struct fscscy_data {
|
||||
u8 watchdog[3]; /* watchdog */
|
||||
u8 volt[3]; /* 12, 5, battery current */
|
||||
u8 temp_act[4]; /* temperature */
|
||||
u8 temp_status[4]; /* status of sensor */
|
||||
u8 temp_max[4]; /* maximum of sensor */
|
||||
u8 temp_status[4]; /* status of temp. sensor */
|
||||
u8 temp_lim[4]; /* limit temperature of temp. sensor */
|
||||
u8 temp_min[4]; /* minimum of temp. sensor, this is just calculated by the module */
|
||||
u8 temp_max[4]; /* maximum of temp. sensor, this is just calculsted by the module */
|
||||
u8 fan_act[6]; /* fans revolutions per second */
|
||||
u8 fan_status[6]; /* fan status */
|
||||
u8 fan_min[6]; /* fan min value for rps */
|
||||
@@ -460,6 +462,12 @@ void fscscy_init_client(struct i2c_client *client)
|
||||
data->revision = fscscy_read_value(client,FSCSCY_REG_REVISION);
|
||||
/* setup missing fan2_min value */
|
||||
/* data->fan_min[2] = 0xff; */
|
||||
|
||||
/* Initialize min/max values from chip */
|
||||
data->temp_min[0] = data->temp_max[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_ACT);
|
||||
data->temp_min[1] = data->temp_max[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_ACT);
|
||||
data->temp_min[2] = data->temp_max[2] = fscscy_read_value(client, FSCSCY_REG_TEMP2_ACT);
|
||||
data->temp_min[3] = data->temp_max[3] = fscscy_read_value(client, FSCSCY_REG_TEMP3_ACT);
|
||||
}
|
||||
|
||||
void fscscy_update_client(struct i2c_client *client)
|
||||
@@ -475,17 +483,26 @@ void fscscy_update_client(struct i2c_client *client)
|
||||
printk("Starting fscscy update\n");
|
||||
#endif
|
||||
data->temp_act[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_ACT);
|
||||
if (data->temp_min[0] > data->temp_act[0]) data->temp_min[0] = data->temp_act[0];
|
||||
if (data->temp_max[0] < data->temp_act[0]) data->temp_max[0] = data->temp_act[0];
|
||||
data->temp_act[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_ACT);
|
||||
if (data->temp_min[1] > data->temp_act[1]) data->temp_min[1] = data->temp_act[1];
|
||||
if (data->temp_max[1] < data->temp_act[1]) data->temp_max[1] = data->temp_act[1];
|
||||
data->temp_act[2] = fscscy_read_value(client, FSCSCY_REG_TEMP2_ACT);
|
||||
if (data->temp_min[2] > data->temp_act[2]) data->temp_min[2] = data->temp_act[2];
|
||||
if (data->temp_max[2] < data->temp_act[2]) data->temp_max[2] = data->temp_act[2];
|
||||
data->temp_act[3] = fscscy_read_value(client, FSCSCY_REG_TEMP3_ACT);
|
||||
if (data->temp_min[3] > data->temp_act[3]) data->temp_min[3] = data->temp_act[3];
|
||||
if (data->temp_max[3] < data->temp_act[3]) data->temp_max[3] = data->temp_act[3];
|
||||
|
||||
data->temp_status[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_STATE);
|
||||
data->temp_status[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_STATE);
|
||||
data->temp_status[2] = fscscy_read_value(client, FSCSCY_REG_TEMP2_STATE);
|
||||
data->temp_status[3] = fscscy_read_value(client, FSCSCY_REG_TEMP3_STATE);
|
||||
data->temp_max[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_MAX);
|
||||
data->temp_max[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_MAX);
|
||||
data->temp_max[2] = fscscy_read_value(client, FSCSCY_REG_TEMP2_MAX);
|
||||
data->temp_max[3] = fscscy_read_value(client, FSCSCY_REG_TEMP3_MAX);
|
||||
data->temp_lim[0] = fscscy_read_value(client, FSCSCY_REG_TEMP0_LIM);
|
||||
data->temp_lim[1] = fscscy_read_value(client, FSCSCY_REG_TEMP1_LIM);
|
||||
data->temp_lim[2] = fscscy_read_value(client, FSCSCY_REG_TEMP2_LIM);
|
||||
data->temp_lim[3] = fscscy_read_value(client, FSCSCY_REG_TEMP3_LIM);
|
||||
|
||||
data->volt[0] = fscscy_read_value(client, FSCSCY_REG_VOLT_12);
|
||||
data->volt[1] = fscscy_read_value(client, FSCSCY_REG_VOLT_5);
|
||||
@@ -602,22 +619,30 @@ void fscscy_temp(struct i2c_client *client, int operation, int ctl_name,
|
||||
case FSCSCY_SYSCTL_TEMP0:
|
||||
results[0] = data->temp_status[0] & 0x03;
|
||||
results[1] = TEMP_FROM_REG(data->temp_act[0]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_max[0]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_lim[0]);
|
||||
results[3] = TEMP_FROM_REG(data->temp_min[0]);
|
||||
results[4] = TEMP_FROM_REG(data->temp_max[0]);
|
||||
break;
|
||||
case FSCSCY_SYSCTL_TEMP1:
|
||||
results[0] = data->temp_status[1] & 0x03;
|
||||
results[1] = TEMP_FROM_REG(data->temp_act[1]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_max[1]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_lim[1]);
|
||||
results[3] = TEMP_FROM_REG(data->temp_min[1]);
|
||||
results[4] = TEMP_FROM_REG(data->temp_max[1]);
|
||||
break;
|
||||
case FSCSCY_SYSCTL_TEMP2:
|
||||
results[0] = data->temp_status[2] & 0x03;
|
||||
results[1] = TEMP_FROM_REG(data->temp_act[2]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_max[2]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_lim[2]);
|
||||
results[3] = TEMP_FROM_REG(data->temp_min[2]);
|
||||
results[4] = TEMP_FROM_REG(data->temp_max[2]);
|
||||
break;
|
||||
case FSCSCY_SYSCTL_TEMP3:
|
||||
results[0] = data->temp_status[3] & 0x03;
|
||||
results[1] = TEMP_FROM_REG(data->temp_act[3]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_max[3]);
|
||||
results[2] = TEMP_FROM_REG(data->temp_lim[3]);
|
||||
results[3] = TEMP_FROM_REG(data->temp_min[3]);
|
||||
results[4] = TEMP_FROM_REG(data->temp_max[3]);
|
||||
break;
|
||||
default:
|
||||
printk("fscscy: ctl_name %d not supported\n",
|
||||
@@ -625,7 +650,7 @@ void fscscy_temp(struct i2c_client *client, int operation, int ctl_name,
|
||||
*nrels_mag = 0;
|
||||
return;
|
||||
}
|
||||
*nrels_mag = 3;
|
||||
*nrels_mag = 5;
|
||||
} else if (operation == SENSORS_PROC_REAL_WRITE) {
|
||||
if(*nrels_mag >= 1) {
|
||||
switch(ctl_name) {
|
||||
|
||||
Reference in new issue
Block a user