Module Name: src
Committed By: jmcneill
Date: Sat May 5 10:25:59 UTC 2018
Modified Files:
src/sys/dev/i2c: axppmic.c
Log Message:
Add ACIN and VBUS present sensors
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/i2c/axppmic.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/i2c/axppmic.c
diff -u src/sys/dev/i2c/axppmic.c:1.2 src/sys/dev/i2c/axppmic.c:1.3
--- src/sys/dev/i2c/axppmic.c:1.2 Sat May 5 00:39:59 2018
+++ src/sys/dev/i2c/axppmic.c Sat May 5 10:25:59 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: axppmic.c,v 1.2 2018/05/05 00:39:59 jmcneill Exp $ */
+/* $NetBSD: axppmic.c,v 1.3 2018/05/05 10:25:59 jmcneill Exp $ */
/*-
* Copyright (c) 2014-2018 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.2 2018/05/05 00:39:59 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.3 2018/05/05 10:25:59 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -44,6 +44,10 @@ __KERNEL_RCSID(0, "$NetBSD: axppmic.c,v
#include <dev/fdt/fdtvar.h>
+#define AXP_POWER_SOURCE_REG 0x00
+#define AXP_POWER_SOURCE_ACIN_PRESENT __BIT(7)
+#define AXP_POWER_SOURCE_VBUS_PRESENT __BIT(5)
+
#define AXP_POWER_MODE_REG 0x01
#define AXP_POWER_MODE_BATT_VALID __BIT(4)
#define AXP_POWER_MODE_BATT_PRESENT __BIT(5)
@@ -180,6 +184,8 @@ struct axppmic_config {
};
enum axppmic_sensor {
+ AXP_SENSOR_ACIN_PRESENT,
+ AXP_SENSOR_VBUS_PRESENT,
AXP_SENSOR_BATT_PRESENT,
AXP_SENSOR_BATT_CHARGING,
AXP_SENSOR_BATT_CHARGE_STATE,
@@ -199,6 +205,7 @@ struct axppmic_softc {
struct sysmon_pswitch sc_smpsw;
struct sysmon_envsys *sc_sme;
+
envsys_data_t sc_sensor[AXP_NSENSORS];
};
@@ -373,12 +380,23 @@ axppmic_sensor_refresh(struct sysmon_env
iic_acquire_bus(sc->sc_i2c, flags);
switch (e->private) {
+ case AXP_SENSOR_ACIN_PRESENT:
+ if (axppmic_read(sc->sc_i2c, sc->sc_addr, AXP_POWER_SOURCE_REG, &val, flags) == 0) {
+ e->state = ENVSYS_SVALID;
+ e->value_cur = !!(val & AXP_POWER_SOURCE_ACIN_PRESENT);
+ }
+ break;
+ case AXP_SENSOR_VBUS_PRESENT:
+ if (axppmic_read(sc->sc_i2c, sc->sc_addr, AXP_POWER_SOURCE_REG, &val, flags) == 0) {
+ e->state = ENVSYS_SVALID;
+ e->value_cur = !!(val & AXP_POWER_SOURCE_VBUS_PRESENT);
+ }
+ break;
case AXP_SENSOR_BATT_PRESENT:
if (axppmic_read(sc->sc_i2c, sc->sc_addr, AXP_POWER_MODE_REG, &val, flags) == 0) {
if (val & AXP_POWER_MODE_BATT_VALID) {
e->state = ENVSYS_SVALID;
e->value_cur = !!(val & AXP_POWER_MODE_BATT_PRESENT);
- break;
}
}
break;
@@ -426,6 +444,26 @@ axppmic_sensor_refresh(struct sysmon_env
}
static void
+axppmic_attach_acadapter(struct axppmic_softc *sc)
+{
+ envsys_data_t *e;
+
+ e = &sc->sc_sensor[AXP_SENSOR_ACIN_PRESENT];
+ e->private = AXP_SENSOR_ACIN_PRESENT;
+ e->units = ENVSYS_INDICATOR;
+ e->state = ENVSYS_SINVALID;
+ strlcpy(e->desc, "ACIN present", sizeof(e->desc));
+ sysmon_envsys_sensor_attach(sc->sc_sme, e);
+
+ e = &sc->sc_sensor[AXP_SENSOR_VBUS_PRESENT];
+ e->private = AXP_SENSOR_VBUS_PRESENT;
+ e->units = ENVSYS_INDICATOR;
+ e->state = ENVSYS_SINVALID;
+ strlcpy(e->desc, "VBUS present", sizeof(e->desc));
+ sysmon_envsys_sensor_attach(sc->sc_sme, e);
+}
+
+static void
axppmic_attach_battery(struct axppmic_softc *sc)
{
envsys_data_t *e;
@@ -475,6 +513,7 @@ axppmic_attach_sensors(struct axppmic_so
sc->sc_sme->sme_class = SME_CLASS_BATTERY;
sc->sc_sme->sme_flags = SME_POLL_ONLY | SME_INIT_REFRESH;
+ axppmic_attach_acadapter(sc);
axppmic_attach_battery(sc);
sysmon_envsys_register(sc->sc_sme);