Changeset 4805

Show
Ignore:
Timestamp:
09/18/07 22:37:36 (7 years ago)
Author:
khali
Message:

Drop all the chip-specific support from sensord.

Location:
lm-sensors/branches/lm-sensors-3.0.0
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/branches/lm-sensors-3.0.0/CHANGES

    r4802 r4805  
    5454               Update URI 
    5555  Program sensord: Syncronize the version with lm-sensors 
     56                   Drop all the chip-specific support 
    5657  Program sensors: Drop all the chip-specific support 
    5758                   Fix alignment of alarm for one-limit temperatures 
  • lm-sensors/branches/lm-sensors-3.0.0/prog/sensord/chips.c

    r4804 r4805  
    176176} 
    177177 
    178 /** DS1621 */ 
    179  
    180 static const char * 
    181 fmtTemps_DS1621 
    182 (const double values[], int alarm, int beep) { 
    183   sprintf (buff, "%.2f C (min = %.1f C, max = %.1f C)", values[0], values[1], values[2]); 
    184   if (alarm) 
    185     sprintf (buff + strlen (buff), " [ALARM(%s)]", (alarm == DS1621_ALARM_TEMP_LOW) ? "LOW" : (alarm == DS1621_ALARM_TEMP_HIGH) ? "HIGH" : "LOW,HIGH"); 
    186   return buff; 
    187 } 
    188  
    189 static const char *ds1621_names[] = { 
    190   SENSORS_DS1621_PREFIX, NULL 
    191 }; 
    192  
    193 static const FeatureDescriptor ds1621_features[] = { 
    194   { fmtTemps_DS1621, rrdF2, DataType_temperature, DS1621_ALARM_TEMP_LOW | DS1621_ALARM_TEMP_HIGH, 0, 
    195     { SENSORS_DS1621_TEMP, SENSORS_DS1621_TEMP_HYST, SENSORS_DS1621_TEMP_OVER, -1 } }, /* hyst=min, over=max */ 
    196   { NULL } 
    197 }; 
    198  
    199 static const ChipDescriptor ds1621_chip = { 
    200   ds1621_names, ds1621_features, SENSORS_DS1621_ALARMS, 0 
    201 }; 
    202  
    203 /** LM75 **/ 
    204  
    205 static const char *lm75_names[] = { 
    206   SENSORS_LM75_PREFIX, NULL 
    207 }; 
    208  
    209 static const FeatureDescriptor lm75_features[] = { 
    210   { fmtTemps_1, rrdF1, DataType_temperature, 0, 0, 
    211     { SENSORS_LM75_TEMP, SENSORS_LM75_TEMP_OVER, SENSORS_LM75_TEMP_HYST, -1 } }, 
    212   { NULL } 
    213 }; 
    214  
    215 static const ChipDescriptor lm75_chip = { 
    216   lm75_names, lm75_features, 0, 0 
    217 }; 
    218  
    219 /** ADM1021 **/ 
    220  
    221 static const char * 
    222 fmtTemps_ADM1021_0 
    223 (const double values[], int alarm, int beep) { 
    224   sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]); 
    225   if (alarm) { 
    226     int low = alarm & ADM1021_ALARM_TEMP_LOW, high = alarm & ADM1021_ALARM_TEMP_HIGH; 
    227     sprintf (buff + strlen (buff), " [ALARM(%s%s%s)]", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : ""); 
    228   } 
    229   return buff; 
    230 } 
    231  
    232 static const char * 
    233 fmtTemps_ADM1021_1 
    234 (const double values[], int alarm, int beep) { 
    235   sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]); 
    236   if (alarm) { 
    237     int na = alarm & ADM1021_ALARM_RTEMP_NA, low = alarm & ADM1021_ALARM_RTEMP_LOW, 
    238       high = alarm & ADM1021_ALARM_RTEMP_HIGH; 
    239     sprintf (buff + strlen (buff), " [ALARM(%s%s%s%s%s)]", na ? "N/A" : "", (na && (low || high)) ? "," : "", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : ""); 
    240   } 
    241   return buff; 
    242 } 
    243  
    244 static const char *adm1021_names[] = { 
    245   SENSORS_ADM1021_PREFIX, SENSORS_ADM1023_PREFIX, NULL 
    246 }; /* N.B: Assume bs sensors 1023 is =~ 1021 */ 
    247  
    248 static const FeatureDescriptor adm1021_features[] = { 
    249   { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0, 
    250     { SENSORS_ADM1021_TEMP, SENSORS_ADM1021_TEMP_HYST, SENSORS_ADM1021_TEMP_OVER, -1 } }, /* hyst=min, over=max */ 
    251   { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0, 
    252     { SENSORS_ADM1021_REMOTE_TEMP, SENSORS_ADM1021_REMOTE_TEMP_HYST, SENSORS_ADM1021_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */ 
    253   { fmtValu_0, NULL, DataType_other, 0, 0, 
    254     { SENSORS_ADM1021_DIE_CODE, -1 } }, 
    255   { NULL } 
    256 }; 
    257  
    258 static const ChipDescriptor adm1021_chip = { 
    259   adm1021_names, adm1021_features, SENSORS_ADM1021_ALARMS, 0 
    260 }; 
    261  
    262 /** MAX1617 **/ 
    263  
    264 static const char *max1617_names[] = { 
    265   SENSORS_MAX1617_PREFIX, SENSORS_MAX1617A_PREFIX, SENSORS_THMC10_PREFIX, SENSORS_LM84_PREFIX, SENSORS_GL523_PREFIX, NULL 
    266 }; /* N.B: Assume vs sensors these have no die code */ 
    267  
    268 static const FeatureDescriptor max1617_features[] = { 
    269   { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0, 
    270     { SENSORS_MAX1617_TEMP, SENSORS_MAX1617_TEMP_HYST, SENSORS_MAX1617_TEMP_OVER, -1 } }, /* hyst=min, over=max */ 
    271   { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0, 
    272     { SENSORS_MAX1617_REMOTE_TEMP, SENSORS_MAX1617_REMOTE_TEMP_HYST, SENSORS_MAX1617_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */ 
    273   { NULL } 
    274 }; 
    275  
    276 static const ChipDescriptor max1617_chip = { 
    277   max1617_names, max1617_features, SENSORS_MAX1617_ALARMS, 0 
    278 }; 
    279  
    280 /** ADM9240 **/ 
    281  
    282 static const char *adm9240_names[] = { 
    283   SENSORS_ADM9240_PREFIX, SENSORS_DS1780_PREFIX, SENSORS_LM81_PREFIX, NULL 
    284 }; 
    285  
    286 static const FeatureDescriptor adm9240_features[] = { 
    287   { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN0, 0, 
    288     { SENSORS_ADM9240_IN0, SENSORS_ADM9240_IN0_MIN, SENSORS_ADM9240_IN0_MAX, -1 } }, 
    289   { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN1, 0, 
    290     { SENSORS_ADM9240_IN1, SENSORS_ADM9240_IN1_MIN, SENSORS_ADM9240_IN1_MAX, -1 } }, 
    291   { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN2, 0, 
    292     { SENSORS_ADM9240_IN2, SENSORS_ADM9240_IN2_MIN, SENSORS_ADM9240_IN2_MAX, -1 } }, 
    293   { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN3, 0, 
    294     { SENSORS_ADM9240_IN3, SENSORS_ADM9240_IN3_MIN, SENSORS_ADM9240_IN3_MAX, -1 } }, 
    295   { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN4, 0, 
    296     { SENSORS_ADM9240_IN4, SENSORS_ADM9240_IN4_MIN, SENSORS_ADM9240_IN4_MAX, -1 } }, 
    297   { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN5, 0, 
    298     { SENSORS_ADM9240_IN5, SENSORS_ADM9240_IN5_MIN, SENSORS_ADM9240_IN5_MAX, -1 } }, 
    299   { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN1, 0, 
    300     { SENSORS_ADM9240_FAN1, SENSORS_ADM9240_FAN1_MIN, SENSORS_ADM9240_FAN1_DIV, -1 } }, 
    301   { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN2, 0, 
    302     { SENSORS_ADM9240_FAN2, SENSORS_ADM9240_FAN2_MIN, SENSORS_ADM9240_FAN2_DIV, -1 } }, 
    303   { fmtTemps_1_0, rrdF1, DataType_temperature, ADM9240_ALARM_TEMP, 0, 
    304     { SENSORS_ADM9240_TEMP, SENSORS_ADM9240_TEMP_OVER, SENSORS_ADM9240_TEMP_HYST, -1 } }, 
    305   { fmtVolt_2, rrdF2, DataType_voltage, 0, 0, 
    306     { SENSORS_ADM9240_VID, -1 } }, 
    307   { fmtChassisIntrusionDetection, NULL, DataType_other, ADM9240_ALARM_CHAS, 0, 
    308     { SENSORS_ADM9240_ALARMS, -1 } }, 
    309   { NULL } 
    310 }; 
    311  
    312 static const ChipDescriptor adm9240_chip = { 
    313   adm9240_names, adm9240_features, SENSORS_ADM9240_ALARMS, 0 
    314 }; 
    315  
    316 /** SIS5595 **/ 
    317  
    318 static const char *sis5595_names[] = { 
    319   SENSORS_SIS5595_PREFIX, NULL 
    320 }; 
    321  
    322 static const FeatureDescriptor sis5595_features[] = { 
    323   { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN0, 0, 
    324     { SENSORS_SIS5595_IN0, SENSORS_SIS5595_IN0_MIN, SENSORS_SIS5595_IN0_MAX, -1 } }, 
    325   { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN1, 0, 
    326     { SENSORS_SIS5595_IN1, SENSORS_SIS5595_IN1_MIN, SENSORS_SIS5595_IN1_MAX, -1 } }, 
    327   { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN2, 0, 
    328     { SENSORS_SIS5595_IN2, SENSORS_SIS5595_IN2_MIN, SENSORS_SIS5595_IN2_MAX, -1 } }, 
    329   { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN3, 0, 
    330     { SENSORS_SIS5595_IN3, SENSORS_SIS5595_IN3_MIN, SENSORS_SIS5595_IN3_MAX, -1 } }, 
    331   { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN4, 0, 
    332     { SENSORS_SIS5595_IN4, SENSORS_SIS5595_IN4_MIN, SENSORS_SIS5595_IN4_MAX, -1 } }, 
    333   { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN1, 0, 
    334     { SENSORS_SIS5595_FAN1, SENSORS_SIS5595_FAN1_MIN, SENSORS_SIS5595_FAN1_DIV, -1 } }, 
    335   { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN2, 0, 
    336     { SENSORS_SIS5595_FAN2, SENSORS_SIS5595_FAN2_MIN, SENSORS_SIS5595_FAN2_DIV, -1 } }, 
    337   { fmtTemps_0, rrdF0, DataType_temperature, SIS5595_ALARM_TEMP, 0, 
    338     { SENSORS_SIS5595_TEMP, SENSORS_SIS5595_TEMP_OVER, SENSORS_SIS5595_TEMP_HYST, -1 } }, 
    339   { fmtBoardTemperatureInput, NULL, DataType_other, SIS5595_ALARM_BTI, 0, 
    340     { SENSORS_SIS5595_ALARMS, -1 } }, 
    341   { NULL } 
    342 }; 
    343  
    344 static const ChipDescriptor sis5595_chip = { 
    345   sis5595_names, sis5595_features, SENSORS_SIS5595_ALARMS, 0 
    346 }; 
    347  
    348 /** VIA686A **/ 
    349  
    350 static const char *via686a_names[] = { 
    351   SENSORS_VIA686A_PREFIX, NULL 
    352 }; 
    353  
    354 static const FeatureDescriptor via686a_features[] = { 
    355   { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN0, 0, 
    356     { SENSORS_VIA686A_IN0, SENSORS_VIA686A_IN0_MIN, SENSORS_VIA686A_IN0_MAX, -1 } }, 
    357   { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN1, 0, 
    358     { SENSORS_VIA686A_IN1, SENSORS_VIA686A_IN1_MIN, SENSORS_VIA686A_IN1_MAX, -1 } }, 
    359   { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN2, 0, 
    360     { SENSORS_VIA686A_IN2, SENSORS_VIA686A_IN2_MIN, SENSORS_VIA686A_IN2_MAX, -1 } }, 
    361   { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN3, 0, 
    362     { SENSORS_VIA686A_IN3, SENSORS_VIA686A_IN3_MIN, SENSORS_VIA686A_IN3_MAX, -1 } }, 
    363   { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN4, 0, 
    364     { SENSORS_VIA686A_IN4, SENSORS_VIA686A_IN4_MIN, SENSORS_VIA686A_IN4_MAX, -1 } }, 
    365   { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN1, 0, 
    366     { SENSORS_VIA686A_FAN1, SENSORS_VIA686A_FAN1_MIN, SENSORS_VIA686A_FAN1_DIV, -1 } }, 
    367   { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN2, 0, 
    368     { SENSORS_VIA686A_FAN2, SENSORS_VIA686A_FAN2_MIN, SENSORS_VIA686A_FAN2_DIV, -1 } }, 
    369   { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP, 0, 
    370     { SENSORS_VIA686A_TEMP, SENSORS_VIA686A_TEMP_OVER, SENSORS_VIA686A_TEMP_HYST, -1 } }, 
    371   { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP2, 0, 
    372     { SENSORS_VIA686A_TEMP2, SENSORS_VIA686A_TEMP2_OVER, SENSORS_VIA686A_TEMP2_HYST, -1 } }, 
    373   { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP3, 0, 
    374     { SENSORS_VIA686A_TEMP3, SENSORS_VIA686A_TEMP3_OVER, SENSORS_VIA686A_TEMP3_HYST, -1 } }, 
    375   { NULL } 
    376 }; 
    377  
    378 static const ChipDescriptor via686a_chip = { 
    379   via686a_names, via686a_features, SENSORS_VIA686A_ALARMS, 0 
    380 }; 
    381  
    382 /** LM78 **/ 
    383  
    384 static const char *lm78_names[] = { 
    385   SENSORS_LM78_PREFIX, SENSORS_LM78J_PREFIX, SENSORS_LM79_PREFIX, NULL 
    386 }; 
    387  
    388 static const FeatureDescriptor lm78_features[] = { 
    389   { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN0, 0, 
    390     { SENSORS_LM78_IN0, SENSORS_LM78_IN0_MIN, SENSORS_LM78_IN0_MAX, -1 } }, 
    391   { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN1, 0, 
    392     { SENSORS_LM78_IN1, SENSORS_LM78_IN1_MIN, SENSORS_LM78_IN1_MAX, -1 } }, 
    393   { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN2, 0, 
    394     { SENSORS_LM78_IN2, SENSORS_LM78_IN2_MIN, SENSORS_LM78_IN2_MAX, -1 } }, 
    395   { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN3, 0, 
    396     { SENSORS_LM78_IN3, SENSORS_LM78_IN3_MIN, SENSORS_LM78_IN3_MAX, -1 } }, 
    397   { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN4, 0, 
    398     { SENSORS_LM78_IN4, SENSORS_LM78_IN4_MIN, SENSORS_LM78_IN4_MAX, -1 } }, 
    399   { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN5, 0, 
    400     { SENSORS_LM78_IN5, SENSORS_LM78_IN5_MIN, SENSORS_LM78_IN5_MAX, -1 } }, 
    401   { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN6, 0, 
    402     { SENSORS_LM78_IN6, SENSORS_LM78_IN6_MIN, SENSORS_LM78_IN6_MAX, -1 } }, 
    403   { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN1, 0, 
    404     { SENSORS_LM78_FAN1, SENSORS_LM78_FAN1_MIN, SENSORS_LM78_FAN1_DIV, -1 } }, 
    405   { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN2, 0, 
    406     { SENSORS_LM78_FAN2, SENSORS_LM78_FAN2_MIN, SENSORS_LM78_FAN2_DIV, -1 } }, 
    407   { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN3, 0, 
    408     { SENSORS_LM78_FAN3, SENSORS_LM78_FAN3_MIN, SENSORS_LM78_FAN3_DIV, -1 } }, 
    409   { fmtTemps_1_0, rrdF1, DataType_rpm, LM78_ALARM_TEMP, 0, 
    410     { SENSORS_LM78_TEMP, SENSORS_LM78_TEMP_OVER, SENSORS_LM78_TEMP_HYST, -1 } }, 
    411   { fmtVolt_2, rrdF2, DataType_voltage, 0, 0, 
    412     { SENSORS_LM78_VID, -1 } }, 
    413   { fmtBoardTemperatureInput, NULL, DataType_other, LM78_ALARM_BTI, 0, 
    414     { SENSORS_LM78_ALARMS, -1 } }, 
    415   { fmtChassisIntrusionDetection, NULL, DataType_other, LM78_ALARM_CHAS, 0, 
    416     { SENSORS_LM78_ALARMS, -1 } }, 
    417   { NULL } 
    418 }; 
    419  
    420 static const ChipDescriptor lm78_chip = { 
    421   lm78_names, lm78_features, SENSORS_LM78_ALARMS, 0 
    422 }; 
    423  
    424 /** GL518 **/ 
    425  
    426 /* N.B: sensors supports a "gl518sm-r00" but it is not picked up in main.c... 
    427 static const char * 
    428 fmtVolts_GL518_R00 
    429 (const double values[], int alarm, int beep) { 
    430   if (values[0] == 0.0) 
    431     sprintf (buff, "n/a (min = %+.2f V, max = %+.2f V)", values[1], values[2]); 
    432   else 
    433     sprintf (buff, "%+.2f V (min = %+.2f V, max = %+.2f V)", values[0], values[1], values[2]); 
    434   return fmtExtra (alarm, beep); 
    435 } 
    436 */ 
    437  
    438 static const char *gl518_names[] = { 
    439   SENSORS_GL518_PREFIX, NULL 
    440 }; 
    441  
    442 static const FeatureDescriptor gl518_features[] = { 
    443   { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VDD, GL518_ALARM_VDD, 
    444     { SENSORS_GL518_VDD, SENSORS_GL518_VDD_MIN, SENSORS_GL518_VDD_MAX, -1 } }, 
    445   { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN1, GL518_ALARM_VIN1, 
    446     { SENSORS_GL518_VIN1, SENSORS_GL518_VIN1_MIN, SENSORS_GL518_VIN1_MAX, -1 } }, 
    447   { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN2, GL518_ALARM_VIN2, 
    448     { SENSORS_GL518_VIN2, SENSORS_GL518_VIN2_MIN, SENSORS_GL518_VIN2_MAX, -1 } }, 
    449   { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN3, GL518_ALARM_VIN3, 
    450     { SENSORS_GL518_VIN3, SENSORS_GL518_VIN3_MIN, SENSORS_GL518_VIN3_MAX, -1 } }, 
    451   { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN1, GL518_ALARM_FAN1, 
    452     { SENSORS_GL518_FAN1, SENSORS_GL518_FAN1_MIN, SENSORS_GL518_FAN1_DIV, -1 } }, 
    453   { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN2, GL518_ALARM_FAN2, 
    454     { SENSORS_GL518_FAN2, SENSORS_GL518_FAN2_MIN, SENSORS_GL518_FAN2_DIV, -1 } }, 
    455   { fmtTemps_1_0, rrdF1, DataType_temperature, GL518_ALARM_TEMP, GL518_ALARM_TEMP, 
    456     { SENSORS_GL518_TEMP, SENSORS_GL518_TEMP_OVER, SENSORS_GL518_TEMP_HYST, -1 } }, 
    457   { fmtSoundAlarm, NULL, DataType_other, 0, 0, 
    458     { SENSORS_GL518_BEEP_ENABLE, -1 } }, 
    459   { NULL } 
    460 }; 
    461  
    462 static const ChipDescriptor gl518_chip = { 
    463   gl518_names, gl518_features, SENSORS_GL518_ALARMS, SENSORS_GL518_BEEPS 
    464 }; 
    465  
    466 /** ADM1025 **/ 
    467  
    468 static const char * 
    469 fmtTemps_ADM1025 
    470 (const double values[], int alarm, int beep) { 
    471   sprintf (buff, "%.1f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]); 
    472   return fmtExtra (alarm, beep); 
    473 } 
    474  
    475 static const char *adm1025_names[] = { 
    476   SENSORS_ADM1025_PREFIX, NULL 
    477 }; 
    478  
    479 static const FeatureDescriptor adm1025_features[] = { 
    480   { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN0, 0, 
    481     { SENSORS_ADM1025_IN0, SENSORS_ADM1025_IN0_MIN, SENSORS_ADM1025_IN0_MAX, -1 } }, 
    482   { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN1, 0, 
    483     { SENSORS_ADM1025_IN1, SENSORS_ADM1025_IN1_MIN, SENSORS_ADM1025_IN1_MAX, -1 } }, 
    484   { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN2, 0, 
    485     { SENSORS_ADM1025_IN2, SENSORS_ADM1025_IN2_MIN, SENSORS_ADM1025_IN2_MAX, -1 } }, 
    486   { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN3, 0, 
    487     { SENSORS_ADM1025_IN3, SENSORS_ADM1025_IN3_MIN, SENSORS_ADM1025_IN3_MAX, -1 } }, 
    488   { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN4, 0, 
    489     { SENSORS_ADM1025_IN4, SENSORS_ADM1025_IN4_MIN, SENSORS_ADM1025_IN4_MAX, -1 } }, 
    490   { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN5, 0, 
    491     { SENSORS_ADM1025_IN5, SENSORS_ADM1025_IN5_MIN, SENSORS_ADM1025_IN5_MAX, -1 } }, 
    492   { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_TEMP, 0, 
    493     { SENSORS_ADM1025_TEMP1, SENSORS_ADM1025_TEMP1_LOW, SENSORS_ADM1025_TEMP1_HIGH, -1 } }, 
    494   { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_RTEMP, 0, 
    495     { SENSORS_ADM1025_TEMP2, SENSORS_ADM1025_TEMP2_LOW, SENSORS_ADM1025_TEMP2_HIGH, -1 } }, 
    496   { NULL } 
    497 }; 
    498  
    499 static const ChipDescriptor adm1025_chip = { 
    500   adm1025_names, adm1025_features, SENSORS_ADM1025_ALARMS, 0 
    501 }; 
    502  
    503 /** LM80 **/ 
    504  
    505 static const char * 
    506 fmtTemps_LM80 
    507 (const double values[], int alarm, int beep) { 
    508   sprintf (buff, "%.2f C (hot limit = %.0f C, hot hysteresis = %.0f C, os limit = %.0f C, os hysteresis = %.0f C)", values[0], values[1], values[2], values[3], values[4]); 
    509   return fmtExtra (alarm, beep); 
    510 } 
    511  
    512 static const char *lm80_names[] = { 
    513   SENSORS_LM80_PREFIX, NULL 
    514 }; 
    515  
    516 static const FeatureDescriptor lm80_features[] = { 
    517   { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN0, 0, 
    518     { SENSORS_LM80_IN0, SENSORS_LM80_IN0_MIN, SENSORS_LM80_IN0_MAX, -1 } }, 
    519   { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN1, 0, 
    520     { SENSORS_LM80_IN1, SENSORS_LM80_IN1_MIN, SENSORS_LM80_IN1_MAX, -1 } }, 
    521   { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN2, 0, 
    522     { SENSORS_LM80_IN2, SENSORS_LM80_IN2_MIN, SENSORS_LM80_IN2_MAX, -1 } }, 
    523   { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN3, 0, 
    524     { SENSORS_LM80_IN3, SENSORS_LM80_IN3_MIN, SENSORS_LM80_IN3_MAX, -1 } }, 
    525   { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN4, 0, 
    526     { SENSORS_LM80_IN4, SENSORS_LM80_IN4_MIN, SENSORS_LM80_IN4_MAX, -1 } }, 
    527   { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN5, 0, 
    528     { SENSORS_LM80_IN5, SENSORS_LM80_IN5_MIN, SENSORS_LM80_IN5_MAX, -1 } }, 
    529   { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN6, 0, 
    530     { SENSORS_LM80_IN6, SENSORS_LM80_IN6_MIN, SENSORS_LM80_IN6_MAX, -1 } }, 
    531   { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN1, 0, 
    532     { SENSORS_LM80_FAN1, SENSORS_LM80_FAN1_MIN, SENSORS_LM80_FAN1_DIV, -1 } }, 
    533   { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN2, 0, 
    534     { SENSORS_LM80_FAN2, SENSORS_LM80_FAN2_MIN, SENSORS_LM80_FAN2_DIV, -1 } }, 
    535   { fmtTemps_LM80, rrdF2, DataType_temperature, LM80_ALARM_TEMP_HOT, 0, 
    536     { SENSORS_LM80_TEMP, SENSORS_LM80_TEMP_HOT_MAX, SENSORS_LM80_TEMP_HOT_HYST, SENSORS_LM80_TEMP_OS_MAX, SENSORS_LM80_TEMP_OS_HYST, -1 } }, 
    537   { fmtBoardTemperatureInput, NULL, DataType_other, LM80_ALARM_BTI, 0, 
    538     { SENSORS_LM80_ALARMS, -1 } }, 
    539   { fmtChassisIntrusionDetection, NULL, DataType_other, LM80_ALARM_CHAS, 0, 
    540     { SENSORS_LM80_ALARMS, -1 } }, 
    541   { NULL } 
    542 }; 
    543  
    544 static const ChipDescriptor lm80_chip = { 
    545   lm80_names, lm80_features, SENSORS_LM80_ALARMS, 0 
    546 }; 
    547  
    548 /** IT87 (thanks to Mike Black) **/ 
    549  
    550 static const char *it87_names[] = { 
    551   SENSORS_IT87_PREFIX, SENSORS_IT8712_PREFIX, 
    552   SENSORS_IT8716_PREFIX, SENSORS_IT8718_PREFIX, NULL 
    553 }; 
    554  
    555 static const FeatureDescriptor it87_features[] = { 
    556   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN0, 0, 
    557     { SENSORS_IT87_IN0, SENSORS_IT87_IN0_MIN, SENSORS_IT87_IN0_MAX, -1 } }, 
    558   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN1, 0, 
    559     { SENSORS_IT87_IN1, SENSORS_IT87_IN1_MIN, SENSORS_IT87_IN1_MAX, -1 } }, 
    560   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN2, 0, 
    561     { SENSORS_IT87_IN2, SENSORS_IT87_IN2_MIN, SENSORS_IT87_IN2_MAX, -1 } }, 
    562   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN3, 0, 
    563     { SENSORS_IT87_IN3, SENSORS_IT87_IN3_MIN, SENSORS_IT87_IN3_MAX, -1 } }, 
    564   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN4, 0, 
    565     { SENSORS_IT87_IN4, SENSORS_IT87_IN4_MIN, SENSORS_IT87_IN4_MAX, -1 } }, 
    566   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN5, 0, 
    567     { SENSORS_IT87_IN5, SENSORS_IT87_IN5_MIN, SENSORS_IT87_IN5_MAX, -1 } }, 
    568   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN6, 0, 
    569     { SENSORS_IT87_IN6, SENSORS_IT87_IN6_MIN, SENSORS_IT87_IN6_MAX, -1 } }, 
    570   { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN7, 0, 
    571     { SENSORS_IT87_IN7, SENSORS_IT87_IN7_MIN, SENSORS_IT87_IN7_MAX, -1 } }, 
    572   { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN1, 0, 
    573     { SENSORS_IT87_FAN1, SENSORS_IT87_FAN1_MIN, -1 } }, 
    574   { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN2, 0, 
    575     { SENSORS_IT87_FAN2, SENSORS_IT87_FAN2_MIN, -1 } }, 
    576   { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN3, 0, 
    577     { SENSORS_IT87_FAN3, SENSORS_IT87_FAN3_MIN, -1 } }, 
    578   { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP1, 0, 
    579     { SENSORS_IT87_TEMP1, SENSORS_IT87_TEMP1_LOW, SENSORS_IT87_TEMP1_HIGH, -1 } }, 
    580   { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP2, 0, 
    581     { SENSORS_IT87_TEMP2, SENSORS_IT87_TEMP2_LOW, SENSORS_IT87_TEMP2_HIGH, -1 } }, 
    582   { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP3, 0, 
    583     { SENSORS_IT87_TEMP3, SENSORS_IT87_TEMP3_LOW, SENSORS_IT87_TEMP3_HIGH, -1 } }, 
    584   { NULL } 
    585 }; 
    586  
    587 static const ChipDescriptor it87_chip = { 
    588   it87_names, it87_features, SENSORS_IT87_ALARMS, 0 
    589 }; 
    590  
    591 /** W83781D **/ 
    592  
    593 static const char * 
    594 fmtTemps_W83781D 
    595 (const double values[], int alarm, int beep) { 
    596   if (values[2] == 127) { 
    597     sprintf (buff, "%.0f C (limit = %.0f C)", 
    598              values[0], values[1]); 
    599   } else { 
    600     sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C)", 
    601              values[0], values[1], values[2]); 
    602   } 
    603   return fmtExtra (alarm, beep); 
    604 } 
    605  
    606 static const char *w83781d_names[] = { 
    607   SENSORS_W83781D_PREFIX, NULL 
    608 }; 
    609  
    610 static const FeatureDescriptor w83781d_features[] = { 
    611   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0, 
    612     { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } }, 
    613   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1, 
    614     { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } }, 
    615   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2, 
    616     { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } }, 
    617   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3, 
    618     { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } }, 
    619   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4, 
    620     { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } }, 
    621   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5, 
    622     { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } }, 
    623   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6, 
    624     { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } }, 
    625   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1, 
    626     { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } }, 
    627   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2, 
    628     { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } }, 
    629   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3, 
    630     { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } }, 
    631   { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1, 
    632     { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } }, 
    633   { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23, 
    634     { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } }, 
    635   { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23, 
    636     { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } }, 
    637   { fmtVolt_3, rrdF3, DataType_voltage, 0, 0, 
    638     { SENSORS_W83781D_VID, -1 } }, 
    639   { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS, 
    640     { SENSORS_W83781D_ALARMS, -1 } }, 
    641   { fmtSoundAlarm, NULL, DataType_other, 0, 0, 
    642     { SENSORS_W83781D_BEEP_ENABLE, -1 } }, 
    643   { NULL } 
    644 }; 
    645  
    646 static const ChipDescriptor w83781d_chip = { 
    647   w83781d_names, w83781d_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS 
    648 }; 
    649  
    650 /** AS99127F **/ 
    651  
    652 static const char *as99127f_names[] = { 
    653   SENSORS_AS99127F_PREFIX, NULL 
    654 }; 
    655  
    656 static const FeatureDescriptor as99127f_features[] = { 
    657   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0, 
    658     { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } }, 
    659   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1, 
    660     { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } }, 
    661   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2, 
    662     { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } }, 
    663   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3, 
    664     { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } }, 
    665   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4, 
    666     { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } }, 
    667   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5, 
    668     { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } }, 
    669   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6, 
    670     { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } }, 
    671   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1, 
    672     { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } }, 
    673   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2, 
    674     { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } }, 
    675   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3, 
    676     { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } }, 
    677   { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1, 
    678     { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } }, 
    679   { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2, 
    680     { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } }, 
    681   { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3, 
    682     { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } }, 
    683   { fmtVolt_3, rrdF3, DataType_voltage, 0, 0, 
    684     { SENSORS_W83781D_VID, -1 } }, 
    685   { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS, 
    686     { SENSORS_W83781D_ALARMS, -1 } }, 
    687   { fmtSoundAlarm, NULL, DataType_other, 0, 0, 
    688     { SENSORS_W83781D_BEEP_ENABLE, -1 } }, 
    689   { NULL } 
    690 }; 
    691  
    692 static const ChipDescriptor as99127f_chip = { 
    693   as99127f_names, as99127f_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS 
    694 }; 
    695  
    696 /** W83782D **/ 
    697  
    698 static const char * 
    699 fmtTemps_W8378x_0 
    700 (const double values[], int alarm, int beep) { 
    701   int sensorID = (int) values[3]; 
    702   const char *sensor = (sensorID == 1) ? "PII/Celeron diode" : 
    703     (sensorID == 2) ? "3904 transistor" : "thermistor"; 
    704   if (values[2] == 127) { 
    705     sprintf (buff, "%.0f C (limit = %.0f C, sensors = %s)", 
    706              values[0], values[1], sensor); 
    707   } else { 
    708     sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C, sensors = %s)", 
    709              values[0], values[1], values[2], sensor); 
    710   } 
    711   return fmtExtra (alarm, beep); 
    712 } 
    713  
    714 static const char * 
    715 fmtTemps_W8378x_1 
    716 (const double values[], int alarm, int beep) { 
    717   int sensorID = (int) values[3]; 
    718   const char *sensor = (sensorID == 1) ? "PII/Celeron diode" : 
    719     (sensorID == 2) ? "3904 transistor" : "thermistor"; 
    720   sprintf (buff, "%.1f C (limit = %.0f C, hysteresis = %.0f C, sensor = %s)", 
    721            values[0], values[1], values[2], sensor); 
    722   return fmtExtra (alarm, beep); 
    723 } 
    724  
    725 static const char *w83782d_names[] = { 
    726   SENSORS_W83782D_PREFIX, SENSORS_W83627HF_PREFIX, SENSORS_W83627THF_PREFIX, SENSORS_W83637HF_PREFIX, NULL 
    727 }; 
    728  
    729 static const FeatureDescriptor w83782d_features[] = { 
    730   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0, 
    731     { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } }, 
    732   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1, 
    733     { SENSORS_W83782D_IN1, SENSORS_W83782D_IN1_MIN, SENSORS_W83782D_IN1_MAX, -1 } }, 
    734   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2, 
    735     { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } }, 
    736   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3, 
    737     { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } }, 
    738   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4, 
    739     { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } }, 
    740   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5, 
    741     { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } }, 
    742   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6, 
    743     { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } }, 
    744   { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN7, W83782D_ALARM_IN7, 
    745     { SENSORS_W83782D_IN7, SENSORS_W83782D_IN7_MIN, SENSORS_W83782D_IN7_MAX, -1 } }, 
    746   { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN8, W83782D_ALARM_IN8, 
    747     { SENSORS_W83782D_IN8, SENSORS_W83782D_IN8_MIN, SENSORS_W83782D_IN8_MAX, -1 } }, 
    748   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1, 
    749     { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } }, 
    750   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2, 
    751     { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } }, 
    752   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3, 
    753     { SENSORS_W83782D_FAN3, SENSORS_W83782D_FAN3_MIN, SENSORS_W83782D_FAN3_DIV, -1 } }, 
    754   { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1, 
    755     { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } }, 
    756   { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2, 
    757     { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } }, 
    758   { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3, 
    759     { SENSORS_W83782D_TEMP3, SENSORS_W83782D_TEMP3_OVER, SENSORS_W83782D_TEMP3_HYST, SENSORS_W83782D_SENS3, -1 } }, 
    760   { fmtVolt_3, rrdF3, DataType_voltage, 0, 0, 
    761     { SENSORS_W83782D_VID, -1 } }, 
    762   { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS, 
    763     { SENSORS_W83781D_ALARMS, -1 } }, 
    764   { fmtSoundAlarm, NULL, DataType_other, 0, 0, 
    765     { SENSORS_W83781D_BEEP_ENABLE, -1 } }, 
    766   { NULL } 
    767 }; 
    768  
    769 static const ChipDescriptor w83782d_chip = { 
    770   w83782d_names, w83782d_features, SENSORS_W83782D_ALARMS, SENSORS_W83782D_BEEPS 
    771 }; 
    772  
    773 /** W83783S **/ 
    774  
    775 static const char *w83783s_names[] = { 
    776   SENSORS_W83783S_PREFIX, NULL 
    777 }; 
    778  
    779 static const FeatureDescriptor w83783s_features[] = { 
    780   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0, 
    781     { SENSORS_W83783S_IN0, SENSORS_W83783S_IN0_MIN, SENSORS_W83783S_IN0_MAX, -1 } }, 
    782   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2, 
    783     { SENSORS_W83783S_IN2, SENSORS_W83783S_IN2_MIN, SENSORS_W83783S_IN2_MAX, -1 } }, 
    784   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3, 
    785     { SENSORS_W83783S_IN3, SENSORS_W83783S_IN3_MIN, SENSORS_W83783S_IN3_MAX, -1 } }, 
    786   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4, 
    787     { SENSORS_W83783S_IN4, SENSORS_W83783S_IN4_MIN, SENSORS_W83783S_IN4_MAX, -1 } }, 
    788   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5, 
    789     { SENSORS_W83783S_IN5, SENSORS_W83783S_IN5_MIN, SENSORS_W83783S_IN5_MAX, -1 } }, 
    790   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6, 
    791     { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } }, 
    792   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1, 
    793     { SENSORS_W83783S_FAN1, SENSORS_W83783S_FAN1_MIN, SENSORS_W83783S_FAN1_DIV, -1 } }, 
    794   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2, 
    795     { SENSORS_W83783S_FAN2, SENSORS_W83783S_FAN2_MIN, SENSORS_W83783S_FAN2_DIV, -1 } }, 
    796   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3, 
    797     { SENSORS_W83783S_FAN3, SENSORS_W83783S_FAN3_MIN, SENSORS_W83783S_FAN3_DIV, -1 } }, 
    798   { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1, 
    799     { SENSORS_W83783S_TEMP1, SENSORS_W83783S_TEMP1_OVER, SENSORS_W83783S_TEMP1_HYST, SENSORS_W83783S_SENS1, -1 } }, 
    800   { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2, 
    801     { SENSORS_W83783S_TEMP2, SENSORS_W83783S_TEMP2_OVER, SENSORS_W83783S_TEMP2_HYST, SENSORS_W83783S_SENS2, -1 } }, 
    802   { fmtVolt_3, rrdF3, DataType_voltage, 0, 0, 
    803     { SENSORS_W83783S_VID, -1 } }, 
    804   { fmtSoundAlarm, NULL, DataType_other, 0, 0, 
    805     { SENSORS_W83781D_BEEP_ENABLE, -1 } }, 
    806   { NULL } 
    807 }; 
    808  
    809 static const ChipDescriptor w83783s_chip = { 
    810   w83783s_names, w83783s_features, SENSORS_W83783S_ALARMS, SENSORS_W83783S_BEEPS 
    811 }; 
    812  
    813 /** W83697HF **/ 
    814  
    815 static const char *w83697hf_names[] = { 
    816   SENSORS_W83697HF_PREFIX, NULL 
    817 }; 
    818  
    819 static const FeatureDescriptor w83697hf_features[] = { 
    820   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0, 
    821     { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } }, 
    822   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2, 
    823     { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } }, 
    824   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3, 
    825     { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } }, 
    826   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4, 
    827     { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } }, 
    828   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5, 
    829     { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } }, 
    830   { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6, 
    831     { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } }, 
    832   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1, 
    833     { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } }, 
    834   { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2, 
    835     { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } }, 
    836   { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1, 
    837     { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } }, 
    838   { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2, 
    839     { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } }, 
    840   { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS, 
    841     { SENSORS_W83781D_ALARMS, -1 } }, 
    842   { fmtSoundAlarm, NULL, DataType_other, 0, 0, 
    843     { SENSORS_W83781D_BEEP_ENABLE, -1 } }, 
    844   { NULL } 
    845 }; 
    846  
    847 static const ChipDescriptor w83697hf_chip = { 
    848   w83697hf_names, w83697hf_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS 
    849 }; 
    850  
    851  
    852 /** MAXILIFE **/ 
    853  
    854 static const char * 
    855 fmtTemps_Maxilife 
    856 (const double values[], int alarm, int beep) { 
    857   if (!values[0] && !values[1] && !values[2]) 
    858     return NULL; 
    859   return fmtTemps_1_0 (values, alarm, beep); 
    860 } 
    861  
    862 static const char * 
    863 rrdTemps_Maxilife 
    864 (const double values[]) { 
    865   if (!values[0] && !values[1] && !values[2]) 
    866     return NULL; 
    867   return rrdF1 (values); 
    868 } 
    869  
    870 static const char * 
    871 fmtFans_Maxilife 
    872 (const double values[], int alarm, int beep) { 
    873   if (!values[0] && !values[1] && !values[2]) 
    874     return NULL; 
    875   if (values[0] < 0) { 
    876     sprintf (buff, "Off (min = %.0f RPM, div = %.0f)", values[1], values[2]);  
    877   } else { 
    878     sprintf (buff, "%.0f RPM (min = %.0f RPM, div = %.0f)", values[0] / values[2], values[1] / values[2], values[2]);  
    879   } 
    880   return fmtExtra (alarm, beep); 
    881 } 
    882  
    883 static const char * 
    884 rrdFans_Maxilife 
    885 (const double values[]) { 
    886   if (!values[0] && !values[1] && !values[2]) 
    887     return NULL; 
    888   if (values[0] < 0) { 
    889     return NULL; 
    890   } else { 
    891     sprintf (buff, "%.0f", values[0] / values[2]); 
    892     return buff; 
    893   } 
    894 } 
    895  
    896 static const char * 
    897 fmtMHz_Maxilife 
    898 (const double values[], int alarm, int beep) { 
    899   if (!values[0] && !values[1] && !values[2]) 
    900     return NULL; 
    901   return fmtMHz_2 (values, alarm, beep); 
    902 } 
    903  
    904 static const char * 
    905 rrdMHz_Maxilife 
    906 (const double values[]) { 
    907   if (!values[0] && !values[1] && !values[2]) 
    908     return NULL; 
    909   return rrdF2 (values); 
    910 } 
    911  
    912 static const char * 
    913 fmtVolts_Maxilife 
    914 (const double values[], int alarm, int beep) { 
    915   if (!values[0] && !values[1] && !values[2]) 
    916     return NULL; 
    917   return fmtVolts_2 (values, alarm, beep); 
    918 } 
    919  
    920 static const char * 
    921 rrdVolts_Maxilife 
    922 (const double values[]) { 
    923   if (!values[0] && !values[1] && !values[2]) 
    924     return NULL; 
    925   return rrdF2 (values); 
    926 } 
    927  
    928 static const char *maxilife_names[] = { 
    929   SENSORS_MAXI_CG_PREFIX, SENSORS_MAXI_CO_PREFIX, SENSORS_MAXI_AS_PREFIX, SENSORS_MAXI_NBA_PREFIX, NULL 
    930 }; 
    931  
    932 static const FeatureDescriptor maxilife_features[] = { 
    933   { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0, 
    934     { SENSORS_MAXI_CG_TEMP1, SENSORS_MAXI_CG_TEMP1_MAX, SENSORS_MAXI_CG_TEMP1_HYST, -1 } }, 
    935   { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP2, 0, 
    936     { SENSORS_MAXI_CG_TEMP2, SENSORS_MAXI_CG_TEMP2_MAX, SENSORS_MAXI_CG_TEMP2_HYST, -1 } }, 
    937   { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0, 
    938     { SENSORS_MAXI_CG_TEMP3, SENSORS_MAXI_CG_TEMP3_MAX, SENSORS_MAXI_CG_TEMP3_HYST, -1 } }, 
    939   { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP4, 0, 
    940     { SENSORS_MAXI_CG_TEMP4, SENSORS_MAXI_CG_TEMP4_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } }, 
    941   { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP5, 0, 
    942     { SENSORS_MAXI_CG_TEMP5, SENSORS_MAXI_CG_TEMP5_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } }, 
    943   { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN1, 0, 
    944     { SENSORS_MAXI_CG_FAN1, SENSORS_MAXI_CG_FAN1_MIN, SENSORS_MAXI_CG_FAN1_DIV, -1 } }, 
    945   { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN2, 0, 
    946     { SENSORS_MAXI_CG_FAN2, SENSORS_MAXI_CG_FAN2_MIN, SENSORS_MAXI_CG_FAN2_DIV, -1 } }, 
    947   { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN3, 0, 
    948     { SENSORS_MAXI_CG_FAN3, SENSORS_MAXI_CG_FAN3_MIN, SENSORS_MAXI_CG_FAN3_DIV, -1 } }, 
    949   { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID1, 0, 
    950     { SENSORS_MAXI_CG_VID1, SENSORS_MAXI_CG_VID1_MIN, SENSORS_MAXI_CG_VID1_MAX, -1 } }, 
    951   { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID2, 0, 
    952     { SENSORS_MAXI_CG_VID2, SENSORS_MAXI_CG_VID2_MIN, SENSORS_MAXI_CG_VID2_MAX, -1 } }, 
    953   { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID3, 0, 
    954     { SENSORS_MAXI_CG_VID3, SENSORS_MAXI_CG_VID3_MIN, SENSORS_MAXI_CG_VID3_MAX, -1 } }, 
    955   { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID4, 0, 
    956     { SENSORS_MAXI_CG_VID4, SENSORS_MAXI_CG_VID4_MIN, SENSORS_MAXI_CG_VID4_MAX, -1 } }, 
    957   { NULL } 
    958 }; 
    959  
    960 static const ChipDescriptor maxilife_chip = { 
    961   maxilife_names, maxilife_features, SENSORS_MAXI_CG_ALARMS, 0 
    962 }; 
    963  
    964 /** ASB100 **/ 
    965  
    966 static const char *asb100_names[] = { 
    967         SENSORS_ASB100_PREFIX, NULL 
    968 }; 
    969  
    970 static const FeatureDescriptor asb100_features[] = { 
    971   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    972     { SENSORS_ASB100_IN0, SENSORS_ASB100_IN0_MIN, SENSORS_ASB100_IN0_MAX, -1 } }, 
    973   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    974     { SENSORS_ASB100_IN1, SENSORS_ASB100_IN1_MIN, SENSORS_ASB100_IN1_MAX, -1 } }, 
    975   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    976     { SENSORS_ASB100_IN2, SENSORS_ASB100_IN2_MIN, SENSORS_ASB100_IN2_MAX, -1 } }, 
    977   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    978     { SENSORS_ASB100_IN3, SENSORS_ASB100_IN3_MIN, SENSORS_ASB100_IN3_MAX, -1 } }, 
    979   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    980     { SENSORS_ASB100_IN4, SENSORS_ASB100_IN4_MIN, SENSORS_ASB100_IN4_MAX, -1 } }, 
    981   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    982     { SENSORS_ASB100_IN5, SENSORS_ASB100_IN5_MIN, SENSORS_ASB100_IN5_MAX, -1 } }, 
    983   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    984     { SENSORS_ASB100_IN6, SENSORS_ASB100_IN6_MIN, SENSORS_ASB100_IN6_MAX, -1 } }, 
    985  
    986   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    987     { SENSORS_ASB100_FAN1, SENSORS_ASB100_FAN1_MIN, -1 } }, 
    988   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    989     { SENSORS_ASB100_FAN2, SENSORS_ASB100_FAN2_MIN, -1 } }, 
    990   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    991     { SENSORS_ASB100_FAN3, SENSORS_ASB100_FAN3_MIN, -1 } }, 
    992  
    993   { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0, 
    994     { SENSORS_ASB100_TEMP1, SENSORS_ASB100_TEMP1_HYST, SENSORS_ASB100_TEMP1_OVER, -1 } }, 
    995   { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0, 
    996     { SENSORS_ASB100_TEMP2, SENSORS_ASB100_TEMP2_HYST, SENSORS_ASB100_TEMP2_OVER, -1 } }, 
    997   { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0, 
    998     { SENSORS_ASB100_TEMP3, SENSORS_ASB100_TEMP3_HYST, SENSORS_ASB100_TEMP3_OVER, -1 } }, 
    999   { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0, 
    1000     { SENSORS_ASB100_TEMP4, SENSORS_ASB100_TEMP4_HYST, SENSORS_ASB100_TEMP4_OVER, -1 } }, 
    1001  
    1002   { NULL } 
    1003 }; 
    1004  
    1005 static const ChipDescriptor asb100_chip = { 
    1006   asb100_names, asb100_features, 0, 0 
    1007 }; 
    1008  
    1009 /** PC87360 **/ 
    1010  
    1011 static const char * 
    1012 fmtTemps_PC87360_0 
    1013 (const double values[], int alarm, int beep) { 
    1014   sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C, crit = %.0f C)", 
    1015            values[0], values[1], values[2], values[3]); 
    1016   return fmtExtra (alarm, beep); 
    1017 } 
    1018  
    1019 static const char * 
    1020 fmtTemps_PC87360_1 
    1021 (const double values[], int alarm, int beep) { 
    1022   sprintf (buff, "%.1f C (min = %.1f C, max = %.1f C, crit = %.1f C)", 
    1023            values[0], values[1], values[2], values[3]); 
    1024   return fmtExtra (alarm, beep); 
    1025 } 
    1026  
    1027 static const char *pc87360_names[] = { 
    1028   SENSORS_PC87360_PREFIX, 
    1029   SENSORS_PC87363_PREFIX, 
    1030   SENSORS_PC87364_PREFIX, 
    1031   SENSORS_PC87365_PREFIX, 
    1032   SENSORS_PC87366_PREFIX, 
    1033   NULL 
    1034 }; 
    1035  
    1036 static const FeatureDescriptor pc87360_features[] = { 
    1037   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1038     { SENSORS_PC87360_FAN1, SENSORS_PC87360_FAN1_MIN, SENSORS_PC87360_FAN1_DIV, -1 } }, 
    1039   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1040     { SENSORS_PC87360_FAN2, SENSORS_PC87360_FAN2_MIN, SENSORS_PC87360_FAN2_DIV, -1 } }, 
    1041   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1042     { SENSORS_PC87360_FAN3, SENSORS_PC87360_FAN3_MIN, SENSORS_PC87360_FAN3_DIV, -1 } }, 
    1043  
    1044   { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 0, 0, 
    1045     { SENSORS_PC87360_TEMP1, SENSORS_PC87360_TEMP1_MIN, SENSORS_PC87360_TEMP1_MAX, 
    1046       SENSORS_PC87360_TEMP1_CRIT, -1 } }, 
    1047   { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 2, 0, 
    1048     { SENSORS_PC87360_TEMP2, SENSORS_PC87360_TEMP2_MIN, SENSORS_PC87360_TEMP2_MAX, 
    1049       SENSORS_PC87360_TEMP2_CRIT, -1 } }, 
    1050   { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 4, 0, 
    1051     { SENSORS_PC87360_TEMP3, SENSORS_PC87360_TEMP3_MIN, SENSORS_PC87360_TEMP3_MAX, 
    1052       SENSORS_PC87360_TEMP3_CRIT, -1 } }, 
    1053   { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0, 
    1054     { SENSORS_PC87360_TEMP4, SENSORS_PC87360_TEMP4_MIN, SENSORS_PC87360_TEMP4_MAX, 
    1055       SENSORS_PC87360_TEMP4_CRIT, -1 } }, 
    1056   { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0, 
    1057     { SENSORS_PC87360_TEMP5, SENSORS_PC87360_TEMP5_MIN, SENSORS_PC87360_TEMP5_MAX, 
    1058       SENSORS_PC87360_TEMP5_CRIT, -1 } }, 
    1059   { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0, 
    1060     { SENSORS_PC87360_TEMP6, SENSORS_PC87360_TEMP6_MIN, SENSORS_PC87360_TEMP6_MAX, 
    1061       SENSORS_PC87360_TEMP6_CRIT, -1 } }, 
    1062  
    1063   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1064     { SENSORS_PC87360_IN0, SENSORS_PC87360_IN0_MIN, SENSORS_PC87360_IN0_MAX, -1 } }, 
    1065   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1066     { SENSORS_PC87360_IN1, SENSORS_PC87360_IN1_MIN, SENSORS_PC87360_IN1_MAX, -1 } }, 
    1067   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1068     { SENSORS_PC87360_IN2, SENSORS_PC87360_IN2_MIN, SENSORS_PC87360_IN2_MAX, -1 } }, 
    1069   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1070     { SENSORS_PC87360_IN3, SENSORS_PC87360_IN3_MIN, SENSORS_PC87360_IN3_MAX, -1 } }, 
    1071   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1072     { SENSORS_PC87360_IN4, SENSORS_PC87360_IN4_MIN, SENSORS_PC87360_IN4_MAX, -1 } }, 
    1073   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1074     { SENSORS_PC87360_IN5, SENSORS_PC87360_IN5_MIN, SENSORS_PC87360_IN5_MAX, -1 } }, 
    1075   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1076     { SENSORS_PC87360_IN6, SENSORS_PC87360_IN6_MIN, SENSORS_PC87360_IN6_MAX, -1 } }, 
    1077   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1078     { SENSORS_PC87360_IN7, SENSORS_PC87360_IN7_MIN, SENSORS_PC87360_IN7_MAX, -1 } }, 
    1079   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1080     { SENSORS_PC87360_IN8, SENSORS_PC87360_IN8_MIN, SENSORS_PC87360_IN8_MAX, -1 } }, 
    1081   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1082     { SENSORS_PC87360_IN9, SENSORS_PC87360_IN9_MIN, SENSORS_PC87360_IN9_MAX, -1 } }, 
    1083   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1084     { SENSORS_PC87360_IN10, SENSORS_PC87360_IN10_MIN, SENSORS_PC87360_IN10_MAX, -1 } }, 
    1085  
    1086   { fmtVolt_3, rrdF3, DataType_voltage, 0, 0, 
    1087     { SENSORS_PC87360_VID, -1 } }, 
    1088   { NULL } 
    1089 }; 
    1090  
    1091 static const ChipDescriptor pc87360_chip = { 
    1092   /* No room for SENSORS_PC87360_ALARMS_IN */ 
    1093   pc87360_names, pc87360_features, SENSORS_PC87360_ALARMS_TEMP, 0 
    1094 }; 
    1095  
    1096 /** PC87427 **/ 
    1097  
    1098 static const char *pc87427_names[] = { 
    1099   SENSORS_PC87427_PREFIX, 
    1100   NULL 
    1101 }; 
    1102  
    1103 static const FeatureDescriptor pc87427_features[] = { 
    1104   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1105     { SENSORS_PC87427_FAN(1), SENSORS_PC87427_FAN_MIN(1), -1, -1 } }, 
    1106   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1107     { SENSORS_PC87427_FAN(2), SENSORS_PC87427_FAN_MIN(2), -1, -1 } }, 
    1108   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1109     { SENSORS_PC87427_FAN(3), SENSORS_PC87427_FAN_MIN(3), -1, -1 } }, 
    1110   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1111     { SENSORS_PC87427_FAN(4), SENSORS_PC87427_FAN_MIN(4), -1, -1 } }, 
    1112   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1113     { SENSORS_PC87427_FAN(5), SENSORS_PC87427_FAN_MIN(5), -1, -1 } }, 
    1114   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1115     { SENSORS_PC87427_FAN(6), SENSORS_PC87427_FAN_MIN(6), -1, -1 } }, 
    1116   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1117     { SENSORS_PC87427_FAN(7), SENSORS_PC87427_FAN_MIN(7), -1, -1 } }, 
    1118   { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0, 
    1119     { SENSORS_PC87427_FAN(8), SENSORS_PC87427_FAN_MIN(8), -1, -1 } }, 
    1120   { NULL } 
    1121 }; 
    1122  
    1123 static const ChipDescriptor pc87427_chip = { 
    1124   pc87427_names, pc87427_features, 0, 0 
    1125 }; 
    1126  
    1127 /** W83627EHF & W83627DHG **/ 
    1128  
    1129 static const char *w83627ehf_names[] = { 
    1130   SENSORS_W83627EHF_PREFIX, SENSORS_W83627DHG_PREFIX, NULL 
    1131 }; 
    1132  
    1133 static const FeatureDescriptor w83627ehf_features[] = { 
    1134   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1135     { SENSORS_W83627EHF_FAN1, SENSORS_W83627EHF_FAN1_MIN, SENSORS_W83627EHF_FAN1_DIV, -1 } }, 
    1136   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1137     { SENSORS_W83627EHF_FAN2, SENSORS_W83627EHF_FAN2_MIN, SENSORS_W83627EHF_FAN2_DIV, -1 } }, 
    1138   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1139     { SENSORS_W83627EHF_FAN3, SENSORS_W83627EHF_FAN3_MIN, SENSORS_W83627EHF_FAN3_DIV, -1 } }, 
    1140   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1141     { SENSORS_W83627EHF_FAN4, SENSORS_W83627EHF_FAN4_MIN, SENSORS_W83627EHF_FAN4_DIV, -1 } }, 
    1142   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1143     { SENSORS_W83627EHF_FAN5, SENSORS_W83627EHF_FAN5_MIN, SENSORS_W83627EHF_FAN5_DIV, -1 } }, 
    1144   { fmtTemps_0, rrdF0, DataType_temperature, 0, 0, 
    1145     { SENSORS_W83627EHF_TEMP1, SENSORS_W83627EHF_TEMP1_OVER, SENSORS_W83627EHF_TEMP1_HYST, -1 } }, 
    1146   { fmtTemps_1, rrdF1, DataType_temperature, 0, 0, 
    1147     { SENSORS_W83627EHF_TEMP2, SENSORS_W83627EHF_TEMP2_OVER, SENSORS_W83627EHF_TEMP2_HYST, -1 } }, 
    1148   { fmtTemps_1, rrdF1, DataType_temperature, 0, 0, 
    1149     { SENSORS_W83627EHF_TEMP3, SENSORS_W83627EHF_TEMP3_OVER, SENSORS_W83627EHF_TEMP3_HYST, -1 } }, 
    1150   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1151     { SENSORS_W83627EHF_IN0, SENSORS_W83627EHF_IN0_MIN, SENSORS_W83627EHF_IN0_MAX, -1 } }, 
    1152   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1153     { SENSORS_W83627EHF_IN1, SENSORS_W83627EHF_IN1_MIN, SENSORS_W83627EHF_IN1_MAX, -1 } }, 
    1154   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1155     { SENSORS_W83627EHF_IN2, SENSORS_W83627EHF_IN2_MIN, SENSORS_W83627EHF_IN2_MAX, -1 } }, 
    1156   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1157     { SENSORS_W83627EHF_IN3, SENSORS_W83627EHF_IN3_MIN, SENSORS_W83627EHF_IN3_MAX, -1 } }, 
    1158   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1159     { SENSORS_W83627EHF_IN4, SENSORS_W83627EHF_IN4_MIN, SENSORS_W83627EHF_IN4_MAX, -1 } }, 
    1160   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1161     { SENSORS_W83627EHF_IN5, SENSORS_W83627EHF_IN5_MIN, SENSORS_W83627EHF_IN5_MAX, -1 } }, 
    1162   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1163     { SENSORS_W83627EHF_IN6, SENSORS_W83627EHF_IN6_MIN, SENSORS_W83627EHF_IN6_MAX, -1 } }, 
    1164   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1165     { SENSORS_W83627EHF_IN7, SENSORS_W83627EHF_IN7_MIN, SENSORS_W83627EHF_IN7_MAX, -1 } }, 
    1166   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1167     { SENSORS_W83627EHF_IN8, SENSORS_W83627EHF_IN8_MIN, SENSORS_W83627EHF_IN8_MAX, -1 } }, 
    1168   { fmtVolts_2, rrdF2, DataType_voltage, 0, 0, 
    1169     { SENSORS_W83627EHF_IN9, SENSORS_W83627EHF_IN9_MIN, SENSORS_W83627EHF_IN9_MAX, -1 } }, 
    1170   { NULL } 
    1171 }; 
    1172  
    1173 static const ChipDescriptor w83627ehf_chip = { 
    1174   w83627ehf_names, w83627ehf_features, 0, 0 
    1175 }; 
    1176  
    1177 /** F71805F **/ 
    1178  
    1179 static const char *f71805f_names[] = { 
    1180   SENSORS_F71805F_PREFIX, NULL 
    1181 }; 
    1182  
    1183 static const FeatureDescriptor f71805f_features[] = { 
    1184   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1185     { SENSORS_F71805F_IN(0), SENSORS_F71805F_IN_MIN(0), SENSORS_F71805F_IN_MAX(0), -1 } }, 
    1186   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1187     { SENSORS_F71805F_IN(1), SENSORS_F71805F_IN_MIN(1), SENSORS_F71805F_IN_MAX(1), -1 } }, 
    1188   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1189     { SENSORS_F71805F_IN(2), SENSORS_F71805F_IN_MIN(2), SENSORS_F71805F_IN_MAX(2), -1 } }, 
    1190   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1191     { SENSORS_F71805F_IN(3), SENSORS_F71805F_IN_MIN(3), SENSORS_F71805F_IN_MAX(3), -1 } }, 
    1192   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1193     { SENSORS_F71805F_IN(4), SENSORS_F71805F_IN_MIN(4), SENSORS_F71805F_IN_MAX(4), -1 } }, 
    1194   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1195     { SENSORS_F71805F_IN(5), SENSORS_F71805F_IN_MIN(5), SENSORS_F71805F_IN_MAX(5), -1 } }, 
    1196   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1197     { SENSORS_F71805F_IN(6), SENSORS_F71805F_IN_MIN(6), SENSORS_F71805F_IN_MAX(6), -1 } }, 
    1198   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1199     { SENSORS_F71805F_IN(7), SENSORS_F71805F_IN_MIN(7), SENSORS_F71805F_IN_MAX(7), -1 } }, 
    1200   { fmtVolts_2, rrdF3, DataType_voltage, 0, 0, 
    1201     { SENSORS_F71805F_IN(8), SENSORS_F71805F_IN_MIN(8), SENSORS_F71805F_IN_MAX(8), -1 } }, 
    1202   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1203     { SENSORS_F71805F_FAN(1), SENSORS_F71805F_FAN_MIN(1), -1, -1 } }, 
    1204   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1205     { SENSORS_F71805F_FAN(2), SENSORS_F71805F_FAN_MIN(2), -1, -1 } }, 
    1206   { fmtFans_0, rrdF0, DataType_rpm, 0, 0, 
    1207     { SENSORS_F71805F_FAN(3), SENSORS_F71805F_FAN_MIN(3), -1, -1 } }, 
    1208   { fmtTemps_0, rrdF0, DataType_temperature, 1 << 0, 0, 
    1209     { SENSORS_F71805F_TEMP(1), SENSORS_F71805F_TEMP_MAX(1), SENSORS_F71805F_TEMP_HYST(1), -1 } }, 
    1210   { fmtTemps_0, rrdF0, DataType_temperature, 1 << 1, 0, 
    1211     { SENSORS_F71805F_TEMP(2), SENSORS_F71805F_TEMP_MAX(2), SENSORS_F71805F_TEMP_HYST(2), -1 } }, 
    1212   { fmtTemps_0, rrdF0, DataType_temperature, 1 << 2, 0, 
    1213     { SENSORS_F71805F_TEMP(3), SENSORS_F71805F_TEMP_MAX(3), SENSORS_F71805F_TEMP_HYST(3), -1 } }, 
    1214   { NULL } 
    1215 }; 
    1216  
    1217 static const ChipDescriptor f71805f_chip = { 
    1218   /* No room for SENSORS_F71805F_ALARMS_IN nor SENSORS_F71805F_ALARMS_FAN */ 
    1219   f71805f_names, f71805f_features, SENSORS_F71805F_ALARMS_TEMP, 0 
    1220 }; 
    1221  
    1222 /** VT1211 **/ 
    1223  
    1224 static const char *vt1211_names[] = { 
    1225   SENSORS_VT1211_PREFIX, NULL 
    1226 }; 
    1227  
    1228 static const FeatureDescriptor vt1211_features[] = { 
    1229   { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN0, 0, 
    1230     { SENSORS_VT1211_IN0, SENSORS_VT1211_IN0_MIN, SENSORS_VT1211_IN0_MAX, -1 } }, 
    1231   { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN1, 0, 
    1232     { SENSORS_VT1211_IN1, SENSORS_VT1211_IN1_MIN, SENSORS_VT1211_IN1_MAX, -1 } }, 
    1233   { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN2, 0, 
    1234     { SENSORS_VT1211_IN2, SENSORS_VT1211_IN2_MIN, SENSORS_VT1211_IN2_MAX, -1 } }, 
    1235   { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN3, 0, 
    1236     { SENSORS_VT1211_IN3, SENSORS_VT1211_IN3_MIN, SENSORS_VT1211_IN3_MAX, -1 } }, 
    1237   { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN4, 0, 
    1238     { SENSORS_VT1211_IN4, SENSORS_VT1211_IN4_MIN, SENSORS_VT1211_IN4_MAX, -1 } }, 
    1239   { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN5, 0, 
    1240     { SENSORS_VT1211_IN5, SENSORS_VT1211_IN5_MIN, SENSORS_VT1211_IN5_MAX, -1 } }, 
    1241   { fmtFans_0, rrdF0, DataType_rpm, VT1211_ALARM_FAN1, 0, 
    1242     { SENSORS_VT1211_FAN1, SENSORS_VT1211_FAN1_MIN, SENSORS_VT1211_FAN1_DIV, -1 } }, 
    1243   { fmtFans_0, rrdF0, DataType_rpm, VT1211_ALARM_FAN2, 0, 
    1244     { SENSORS_VT1211_FAN2, SENSORS_VT1211_FAN2_MIN, SENSORS_VT1211_FAN2_DIV, -1 } }, 
    1245   { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP1, 0, 
    1246     { SENSORS_VT1211_TEMP1, SENSORS_VT1211_TEMP1_OVER, SENSORS_VT1211_TEMP1_HYST, -1 } }, 
    1247   { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP2, 0, 
    1248     { SENSORS_VT1211_TEMP2, SENSORS_VT1211_TEMP2_OVER, SENSORS_VT1211_TEMP2_HYST, -1 } }, 
    1249   { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP3, 0, 
    1250     { SENSORS_VT1211_TEMP3, SENSORS_VT1211_TEMP3_OVER, SENSORS_VT1211_TEMP3_HYST, -1 } }, 
    1251   { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP4, 0, 
    1252     { SENSORS_VT1211_TEMP4, SENSORS_VT1211_TEMP4_OVER, SENSORS_VT1211_TEMP4_HYST, -1 } }, 
    1253   { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP5, 0, 
    1254     { SENSORS_VT1211_TEMP5, SENSORS_VT1211_TEMP5_OVER, SENSORS_VT1211_TEMP5_HYST, -1 } }, 
    1255   { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP6, 0, 
    1256     { SENSORS_VT1211_TEMP6, SENSORS_VT1211_TEMP6_OVER, SENSORS_VT1211_TEMP6_HYST, -1 } }, 
    1257   { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP7, 0, 
    1258     { SENSORS_VT1211_TEMP7, SENSORS_VT1211_TEMP7_OVER, SENSORS_VT1211_TEMP7_HYST, -1 } }, 
    1259   { fmtVolt_3, rrdF3, DataType_voltage, 0, 0, 
    1260     { SENSORS_VT1211_VID, -1 } }, 
    1261   { NULL } 
    1262 }; 
    1263  
    1264 static const ChipDescriptor vt1211_chip = { 
    1265   vt1211_names, vt1211_features, SENSORS_VT1211_ALARMS, 0 
    1266 }; 
    1267  
    1268 /** K8 **/ 
    1269  
    1270 static const char *k8temp_names[] = { 
    1271   SENSORS_K8TEMP_PREFIX, NULL 
    1272 }; 
    1273  
    1274 static const FeatureDescriptor k8temp_features[] = { 
    1275   { fmtTemp_only, rrdF0, DataType_temperature, 0, 0, 
    1276     { SENSORS_K8TEMP_TEMP1, -1 } }, 
    1277   { NULL } 
    1278 }; 
    1279  
    1280 static const ChipDescriptor k8temp_chip = { 
    1281   k8temp_names, k8temp_features, 0, 0 
    1282 }; 
    1283  
    1284  
    1285178/** ALL **/ 
    1286179 
    1287180const ChipDescriptor * const knownChips[] = { 
    1288   &adm1021_chip, 
    1289   &adm1025_chip, 
    1290   &adm9240_chip, 
    1291   &ds1621_chip, 
    1292   &gl518_chip, 
    1293   &lm75_chip, 
    1294   &lm78_chip, 
    1295   &lm80_chip, 
    1296   &max1617_chip, 
    1297   &maxilife_chip, 
    1298   &sis5595_chip, 
    1299   &via686a_chip, 
    1300   &as99127f_chip, 
    1301   &w83781d_chip, 
    1302   &w83782d_chip, 
    1303   &w83783s_chip, 
    1304   &w83697hf_chip, 
    1305   &it87_chip, 
    1306   &asb100_chip, 
    1307   &pc87360_chip, 
    1308   &pc87427_chip, 
    1309   &w83627ehf_chip, 
    1310   &f71805f_chip, 
    1311   &vt1211_chip, 
    1312   &k8temp_chip, 
    1313181  NULL 
    1314182};