summaryrefslogtreecommitdiff
path: root/sys/dev/i2c/adt7462.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2008-04-23 11:11:15 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2008-04-23 11:11:15 +0000
commit085ccde0e13b19ada2b604ba21633a2b553626ab (patch)
tree382fe4b609d4a2f3a90d3b074d736b80d44eca0e /sys/dev/i2c/adt7462.c
parent2a58963f6f3e04c3ec1f36582d4999a094feee5c (diff)
learn about the fans
Diffstat (limited to 'sys/dev/i2c/adt7462.c')
-rw-r--r--sys/dev/i2c/adt7462.c95
1 files changed, 74 insertions, 21 deletions
diff --git a/sys/dev/i2c/adt7462.c b/sys/dev/i2c/adt7462.c
index 1ac783c7cea..cbda0ef5679 100644
--- a/sys/dev/i2c/adt7462.c
+++ b/sys/dev/i2c/adt7462.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: adt7462.c,v 1.5 2008/04/22 03:05:03 cnst Exp $ */
+/* $OpenBSD: adt7462.c,v 1.6 2008/04/23 11:11:14 deraadt Exp $ */
/*
* Copyright (c) 2008 Theo de Raadt
@@ -23,21 +23,45 @@
#include <dev/i2c/i2cvar.h>
-#define ADT7462_INT_TEMPL 0x88
-#define ADT7462_INT_TEMPH 0x89
-#define ADT7462_EXT_TEMP1L 0x8a
-#define ADT7462_EXT_TEMP1H 0x8b
-#define ADT7462_EXT_TEMP2L 0x8c
-#define ADT7462_EXT_TEMP2H 0x8d
-#define ADT7462_EXT_TEMP3L 0x8e
-#define ADT7462_EXT_TEMP3H 0x8f
+#define ADT7462_TEMPL 0x88
+#define ADT7462_TEMPH 0x89
+#define ADT7462_TEMP1L 0x8a
+#define ADT7462_TEMP1H 0x8b
+#define ADT7462_TEMP2L 0x8c
+#define ADT7462_TEMP2H 0x8d
+#define ADT7462_TEMP3L 0x8e
+#define ADT7462_TEMP3H 0x8f
+#define ADT7262_TACH1L 0x98
+#define ADT7262_TACH1H 0x99
+#define ADT7262_TACH2L 0x9a
+#define ADT7262_TACH2H 0x9b
+#define ADT7262_TACH3L 0x9c
+#define ADT7262_TACH3H 0x9d
+#define ADT7262_TACH4L 0x9e
+#define ADT7262_TACH4H 0x9f
+#define ADT7262_TACH5L 0xa2
+#define ADT7262_TACH5H 0xa3
+#define ADT7262_TACH6L 0xa4
+#define ADT7262_TACH6H 0xa5
+#define ADT7262_TACH7L 0xa6
+#define ADT7262_TACH7H 0xa7
+#define ADT7262_TACH8L 0xa8
+#define ADT7262_TACH8H 0xa9
/* Sensors */
#define ADTFSM_TEMP0 0
#define ADTFSM_TEMP1 1
#define ADTFSM_TEMP2 2
#define ADTFSM_TEMP3 3
-#define ADTFSM_NUM_SENSORS 4
+#define ADTFSM_TACH1 4
+#define ADTFSM_TACH2 5
+#define ADTFSM_TACH3 6
+#define ADTFSM_TACH4 7
+#define ADTFSM_TACH5 8
+#define ADTFSM_TACH6 9
+#define ADTFSM_TACH7 10
+#define ADTFSM_TACH8 11
+#define ADTFSM_NUM_SENSORS 12
struct adtfsm_softc {
struct device sc_dev;
@@ -85,16 +109,22 @@ adtfsm_attach(struct device *parent, struct device *self, void *aux)
strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
sizeof(sc->sc_sensordev.xname));
- for (i = 0; i < 4; i++)
+ for (i = ADTFSM_TEMP0; i <= ADTFSM_TEMP3; i++) {
sc->sc_sensor[i].type = SENSOR_TEMP;
+ sc->sc_sensor[i].flags |= SENSOR_FINVALID;
+ }
- for (i = 0; i < 1; i++)
- strlcpy(sc->sc_sensor[i].desc, "Internal",
- sizeof(sc->sc_sensor[i].desc));
+ strlcpy(sc->sc_sensor[0].desc, "Internal",
+ sizeof(sc->sc_sensor[0].desc));
for (i = 1; i < 4; i++)
strlcpy(sc->sc_sensor[i].desc, "External",
sizeof(sc->sc_sensor[i].desc));
+ for (i = ADTFSM_TACH1; i <= ADTFSM_TACH8; i++) {
+ sc->sc_sensor[i].type = SENSOR_FANRPM;
+ sc->sc_sensor[i].flags |= SENSOR_FINVALID;
+ }
+
if (sensor_task_register(sc, adtfsm_refresh, 5) == NULL) {
printf(", unable to register update task\n");
return;
@@ -112,14 +142,17 @@ adtfsm_refresh(void *arg)
{
struct adtfsm_softc *sc = arg;
u_int8_t cmdh, cmdl, datah = 0x01, datal = 0x02;
+ struct ksensor *ks;
+ u_short ut;
short t;
int i;
iic_acquire_bus(sc->sc_tag, 0);
- for (i = 0; i < 4; i++) {
- cmdl = ADT7462_INT_TEMPL + i * 2;
- cmdh = ADT7462_INT_TEMPH + i * 2;
+ for (i = 0; i <= ADTFSM_TEMP3 - ADTFSM_TEMP0; i++) {
+ cmdl = ADT7462_TEMPL + i * 2;
+ cmdh = ADT7462_TEMPH + i * 2;
+ ks = &sc->sc_sensor[ADTFSM_TEMP0 + i];
if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
sc->sc_addr, &cmdl, sizeof cmdl, &datal,
sizeof datal, 0) == 0 &&
@@ -127,11 +160,31 @@ adtfsm_refresh(void *arg)
sc->sc_addr, &cmdh, sizeof cmdh, &datah,
sizeof datah, 0) == 0) {
t = (((datah << 8) | datal) >> 6) - (64 << 2);
- sc->sc_sensor[i].value = 273150000 + t * 250000;
- sc->sc_sensor[i].flags &= ~SENSOR_FINVALID;
+ ks->value = 273150000 + t * 250000;
+ ks->flags &= ~SENSOR_FINVALID;
+ } else
+ ks->flags |= SENSOR_FINVALID;
+ }
+
+ for (i = 0; i <= ADTFSM_TACH8 - ADTFSM_TACH1; i++) {
+ cmdl = ADT7262_TACH1L + i * 2;
+ cmdh = ADT7262_TACH1H + i * 2;
+ ks = &sc->sc_sensor[ADTFSM_TACH1 + i];
+ if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
+ sc->sc_addr, &cmdl, sizeof cmdl, &datal,
+ sizeof datal, 0) == 0 &&
+ iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
+ sc->sc_addr, &cmdh, sizeof cmdh, &datah,
+ sizeof datah, 0) == 0) {
+ ut = ((datah << 8) | datal);
+ if (ut == 0x0000 || ut == 0xffff)
+ ks->flags |= SENSOR_FINVALID;
+ else {
+ ks->value = 90000 * 60 / ut;
+ ks->flags &= ~SENSOR_FINVALID;
+ }
} else
- sc->sc_sensor[i].flags |= SENSOR_FINVALID;
- printf("val %02x %02x\n", datah, datal);
+ ks->flags |= SENSOR_FINVALID;
}
iic_release_bus(sc->sc_tag, 0);