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 <jmcne...@invisible.ca>
@@ -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);

Reply via email to