Module Name:    src
Committed By:   jruoho
Date:           Wed Mar 17 07:40:34 UTC 2010

Modified Files:
        src/sys/dev/acpi: acpi_bat.c

Log Message:
Move the low and warning capacity sensors to the limits framework provided
by sysmon_envsys(9).


To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 src/sys/dev/acpi/acpi_bat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/acpi/acpi_bat.c
diff -u src/sys/dev/acpi/acpi_bat.c:1.86 src/sys/dev/acpi/acpi_bat.c:1.87
--- src/sys/dev/acpi/acpi_bat.c:1.86	Sun Mar 14 18:05:07 2010
+++ src/sys/dev/acpi/acpi_bat.c	Wed Mar 17 07:40:34 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_bat.c,v 1.86 2010/03/14 18:05:07 pgoyette Exp $	*/
+/*	$NetBSD: acpi_bat.c,v 1.87 2010/03/17 07:40:34 jruoho Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.86 2010/03/14 18:05:07 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.87 2010/03/17 07:40:34 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -97,19 +97,17 @@
  */
 enum {
 	ACPIBAT_PRESENT		 = 0,
-	ACPIBAT_DCAPACITY	 = 1,
-	ACPIBAT_LFCCAPACITY	 = 2,
-	ACPIBAT_TECHNOLOGY	 = 3,
-	ACPIBAT_DVOLTAGE	 = 4,
-	ACPIBAT_WCAPACITY	 = 5,
-	ACPIBAT_LCAPACITY	 = 6,
-	ACPIBAT_VOLTAGE		 = 7,
-	ACPIBAT_CHARGERATE	 = 8,
-	ACPIBAT_DISCHARGERATE	 = 9,
-	ACPIBAT_CAPACITY	 = 10,
-	ACPIBAT_CHARGING	 = 11,
-	ACPIBAT_CHARGE_STATE	 = 12,
-	ACPIBAT_COUNT		 = 13
+	ACPIBAT_TECHNOLOGY	 = 1,
+	ACPIBAT_DVOLTAGE	 = 2,
+	ACPIBAT_VOLTAGE		 = 3,
+	ACPIBAT_DCAPACITY	 = 4,
+	ACPIBAT_LFCCAPACITY	 = 5,
+	ACPIBAT_CAPACITY	 = 6,
+	ACPIBAT_CHARGERATE	 = 7,
+	ACPIBAT_DISCHARGERATE	 = 8,
+	ACPIBAT_CHARGING	 = 9,
+	ACPIBAT_CHARGE_STATE	 = 10,
+	ACPIBAT_COUNT		 = 11
 };
 
 /*
@@ -152,6 +150,8 @@
 	envsys_data_t		*sc_sensor;
 	kmutex_t		 sc_mutex;
 	kcondvar_t		 sc_condvar;
+	int32_t			 sc_lcapacity;
+	int32_t			 sc_wcapacity;
 	int                      sc_present;
 };
 
@@ -166,7 +166,7 @@
 #define ACPIBAT_ST_CRITICAL	0x00000004  /* battery is critical */
 
 /*
- * A value used when _BST or _BIF is teporarily unknown (see ibid.).
+ * A value used when _BST or _BIF is temporarily unknown (see ibid.).
  */
 #define ACPIBAT_VAL_UNKNOWN	0xFFFFFFFF
 
@@ -186,6 +186,8 @@
 static void         acpibat_notify_handler(ACPI_HANDLE, UINT32, void *);
 static void         acpibat_refresh(struct sysmon_envsys *, envsys_data_t *);
 static bool	    acpibat_resume(device_t, const pmf_qual_t *);
+static void	    acpibat_get_limits(struct sysmon_envsys *, envsys_data_t *,
+				       sysmon_envsys_lim_t *, uint32_t *);
 
 CFATTACH_DECL_NEW(acpibat, sizeof(struct acpibat_softc),
     acpibat_match, acpibat_attach, acpibat_detach, NULL);
@@ -222,7 +224,10 @@
 	aprint_normal(": ACPI Battery\n");
 
 	sc->sc_node = aa->aa_node;
+
 	sc->sc_present = 0;
+	sc->sc_lcapacity = 0;
+	sc->sc_wcapacity = 0;
 
 	sc->sc_sme = NULL;
 	sc->sc_sensor = NULL;
@@ -405,8 +410,6 @@
 
 	sc->sc_sensor[ACPIBAT_DCAPACITY].units = capunit;
 	sc->sc_sensor[ACPIBAT_LFCCAPACITY].units = capunit;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].units = capunit;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].units = capunit;
 	sc->sc_sensor[ACPIBAT_CHARGERATE].units = rateunit;
 	sc->sc_sensor[ACPIBAT_DISCHARGERATE].units = rateunit;
 	sc->sc_sensor[ACPIBAT_CAPACITY].units = capunit;
@@ -431,29 +434,16 @@
 	sc->sc_sensor[ACPIBAT_DVOLTAGE].value_cur = val;
 	sc->sc_sensor[ACPIBAT_DVOLTAGE].state = ACPIBAT_VAL_ISVALID(val);
 
-	/* Design warning capacity. */
-	val = elm[ACPIBAT_BIF_WCAPACITY].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].value_cur = val;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].state = ACPIBAT_VAL_ISVALID(val);
-	sc->sc_sensor[ACPIBAT_WCAPACITY].flags |=
-	    ENVSYS_FPERCENT | ENVSYS_FVALID_MAX;
-
-	/* Design low capacity. */
-	val = elm[ACPIBAT_BIF_LCAPACITY].Integer.Value * 1000;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].value_cur = val;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].state = ACPIBAT_VAL_ISVALID(val);
-	sc->sc_sensor[ACPIBAT_LCAPACITY].flags |=
-	    ENVSYS_FPERCENT | ENVSYS_FVALID_MAX;
+	/* Design low and warning capacity. */
+	sc->sc_lcapacity = elm[ACPIBAT_BIF_LCAPACITY].Integer.Value * 1000;
+	sc->sc_wcapacity = elm[ACPIBAT_BIF_WCAPACITY].Integer.Value * 1000;
 
 	/*
-	 * Initialize the maximum of current, warning, and
-	 * low capacity to the last full charge capacity.
+	 * Initialize the maximum of current capacity
+	 * to the last known full charge capacity.
 	 */
 	val = sc->sc_sensor[ACPIBAT_LFCCAPACITY].value_cur;
-
 	sc->sc_sensor[ACPIBAT_CAPACITY].value_max = val;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].value_max = val;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].value_max = val;
 
 out:
 	if (obj != NULL)
@@ -535,15 +525,13 @@
 	sc->sc_sensor[ACPIBAT_CHARGE_STATE].value_cur =
 	    ENVSYS_BATTERY_CAPACITY_NORMAL;
 
-	if (sc->sc_sensor[ACPIBAT_CAPACITY].value_cur <
-	    sc->sc_sensor[ACPIBAT_WCAPACITY].value_cur) {
+	if (sc->sc_sensor[ACPIBAT_CAPACITY].value_cur < sc->sc_wcapacity) {
 		sc->sc_sensor[ACPIBAT_CAPACITY].state = ENVSYS_SWARNUNDER;
 		sc->sc_sensor[ACPIBAT_CHARGE_STATE].value_cur =
 		    ENVSYS_BATTERY_CAPACITY_WARNING;
 	}
 
-	if (sc->sc_sensor[ACPIBAT_CAPACITY].value_cur <
-	    sc->sc_sensor[ACPIBAT_LCAPACITY].value_cur) {
+	if (sc->sc_sensor[ACPIBAT_CAPACITY].value_cur < sc->sc_lcapacity) {
 		sc->sc_sensor[ACPIBAT_CAPACITY].state = ENVSYS_SCRITUNDER;
 		sc->sc_sensor[ACPIBAT_CHARGE_STATE].value_cur =
 		    ENVSYS_BATTERY_CAPACITY_LOW;
@@ -578,7 +566,7 @@
 	if (rv > 0)
 		acpibat_get_info(dv);
 	else {
-		i = (rv < 0) ? 0 : ACPIBAT_DCAPACITY;
+		i = (rv < 0) ? 0 : ACPIBAT_TECHNOLOGY;
 
 		while (i < ACPIBAT_COUNT) {
 			sc->sc_sensor[i].state = ENVSYS_SINVALID;
@@ -609,7 +597,7 @@
 
 		acpibat_get_status(dv);
 	} else {
-		i = (rv < 0) ? 0 : ACPIBAT_DCAPACITY;
+		i = (rv < 0) ? 0 : ACPIBAT_TECHNOLOGY;
 
 		while (i < ACPIBAT_COUNT) {
 			sc->sc_sensor[i].state = ENVSYS_SINVALID;
@@ -673,8 +661,6 @@
 	INITDATA(ACPIBAT_LFCCAPACITY, ENVSYS_SWATTHOUR, "last full cap");
 	INITDATA(ACPIBAT_TECHNOLOGY, ENVSYS_INTEGER, "technology");
 	INITDATA(ACPIBAT_DVOLTAGE, ENVSYS_SVOLTS_DC, "design voltage");
-	INITDATA(ACPIBAT_WCAPACITY, ENVSYS_SWATTHOUR, "warn cap");
-	INITDATA(ACPIBAT_LCAPACITY, ENVSYS_SWATTHOUR, "low cap");
 	INITDATA(ACPIBAT_VOLTAGE, ENVSYS_SVOLTS_DC, "voltage");
 	INITDATA(ACPIBAT_CHARGERATE, ENVSYS_SWATTS, "charge rate");
 	INITDATA(ACPIBAT_DISCHARGERATE, ENVSYS_SWATTS, "discharge rate");
@@ -684,10 +670,10 @@
 
 #undef INITDATA
 
-	/* Enable monitoring for the charge state sensor */
+	sc->sc_sensor[ACPIBAT_CAPACITY].flags |= ENVSYS_FMONLIMITS;
 	sc->sc_sensor[ACPIBAT_CHARGE_STATE].flags |= ENVSYS_FMONSTCHANGED;
 
-	/* Disable userland monitoring on these sensors */
+	/* Disable userland monitoring on these sensors. */
 	sc->sc_sensor[ACPIBAT_VOLTAGE].flags = ENVSYS_FMONNOTSUPP;
 	sc->sc_sensor[ACPIBAT_CHARGERATE].flags = ENVSYS_FMONNOTSUPP;
 	sc->sc_sensor[ACPIBAT_DISCHARGERATE].flags = ENVSYS_FMONNOTSUPP;
@@ -695,8 +681,6 @@
 	sc->sc_sensor[ACPIBAT_LFCCAPACITY].flags = ENVSYS_FMONNOTSUPP;
 	sc->sc_sensor[ACPIBAT_TECHNOLOGY].flags = ENVSYS_FMONNOTSUPP;
 	sc->sc_sensor[ACPIBAT_DVOLTAGE].flags = ENVSYS_FMONNOTSUPP;
-	sc->sc_sensor[ACPIBAT_WCAPACITY].flags = ENVSYS_FMONNOTSUPP;
-	sc->sc_sensor[ACPIBAT_LCAPACITY].flags = ENVSYS_FMONNOTSUPP;
 
 	sc->sc_sme = sysmon_envsys_create();
 
@@ -712,6 +696,7 @@
 	sc->sc_sme->sme_refresh = acpibat_refresh;
 	sc->sc_sme->sme_class = SME_CLASS_BATTERY;
 	sc->sc_sme->sme_flags = SME_POLL_ONLY;
+	sc->sc_sme->sme_get_limits = acpibat_get_limits;
 
 	acpibat_update_info(dv);
 	acpibat_update_status(dv);
@@ -768,6 +753,22 @@
 	return true;
 }
 
+static void
+acpibat_get_limits(struct sysmon_envsys *sme, envsys_data_t *edata,
+    sysmon_envsys_lim_t *limits, uint32_t *props)
+{
+	device_t dv = sme->sme_cookie;
+	struct acpibat_softc *sc = device_private(dv);
+
+	if (edata->sensor != ACPIBAT_CAPACITY)
+		return;
+
+	limits->sel_critmin = sc->sc_lcapacity;
+	limits->sel_warnmin = sc->sc_wcapacity;
+
+	*props |= PROP_BATTCAP | PROP_BATTWARN | PROP_DRIVER_LIMITS;
+}
+
 #ifdef _MODULE
 
 MODULE(MODULE_CLASS_DRIVER, acpibat, NULL);

Reply via email to