Changeset 1695
- Timestamp:
- 01/13/03 03:15:20 (6 years ago)
- Files:
-
- lm-sensors/trunk/kernel/chips/adm1021.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
lm-sensors/trunk/kernel/chips/adm1021.c
r1692 r1695 73 73 #define ADM1021_REG_ONESHOT 0x0F 74 74 75 #define ADM1021_ALARM_TEMP (ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW) 76 #define ADM1021_ALARM_RTEMP (ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW\ 77 | ADM1021_ALARM_RTEMP_NA) 78 #define ADM1021_ALARM_ALL (ADM1021_ALARM_TEMP | ADM1021_ALARM_RTEMP) 75 79 76 80 /* Conversions. Rounding and limit checking is only done on the TO_REG … … 104 108 u8 temp, temp_os, temp_hyst; /* Register values */ 105 109 u8 remote_temp, remote_temp_os, remote_temp_hyst, alarms, die_code; 110 u8 fail; 106 111 /* Special values for ADM1023 only */ 107 112 u8 remote_temp_prec, remote_temp_os_prec, remote_temp_hyst_prec, … … 119 124 static void adm1021_dec_use(struct i2c_client *client); 120 125 static int adm1021_read_value(struct i2c_client *client, u8 reg); 121 static int adm1021_rd_good(u8 *val, struct i2c_client *client, u8 reg );126 static int adm1021_rd_good(u8 *val, struct i2c_client *client, u8 reg, u8 mask); 122 127 static int adm1021_write_value(struct i2c_client *client, u8 reg, 123 128 u16 value); … … 398 403 } 399 404 400 /* only update value if read succeeded */401 int adm1021_rd_good(u8 *val, struct i2c_client *client, u8 reg )405 /* only update value if read succeeded; set fail bit if failed */ 406 int adm1021_rd_good(u8 *val, struct i2c_client *client, u8 reg, u8 mask) 402 407 { 403 408 int i; 409 struct adm1021_data *data = client->data; 410 404 411 i = i2c_smbus_read_byte_data(client, reg); 405 if(i < 0) 412 if (i < 0) { 413 data->fail |= mask; 406 414 return i; 415 } 407 416 *val = i; 408 417 return 0; … … 430 439 #endif 431 440 432 adm1021_rd_good(&(data->temp), client, ADM1021_REG_TEMP); 433 adm1021_rd_good(&(data->temp_os), client, ADM1021_REG_TOS_R); 441 data->fail = 0; 442 adm1021_rd_good(&(data->temp), client, ADM1021_REG_TEMP, 443 ADM1021_ALARM_TEMP); 444 adm1021_rd_good(&(data->temp_os), client, ADM1021_REG_TOS_R, 445 ADM1021_ALARM_TEMP); 434 446 adm1021_rd_good(&(data->temp_hyst), client, 435 ADM1021_REG_THYST_R );447 ADM1021_REG_THYST_R, ADM1021_ALARM_TEMP); 436 448 adm1021_rd_good(&(data->remote_temp), client, 437 ADM1021_REG_REMOTE_TEMP );449 ADM1021_REG_REMOTE_TEMP, ADM1021_ALARM_RTEMP); 438 450 adm1021_rd_good(&(data->remote_temp_os), client, 439 ADM1021_REG_REMOTE_TOS_R );451 ADM1021_REG_REMOTE_TOS_R, ADM1021_ALARM_RTEMP); 440 452 adm1021_rd_good(&(data->remote_temp_hyst), client, 441 ADM1021_REG_REMOTE_THYST_R); 442 if(!adm1021_rd_good(&(data->alarms), client, 443 ADM1021_REG_STATUS)) 444 data->alarms &= 0xec; 453 ADM1021_REG_REMOTE_THYST_R, 454 ADM1021_ALARM_RTEMP); 455 data->alarms = ADM1021_ALARM_ALL; 456 if (!adm1021_rd_good(&(data->alarms), client, 457 ADM1021_REG_STATUS, 0)) 458 data->alarms &= ADM1021_ALARM_ALL; 445 459 if (data->type == adm1021) 446 460 adm1021_rd_good(&(data->die_code), client, 447 ADM1021_REG_DIE_CODE );461 ADM1021_REG_DIE_CODE, 0); 448 462 if (data->type == adm1023) { 449 463 adm1021_rd_good(&(data->remote_temp_prec), client, 450 ADM1021_REG_REM_TEMP_PREC); 464 ADM1021_REG_REM_TEMP_PREC, 465 ADM1021_ALARM_TEMP); 451 466 adm1021_rd_good(&(data->remote_temp_os_prec), client, 452 ADM1021_REG_REM_TOS_PREC); 467 ADM1021_REG_REM_TOS_PREC, 468 ADM1021_ALARM_RTEMP); 453 469 adm1021_rd_good(&(data->remote_temp_hyst_prec), client, 454 ADM1021_REG_REM_THYST_PREC); 470 ADM1021_REG_REM_THYST_PREC, 471 ADM1021_ALARM_RTEMP); 455 472 adm1021_rd_good(&(data->remote_temp_offset), client, 456 ADM1021_REG_REM_OFFSET); 473 ADM1021_REG_REM_OFFSET, 474 ADM1021_ALARM_RTEMP); 457 475 adm1021_rd_good(&(data->remote_temp_offset_prec), 458 client, ADM1021_REG_REM_OFFSET_PREC); 476 client, ADM1021_REG_REM_OFFSET_PREC, 477 ADM1021_ALARM_RTEMP); 459 478 } 460 479 data->last_updated = jiffies; … … 588 607 else if (operation == SENSORS_PROC_REAL_READ) { 589 608 adm1021_update_client(client); 590 results[0] = data->alarms ;609 results[0] = data->alarms | data->fail; 591 610 *nrels_mag = 1; 592 611 } else if (operation == SENSORS_PROC_REAL_WRITE) {
