summaryrefslogtreecommitdiff
path: root/sys/dev/acpi/acpibat.c
diff options
context:
space:
mode:
authorMarco Peereboom <marco@cvs.openbsd.org>2006-02-17 07:09:26 +0000
committerMarco Peereboom <marco@cvs.openbsd.org>2006-02-17 07:09:26 +0000
commitcc91cf4c126918bfd6d46340186beccf2089aee7 (patch)
treeb0292af8a5be0c55c0eb8458ab947c8ce57b74ff /sys/dev/acpi/acpibat.c
parent31da0da33f29d78ec378f9f2492774a0092ea480 (diff)
Propogate some values through the sysctl hw.sesnsors interface for debug
purposes. This will be removed later and replaced with something better.
Diffstat (limited to 'sys/dev/acpi/acpibat.c')
-rw-r--r--sys/dev/acpi/acpibat.c87
1 files changed, 86 insertions, 1 deletions
diff --git a/sys/dev/acpi/acpibat.c b/sys/dev/acpi/acpibat.c
index 864e7a96bc9..a5ed42fe68f 100644
--- a/sys/dev/acpi/acpibat.c
+++ b/sys/dev/acpi/acpibat.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpibat.c,v 1.13 2006/02/17 00:45:27 marco Exp $ */
+/* $OpenBSD: acpibat.c,v 1.14 2006/02/17 07:09:25 marco Exp $ */
/*
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
*
@@ -28,6 +28,8 @@
#include <dev/acpi/amltypes.h>
#include <dev/acpi/dsdt.h>
+#include <sys/sensors.h>
+
int acpibat_match(struct device *, void *, void *);
void acpibat_attach(struct device *, struct device *, void *);
@@ -42,6 +44,8 @@ struct acpibat_softc {
struct acpibat_bif sc_bif;
struct acpibat_bst sc_bst;
+
+ struct sensor sens[13]; /* XXX debug only */
};
struct cfattach acpibat_ca = {
@@ -52,6 +56,7 @@ struct cfdriver acpibat_cd = {
NULL, "acpibat", DV_DULL
};
+void acpibat_refresh(void *);
int acpibat_getbif(struct acpibat_softc *);
int acpibat_getbst(struct acpibat_softc *);
@@ -70,11 +75,13 @@ acpibat_match(struct device *parent, void *match, void *aux)
return (1);
}
+/* XXX this is for debug only, remove later */
void
acpibat_attach(struct device *parent, struct device *self, void *aux)
{
struct acpibat_softc *sc = (struct acpibat_softc *) self;
struct acpi_attach_args *aa = aux;
+ int i;
sc->sc_acpi = (struct acpi_softc *)parent;
sc->sc_devnode = aa->aaa_node->child;
@@ -89,6 +96,84 @@ acpibat_attach(struct device *parent, struct device *self, void *aux)
sc->sc_bif.bif_serial,
sc->sc_bif.bif_type,
sc->sc_bif.bif_oem);
+
+ memset(sc->sens, 0, sizeof(sc->sens));
+
+ for (i = 0; i < 13; i++)
+ strlcpy(sc->sens[i].device, DEVNAME(sc), sizeof(sc->sens[i].device));
+
+ strlcpy(sc->sens[0].desc, "last full capacity", sizeof(sc->sens[2].desc));
+ sc->sens[0].type = SENSOR_PERCENT;
+ sensor_add(&sc->sens[0]);
+ sc->sens[0].value = sc->sc_bif.bif_last_capacity / sc->sc_bif.bif_cap_granu1 * 1000;
+
+ strlcpy(sc->sens[1].desc, "warning capacity", sizeof(sc->sens[1].desc));
+ sc->sens[1].type = SENSOR_PERCENT;
+ sensor_add(&sc->sens[1]);
+ sc->sens[1].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000;
+
+ strlcpy(sc->sens[2].desc, "low capacity", sizeof(sc->sens[2].desc));
+ sc->sens[2].type = SENSOR_PERCENT;
+ sensor_add(&sc->sens[2]);
+ sc->sens[2].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000;
+
+ strlcpy(sc->sens[3].desc, "voltage", sizeof(sc->sens[3].desc));
+ sc->sens[3].type = SENSOR_VOLTS_DC;
+ sensor_add(&sc->sens[3]);
+ sc->sens[3].status = SENSOR_S_OK;
+ sc->sens[3].value = sc->sc_bif.bif_voltage * 1000;
+
+ strlcpy(sc->sens[4].desc, "state", sizeof(sc->sens[4].desc));
+ sc->sens[4].type = SENSOR_INTEGER;
+ sensor_add(&sc->sens[4]);
+ sc->sens[4].status = SENSOR_S_OK;
+ sc->sens[4].value = sc->sc_bst.bst_state;
+
+ strlcpy(sc->sens[5].desc, "rate", sizeof(sc->sens[5].desc));
+ sc->sens[5].type = SENSOR_INTEGER;
+ sensor_add(&sc->sens[5]);
+ sc->sens[5].value = sc->sc_bst.bst_rate;
+
+ strlcpy(sc->sens[6].desc, "remaining capacity", sizeof(sc->sens[6].desc));
+ sc->sens[6].type = SENSOR_PERCENT;
+ sensor_add(&sc->sens[6]);
+ sc->sens[6].value = sc->sc_bst.bst_capacity / sc->sc_bif.bif_cap_granu1 * 1000;
+
+ strlcpy(sc->sens[7].desc, "current voltage", sizeof(sc->sens[7].desc));
+ sc->sens[7].type = SENSOR_VOLTS_DC;
+ sensor_add(&sc->sens[7]);
+ sc->sens[7].status = SENSOR_S_OK;
+ sc->sens[7].value = sc->sc_bst.bst_voltage * 1000;
+
+ if (sensor_task_register(sc, acpibat_refresh, 10))
+ printf(", unable to register update task\n");
+}
+
+void
+acpibat_refresh(void *arg)
+{
+ struct acpibat_softc *sc = arg;
+
+ acpibat_getbif(sc);
+ acpibat_getbst(sc);
+
+ sc->sens[0].value = sc->sc_bif.bif_last_capacity / sc->sc_bif.bif_cap_granu1 * 1000;
+ sc->sens[1].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000;
+ sc->sens[2].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000;
+ sc->sens[3].value = sc->sc_bif.bif_voltage * 1000;
+
+ sc->sens[4].status = SENSOR_S_OK;
+ if (sc->sc_bst.bst_state & BST_DISCHARGE)
+ strlcpy(sc->sens[4].desc, "battery discharging", sizeof(sc->sens[4].desc));
+ else if (sc->sc_bst.bst_state & BST_CHARGE)
+ strlcpy(sc->sens[4].desc, "battery charging", sizeof(sc->sens[4].desc));
+ else if (sc->sc_bst.bst_state & BST_CRITICAL) {
+ strlcpy(sc->sens[4].desc, "battery critical", sizeof(sc->sens[4].desc));
+ sc->sens[4].status = SENSOR_S_CRIT;
+ }
+ sc->sens[4].value = sc->sc_bst.bst_state;
+ sc->sens[5].value = sc->sc_bst.bst_rate;
+ sc->sens[6].value = sc->sc_bst.bst_capacity / sc->sc_bif.bif_cap_granu1 * 1000;
}
int