root/lm-sensors/trunk/prog/sensord/chips.c @ 5356

Revision 5356, 65.5 KB (checked in by khali, 5 years ago)

Add user-space support for the IT8720F (handled exactly the same as
the IT8718F.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 * sensord
3 *
4 * A daemon that periodically logs sensor information to syslog.
5 *
6 * Copyright (c) 1999-2002 Merlin Hughes <merlin@merlin.org>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26
27#include "sensord.h"
28#include "lib/chips.h"
29#include "kernel/include/sensors.h"
30
31/* TODO: Temp in C/F */
32
33/** formatters **/
34
35static char buff[4096];
36
37static const char *
38fmtExtra
39(int alarm, int beep) {
40  if (alarm)
41    sprintf (buff + strlen (buff), " [ALARM]");
42  if (beep)
43    sprintf (buff + strlen (buff), " (beep)");
44  return buff;
45}
46
47static const char *
48fmtTemps_0
49(const double values[], int alarm, int beep) {
50  sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C)", values[0], values[1], values[2]);
51  return fmtExtra (alarm, beep);
52}
53
54static const char *
55fmtTemps_1_0
56(const double values[], int alarm, int beep) {
57  sprintf (buff, "%.1f C (limit = %.0f C, hysteresis = %.0f C)", values[0], values[1], values[2]);
58  return fmtExtra (alarm, beep);
59}
60
61static const char *
62fmtTemps_1
63(const double values[], int alarm, int beep) {
64  sprintf (buff, "%.1f C (limit = %.1f C, hysteresis = %.1f C)", values[0], values[1], values[2]);
65  return fmtExtra (alarm, beep);
66}
67
68static const char *
69fmtTemps_minmax_0
70(const double values[], int alarm, int beep) {
71 sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
72 return fmtExtra (alarm, beep);
73}
74
75static const char *
76fmtTemp_only
77(const double values[], int alarm, int beep) {
78  sprintf (buff, "%.1f C", values[0]);
79  return fmtExtra (alarm, beep);
80}
81
82static const char *
83fmtVolt_2
84(const double values[], int alarm, int beep) {
85  sprintf (buff, "%+.2f V", values[0]);
86  return fmtExtra (alarm, beep);
87}
88
89static const char *
90fmtVolt_3
91(const double values[], int alarm, int beep) {
92  sprintf (buff, "%+.3f V", values[0]);
93  return fmtExtra (alarm, beep);
94}
95
96static const char *
97fmtVolts_2
98(const double values[], int alarm, int beep) {
99  sprintf (buff, "%+.2f V (min = %+.2f V, max = %+.2f V)", values[0], values[1], values[2]);
100  return fmtExtra (alarm, beep);
101}
102
103static const char *
104fmtFans_0
105(const double values[], int alarm, int beep) {
106  sprintf (buff, "%.0f RPM (min = %.0f RPM, div = %.0f)", values[0], values[1], values[2]);
107  return fmtExtra (alarm, beep);
108}
109
110static const char *
111fmtFans_nodiv_0
112(const double values[], int alarm, int beep) {
113  sprintf (buff, "%.0f RPM (min = %.0f RPM)", values[0], values[1]);
114  return fmtExtra (alarm, beep);
115}
116
117static const char *
118fmtMHz_2
119(const double values[], int alarm, int beep) {
120  sprintf (buff, "%.2f MHz (min = %.2f MHz, max = %.2f MHz)", values[0], values[1], values[2]);
121  return fmtExtra (alarm, beep);
122}
123
124static const char *
125fmtChassisIntrusionDetection
126(const double values[], int alarm, int beep) {
127  sprintf (buff, "Chassis intrusion detection");
128  return fmtExtra (alarm, beep);
129}
130
131static const char *
132fmtBoardTemperatureInput
133(const double values[], int alarm, int beep) {
134  sprintf (buff, "Board temperature input"); /* N.B: "(usually LM75 chips)" */
135  return fmtExtra (alarm, beep);
136}
137
138static const char *
139fmtSoundAlarm
140(const double values[], int alarm, int beep) {
141  sprintf (buff, "Sound alarm %s", (values[0] < 0.5) ? "disabled" : "enabled");
142  return fmtExtra (alarm, beep);
143}
144
145static const char *
146rrdF0
147(const double values[]) {
148  sprintf (buff, "%.0f", values[0]);
149  return buff;
150}
151
152static const char *
153rrdF1
154(const double values[]) {
155  sprintf (buff, "%.1f", values[0]);
156  return buff;
157}
158
159static const char *
160rrdF2
161(const double values[]) {
162  sprintf (buff, "%.2f", values[0]);
163  return buff;
164}
165
166static const char *
167rrdF3
168(const double values[]) {
169  sprintf (buff, "%.3f", values[0]);
170  return buff;
171}
172
173/** DS1621 */
174
175static const char *
176fmtTemps_DS1621
177(const double values[], int alarm, int beep) {
178  sprintf (buff, "%.2f C (min = %.1f C, max = %.1f C)", values[0], values[1], values[2]);
179  if (alarm)
180    sprintf (buff + strlen (buff), " [ALARM(%s)]", (alarm == DS1621_ALARM_TEMP_LOW) ? "LOW" : (alarm == DS1621_ALARM_TEMP_HIGH) ? "HIGH" : "LOW,HIGH");
181  return buff;
182}
183
184static const char *ds1621_names[] = {
185  SENSORS_DS1621_PREFIX, NULL
186};
187
188static const FeatureDescriptor ds1621_features[] = {
189  { fmtTemps_DS1621, rrdF2, DataType_temperature, DS1621_ALARM_TEMP_LOW | DS1621_ALARM_TEMP_HIGH, 0,
190    { SENSORS_DS1621_TEMP, SENSORS_DS1621_TEMP_HYST, SENSORS_DS1621_TEMP_OVER, -1 } }, /* hyst=min, over=max */
191  { NULL }
192};
193
194static const ChipDescriptor ds1621_chip = {
195  ds1621_names, ds1621_features, SENSORS_DS1621_ALARMS, 0
196};
197
198/** LM75 **/
199
200static const char *lm75_names[] = {
201  SENSORS_LM75_PREFIX, NULL
202};
203
204static const FeatureDescriptor lm75_features[] = {
205  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
206    { SENSORS_LM75_TEMP, SENSORS_LM75_TEMP_OVER, SENSORS_LM75_TEMP_HYST, -1 } },
207  { NULL }
208};
209
210static const ChipDescriptor lm75_chip = {
211  lm75_names, lm75_features, 0, 0
212};
213
214/** ADM1021 **/
215
216static const char *
217fmtTemps_ADM1021_0
218(const double values[], int alarm, int beep) {
219  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
220  if (alarm) {
221    int low = alarm & ADM1021_ALARM_TEMP_LOW, high = alarm & ADM1021_ALARM_TEMP_HIGH;
222    sprintf (buff + strlen (buff), " [ALARM(%s%s%s)]", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : "");
223  }
224  return buff;
225}
226
227static const char *
228fmtTemps_ADM1021_1
229(const double values[], int alarm, int beep) {
230  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
231  if (alarm) {
232    int na = alarm & ADM1021_ALARM_RTEMP_NA, low = alarm & ADM1021_ALARM_RTEMP_LOW,
233      high = alarm & ADM1021_ALARM_RTEMP_HIGH;
234    sprintf (buff + strlen (buff), " [ALARM(%s%s%s%s%s)]", na ? "N/A" : "", (na && (low || high)) ? "," : "", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : "");
235  }
236  return buff;
237}
238
239static const char *adm1021_names[] = {
240  SENSORS_ADM1021_PREFIX, SENSORS_ADM1023_PREFIX, NULL
241}; /* N.B: Assume bs sensors 1023 is =~ 1021 */
242
243static const FeatureDescriptor adm1021_features[] = {
244  { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0,
245    { SENSORS_ADM1021_TEMP, SENSORS_ADM1021_TEMP_HYST, SENSORS_ADM1021_TEMP_OVER, -1 } }, /* hyst=min, over=max */
246  { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0,
247    { SENSORS_ADM1021_REMOTE_TEMP, SENSORS_ADM1021_REMOTE_TEMP_HYST, SENSORS_ADM1021_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */
248  { NULL }
249};
250
251static const ChipDescriptor adm1021_chip = {
252  adm1021_names, adm1021_features, SENSORS_ADM1021_ALARMS, 0
253};
254
255/** MAX1617 **/
256
257static const char *max1617_names[] = {
258  SENSORS_MAX1617_PREFIX, SENSORS_MAX1617A_PREFIX, SENSORS_THMC10_PREFIX, SENSORS_LM84_PREFIX, SENSORS_GL523_PREFIX, NULL
259}; /* N.B: Assume vs sensors these have no die code */
260
261static const FeatureDescriptor max1617_features[] = {
262  { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0,
263    { SENSORS_MAX1617_TEMP, SENSORS_MAX1617_TEMP_HYST, SENSORS_MAX1617_TEMP_OVER, -1 } }, /* hyst=min, over=max */
264  { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0,
265    { SENSORS_MAX1617_REMOTE_TEMP, SENSORS_MAX1617_REMOTE_TEMP_HYST, SENSORS_MAX1617_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */
266  { NULL }
267};
268
269static const ChipDescriptor max1617_chip = {
270  max1617_names, max1617_features, SENSORS_MAX1617_ALARMS, 0
271};
272
273/** ADM9240 **/
274
275static const char *adm9240_names[] = {
276  SENSORS_ADM9240_PREFIX, SENSORS_DS1780_PREFIX, SENSORS_LM81_PREFIX, NULL
277};
278
279static const FeatureDescriptor adm9240_features[] = {
280  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN0, 0,
281    { SENSORS_ADM9240_IN0, SENSORS_ADM9240_IN0_MIN, SENSORS_ADM9240_IN0_MAX, -1 } },
282  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN1, 0,
283    { SENSORS_ADM9240_IN1, SENSORS_ADM9240_IN1_MIN, SENSORS_ADM9240_IN1_MAX, -1 } },
284  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN2, 0,
285    { SENSORS_ADM9240_IN2, SENSORS_ADM9240_IN2_MIN, SENSORS_ADM9240_IN2_MAX, -1 } },
286  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN3, 0,
287    { SENSORS_ADM9240_IN3, SENSORS_ADM9240_IN3_MIN, SENSORS_ADM9240_IN3_MAX, -1 } },
288  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN4, 0,
289    { SENSORS_ADM9240_IN4, SENSORS_ADM9240_IN4_MIN, SENSORS_ADM9240_IN4_MAX, -1 } },
290  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN5, 0,
291    { SENSORS_ADM9240_IN5, SENSORS_ADM9240_IN5_MIN, SENSORS_ADM9240_IN5_MAX, -1 } },
292  { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN1, 0,
293    { SENSORS_ADM9240_FAN1, SENSORS_ADM9240_FAN1_MIN, SENSORS_ADM9240_FAN1_DIV, -1 } },
294  { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN2, 0,
295    { SENSORS_ADM9240_FAN2, SENSORS_ADM9240_FAN2_MIN, SENSORS_ADM9240_FAN2_DIV, -1 } },
296  { fmtTemps_1_0, rrdF1, DataType_temperature, ADM9240_ALARM_TEMP, 0,
297    { SENSORS_ADM9240_TEMP, SENSORS_ADM9240_TEMP_OVER, SENSORS_ADM9240_TEMP_HYST, -1 } },
298  { fmtVolt_2, rrdF2, DataType_voltage, 0, 0,
299    { SENSORS_ADM9240_VID, -1 } },
300  { fmtChassisIntrusionDetection, NULL, DataType_other, ADM9240_ALARM_CHAS, 0,
301    { SENSORS_ADM9240_ALARMS, -1 } },
302  { NULL }
303};
304
305static const ChipDescriptor adm9240_chip = {
306  adm9240_names, adm9240_features, SENSORS_ADM9240_ALARMS, 0
307};
308
309/** SIS5595 **/
310
311static const char *sis5595_names[] = {
312  SENSORS_SIS5595_PREFIX, NULL
313};
314
315static const FeatureDescriptor sis5595_features[] = {
316  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN0, 0,
317    { SENSORS_SIS5595_IN0, SENSORS_SIS5595_IN0_MIN, SENSORS_SIS5595_IN0_MAX, -1 } },
318  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN1, 0,
319    { SENSORS_SIS5595_IN1, SENSORS_SIS5595_IN1_MIN, SENSORS_SIS5595_IN1_MAX, -1 } },
320  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN2, 0,
321    { SENSORS_SIS5595_IN2, SENSORS_SIS5595_IN2_MIN, SENSORS_SIS5595_IN2_MAX, -1 } },
322  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN3, 0,
323    { SENSORS_SIS5595_IN3, SENSORS_SIS5595_IN3_MIN, SENSORS_SIS5595_IN3_MAX, -1 } },
324  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN4, 0,
325    { SENSORS_SIS5595_IN4, SENSORS_SIS5595_IN4_MIN, SENSORS_SIS5595_IN4_MAX, -1 } },
326  { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN1, 0,
327    { SENSORS_SIS5595_FAN1, SENSORS_SIS5595_FAN1_MIN, SENSORS_SIS5595_FAN1_DIV, -1 } },
328  { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN2, 0,
329    { SENSORS_SIS5595_FAN2, SENSORS_SIS5595_FAN2_MIN, SENSORS_SIS5595_FAN2_DIV, -1 } },
330  { fmtTemps_0, rrdF0, DataType_temperature, SIS5595_ALARM_TEMP, 0,
331    { SENSORS_SIS5595_TEMP, SENSORS_SIS5595_TEMP_OVER, SENSORS_SIS5595_TEMP_HYST, -1 } },
332  { fmtBoardTemperatureInput, NULL, DataType_other, SIS5595_ALARM_BTI, 0,
333    { SENSORS_SIS5595_ALARMS, -1 } },
334  { NULL }
335};
336
337static const ChipDescriptor sis5595_chip = {
338  sis5595_names, sis5595_features, SENSORS_SIS5595_ALARMS, 0
339};
340
341/** VIA686A **/
342
343static const char *via686a_names[] = {
344  SENSORS_VIA686A_PREFIX, NULL
345};
346
347static const FeatureDescriptor via686a_features[] = {
348  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN0, 0,
349    { SENSORS_VIA686A_IN0, SENSORS_VIA686A_IN0_MIN, SENSORS_VIA686A_IN0_MAX, -1 } },
350  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN1, 0,
351    { SENSORS_VIA686A_IN1, SENSORS_VIA686A_IN1_MIN, SENSORS_VIA686A_IN1_MAX, -1 } },
352  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN2, 0,
353    { SENSORS_VIA686A_IN2, SENSORS_VIA686A_IN2_MIN, SENSORS_VIA686A_IN2_MAX, -1 } },
354  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN3, 0,
355    { SENSORS_VIA686A_IN3, SENSORS_VIA686A_IN3_MIN, SENSORS_VIA686A_IN3_MAX, -1 } },
356  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN4, 0,
357    { SENSORS_VIA686A_IN4, SENSORS_VIA686A_IN4_MIN, SENSORS_VIA686A_IN4_MAX, -1 } },
358  { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN1, 0,
359    { SENSORS_VIA686A_FAN1, SENSORS_VIA686A_FAN1_MIN, SENSORS_VIA686A_FAN1_DIV, -1 } },
360  { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN2, 0,
361    { SENSORS_VIA686A_FAN2, SENSORS_VIA686A_FAN2_MIN, SENSORS_VIA686A_FAN2_DIV, -1 } },
362  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP, 0,
363    { SENSORS_VIA686A_TEMP, SENSORS_VIA686A_TEMP_OVER, SENSORS_VIA686A_TEMP_HYST, -1 } },
364  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP2, 0,
365    { SENSORS_VIA686A_TEMP2, SENSORS_VIA686A_TEMP2_OVER, SENSORS_VIA686A_TEMP2_HYST, -1 } },
366  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP3, 0,
367    { SENSORS_VIA686A_TEMP3, SENSORS_VIA686A_TEMP3_OVER, SENSORS_VIA686A_TEMP3_HYST, -1 } },
368  { NULL }
369};
370
371static const ChipDescriptor via686a_chip = {
372  via686a_names, via686a_features, SENSORS_VIA686A_ALARMS, 0
373};
374
375/** LM78 **/
376
377static const char *lm78_names[] = {
378  SENSORS_LM78_PREFIX, SENSORS_LM78J_PREFIX, SENSORS_LM79_PREFIX, NULL
379};
380
381static const FeatureDescriptor lm78_features[] = {
382  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN0, 0,
383    { SENSORS_LM78_IN0, SENSORS_LM78_IN0_MIN, SENSORS_LM78_IN0_MAX, -1 } },
384  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN1, 0,
385    { SENSORS_LM78_IN1, SENSORS_LM78_IN1_MIN, SENSORS_LM78_IN1_MAX, -1 } },
386  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN2, 0,
387    { SENSORS_LM78_IN2, SENSORS_LM78_IN2_MIN, SENSORS_LM78_IN2_MAX, -1 } },
388  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN3, 0,
389    { SENSORS_LM78_IN3, SENSORS_LM78_IN3_MIN, SENSORS_LM78_IN3_MAX, -1 } },
390  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN4, 0,
391    { SENSORS_LM78_IN4, SENSORS_LM78_IN4_MIN, SENSORS_LM78_IN4_MAX, -1 } },
392  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN5, 0,
393    { SENSORS_LM78_IN5, SENSORS_LM78_IN5_MIN, SENSORS_LM78_IN5_MAX, -1 } },
394  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN6, 0,
395    { SENSORS_LM78_IN6, SENSORS_LM78_IN6_MIN, SENSORS_LM78_IN6_MAX, -1 } },
396  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN1, 0,
397    { SENSORS_LM78_FAN1, SENSORS_LM78_FAN1_MIN, SENSORS_LM78_FAN1_DIV, -1 } },
398  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN2, 0,
399    { SENSORS_LM78_FAN2, SENSORS_LM78_FAN2_MIN, SENSORS_LM78_FAN2_DIV, -1 } },
400  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN3, 0,
401    { SENSORS_LM78_FAN3, SENSORS_LM78_FAN3_MIN, SENSORS_LM78_FAN3_DIV, -1 } },
402  { fmtTemps_1_0, rrdF1, DataType_rpm, LM78_ALARM_TEMP, 0,
403    { SENSORS_LM78_TEMP, SENSORS_LM78_TEMP_OVER, SENSORS_LM78_TEMP_HYST, -1 } },
404  { fmtVolt_2, rrdF2, DataType_voltage, 0, 0,
405    { SENSORS_LM78_VID, -1 } },
406  { fmtBoardTemperatureInput, NULL, DataType_other, LM78_ALARM_BTI, 0,
407    { SENSORS_LM78_ALARMS, -1 } },
408  { fmtChassisIntrusionDetection, NULL, DataType_other, LM78_ALARM_CHAS, 0,
409    { SENSORS_LM78_ALARMS, -1 } },
410  { NULL }
411};
412
413static const ChipDescriptor lm78_chip = {
414  lm78_names, lm78_features, SENSORS_LM78_ALARMS, 0
415};
416
417/** GL518 **/
418
419/* N.B: sensors supports a "gl518sm-r00" but it is not picked up in main.c...
420static const char *
421fmtVolts_GL518_R00
422(const double values[], int alarm, int beep) {
423  if (values[0] == 0.0)
424    sprintf (buff, "n/a (min = %+.2f V, max = %+.2f V)", values[1], values[2]);
425  else
426    sprintf (buff, "%+.2f V (min = %+.2f V, max = %+.2f V)", values[0], values[1], values[2]);
427  return fmtExtra (alarm, beep);
428}
429*/
430
431static const char *gl518_names[] = {
432  SENSORS_GL518_PREFIX, NULL
433};
434
435static const FeatureDescriptor gl518_features[] = {
436  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VDD, GL518_ALARM_VDD,
437    { SENSORS_GL518_VDD, SENSORS_GL518_VDD_MIN, SENSORS_GL518_VDD_MAX, -1 } },
438  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN1, GL518_ALARM_VIN1,
439    { SENSORS_GL518_VIN1, SENSORS_GL518_VIN1_MIN, SENSORS_GL518_VIN1_MAX, -1 } },
440  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN2, GL518_ALARM_VIN2,
441    { SENSORS_GL518_VIN2, SENSORS_GL518_VIN2_MIN, SENSORS_GL518_VIN2_MAX, -1 } },
442  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN3, GL518_ALARM_VIN3,
443    { SENSORS_GL518_VIN3, SENSORS_GL518_VIN3_MIN, SENSORS_GL518_VIN3_MAX, -1 } },
444  { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN1, GL518_ALARM_FAN1,
445    { SENSORS_GL518_FAN1, SENSORS_GL518_FAN1_MIN, SENSORS_GL518_FAN1_DIV, -1 } },
446  { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN2, GL518_ALARM_FAN2,
447    { SENSORS_GL518_FAN2, SENSORS_GL518_FAN2_MIN, SENSORS_GL518_FAN2_DIV, -1 } },
448  { fmtTemps_1_0, rrdF1, DataType_temperature, GL518_ALARM_TEMP, GL518_ALARM_TEMP,
449    { SENSORS_GL518_TEMP, SENSORS_GL518_TEMP_OVER, SENSORS_GL518_TEMP_HYST, -1 } },
450  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
451    { SENSORS_GL518_BEEP_ENABLE, -1 } },
452  { NULL }
453};
454
455static const ChipDescriptor gl518_chip = {
456  gl518_names, gl518_features, SENSORS_GL518_ALARMS, SENSORS_GL518_BEEPS
457};
458
459/** ADM1025 **/
460
461static const char *
462fmtTemps_ADM1025
463(const double values[], int alarm, int beep) {
464  sprintf (buff, "%.1f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
465  return fmtExtra (alarm, beep);
466}
467
468static const char *adm1025_names[] = {
469  SENSORS_ADM1025_PREFIX, NULL
470};
471
472static const FeatureDescriptor adm1025_features[] = {
473  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN0, 0,
474    { SENSORS_ADM1025_IN0, SENSORS_ADM1025_IN0_MIN, SENSORS_ADM1025_IN0_MAX, -1 } },
475  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN1, 0,
476    { SENSORS_ADM1025_IN1, SENSORS_ADM1025_IN1_MIN, SENSORS_ADM1025_IN1_MAX, -1 } },
477  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN2, 0,
478    { SENSORS_ADM1025_IN2, SENSORS_ADM1025_IN2_MIN, SENSORS_ADM1025_IN2_MAX, -1 } },
479  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN3, 0,
480    { SENSORS_ADM1025_IN3, SENSORS_ADM1025_IN3_MIN, SENSORS_ADM1025_IN3_MAX, -1 } },
481  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN4, 0,
482    { SENSORS_ADM1025_IN4, SENSORS_ADM1025_IN4_MIN, SENSORS_ADM1025_IN4_MAX, -1 } },
483  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN5, 0,
484    { SENSORS_ADM1025_IN5, SENSORS_ADM1025_IN5_MIN, SENSORS_ADM1025_IN5_MAX, -1 } },
485  { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_TEMP, 0,
486    { SENSORS_ADM1025_TEMP1, SENSORS_ADM1025_TEMP1_LOW, SENSORS_ADM1025_TEMP1_HIGH, -1 } },
487  { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_RTEMP, 0,
488    { SENSORS_ADM1025_TEMP2, SENSORS_ADM1025_TEMP2_LOW, SENSORS_ADM1025_TEMP2_HIGH, -1 } },
489  { NULL }
490};
491
492static const ChipDescriptor adm1025_chip = {
493  adm1025_names, adm1025_features, SENSORS_ADM1025_ALARMS, 0
494};
495
496/** LM80 **/
497
498static const char *
499fmtTemps_LM80
500(const double values[], int alarm, int beep) {
501  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]);
502  return fmtExtra (alarm, beep);
503}
504
505static const char *lm80_names[] = {
506  SENSORS_LM80_PREFIX, NULL
507};
508
509static const FeatureDescriptor lm80_features[] = {
510  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN0, 0,
511    { SENSORS_LM80_IN0, SENSORS_LM80_IN0_MIN, SENSORS_LM80_IN0_MAX, -1 } },
512  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN1, 0,
513    { SENSORS_LM80_IN1, SENSORS_LM80_IN1_MIN, SENSORS_LM80_IN1_MAX, -1 } },
514  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN2, 0,
515    { SENSORS_LM80_IN2, SENSORS_LM80_IN2_MIN, SENSORS_LM80_IN2_MAX, -1 } },
516  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN3, 0,
517    { SENSORS_LM80_IN3, SENSORS_LM80_IN3_MIN, SENSORS_LM80_IN3_MAX, -1 } },
518  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN4, 0,
519    { SENSORS_LM80_IN4, SENSORS_LM80_IN4_MIN, SENSORS_LM80_IN4_MAX, -1 } },
520  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN5, 0,
521    { SENSORS_LM80_IN5, SENSORS_LM80_IN5_MIN, SENSORS_LM80_IN5_MAX, -1 } },
522  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN6, 0,
523    { SENSORS_LM80_IN6, SENSORS_LM80_IN6_MIN, SENSORS_LM80_IN6_MAX, -1 } },
524  { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN1, 0,
525    { SENSORS_LM80_FAN1, SENSORS_LM80_FAN1_MIN, SENSORS_LM80_FAN1_DIV, -1 } },
526  { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN2, 0,
527    { SENSORS_LM80_FAN2, SENSORS_LM80_FAN2_MIN, SENSORS_LM80_FAN2_DIV, -1 } },
528  { fmtTemps_LM80, rrdF2, DataType_temperature, LM80_ALARM_TEMP_HOT, 0,
529    { SENSORS_LM80_TEMP, SENSORS_LM80_TEMP_HOT_MAX, SENSORS_LM80_TEMP_HOT_HYST, SENSORS_LM80_TEMP_OS_MAX, SENSORS_LM80_TEMP_OS_HYST, -1 } },
530  { fmtBoardTemperatureInput, NULL, DataType_other, LM80_ALARM_BTI, 0,
531    { SENSORS_LM80_ALARMS, -1 } },
532  { fmtChassisIntrusionDetection, NULL, DataType_other, LM80_ALARM_CHAS, 0,
533    { SENSORS_LM80_ALARMS, -1 } },
534  { NULL }
535};
536
537static const ChipDescriptor lm80_chip = {
538  lm80_names, lm80_features, SENSORS_LM80_ALARMS, 0
539};
540
541/** LM85 **/
542
543static const char *lm85_names[] = {
544  SENSORS_LM85_PREFIX, SENSORS_LM85B_PREFIX, SENSORS_LM85C_PREFIX,
545  SENSORS_ADM1027_PREFIX, SENSORS_ADT7463_PREFIX,
546  SENSORS_EMC6D100_PREFIX, SENSORS_EMC6D102_PREFIX, NULL
547};
548
549static const FeatureDescriptor lm85_features[] = {
550  { fmtVolts_2, rrdF2, DataType_voltage, LM85_ALARM_IN0, 0,
551    { SENSORS_LM85_IN0, SENSORS_LM85_IN0_MIN, SENSORS_LM85_IN0_MAX, -1 } },
552  { fmtVolts_2, rrdF2, DataType_voltage, LM85_ALARM_IN1, 0,
553    { SENSORS_LM85_IN1, SENSORS_LM85_IN1_MIN, SENSORS_LM85_IN1_MAX, -1 } },
554  { fmtVolts_2, rrdF2, DataType_voltage, LM85_ALARM_IN2, 0,
555    { SENSORS_LM85_IN2, SENSORS_LM85_IN2_MIN, SENSORS_LM85_IN2_MAX, -1 } },
556  { fmtVolts_2, rrdF2, DataType_voltage, LM85_ALARM_IN3, 0,
557    { SENSORS_LM85_IN3, SENSORS_LM85_IN3_MIN, SENSORS_LM85_IN3_MAX, -1 } },
558  { fmtVolts_2, rrdF2, DataType_voltage, LM85_ALARM_IN4, 0,
559    { SENSORS_LM85_IN4, SENSORS_LM85_IN4_MIN, SENSORS_LM85_IN4_MAX, -1 } },
560  { fmtFans_nodiv_0, rrdF0, DataType_rpm, LM85_ALARM_FAN1, 0,
561    { SENSORS_LM85_FAN1, SENSORS_LM85_FAN1_MIN, -1 } },
562  { fmtFans_nodiv_0, rrdF0, DataType_rpm, LM85_ALARM_FAN2, 0,
563    { SENSORS_LM85_FAN2, SENSORS_LM85_FAN2_MIN, -1 } },
564  { fmtFans_nodiv_0, rrdF0, DataType_rpm, LM85_ALARM_FAN3, 0,
565    { SENSORS_LM85_FAN3, SENSORS_LM85_FAN3_MIN, -1 } },
566  { fmtFans_nodiv_0, rrdF0, DataType_rpm, LM85_ALARM_FAN4, 0,
567    { SENSORS_LM85_FAN4, SENSORS_LM85_FAN4_MIN, -1 } },
568  { fmtTemps_minmax_0, rrdF1, DataType_temperature, LM85_ALARM_TEMP1, 0,
569    { SENSORS_LM85_TEMP1, SENSORS_LM85_TEMP1_MIN, SENSORS_LM85_TEMP1_MAX, -1 } },
570  { fmtTemps_minmax_0, rrdF1, DataType_temperature, LM85_ALARM_TEMP2, 0,
571    { SENSORS_LM85_TEMP2, SENSORS_LM85_TEMP2_MIN, SENSORS_LM85_TEMP2_MAX, -1 } },
572  { fmtTemps_minmax_0, rrdF1, DataType_temperature, LM85_ALARM_TEMP3, 0,
573    { SENSORS_LM85_TEMP3, SENSORS_LM85_TEMP3_MIN, SENSORS_LM85_TEMP3_MAX, -1 } },
574  { NULL }
575};
576
577static const ChipDescriptor lm85_chip = {
578  lm85_names, lm85_features, SENSORS_LM85_ALARMS, 0
579};
580
581/** LM87 **/
582
583static const char *lm87_names[] = {
584  SENSORS_LM87_PREFIX, NULL
585};
586
587static const FeatureDescriptor lm87_features[] = {
588  { fmtVolts_2, rrdF2, DataType_voltage, LM87_ALARM_IN0, 0,
589    { SENSORS_LM87_IN0, SENSORS_LM87_IN0_MIN, SENSORS_LM87_IN0_MAX, -1 } },
590  { fmtVolts_2, rrdF2, DataType_voltage, LM87_ALARM_IN1, 0,
591    { SENSORS_LM87_IN1, SENSORS_LM87_IN1_MIN, SENSORS_LM87_IN1_MAX, -1 } },
592  { fmtVolts_2, rrdF2, DataType_voltage, LM87_ALARM_IN2, 0,
593    { SENSORS_LM87_IN2, SENSORS_LM87_IN2_MIN, SENSORS_LM87_IN2_MAX, -1 } },
594  { fmtVolts_2, rrdF2, DataType_voltage, LM87_ALARM_IN3, 0,
595    { SENSORS_LM87_IN3, SENSORS_LM87_IN3_MIN, SENSORS_LM87_IN3_MAX, -1 } },
596  { fmtVolts_2, rrdF2, DataType_voltage, LM87_ALARM_IN4, 0,
597    { SENSORS_LM87_IN4, SENSORS_LM87_IN4_MIN, SENSORS_LM87_IN4_MAX, -1 } },
598  { fmtVolts_2, rrdF2, DataType_voltage, LM87_ALARM_IN5, 0,
599    { SENSORS_LM87_IN5, SENSORS_LM87_IN5_MIN, SENSORS_LM87_IN5_MAX, -1 } },
600  { fmtFans_0, rrdF0, DataType_rpm, LM87_ALARM_FAN1, 0,
601    { SENSORS_LM87_FAN1, SENSORS_LM87_FAN1_MIN, SENSORS_LM87_FAN1_DIV, -1 } },
602  { fmtFans_0, rrdF0, DataType_rpm, LM87_ALARM_FAN2, 0,
603    { SENSORS_LM87_FAN2, SENSORS_LM87_FAN2_MIN, SENSORS_LM87_FAN2_DIV, -1 } },
604  { fmtTemps_minmax_0, rrdF1, DataType_temperature, LM87_ALARM_TEMP1, 0,
605    { SENSORS_LM87_TEMP1, SENSORS_LM87_TEMP1_HYST, SENSORS_LM87_TEMP1_OVER, -1 } },
606  { fmtTemps_minmax_0, rrdF1, DataType_temperature, LM87_ALARM_TEMP2, 0,
607    { SENSORS_LM87_TEMP2, SENSORS_LM87_TEMP2_HYST, SENSORS_LM87_TEMP2_OVER, -1 } },
608  { fmtTemps_minmax_0, rrdF1, DataType_temperature, LM87_ALARM_TEMP3, 0,
609    { SENSORS_LM87_TEMP3, SENSORS_LM87_TEMP3_HYST, SENSORS_LM87_TEMP3_OVER, -1 } },
610  { NULL }
611};
612
613static const ChipDescriptor lm87_chip = {
614  lm87_names, lm87_features, SENSORS_LM87_ALARMS, 0
615};
616
617/** IT87 (thanks to Mike Black) **/
618
619static const char *it87_names[] = {
620  SENSORS_IT87_PREFIX, SENSORS_IT8712_PREFIX,
621  SENSORS_IT8716_PREFIX, SENSORS_IT8718_PREFIX, SENSORS_IT8720_PREFIX, NULL
622};
623
624static const FeatureDescriptor it87_features[] = {
625  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN0, 0,
626    { SENSORS_IT87_IN0, SENSORS_IT87_IN0_MIN, SENSORS_IT87_IN0_MAX, -1 } },
627  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN1, 0,
628    { SENSORS_IT87_IN1, SENSORS_IT87_IN1_MIN, SENSORS_IT87_IN1_MAX, -1 } },
629  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN2, 0,
630    { SENSORS_IT87_IN2, SENSORS_IT87_IN2_MIN, SENSORS_IT87_IN2_MAX, -1 } },
631  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN3, 0,
632    { SENSORS_IT87_IN3, SENSORS_IT87_IN3_MIN, SENSORS_IT87_IN3_MAX, -1 } },
633  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN4, 0,
634    { SENSORS_IT87_IN4, SENSORS_IT87_IN4_MIN, SENSORS_IT87_IN4_MAX, -1 } },
635  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN5, 0,
636    { SENSORS_IT87_IN5, SENSORS_IT87_IN5_MIN, SENSORS_IT87_IN5_MAX, -1 } },
637  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN6, 0,
638    { SENSORS_IT87_IN6, SENSORS_IT87_IN6_MIN, SENSORS_IT87_IN6_MAX, -1 } },
639  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN7, 0,
640    { SENSORS_IT87_IN7, SENSORS_IT87_IN7_MIN, SENSORS_IT87_IN7_MAX, -1 } },
641  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN1, 0,
642    { SENSORS_IT87_FAN1, SENSORS_IT87_FAN1_MIN, -1 } },
643  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN2, 0,
644    { SENSORS_IT87_FAN2, SENSORS_IT87_FAN2_MIN, -1 } },
645  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN3, 0,
646    { SENSORS_IT87_FAN3, SENSORS_IT87_FAN3_MIN, -1 } },
647  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP1, 0,
648    { SENSORS_IT87_TEMP1, SENSORS_IT87_TEMP1_LOW, SENSORS_IT87_TEMP1_HIGH, -1 } },
649  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP2, 0,
650    { SENSORS_IT87_TEMP2, SENSORS_IT87_TEMP2_LOW, SENSORS_IT87_TEMP2_HIGH, -1 } },
651  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP3, 0,
652    { SENSORS_IT87_TEMP3, SENSORS_IT87_TEMP3_LOW, SENSORS_IT87_TEMP3_HIGH, -1 } },
653  { NULL }
654};
655
656static const ChipDescriptor it87_chip = {
657  it87_names, it87_features, SENSORS_IT87_ALARMS, 0
658};
659
660/** W83781D **/
661
662static const char *
663fmtTemps_W83781D
664(const double values[], int alarm, int beep) {
665  if (values[2] == 127) {
666    sprintf (buff, "%.0f C (limit = %.0f C)",
667             values[0], values[1]);
668  } else {
669    sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C)",
670             values[0], values[1], values[2]);
671  }
672  return fmtExtra (alarm, beep);
673}
674
675static const char *w83781d_names[] = {
676  SENSORS_W83781D_PREFIX, NULL
677};
678
679static const FeatureDescriptor w83781d_features[] = {
680  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
681    { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } },
682  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
683    { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } },
684  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
685    { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } },
686  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
687    { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } },
688  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
689    { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } },
690  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
691    { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } },
692  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
693    { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } },
694  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
695    { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } },
696  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
697    { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } },
698  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
699    { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } },
700  { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
701    { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } },
702  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23,
703    { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } },
704  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23,
705    { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } },
706  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
707    { SENSORS_W83781D_VID, -1 } },
708  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
709    { SENSORS_W83781D_ALARMS, -1 } },
710  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
711    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
712  { NULL }
713};
714
715static const ChipDescriptor w83781d_chip = {
716  w83781d_names, w83781d_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
717};
718
719/** AS99127F **/
720
721static const char *as99127f_names[] = {
722  SENSORS_AS99127F_PREFIX, NULL
723};
724
725static const FeatureDescriptor as99127f_features[] = {
726  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
727    { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } },
728  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
729    { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } },
730  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
731    { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } },
732  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
733    { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } },
734  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
735    { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } },
736  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
737    { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } },
738  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
739    { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } },
740  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
741    { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } },
742  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
743    { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } },
744  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
745    { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } },
746  { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
747    { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } },
748  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
749    { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } },
750  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3,
751    { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } },
752  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
753    { SENSORS_W83781D_VID, -1 } },
754  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
755    { SENSORS_W83781D_ALARMS, -1 } },
756  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
757    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
758  { NULL }
759};
760
761static const ChipDescriptor as99127f_chip = {
762  as99127f_names, as99127f_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
763};
764
765/** W83782D **/
766
767static const char *
768fmtTemps_W8378x_0
769(const double values[], int alarm, int beep) {
770  int sensorID = (int) values[3];
771  const char *sensor = (sensorID == 1) ? "PII/Celeron diode" :
772    (sensorID == 2) ? "3904 transistor" : "thermistor";
773  if (values[2] == 127) {
774    sprintf (buff, "%.0f C (limit = %.0f C, sensors = %s)",
775             values[0], values[1], sensor);
776  } else {
777    sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C, sensors = %s)",
778             values[0], values[1], values[2], sensor);
779  }
780  return fmtExtra (alarm, beep);
781}
782
783static const char *
784fmtTemps_W8378x_1
785(const double values[], int alarm, int beep) {
786  int sensorID = (int) values[3];
787  const char *sensor = (sensorID == 1) ? "PII/Celeron diode" :
788    (sensorID == 2) ? "3904 transistor" : "thermistor";
789  sprintf (buff, "%.1f C (limit = %.0f C, hysteresis = %.0f C, sensor = %s)",
790           values[0], values[1], values[2], sensor);
791  return fmtExtra (alarm, beep);
792}
793
794static const char *w83782d_names[] = {
795  SENSORS_W83782D_PREFIX, SENSORS_W83627HF_PREFIX, SENSORS_W83627THF_PREFIX, SENSORS_W83637HF_PREFIX, NULL
796};
797
798static const FeatureDescriptor w83782d_features[] = {
799  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
800    { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } },
801  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
802    { SENSORS_W83782D_IN1, SENSORS_W83782D_IN1_MIN, SENSORS_W83782D_IN1_MAX, -1 } },
803  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
804    { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } },
805  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
806    { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } },
807  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
808    { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } },
809  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
810    { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } },
811  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
812    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
813  { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN7, W83782D_ALARM_IN7,
814    { SENSORS_W83782D_IN7, SENSORS_W83782D_IN7_MIN, SENSORS_W83782D_IN7_MAX, -1 } },
815  { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN8, W83782D_ALARM_IN8,
816    { SENSORS_W83782D_IN8, SENSORS_W83782D_IN8_MIN, SENSORS_W83782D_IN8_MAX, -1 } },
817  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
818    { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } },
819  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
820    { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } },
821  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
822    { SENSORS_W83782D_FAN3, SENSORS_W83782D_FAN3_MIN, SENSORS_W83782D_FAN3_DIV, -1 } },
823  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
824    { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } },
825  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
826    { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } },
827  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3,
828    { SENSORS_W83782D_TEMP3, SENSORS_W83782D_TEMP3_OVER, SENSORS_W83782D_TEMP3_HYST, SENSORS_W83782D_SENS3, -1 } },
829  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
830    { SENSORS_W83782D_VID, -1 } },
831  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
832    { SENSORS_W83781D_ALARMS, -1 } },
833  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
834    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
835  { NULL }
836};
837
838static const ChipDescriptor w83782d_chip = {
839  w83782d_names, w83782d_features, SENSORS_W83782D_ALARMS, SENSORS_W83782D_BEEPS
840};
841
842/** W83783S **/
843
844static const char *w83783s_names[] = {
845  SENSORS_W83783S_PREFIX, NULL
846};
847
848static const FeatureDescriptor w83783s_features[] = {
849  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
850    { SENSORS_W83783S_IN0, SENSORS_W83783S_IN0_MIN, SENSORS_W83783S_IN0_MAX, -1 } },
851  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
852    { SENSORS_W83783S_IN2, SENSORS_W83783S_IN2_MIN, SENSORS_W83783S_IN2_MAX, -1 } },
853  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
854    { SENSORS_W83783S_IN3, SENSORS_W83783S_IN3_MIN, SENSORS_W83783S_IN3_MAX, -1 } },
855  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
856    { SENSORS_W83783S_IN4, SENSORS_W83783S_IN4_MIN, SENSORS_W83783S_IN4_MAX, -1 } },
857  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
858    { SENSORS_W83783S_IN5, SENSORS_W83783S_IN5_MIN, SENSORS_W83783S_IN5_MAX, -1 } },
859  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
860    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
861  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
862    { SENSORS_W83783S_FAN1, SENSORS_W83783S_FAN1_MIN, SENSORS_W83783S_FAN1_DIV, -1 } },
863  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
864    { SENSORS_W83783S_FAN2, SENSORS_W83783S_FAN2_MIN, SENSORS_W83783S_FAN2_DIV, -1 } },
865  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
866    { SENSORS_W83783S_FAN3, SENSORS_W83783S_FAN3_MIN, SENSORS_W83783S_FAN3_DIV, -1 } },
867  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
868    { SENSORS_W83783S_TEMP1, SENSORS_W83783S_TEMP1_OVER, SENSORS_W83783S_TEMP1_HYST, SENSORS_W83783S_SENS1, -1 } },
869  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
870    { SENSORS_W83783S_TEMP2, SENSORS_W83783S_TEMP2_OVER, SENSORS_W83783S_TEMP2_HYST, SENSORS_W83783S_SENS2, -1 } },
871  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
872    { SENSORS_W83783S_VID, -1 } },
873  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
874    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
875  { NULL }
876};
877
878static const ChipDescriptor w83783s_chip = {
879  w83783s_names, w83783s_features, SENSORS_W83783S_ALARMS, SENSORS_W83783S_BEEPS
880};
881
882/** W83697HF **/
883
884static const char *w83697hf_names[] = {
885  SENSORS_W83697HF_PREFIX, NULL
886};
887
888static const FeatureDescriptor w83697hf_features[] = {
889  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
890    { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } },
891  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
892    { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } },
893  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
894    { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } },
895  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
896    { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } },
897  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
898    { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } },
899  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
900    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
901  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
902    { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } },
903  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
904    { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } },
905  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
906    { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } },
907  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
908    { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } },
909  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
910    { SENSORS_W83781D_ALARMS, -1 } },
911  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
912    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
913  { NULL }
914};
915
916static const ChipDescriptor w83697hf_chip = {
917  w83697hf_names, w83697hf_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
918};
919
920
921/** MAXILIFE **/
922
923static const char *
924fmtTemps_Maxilife
925(const double values[], int alarm, int beep) {
926  if (!values[0] && !values[1] && !values[2])
927    return NULL;
928  return fmtTemps_1_0 (values, alarm, beep);
929}
930
931static const char *
932rrdTemps_Maxilife
933(const double values[]) {
934  if (!values[0] && !values[1] && !values[2])
935    return NULL;
936  return rrdF1 (values);
937}
938
939static const char *
940fmtFans_Maxilife
941(const double values[], int alarm, int beep) {
942  if (!values[0] && !values[1] && !values[2])
943    return NULL;
944  if (values[0] < 0) {
945    sprintf (buff, "Off (min = %.0f RPM, div = %.0f)", values[1], values[2]); 
946  } else {
947    sprintf (buff, "%.0f RPM (min = %.0f RPM, div = %.0f)", values[0] / values[2], values[1] / values[2], values[2]); 
948  }
949  return fmtExtra (alarm, beep);
950}
951
952static const char *
953rrdFans_Maxilife
954(const double values[]) {
955  if (!values[0] && !values[1] && !values[2])
956    return NULL;
957  if (values[0] < 0) {
958    return NULL;
959  } else {
960    sprintf (buff, "%.0f", values[0] / values[2]);
961    return buff;
962  }
963}
964
965static const char *
966fmtMHz_Maxilife
967(const double values[], int alarm, int beep) {
968  if (!values[0] && !values[1] && !values[2])
969    return NULL;
970  return fmtMHz_2 (values, alarm, beep);
971}
972
973static const char *
974rrdMHz_Maxilife
975(const double values[]) {
976  if (!values[0] && !values[1] && !values[2])
977    return NULL;
978  return rrdF2 (values);
979}
980
981static const char *
982fmtVolts_Maxilife
983(const double values[], int alarm, int beep) {
984  if (!values[0] && !values[1] && !values[2])
985    return NULL;
986  return fmtVolts_2 (values, alarm, beep);
987}
988
989static const char *
990rrdVolts_Maxilife
991(const double values[]) {
992  if (!values[0] && !values[1] && !values[2])
993    return NULL;
994  return rrdF2 (values);
995}
996
997static const char *maxilife_names[] = {
998  SENSORS_MAXI_CG_PREFIX, SENSORS_MAXI_CO_PREFIX, SENSORS_MAXI_AS_PREFIX, SENSORS_MAXI_NBA_PREFIX, NULL
999};
1000
1001static const FeatureDescriptor maxilife_features[] = {
1002  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0,
1003    { SENSORS_MAXI_CG_TEMP1, SENSORS_MAXI_CG_TEMP1_MAX, SENSORS_MAXI_CG_TEMP1_HYST, -1 } },
1004  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP2, 0,
1005    { SENSORS_MAXI_CG_TEMP2, SENSORS_MAXI_CG_TEMP2_MAX, SENSORS_MAXI_CG_TEMP2_HYST, -1 } },
1006  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0,
1007    { SENSORS_MAXI_CG_TEMP3, SENSORS_MAXI_CG_TEMP3_MAX, SENSORS_MAXI_CG_TEMP3_HYST, -1 } },
1008  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP4, 0,
1009    { SENSORS_MAXI_CG_TEMP4, SENSORS_MAXI_CG_TEMP4_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } },
1010  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP5, 0,
1011    { SENSORS_MAXI_CG_TEMP5, SENSORS_MAXI_CG_TEMP5_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } },
1012  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN1, 0,
1013    { SENSORS_MAXI_CG_FAN1, SENSORS_MAXI_CG_FAN1_MIN, SENSORS_MAXI_CG_FAN1_DIV, -1 } },
1014  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN2, 0,
1015    { SENSORS_MAXI_CG_FAN2, SENSORS_MAXI_CG_FAN2_MIN, SENSORS_MAXI_CG_FAN2_DIV, -1 } },
1016  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN3, 0,
1017    { SENSORS_MAXI_CG_FAN3, SENSORS_MAXI_CG_FAN3_MIN, SENSORS_MAXI_CG_FAN3_DIV, -1 } },
1018  { fmtMHz_Maxilife, rrdMHz_Maxilife, DataType_mhz, MAXI_ALARM_PLL, 0,
1019    { SENSORS_MAXI_CG_PLL, SENSORS_MAXI_CG_PLL_MIN, SENSORS_MAXI_CG_PLL_MAX, -1 } },
1020  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID1, 0,
1021    { SENSORS_MAXI_CG_VID1, SENSORS_MAXI_CG_VID1_MIN, SENSORS_MAXI_CG_VID1_MAX, -1 } },
1022  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID2, 0,
1023    { SENSORS_MAXI_CG_VID2, SENSORS_MAXI_CG_VID2_MIN, SENSORS_MAXI_CG_VID2_MAX, -1 } },
1024  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID3, 0,
1025    { SENSORS_MAXI_CG_VID3, SENSORS_MAXI_CG_VID3_MIN, SENSORS_MAXI_CG_VID3_MAX, -1 } },
1026  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID4, 0,
1027    { SENSORS_MAXI_CG_VID4, SENSORS_MAXI_CG_VID4_MIN, SENSORS_MAXI_CG_VID4_MAX, -1 } },
1028  { NULL }
1029};
1030
1031static const ChipDescriptor maxilife_chip = {
1032  maxilife_names, maxilife_features, SENSORS_MAXI_CG_ALARMS, 0
1033};
1034
1035/** ASB100 **/
1036
1037static const char *asb100_names[] = {
1038        SENSORS_ASB100_PREFIX, NULL
1039};
1040
1041static const FeatureDescriptor asb100_features[] = {
1042  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1043    { SENSORS_ASB100_IN0, SENSORS_ASB100_IN0_MIN, SENSORS_ASB100_IN0_MAX, -1 } },
1044  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1045    { SENSORS_ASB100_IN1, SENSORS_ASB100_IN1_MIN, SENSORS_ASB100_IN1_MAX, -1 } },
1046  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1047    { SENSORS_ASB100_IN2, SENSORS_ASB100_IN2_MIN, SENSORS_ASB100_IN2_MAX, -1 } },
1048  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1049    { SENSORS_ASB100_IN3, SENSORS_ASB100_IN3_MIN, SENSORS_ASB100_IN3_MAX, -1 } },
1050  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1051    { SENSORS_ASB100_IN4, SENSORS_ASB100_IN4_MIN, SENSORS_ASB100_IN4_MAX, -1 } },
1052  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1053    { SENSORS_ASB100_IN5, SENSORS_ASB100_IN5_MIN, SENSORS_ASB100_IN5_MAX, -1 } },
1054  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1055    { SENSORS_ASB100_IN6, SENSORS_ASB100_IN6_MIN, SENSORS_ASB100_IN6_MAX, -1 } },
1056
1057  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1058    { SENSORS_ASB100_FAN1, SENSORS_ASB100_FAN1_MIN, -1 } },
1059  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1060    { SENSORS_ASB100_FAN2, SENSORS_ASB100_FAN2_MIN, -1 } },
1061  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1062    { SENSORS_ASB100_FAN3, SENSORS_ASB100_FAN3_MIN, -1 } },
1063
1064  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
1065    { SENSORS_ASB100_TEMP1, SENSORS_ASB100_TEMP1_HYST, SENSORS_ASB100_TEMP1_OVER, -1 } },
1066  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
1067    { SENSORS_ASB100_TEMP2, SENSORS_ASB100_TEMP2_HYST, SENSORS_ASB100_TEMP2_OVER, -1 } },
1068  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
1069    { SENSORS_ASB100_TEMP3, SENSORS_ASB100_TEMP3_HYST, SENSORS_ASB100_TEMP3_OVER, -1 } },
1070  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
1071    { SENSORS_ASB100_TEMP4, SENSORS_ASB100_TEMP4_HYST, SENSORS_ASB100_TEMP4_OVER, -1 } },
1072
1073  { NULL }
1074};
1075
1076static const ChipDescriptor asb100_chip = {
1077  asb100_names, asb100_features, 0, 0
1078};
1079
1080/** PC87360 **/
1081
1082static const char *
1083fmtTemps_PC87360_0
1084(const double values[], int alarm, int beep) {
1085  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C, crit = %.0f C)",
1086           values[0], values[1], values[2], values[3]);
1087  return fmtExtra (alarm, beep);
1088}
1089
1090static const char *
1091fmtTemps_PC87360_1
1092(const double values[], int alarm, int beep) {
1093  sprintf (buff, "%.1f C (min = %.1f C, max = %.1f C, crit = %.1f C)",
1094           values[0], values[1], values[2], values[3]);
1095  return fmtExtra (alarm, beep);
1096}
1097
1098static const char *pc87360_names[] = {
1099  SENSORS_PC87360_PREFIX,
1100  SENSORS_PC87363_PREFIX,
1101  SENSORS_PC87364_PREFIX,
1102  SENSORS_PC87365_PREFIX,
1103  SENSORS_PC87366_PREFIX,
1104  NULL
1105};
1106
1107static const FeatureDescriptor pc87360_features[] = {
1108  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1109    { SENSORS_PC87360_FAN1, SENSORS_PC87360_FAN1_MIN, SENSORS_PC87360_FAN1_DIV, -1 } },
1110  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1111    { SENSORS_PC87360_FAN2, SENSORS_PC87360_FAN2_MIN, SENSORS_PC87360_FAN2_DIV, -1 } },
1112  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1113    { SENSORS_PC87360_FAN3, SENSORS_PC87360_FAN3_MIN, SENSORS_PC87360_FAN3_DIV, -1 } },
1114
1115  { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 0, 0,
1116    { SENSORS_PC87360_TEMP1, SENSORS_PC87360_TEMP1_MIN, SENSORS_PC87360_TEMP1_MAX,
1117      SENSORS_PC87360_TEMP1_CRIT, -1 } },
1118  { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 2, 0,
1119    { SENSORS_PC87360_TEMP2, SENSORS_PC87360_TEMP2_MIN, SENSORS_PC87360_TEMP2_MAX,
1120      SENSORS_PC87360_TEMP2_CRIT, -1 } },
1121  { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 4, 0,
1122    { SENSORS_PC87360_TEMP3, SENSORS_PC87360_TEMP3_MIN, SENSORS_PC87360_TEMP3_MAX,
1123      SENSORS_PC87360_TEMP3_CRIT, -1 } },
1124  { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0,
1125    { SENSORS_PC87360_TEMP4, SENSORS_PC87360_TEMP4_MIN, SENSORS_PC87360_TEMP4_MAX,
1126      SENSORS_PC87360_TEMP4_CRIT, -1 } },
1127  { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0,
1128    { SENSORS_PC87360_TEMP5, SENSORS_PC87360_TEMP5_MIN, SENSORS_PC87360_TEMP5_MAX,
1129      SENSORS_PC87360_TEMP5_CRIT, -1 } },
1130  { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0,
1131    { SENSORS_PC87360_TEMP6, SENSORS_PC87360_TEMP6_MIN, SENSORS_PC87360_TEMP6_MAX,
1132      SENSORS_PC87360_TEMP6_CRIT, -1 } },
1133
1134  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1135    { SENSORS_PC87360_IN0, SENSORS_PC87360_IN0_MIN, SENSORS_PC87360_IN0_MAX, -1 } },
1136  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1137    { SENSORS_PC87360_IN1, SENSORS_PC87360_IN1_MIN, SENSORS_PC87360_IN1_MAX, -1 } },
1138  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1139    { SENSORS_PC87360_IN2, SENSORS_PC87360_IN2_MIN, SENSORS_PC87360_IN2_MAX, -1 } },
1140  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1141    { SENSORS_PC87360_IN3, SENSORS_PC87360_IN3_MIN, SENSORS_PC87360_IN3_MAX, -1 } },
1142  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1143    { SENSORS_PC87360_IN4, SENSORS_PC87360_IN4_MIN, SENSORS_PC87360_IN4_MAX, -1 } },
1144  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1145    { SENSORS_PC87360_IN5, SENSORS_PC87360_IN5_MIN, SENSORS_PC87360_IN5_MAX, -1 } },
1146  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1147    { SENSORS_PC87360_IN6, SENSORS_PC87360_IN6_MIN, SENSORS_PC87360_IN6_MAX, -1 } },
1148  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1149    { SENSORS_PC87360_IN7, SENSORS_PC87360_IN7_MIN, SENSORS_PC87360_IN7_MAX, -1 } },
1150  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1151    { SENSORS_PC87360_IN8, SENSORS_PC87360_IN8_MIN, SENSORS_PC87360_IN8_MAX, -1 } },
1152  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1153    { SENSORS_PC87360_IN9, SENSORS_PC87360_IN9_MIN, SENSORS_PC87360_IN9_MAX, -1 } },
1154  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1155    { SENSORS_PC87360_IN10, SENSORS_PC87360_IN10_MIN, SENSORS_PC87360_IN10_MAX, -1 } },
1156
1157  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
1158    { SENSORS_PC87360_VID, -1 } },
1159  { NULL }
1160};
1161
1162static const ChipDescriptor pc87360_chip = {
1163  /* No room for SENSORS_PC87360_ALARMS_IN */
1164  pc87360_names, pc87360_features, SENSORS_PC87360_ALARMS_TEMP, 0
1165};
1166
1167/** PC87427 **/
1168
1169static const char *pc87427_names[] = {
1170  SENSORS_PC87427_PREFIX,
1171  NULL
1172};
1173
1174static const FeatureDescriptor pc87427_features[] = {
1175  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1176    { SENSORS_PC87427_FAN(1), SENSORS_PC87427_FAN_MIN(1), -1 } },
1177  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1178    { SENSORS_PC87427_FAN(2), SENSORS_PC87427_FAN_MIN(2), -1 } },
1179  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1180    { SENSORS_PC87427_FAN(3), SENSORS_PC87427_FAN_MIN(3), -1 } },
1181  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1182    { SENSORS_PC87427_FAN(4), SENSORS_PC87427_FAN_MIN(4), -1 } },
1183  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1184    { SENSORS_PC87427_FAN(5), SENSORS_PC87427_FAN_MIN(5), -1 } },
1185  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1186    { SENSORS_PC87427_FAN(6), SENSORS_PC87427_FAN_MIN(6), -1 } },
1187  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1188    { SENSORS_PC87427_FAN(7), SENSORS_PC87427_FAN_MIN(7), -1 } },
1189  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1190    { SENSORS_PC87427_FAN(8), SENSORS_PC87427_FAN_MIN(8), -1 } },
1191  { NULL }
1192};
1193
1194static const ChipDescriptor pc87427_chip = {
1195  pc87427_names, pc87427_features, 0, 0
1196};
1197
1198/** W83627EHF & W83627DHG **/
1199
1200static const char *w83627ehf_names[] = {
1201  SENSORS_W83627EHF_PREFIX, SENSORS_W83627DHG_PREFIX, NULL
1202};
1203
1204static const FeatureDescriptor w83627ehf_features[] = {
1205  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1206    { SENSORS_W83627EHF_FAN1, SENSORS_W83627EHF_FAN1_MIN, SENSORS_W83627EHF_FAN1_DIV, -1 } },
1207  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1208    { SENSORS_W83627EHF_FAN2, SENSORS_W83627EHF_FAN2_MIN, SENSORS_W83627EHF_FAN2_DIV, -1 } },
1209  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1210    { SENSORS_W83627EHF_FAN3, SENSORS_W83627EHF_FAN3_MIN, SENSORS_W83627EHF_FAN3_DIV, -1 } },
1211  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1212    { SENSORS_W83627EHF_FAN4, SENSORS_W83627EHF_FAN4_MIN, SENSORS_W83627EHF_FAN4_DIV, -1 } },
1213  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1214    { SENSORS_W83627EHF_FAN5, SENSORS_W83627EHF_FAN5_MIN, SENSORS_W83627EHF_FAN5_DIV, -1 } },
1215  { fmtTemps_0, rrdF0, DataType_temperature, 0, 0,
1216    { SENSORS_W83627EHF_TEMP1, SENSORS_W83627EHF_TEMP1_OVER, SENSORS_W83627EHF_TEMP1_HYST, -1 } },
1217  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1218    { SENSORS_W83627EHF_TEMP2, SENSORS_W83627EHF_TEMP2_OVER, SENSORS_W83627EHF_TEMP2_HYST, -1 } },
1219  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1220    { SENSORS_W83627EHF_TEMP3, SENSORS_W83627EHF_TEMP3_OVER, SENSORS_W83627EHF_TEMP3_HYST, -1 } },
1221  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1222    { SENSORS_W83627EHF_IN0, SENSORS_W83627EHF_IN0_MIN, SENSORS_W83627EHF_IN0_MAX, -1 } },
1223  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1224    { SENSORS_W83627EHF_IN1, SENSORS_W83627EHF_IN1_MIN, SENSORS_W83627EHF_IN1_MAX, -1 } },
1225  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1226    { SENSORS_W83627EHF_IN2, SENSORS_W83627EHF_IN2_MIN, SENSORS_W83627EHF_IN2_MAX, -1 } },
1227  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1228    { SENSORS_W83627EHF_IN3, SENSORS_W83627EHF_IN3_MIN, SENSORS_W83627EHF_IN3_MAX, -1 } },
1229  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1230    { SENSORS_W83627EHF_IN4, SENSORS_W83627EHF_IN4_MIN, SENSORS_W83627EHF_IN4_MAX, -1 } },
1231  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1232    { SENSORS_W83627EHF_IN5, SENSORS_W83627EHF_IN5_MIN, SENSORS_W83627EHF_IN5_MAX, -1 } },
1233  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1234    { SENSORS_W83627EHF_IN6, SENSORS_W83627EHF_IN6_MIN, SENSORS_W83627EHF_IN6_MAX, -1 } },
1235  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1236    { SENSORS_W83627EHF_IN7, SENSORS_W83627EHF_IN7_MIN, SENSORS_W83627EHF_IN7_MAX, -1 } },
1237  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1238    { SENSORS_W83627EHF_IN8, SENSORS_W83627EHF_IN8_MIN, SENSORS_W83627EHF_IN8_MAX, -1 } },
1239  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1240    { SENSORS_W83627EHF_IN9, SENSORS_W83627EHF_IN9_MIN, SENSORS_W83627EHF_IN9_MAX, -1 } },
1241  { NULL }
1242};
1243
1244static const ChipDescriptor w83627ehf_chip = {
1245  w83627ehf_names, w83627ehf_features, 0, 0
1246};
1247
1248/** F71805F **/
1249
1250static const char *f71805f_names[] = {
1251  SENSORS_F71805F_PREFIX, NULL
1252};
1253
1254static const FeatureDescriptor f71805f_features[] = {
1255  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1256    { SENSORS_F71805F_IN(0), SENSORS_F71805F_IN_MIN(0), SENSORS_F71805F_IN_MAX(0), -1 } },
1257  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1258    { SENSORS_F71805F_IN(1), SENSORS_F71805F_IN_MIN(1), SENSORS_F71805F_IN_MAX(1), -1 } },
1259  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1260    { SENSORS_F71805F_IN(2), SENSORS_F71805F_IN_MIN(2), SENSORS_F71805F_IN_MAX(2), -1 } },
1261  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1262    { SENSORS_F71805F_IN(3), SENSORS_F71805F_IN_MIN(3), SENSORS_F71805F_IN_MAX(3), -1 } },
1263  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1264    { SENSORS_F71805F_IN(4), SENSORS_F71805F_IN_MIN(4), SENSORS_F71805F_IN_MAX(4), -1 } },
1265  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1266    { SENSORS_F71805F_IN(5), SENSORS_F71805F_IN_MIN(5), SENSORS_F71805F_IN_MAX(5), -1 } },
1267  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1268    { SENSORS_F71805F_IN(6), SENSORS_F71805F_IN_MIN(6), SENSORS_F71805F_IN_MAX(6), -1 } },
1269  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1270    { SENSORS_F71805F_IN(7), SENSORS_F71805F_IN_MIN(7), SENSORS_F71805F_IN_MAX(7), -1 } },
1271  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1272    { SENSORS_F71805F_IN(8), SENSORS_F71805F_IN_MIN(8), SENSORS_F71805F_IN_MAX(8), -1 } },
1273  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1274    { SENSORS_F71805F_FAN(1), SENSORS_F71805F_FAN_MIN(1), -1 } },
1275  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1276    { SENSORS_F71805F_FAN(2), SENSORS_F71805F_FAN_MIN(2), -1 } },
1277  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1278    { SENSORS_F71805F_FAN(3), SENSORS_F71805F_FAN_MIN(3), -1 } },
1279  { fmtTemps_0, rrdF0, DataType_temperature, 1 << 0, 0,
1280    { SENSORS_F71805F_TEMP(1), SENSORS_F71805F_TEMP_MAX(1), SENSORS_F71805F_TEMP_HYST(1), -1 } },
1281  { fmtTemps_0, rrdF0, DataType_temperature, 1 << 1, 0,
1282    { SENSORS_F71805F_TEMP(2), SENSORS_F71805F_TEMP_MAX(2), SENSORS_F71805F_TEMP_HYST(2), -1 } },
1283  { fmtTemps_0, rrdF0, DataType_temperature, 1 << 2, 0,
1284    { SENSORS_F71805F_TEMP(3), SENSORS_F71805F_TEMP_MAX(3), SENSORS_F71805F_TEMP_HYST(3), -1 } },
1285  { NULL }
1286};
1287
1288static const ChipDescriptor f71805f_chip = {
1289  /* No room for SENSORS_F71805F_ALARMS_IN nor SENSORS_F71805F_ALARMS_FAN */
1290  f71805f_names, f71805f_features, SENSORS_F71805F_ALARMS_TEMP, 0
1291};
1292
1293/** VT1211 **/
1294
1295static const char *vt1211_names[] = {
1296  SENSORS_VT1211_PREFIX, NULL
1297};
1298
1299static const FeatureDescriptor vt1211_features[] = {
1300  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN0, 0,
1301    { SENSORS_VT1211_IN0, SENSORS_VT1211_IN0_MIN, SENSORS_VT1211_IN0_MAX, -1 } },
1302  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN1, 0,
1303    { SENSORS_VT1211_IN1, SENSORS_VT1211_IN1_MIN, SENSORS_VT1211_IN1_MAX, -1 } },
1304  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN2, 0,
1305    { SENSORS_VT1211_IN2, SENSORS_VT1211_IN2_MIN, SENSORS_VT1211_IN2_MAX, -1 } },
1306  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN3, 0,
1307    { SENSORS_VT1211_IN3, SENSORS_VT1211_IN3_MIN, SENSORS_VT1211_IN3_MAX, -1 } },
1308  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN4, 0,
1309    { SENSORS_VT1211_IN4, SENSORS_VT1211_IN4_MIN, SENSORS_VT1211_IN4_MAX, -1 } },
1310  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN5, 0,
1311    { SENSORS_VT1211_IN5, SENSORS_VT1211_IN5_MIN, SENSORS_VT1211_IN5_MAX, -1 } },
1312  { fmtFans_0, rrdF0, DataType_rpm, VT1211_ALARM_FAN1, 0,
1313    { SENSORS_VT1211_FAN1, SENSORS_VT1211_FAN1_MIN, SENSORS_VT1211_FAN1_DIV, -1 } },
1314  { fmtFans_0, rrdF0, DataType_rpm, VT1211_ALARM_FAN2, 0,
1315    { SENSORS_VT1211_FAN2, SENSORS_VT1211_FAN2_MIN, SENSORS_VT1211_FAN2_DIV, -1 } },
1316  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP1, 0,
1317    { SENSORS_VT1211_TEMP1, SENSORS_VT1211_TEMP1_OVER, SENSORS_VT1211_TEMP1_HYST, -1 } },
1318  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP2, 0,
1319    { SENSORS_VT1211_TEMP2, SENSORS_VT1211_TEMP2_OVER, SENSORS_VT1211_TEMP2_HYST, -1 } },
1320  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP3, 0,
1321    { SENSORS_VT1211_TEMP3, SENSORS_VT1211_TEMP3_OVER, SENSORS_VT1211_TEMP3_HYST, -1 } },
1322  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP4, 0,
1323    { SENSORS_VT1211_TEMP4, SENSORS_VT1211_TEMP4_OVER, SENSORS_VT1211_TEMP4_HYST, -1 } },
1324  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP5, 0,
1325    { SENSORS_VT1211_TEMP5, SENSORS_VT1211_TEMP5_OVER, SENSORS_VT1211_TEMP5_HYST, -1 } },
1326  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP6, 0,
1327    { SENSORS_VT1211_TEMP6, SENSORS_VT1211_TEMP6_OVER, SENSORS_VT1211_TEMP6_HYST, -1 } },
1328  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP7, 0,
1329    { SENSORS_VT1211_TEMP7, SENSORS_VT1211_TEMP7_OVER, SENSORS_VT1211_TEMP7_HYST, -1 } },
1330  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
1331    { SENSORS_VT1211_VID, -1 } },
1332  { NULL }
1333};
1334
1335static const ChipDescriptor vt1211_chip = {
1336  vt1211_names, vt1211_features, SENSORS_VT1211_ALARMS, 0
1337};
1338
1339/** K8 **/
1340
1341static const char *k8temp_names[] = {
1342  SENSORS_K8TEMP_PREFIX, NULL
1343};
1344
1345static const FeatureDescriptor k8temp_features[] = {
1346  { fmtTemp_only, rrdF0, DataType_temperature, 0, 0,
1347    { SENSORS_K8TEMP_TEMP1, -1 } },
1348  { NULL }
1349};
1350
1351static const ChipDescriptor k8temp_chip = {
1352  k8temp_names, k8temp_features, 0, 0
1353};
1354
1355/** W83793 **/
1356
1357static const char *w83793_names[] = {
1358  SENSORS_W83793_PREFIX, NULL
1359};
1360
1361static const FeatureDescriptor w83793_features[] = {
1362  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1363    { SENSORS_W83793_FAN(1), SENSORS_W83793_FAN_MIN(1), -1 } },
1364  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1365    { SENSORS_W83793_FAN(2), SENSORS_W83793_FAN_MIN(2), -1 } },
1366  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1367    { SENSORS_W83793_FAN(3), SENSORS_W83793_FAN_MIN(3), -1 } },
1368  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1369    { SENSORS_W83793_FAN(4), SENSORS_W83793_FAN_MIN(4), -1 } },
1370  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1371    { SENSORS_W83793_FAN(5), SENSORS_W83793_FAN_MIN(5), -1 } },
1372  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1373    { SENSORS_W83793_FAN(6), SENSORS_W83793_FAN_MIN(6), -1 } },
1374  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1375    { SENSORS_W83793_FAN(7), SENSORS_W83793_FAN_MIN(7), -1 } },
1376  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1377    { SENSORS_W83793_FAN(8), SENSORS_W83793_FAN_MIN(8), -1 } },
1378  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1379    { SENSORS_W83793_FAN(9), SENSORS_W83793_FAN_MIN(9), -1 } },
1380  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1381    { SENSORS_W83793_FAN(10), SENSORS_W83793_FAN_MIN(10), -1 } },
1382  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1383    { SENSORS_W83793_FAN(11), SENSORS_W83793_FAN_MIN(11), -1 } },
1384  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1385    { SENSORS_W83793_FAN(12), SENSORS_W83793_FAN_MIN(12), -1 } },
1386  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1387    { SENSORS_W83793_TEMP(1), SENSORS_W83793_TEMP_CRIT(1), SENSORS_W83793_TEMP_CRIT_HYST(1), -1 } },
1388  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1389    { SENSORS_W83793_TEMP(2), SENSORS_W83793_TEMP_CRIT(2), SENSORS_W83793_TEMP_CRIT_HYST(2), -1 } },
1390  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1391    { SENSORS_W83793_TEMP(3), SENSORS_W83793_TEMP_CRIT(3), SENSORS_W83793_TEMP_CRIT_HYST(3), -1 } },
1392  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1393    { SENSORS_W83793_TEMP(4), SENSORS_W83793_TEMP_CRIT(4), SENSORS_W83793_TEMP_CRIT_HYST(4), -1 } },
1394  { fmtTemps_0, rrdF0, DataType_temperature, 0, 0,
1395    { SENSORS_W83793_TEMP(5), SENSORS_W83793_TEMP_CRIT(5), SENSORS_W83793_TEMP_CRIT_HYST(5), -1 } },
1396  { fmtTemps_0, rrdF0, DataType_temperature, 0, 0,
1397    { SENSORS_W83793_TEMP(6), SENSORS_W83793_TEMP_CRIT(6), SENSORS_W83793_TEMP_CRIT_HYST(6), -1 } },
1398  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1399    { SENSORS_W83793_IN(0), SENSORS_W83793_IN_MIN(0), SENSORS_W83793_IN_MAX(0), -1 } },
1400  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1401    { SENSORS_W83793_IN(1), SENSORS_W83793_IN_MIN(1), SENSORS_W83793_IN_MAX(1), -1 } },
1402  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1403    { SENSORS_W83793_IN(2), SENSORS_W83793_IN_MIN(2), SENSORS_W83793_IN_MAX(2), -1 } },
1404  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1405    { SENSORS_W83793_IN(3), SENSORS_W83793_IN_MIN(3), SENSORS_W83793_IN_MAX(3), -1 } },
1406  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1407    { SENSORS_W83793_IN(4), SENSORS_W83793_IN_MIN(4), SENSORS_W83793_IN_MAX(4), -1 } },
1408  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1409    { SENSORS_W83793_IN(5), SENSORS_W83793_IN_MIN(5), SENSORS_W83793_IN_MAX(5), -1 } },
1410  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1411    { SENSORS_W83793_IN(6), SENSORS_W83793_IN_MIN(6), SENSORS_W83793_IN_MAX(6), -1 } },
1412  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1413    { SENSORS_W83793_IN(7), SENSORS_W83793_IN_MIN(7), SENSORS_W83793_IN_MAX(7), -1 } },
1414  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1415    { SENSORS_W83793_IN(8), SENSORS_W83793_IN_MIN(8), SENSORS_W83793_IN_MAX(8), -1 } },
1416  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1417    { SENSORS_W83793_IN(9), SENSORS_W83793_IN_MIN(9), SENSORS_W83793_IN_MAX(9), -1 } },
1418  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
1419    { SENSORS_W83793_VID0, -1 } },
1420  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
1421    { SENSORS_W83793_VID1, -1 } },
1422  { NULL }
1423};
1424
1425static const ChipDescriptor w83793_chip = {
1426  w83793_names, w83793_features, 0, 0
1427};
1428
1429/** LM90 **/
1430
1431static const char *lm90_names[] = {
1432  SENSORS_LM90_PREFIX, SENSORS_ADM1032_PREFIX, SENSORS_LM99_PREFIX, SENSORS_LM86_PREFIX,
1433  SENSORS_MAX6657_PREFIX, SENSORS_ADT7461_PREFIX, NULL
1434};
1435
1436static const FeatureDescriptor lm90_features[] = {
1437  { fmtTemps_PC87360_1, rrdF1, DataType_temperature,
1438    LM90_ALARM_LOCAL_HIGH | LM90_ALARM_LOCAL_LOW | LM90_ALARM_LOCAL_CRIT, 0,
1439    { SENSORS_LM90_LOCAL_TEMP, SENSORS_LM90_LOCAL_LOW,
1440      SENSORS_LM90_LOCAL_HIGH, SENSORS_LM90_LOCAL_TCRIT, -1 } },
1441  { fmtTemps_PC87360_1, rrdF1, DataType_temperature,
1442    LM90_ALARM_REMOTE_HIGH | LM90_ALARM_REMOTE_LOW | LM90_ALARM_REMOTE_CRIT, 0,
1443    { SENSORS_LM90_REMOTE_TEMP, SENSORS_LM90_REMOTE_LOW,
1444      SENSORS_LM90_REMOTE_HIGH, SENSORS_LM90_REMOTE_TCRIT, -1 } },
1445  { NULL }
1446};
1447
1448static const ChipDescriptor lm90_chip = {
1449  lm90_names, lm90_features, SENSORS_LM90_ALARMS, 0
1450};
1451
1452
1453/** ALL **/
1454
1455const ChipDescriptor * const knownChips[] = {
1456  &adm1021_chip,
1457  &adm1025_chip,
1458  &adm9240_chip,
1459  &ds1621_chip,
1460  &gl518_chip,
1461  &lm75_chip,
1462  &lm78_chip,
1463  &lm80_chip,
1464  &lm85_chip,
1465  &lm87_chip,
1466  &max1617_chip,
1467  &maxilife_chip,
1468  &sis5595_chip,
1469  &via686a_chip,
1470  &as99127f_chip,
1471  &w83781d_chip,
1472  &w83782d_chip,
1473  &w83783s_chip,
1474  &w83697hf_chip,
1475  &it87_chip,
1476  &asb100_chip,
1477  &pc87360_chip,
1478  &pc87427_chip,
1479  &w83627ehf_chip,
1480  &f71805f_chip,
1481  &vt1211_chip,
1482  &k8temp_chip,
1483  &w83793_chip,
1484  &lm90_chip,
1485  NULL
1486};
Note: See TracBrowser for help on using the browser.