Module Name: src
Committed By: jruoho
Date: Sat Jan 23 15:06:47 UTC 2010
Modified Files:
src/sys/dev/acpi: acpi_bat.c
Log Message:
Cleanup:
* Remove ACPI_BAT_DEBUG.
* Reduce the amount of error reporting.
* Remove the internal bookkeeping flags.
* Remove the debugging functions used to print status and information
changes. This information is fully conveyed in the output of envstat(8).
* Always evaluate _STA. If it fails or the battery is not present, mark
all remaining sensors as invalid. This will eliminate the convoluted
update routine.
* Semantics.
Over 200 LOC was eliminated, but functional change should again be minimal.
ok jmcneill@, pgoyette@
To generate a diff of this commit:
cvs rdiff -u -r1.76 -r1.77 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.76 src/sys/dev/acpi/acpi_bat.c:1.77
--- src/sys/dev/acpi/acpi_bat.c:1.76 Thu Jan 21 08:57:17 2010
+++ src/sys/dev/acpi/acpi_bat.c Sat Jan 23 15:06:47 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_bat.c,v 1.76 2010/01/21 08:57:17 jruoho Exp $ */
+/* $NetBSD: acpi_bat.c,v 1.77 2010/01/23 15:06:47 jruoho Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -62,10 +62,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#if 0
-#define ACPI_BAT_DEBUG
-#endif
-
/*
* ACPI Battery Driver.
*
@@ -79,21 +75,22 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.76 2010/01/21 08:57:17 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.77 2010/01/23 15:06:47 jruoho Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h> /* for hz */
#include <sys/device.h>
#include <sys/mutex.h>
+
#include <dev/sysmon/sysmonvar.h>
#include <dev/acpi/acpica.h>
#include <dev/acpi/acpireg.h>
#include <dev/acpi/acpivar.h>
-#define _COMPONENT ACPI_BAT_COMPONENT
-ACPI_MODULE_NAME ("acpi_bat")
+#define _COMPONENT ACPI_BAT_COMPONENT
+ACPI_MODULE_NAME ("acpi_bat")
/*
* Sensor indexes.
@@ -149,16 +146,12 @@
};
struct acpibat_softc {
- struct acpi_devnode *sc_node; /* our ACPI devnode */
- int sc_flags; /* see below */
- int sc_available; /* available information level */
-
- struct sysmon_envsys *sc_sme;
- envsys_data_t sc_sensor[ACPIBAT_COUNT];
- struct timeval sc_lastupdate;
-
- kmutex_t sc_mutex;
- kcondvar_t sc_condvar;
+ struct acpi_devnode *sc_node;
+ struct sysmon_envsys *sc_sme;
+ struct timeval sc_lastupdate;
+ envsys_data_t sc_sensor[ACPIBAT_COUNT];
+ kmutex_t sc_mutex;
+ kcondvar_t sc_condvar;
};
static const char * const bat_hid[] = {
@@ -166,16 +159,7 @@
NULL
};
-/*
- * These flags are used to examine the battery device data returned from
- * the ACPI interface, specifically the "battery status"
- */
#define ACPIBAT_PWRUNIT_MA 0x00000001 /* mA not mW */
-
-/*
- * These flags are used to examine the battery charge/discharge/critical
- * state returned from a get-status command.
- */
#define ACPIBAT_ST_DISCHARGING 0x00000001 /* battery is discharging */
#define ACPIBAT_ST_CHARGING 0x00000002 /* battery is charging */
#define ACPIBAT_ST_CRITICAL 0x00000004 /* battery is critical */
@@ -201,50 +185,22 @@
#define ACPIBAT_VAL_ISVALID(x) \
(((x) != ACPIBAT_VAL_UNKNOWN) ? ENVSYS_SVALID : ENVSYS_SINVALID)
-/*
- * These flags are used to set internal state in our softc.
- */
-#define ABAT_F_VERBOSE 0x01 /* verbose events */
-#define ABAT_F_PWRUNIT_MA 0x02 /* mA instead of mW */
-#define ABAT_F_PRESENT 0x04 /* is the battery present? */
-
-#define ABAT_SET(sc, f) (void)((sc)->sc_flags |= (f))
-#define ABAT_CLEAR(sc, f) (void)((sc)->sc_flags &= ~(f))
-#define ABAT_ISSET(sc, f) ((sc)->sc_flags & (f))
-
-/*
- * Available info level
- */
-
-#define ABAT_ALV_NONE 0 /* none is available */
-#define ABAT_ALV_PRESENCE 1 /* presence info is available */
-#define ABAT_ALV_INFO 2 /* battery info is available */
-#define ABAT_ALV_STAT 3 /* battery status is available */
-
-static int acpibat_match(device_t, cfdata_t, void *);
-static void acpibat_attach(device_t, device_t, void *);
-static bool acpibat_resume(device_t, pmf_qual_t);
+static int acpibat_match(device_t, cfdata_t, void *);
+static void acpibat_attach(device_t, device_t, void *);
+static int acpibat_get_sta(device_t);
+static ACPI_OBJECT *acpibat_get_object(ACPI_HANDLE, const char *, int);
+static void acpibat_get_info(device_t);
+static void acpibat_get_status(device_t);
+static void acpibat_update_info(void *);
+static void acpibat_update_status(void *);
+static void acpibat_init_envsys(device_t);
+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, pmf_qual_t);
CFATTACH_DECL_NEW(acpibat, sizeof(struct acpibat_softc),
acpibat_match, acpibat_attach, NULL, NULL);
-static void acpibat_clear_presence(struct acpibat_softc *);
-static void acpibat_clear_info(struct acpibat_softc *);
-static void acpibat_clear_stat(struct acpibat_softc *);
-static int acpibat_battery_present(device_t);
-static ACPI_OBJECT *acpibat_get_object(ACPI_HANDLE, const char *, int);
-static ACPI_STATUS acpibat_get_status(device_t);
-static ACPI_STATUS acpibat_get_info(device_t);
-static void acpibat_print_info(device_t);
-static void acpibat_print_stat(device_t);
-static void acpibat_update(void *);
-static void acpibat_update_info(void *);
-static void acpibat_update_stat(void *);
-
-static void acpibat_init_envsys(device_t);
-static void acpibat_notify_handler(ACPI_HANDLE, UINT32, void *);
-static void acpibat_refresh(struct sysmon_envsys *, envsys_data_t *);
-
/*
* acpibat_match:
*
@@ -261,23 +217,6 @@
return acpi_match_hid(aa->aa_node->ad_devinfo, bat_hid);
}
-static bool
-acpibat_resume(device_t dv, pmf_qual_t qual)
-{
- ACPI_STATUS rv;
-
- rv = AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_stat, dv);
- if (ACPI_FAILURE(rv))
- aprint_error_dev(dv, "unable to queue status check: %s\n",
- AcpiFormatException(rv));
- rv = AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_info, dv);
- if (ACPI_FAILURE(rv))
- aprint_error_dev(dv, "unable to queue info check: %s\n",
- AcpiFormatException(rv));
-
- return true;
-}
-
/*
* acpibat_attach:
*
@@ -290,109 +229,54 @@
struct acpi_attach_args *aa = aux;
ACPI_STATUS rv;
- aprint_naive(": ACPI Battery (Control Method)\n");
- aprint_normal(": ACPI Battery (Control Method)\n");
+ aprint_naive(": ACPI Battery\n");
+ aprint_normal(": ACPI Battery\n");
sc->sc_node = aa->aa_node;
mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NONE);
cv_init(&sc->sc_condvar, device_xname(self));
- rv = AcpiInstallNotifyHandler(sc->sc_node->ad_handle,
- ACPI_ALL_NOTIFY,
- acpibat_notify_handler, self);
- if (ACPI_FAILURE(rv)) {
- aprint_error_dev(self,
- "unable to register DEVICE/SYSTEM NOTIFY handler: %s\n",
- AcpiFormatException(rv));
- return;
- }
-
-#ifdef ACPI_BAT_DEBUG
- ABAT_SET(sc, ABAT_F_VERBOSE);
-#endif
-
- if (!pmf_device_register(self, NULL, acpibat_resume))
+ if (pmf_device_register(self, NULL, acpibat_resume) != true)
aprint_error_dev(self, "couldn't establish power handler\n");
- acpibat_init_envsys(self);
-}
-
-/*
- * clear informations
- */
-
-static void
-acpibat_clear_presence(struct acpibat_softc *sc)
-{
- acpibat_clear_info(sc);
- sc->sc_available = ABAT_ALV_NONE;
- ABAT_CLEAR(sc, ABAT_F_PRESENT);
-}
-
-static void
-acpibat_clear_info(struct acpibat_softc *sc)
-{
- acpibat_clear_stat(sc);
- if (sc->sc_available > ABAT_ALV_PRESENCE)
- sc->sc_available = ABAT_ALV_PRESENCE;
-
- sc->sc_sensor[ACPIBAT_DCAPACITY].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_LFCCAPACITY].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_CAPACITY].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_TECHNOLOGY].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_DVOLTAGE].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_WCAPACITY].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_LCAPACITY].state = ENVSYS_SINVALID;
-}
-
-static void
-acpibat_clear_stat(struct acpibat_softc *sc)
-{
- if (sc->sc_available > ABAT_ALV_INFO)
- sc->sc_available = ABAT_ALV_INFO;
+ rv = AcpiInstallNotifyHandler(sc->sc_node->ad_handle,
+ ACPI_ALL_NOTIFY, acpibat_notify_handler, self);
- sc->sc_sensor[ACPIBAT_CHARGERATE].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_DISCHARGERATE].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_CAPACITY].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_VOLTAGE].state = ENVSYS_SINVALID;
- sc->sc_sensor[ACPIBAT_CHARGING].state = ENVSYS_SINVALID;
+ if (ACPI_SUCCESS(rv))
+ acpibat_init_envsys(self);
+ else
+ aprint_error_dev(self, "couldn't install notify handler\n");
}
/*
- * acpibat_battery_present:
+ * acpibat_get_sta:
*
* Evaluate whether the battery is present or absent.
*
* Returns: 0 for no battery, 1 for present, and -1 on error.
*/
static int
-acpibat_battery_present(device_t dv)
+acpibat_get_sta(device_t dv)
{
struct acpibat_softc *sc = device_private(dv);
ACPI_INTEGER val;
ACPI_STATUS rv;
- uint32_t sta;
rv = acpi_eval_integer(sc->sc_node->ad_handle, "_STA", &val);
if (ACPI_FAILURE(rv)) {
aprint_error_dev(dv, "failed to evaluate _STA\n");
- sc->sc_sensor[ACPIBAT_PRESENT].state = ENVSYS_SINVALID;
return -1;
}
- sta = (uint32_t)val;
-
- sc->sc_available = ABAT_ALV_PRESENCE;
sc->sc_sensor[ACPIBAT_PRESENT].state = ENVSYS_SVALID;
- if ((sta & ACPIBAT_STA_PRESENT) == 0) {
+ if ((val & ACPIBAT_STA_PRESENT) == 0) {
sc->sc_sensor[ACPIBAT_PRESENT].value_cur = 0;
return 0;
}
- ABAT_SET(sc, ABAT_F_PRESENT);
sc->sc_sensor[ACPIBAT_PRESENT].value_cur = 1;
return 1;
@@ -430,7 +314,7 @@
*
* Get, and possibly display, the battery info.
*/
-static ACPI_STATUS
+static void
acpibat_get_info(device_t dv)
{
struct acpibat_softc *sc = device_private(dv);
@@ -479,11 +363,9 @@
aprint_verbose("\n");
if ((elm[ACPIBAT_BIF_UNIT].Integer.Value & ACPIBAT_PWRUNIT_MA) != 0) {
- ABAT_SET(sc, ABAT_F_PWRUNIT_MA);
capunit = ENVSYS_SAMPHOUR;
rateunit = ENVSYS_SAMPS;
} else {
- ABAT_CLEAR(sc, ABAT_F_PWRUNIT_MA);
capunit = ENVSYS_SWATTHOUR;
rateunit = ENVSYS_SWATTS;
}
@@ -540,8 +422,6 @@
sc->sc_sensor[ACPIBAT_WCAPACITY].value_max = val;
sc->sc_sensor[ACPIBAT_LCAPACITY].value_max = val;
- sc->sc_available = ABAT_ALV_INFO;
-
out:
if (obj != NULL)
ACPI_FREE(obj);
@@ -549,8 +429,6 @@
if (ACPI_FAILURE(rv))
aprint_error_dev(dv, "failed to evaluate _BIF: %s\n",
AcpiFormatException(rv));
-
- return rv;
}
/*
@@ -558,7 +436,7 @@
*
* Get, and possibly display, the current battery line status.
*/
-static ACPI_STATUS
+static void
acpibat_get_status(device_t dv)
{
struct acpibat_softc *sc = device_private(dv);
@@ -650,143 +528,55 @@
if (ACPI_FAILURE(rv))
aprint_error_dev(dv, "failed to evaluate _BST: %s\n",
AcpiFormatException(rv));
-
- return rv;
}
-#define SCALE(x) ((x)/1000000), (((x)%1000000)/1000)
-#define CAPUNITS(sc) (ABAT_ISSET((sc), ABAT_F_PWRUNIT_MA)?"Ah":"Wh")
-#define RATEUNITS(sc) (ABAT_ISSET((sc), ABAT_F_PWRUNIT_MA)?"A":"W")
static void
-acpibat_print_info(device_t dv)
+acpibat_update_info(void *arg)
{
+ device_t dv = arg;
struct acpibat_softc *sc = device_private(dv);
- const char *tech;
-
- if (sc->sc_sensor[ACPIBAT_TECHNOLOGY].value_cur)
- tech = "secondary";
- else
- tech = "primary";
+ int i, rv;
- aprint_debug_dev(dv, "%s battery, Design %d.%03d%s "
- "Last full %d.%03d%s Warn %d.%03d%s Low %d.%03d%s\n",
- tech, SCALE(sc->sc_sensor[ACPIBAT_DCAPACITY].value_cur), CAPUNITS(sc),
- SCALE(sc->sc_sensor[ACPIBAT_LFCCAPACITY].value_cur),CAPUNITS(sc),
- SCALE(sc->sc_sensor[ACPIBAT_WCAPACITY].value_cur), CAPUNITS(sc),
- SCALE(sc->sc_sensor[ACPIBAT_LCAPACITY].value_cur), CAPUNITS(sc));
-}
+ mutex_enter(&sc->sc_mutex);
-static void
-acpibat_print_stat(device_t dv)
-{
- struct acpibat_softc *sc = device_private(dv);
- const char *capstat, *chargestat;
- int percent, denom;
- int32_t value;
-
- percent = 0;
-
- if (sc->sc_sensor[ACPIBAT_CAPACITY].state == ENVSYS_SCRITUNDER)
- capstat = "CRITICAL UNDER ";
- else if (sc->sc_sensor[ACPIBAT_CAPACITY].state == ENVSYS_SCRITOVER)
- capstat = "CRITICAL OVER ";
- else
- capstat = "";
+ rv = acpibat_get_sta(dv);
- if (sc->sc_sensor[ACPIBAT_CHARGING].state != ENVSYS_SVALID) {
- chargestat = "idling";
- value = 0;
- } else if (sc->sc_sensor[ACPIBAT_CHARGING].value_cur == 0) {
- chargestat = "discharging";
- value = sc->sc_sensor[ACPIBAT_DISCHARGERATE].value_cur;
- } else {
- chargestat = "charging";
- value = sc->sc_sensor[ACPIBAT_CHARGERATE].value_cur;
+ if (rv > 0)
+ acpibat_get_info(dv);
+ else {
+ i = (rv < 0) ? 0 : ACPIBAT_DCAPACITY;
+
+ while (i < ACPIBAT_COUNT) {
+ sc->sc_sensor[i].state = ENVSYS_SINVALID;
+ i++;
+ }
}
- denom = sc->sc_sensor[ACPIBAT_LFCCAPACITY].value_cur / 100;
- if (denom > 0)
- percent = (sc->sc_sensor[ACPIBAT_CAPACITY].value_cur) / denom;
-
- aprint_debug_dev(dv, "%s%s: %d.%03dV cap %d.%03d%s (%d%%) "
- "rate %d.%03d%s\n", capstat, chargestat,
- SCALE(sc->sc_sensor[ACPIBAT_VOLTAGE].value_cur),
- SCALE(sc->sc_sensor[ACPIBAT_CAPACITY].value_cur), CAPUNITS(sc),
- percent, SCALE(value), RATEUNITS(sc));
+ mutex_exit(&sc->sc_mutex);
}
static void
-acpibat_update(void *arg)
+acpibat_update_status(void *arg)
{
device_t dv = arg;
struct acpibat_softc *sc = device_private(dv);
-
- if (sc->sc_available < ABAT_ALV_INFO) {
- /* current information is invalid */
-#if 0
- /*
- * XXX: The driver sometimes unaware that the battery exist.
- * (i.e. just after the boot or resuming)
- * Thus, the driver should always check it here.
- */
- if (sc->sc_available < ABAT_ALV_PRESENCE)
-#endif
- /* presence is invalid */
- if (acpibat_battery_present(dv) < 0)
- return;
-
- if (ABAT_ISSET(sc, ABAT_F_PRESENT)) {
- /* the battery is present. */
- if (ABAT_ISSET(sc, ABAT_F_VERBOSE))
- aprint_debug_dev(dv,
- "battery is present.\n");
- if (ACPI_FAILURE(acpibat_get_info(dv)))
- return;
- if (ABAT_ISSET(sc, ABAT_F_VERBOSE))
- acpibat_print_info(dv);
- } else {
- /* the battery is not present. */
- if (ABAT_ISSET(sc, ABAT_F_VERBOSE))
- aprint_debug_dev(dv,
- "battery is not present.\n");
- return;
- }
- } else {
- /* current information is valid */
- if (!ABAT_ISSET(sc, ABAT_F_PRESENT)) {
- /* the battery is not present. */
- return;
- }
- }
-
- if (ACPI_FAILURE(acpibat_get_status(dv)))
- return;
-
- if (ABAT_ISSET(sc, ABAT_F_VERBOSE))
- acpibat_print_stat(dv);
-}
-
-static void
-acpibat_update_info(void *arg)
-{
- device_t dev = arg;
- struct acpibat_softc *sc = device_private(dev);
+ int i, rv;
mutex_enter(&sc->sc_mutex);
- acpibat_clear_presence(sc);
- acpibat_update(arg);
- mutex_exit(&sc->sc_mutex);
-}
-static void
-acpibat_update_stat(void *arg)
-{
- device_t dev = arg;
- struct acpibat_softc *sc = device_private(dev);
+ rv = acpibat_get_sta(dv);
+
+ if (rv > 0)
+ acpibat_get_status(dv);
+ else {
+ i = (rv < 0) ? 0 : ACPIBAT_DCAPACITY;
+
+ while (i < ACPIBAT_COUNT) {
+ sc->sc_sensor[i].state = ENVSYS_SINVALID;
+ i++;
+ }
+ }
- mutex_enter(&sc->sc_mutex);
- acpibat_clear_stat(sc);
- acpibat_update(arg);
microtime(&sc->sc_lastupdate);
cv_broadcast(&sc->sc_condvar);
mutex_exit(&sc->sc_mutex);
@@ -800,36 +590,25 @@
static void
acpibat_notify_handler(ACPI_HANDLE handle, UINT32 notify, void *context)
{
+ static const int handler = OSL_NOTIFY_HANDLER;
device_t dv = context;
- ACPI_STATUS rv;
-
-#ifdef ACPI_BAT_DEBUG
- aprint_debug_dev(dv, "received notify message: 0x%x\n", notify);
-#endif
switch (notify) {
+
case ACPI_NOTIFY_BusCheck:
break;
+
case ACPI_NOTIFY_DeviceCheck:
case ACPI_NOTIFY_BatteryInformationChanged:
- rv = AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_info, dv);
- if (ACPI_FAILURE(rv))
- aprint_error_dev(dv,
- "unable to queue info check: %s\n",
- AcpiFormatException(rv));
+ (void)AcpiOsExecute(handler, acpibat_update_info, dv);
break;
case ACPI_NOTIFY_BatteryStatusChanged:
- rv = AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_stat, dv);
- if (ACPI_FAILURE(rv))
- aprint_error_dev(dv,
- "unable to queue status check: %s\n",
- AcpiFormatException(rv));
+ (void)AcpiOsExecute(handler, acpibat_update_status, dv);
break;
default:
- aprint_error_dev(dv,
- "received unknown notify message: 0x%x\n", notify);
+ aprint_error_dev(dv, "unknown notify: 0x%02X\n", notify);
}
}
@@ -837,33 +616,27 @@
acpibat_init_envsys(device_t dv)
{
struct acpibat_softc *sc = device_private(dv);
- int i, capunit, rateunit;
-
- if (sc->sc_flags & ABAT_F_PWRUNIT_MA) {
- capunit = ENVSYS_SAMPHOUR;
- rateunit = ENVSYS_SAMPS;
- } else {
- capunit = ENVSYS_SWATTHOUR;
- rateunit = ENVSYS_SWATTS;
- }
+ int i;
#define INITDATA(index, unit, string) \
- sc->sc_sensor[index].state = ENVSYS_SVALID; \
- sc->sc_sensor[index].units = unit; \
- strlcpy(sc->sc_sensor[index].desc, string, \
- sizeof(sc->sc_sensor[index].desc));
+ do { \
+ sc->sc_sensor[index].state = ENVSYS_SVALID; \
+ sc->sc_sensor[index].units = unit; \
+ (void)strlcpy(sc->sc_sensor[index].desc, string, \
+ sizeof(sc->sc_sensor[index].desc)); \
+ } while (/* CONSTCOND */ 0)
INITDATA(ACPIBAT_PRESENT, ENVSYS_INDICATOR, "present");
- INITDATA(ACPIBAT_DCAPACITY, capunit, "design cap");
- INITDATA(ACPIBAT_LFCCAPACITY, capunit, "last full cap");
+ INITDATA(ACPIBAT_DCAPACITY, ENVSYS_SWATTHOUR, "design cap");
+ 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, capunit, "warn cap");
- INITDATA(ACPIBAT_LCAPACITY, capunit, "low cap");
+ INITDATA(ACPIBAT_WCAPACITY, ENVSYS_SWATTHOUR, "warn cap");
+ INITDATA(ACPIBAT_LCAPACITY, ENVSYS_SWATTHOUR, "low cap");
INITDATA(ACPIBAT_VOLTAGE, ENVSYS_SVOLTS_DC, "voltage");
- INITDATA(ACPIBAT_CHARGERATE, rateunit, "charge rate");
- INITDATA(ACPIBAT_DISCHARGERATE, rateunit, "discharge rate");
- INITDATA(ACPIBAT_CAPACITY, capunit, "charge");
+ INITDATA(ACPIBAT_CHARGERATE, ENVSYS_SWATTS, "charge rate");
+ INITDATA(ACPIBAT_DISCHARGERATE, ENVSYS_SWATTS, "discharge rate");
+ INITDATA(ACPIBAT_CAPACITY, ENVSYS_SWATTHOUR, "charge");
INITDATA(ACPIBAT_CHARGING, ENVSYS_BATTERY_CHARGE, "charging");
INITDATA(ACPIBAT_CHARGE_STATE, ENVSYS_BATTERY_CAPACITY, "charge state");
@@ -885,13 +658,12 @@
sc->sc_sensor[ACPIBAT_LCAPACITY].flags = ENVSYS_FMONNOTSUPP;
sc->sc_sme = sysmon_envsys_create();
+
for (i = 0; i < ACPIBAT_COUNT; i++) {
+
if (sysmon_envsys_sensor_attach(sc->sc_sme,
- &sc->sc_sensor[i])) {
- aprint_error_dev(dv, "unable to add sensor%d\n", i);
- sysmon_envsys_destroy(sc->sc_sme);
- return;
- }
+ &sc->sc_sensor[i]))
+ goto fail;
}
sc->sc_sme->sme_name = device_xname(dv);
@@ -900,12 +672,17 @@
sc->sc_sme->sme_class = SME_CLASS_BATTERY;
sc->sc_sme->sme_flags = SME_POLL_ONLY;
- acpibat_update(dv);
+ acpibat_update_info(dv);
+ acpibat_update_status(dv);
- if (sysmon_envsys_register(sc->sc_sme)) {
- aprint_error_dev(dv, "unable to register with sysmon\n");
- sysmon_envsys_destroy(sc->sc_sme);
- }
+ if (sysmon_envsys_register(sc->sc_sme))
+ goto fail;
+
+ return;
+
+fail:
+ aprint_error_dev(dv, "failed to initialize sysmon\n");
+ sysmon_envsys_destroy(sc->sc_sme);
}
static void
@@ -913,25 +690,34 @@
{
device_t dv = sme->sme_cookie;
struct acpibat_softc *sc = device_private(dv);
- ACPI_STATUS rv;
struct timeval tv, tmp;
+ ACPI_STATUS rv;
- if (!ABAT_ISSET(sc, ABAT_F_PRESENT))
- acpibat_battery_present(dv);
+ tmp.tv_sec = 5;
+ tmp.tv_usec = 0;
+ microtime(&tv);
+ timersub(&tv, &tmp, &tv);
- if (ABAT_ISSET(sc, ABAT_F_PRESENT)) {
- tmp.tv_sec = 5;
- tmp.tv_usec = 0;
- microtime(&tv);
- timersub(&tv, &tmp, &tv);
- if (timercmp(&tv, &sc->sc_lastupdate, <))
- return;
-
- if (!mutex_tryenter(&sc->sc_mutex))
- return;
- rv = AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_stat, dv);
- if (!ACPI_FAILURE(rv))
- cv_timedwait(&sc->sc_condvar, &sc->sc_mutex, hz);
- mutex_exit(&sc->sc_mutex);
- }
+ if (timercmp(&tv, &sc->sc_lastupdate, <))
+ return;
+
+ if (!mutex_tryenter(&sc->sc_mutex))
+ return;
+
+ rv = AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_status, dv);
+
+ if (ACPI_SUCCESS(rv))
+ cv_timedwait(&sc->sc_condvar, &sc->sc_mutex, hz);
+
+ mutex_exit(&sc->sc_mutex);
+}
+
+static bool
+acpibat_resume(device_t dv, pmf_qual_t qual)
+{
+
+ (void)AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_info, dv);
+ (void)AcpiOsExecute(OSL_NOTIFY_HANDLER, acpibat_update_status, dv);
+
+ return true;
}