Changeset 1695

Show
Ignore:
Timestamp:
01/13/03 03:15:20 (6 years ago)
Author:
mds
Message:

set alarm bits on read fails

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • lm-sensors/trunk/kernel/chips/adm1021.c

    r1692 r1695  
    7373#define ADM1021_REG_ONESHOT 0x0F 
    7474 
     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) 
    7579 
    7680/* Conversions. Rounding and limit checking is only done on the TO_REG 
     
    104108        u8 temp, temp_os, temp_hyst;    /* Register values */ 
    105109        u8 remote_temp, remote_temp_os, remote_temp_hyst, alarms, die_code; 
     110        u8 fail; 
    106111        /* Special values for ADM1023 only */ 
    107112        u8 remote_temp_prec, remote_temp_os_prec, remote_temp_hyst_prec,  
     
    119124static void adm1021_dec_use(struct i2c_client *client); 
    120125static int adm1021_read_value(struct i2c_client *client, u8 reg); 
    121 static int adm1021_rd_good(u8 *val, struct i2c_client *client, u8 reg); 
     126static int adm1021_rd_good(u8 *val, struct i2c_client *client, u8 reg, u8 mask); 
    122127static int adm1021_write_value(struct i2c_client *client, u8 reg, 
    123128                               u16 value); 
     
    398403} 
    399404 
    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 */ 
     406int adm1021_rd_good(u8 *val, struct i2c_client *client, u8 reg, u8 mask
    402407{ 
    403408        int i; 
     409        struct adm1021_data *data = client->data; 
     410 
    404411        i = i2c_smbus_read_byte_data(client, reg); 
    405         if(i < 0) 
     412        if (i < 0) { 
     413                data->fail |= mask; 
    406414                return i; 
     415        } 
    407416        *val = i; 
    408417        return 0; 
     
    430439#endif 
    431440 
    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); 
    434446                adm1021_rd_good(&(data->temp_hyst), client, 
    435                                 ADM1021_REG_THYST_R); 
     447                                ADM1021_REG_THYST_R, ADM1021_ALARM_TEMP); 
    436448                adm1021_rd_good(&(data->remote_temp), client, 
    437                                 ADM1021_REG_REMOTE_TEMP); 
     449                                ADM1021_REG_REMOTE_TEMP, ADM1021_ALARM_RTEMP); 
    438450                adm1021_rd_good(&(data->remote_temp_os), client, 
    439                                 ADM1021_REG_REMOTE_TOS_R); 
     451                                ADM1021_REG_REMOTE_TOS_R, ADM1021_ALARM_RTEMP); 
    440452                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; 
    445459                if (data->type == adm1021) 
    446460                        adm1021_rd_good(&(data->die_code), client, 
    447                                         ADM1021_REG_DIE_CODE); 
     461                                        ADM1021_REG_DIE_CODE, 0); 
    448462                if (data->type == adm1023) { 
    449463                        adm1021_rd_good(&(data->remote_temp_prec), client, 
    450                                         ADM1021_REG_REM_TEMP_PREC); 
     464                                        ADM1021_REG_REM_TEMP_PREC, 
     465                                        ADM1021_ALARM_TEMP); 
    451466                        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); 
    453469                        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); 
    455472                        adm1021_rd_good(&(data->remote_temp_offset), client, 
    456                                            ADM1021_REG_REM_OFFSET); 
     473                                        ADM1021_REG_REM_OFFSET, 
     474                                        ADM1021_ALARM_RTEMP); 
    457475                        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); 
    459478                } 
    460479                data->last_updated = jiffies; 
     
    588607        else if (operation == SENSORS_PROC_REAL_READ) { 
    589608                adm1021_update_client(client); 
    590                 results[0] = data->alarms
     609                results[0] = data->alarms | data->fail
    591610                *nrels_mag = 1; 
    592611        } else if (operation == SENSORS_PROC_REAL_WRITE) {