Module Name:    src
Committed By:   rkujawa
Date:           Fri Apr 26 19:32:43 UTC 2013

Modified Files:
        src/sys/dev/i2c: tps65217pmic.c

Log Message:
Add envsys(4) support to TPS65217 PMIC driver.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/i2c/tps65217pmic.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/tps65217pmic.c
diff -u src/sys/dev/i2c/tps65217pmic.c:1.2 src/sys/dev/i2c/tps65217pmic.c:1.3
--- src/sys/dev/i2c/tps65217pmic.c:1.2	Fri Apr 26 15:31:03 2013
+++ src/sys/dev/i2c/tps65217pmic.c	Fri Apr 26 19:32:43 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: tps65217pmic.c,v 1.2 2013/04/26 15:31:03 rkujawa Exp $ */
+/*	$NetBSD: tps65217pmic.c,v 1.3 2013/04/26 19:32:43 rkujawa Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,34 +31,42 @@
 
 /* 
  * Texas Instruments TPS65217 Power Management IC driver. 
- * TODO: battery, sequencer
+ * TODO: battery, sequencer, pgood
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tps65217pmic.c,v 1.2 2013/04/26 15:31:03 rkujawa Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tps65217pmic.c,v 1.3 2013/04/26 19:32:43 rkujawa Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 #include <sys/kernel.h>
+#include <sys/mutex.h>
 
 #include <sys/bus.h>
 #include <dev/i2c/i2cvar.h>
 
+#include <dev/sysmon/sysmonvar.h>
+
 #include <dev/i2c/tps65217pmicreg.h>
 
+#define NTPS_REG	7
+
 struct tps65217pmic_softc {
-	device_t	sc_dev;
+	device_t		sc_dev;
 
-	i2c_tag_t	sc_tag;
-	i2c_addr_t	sc_addr;
+	i2c_tag_t		sc_tag;
+	i2c_addr_t		sc_addr;
 
-	uint8_t		sc_version;
-	uint8_t		sc_revision;
-};
+	uint8_t			sc_version;
+	uint8_t			sc_revision;
 
+	/* envsys(4) stuff */
+	struct sysmon_envsys	*sc_sme;
+	envsys_data_t		sc_sensor[NTPS_REG];
+	kmutex_t		sc_lock;
+};
 
-#define NTPS_REG	7
 /* Voltage regulators */
 enum tps_reg_num {
 	TPS65217PMIC_LDO1,
@@ -107,21 +115,23 @@ struct tps_reg_param {
 static int tps65217pmic_match(device_t, cfdata_t, void *);
 static void tps65217pmic_attach(device_t, device_t, void *);
 
-static uint8_t tps65217pmic_reg_read(struct tps65217pmic_softc *sc, 
-    uint8_t regno);
+static uint8_t tps65217pmic_reg_read(struct tps65217pmic_softc *, uint8_t);
+
+static void tps65217pmic_refresh(struct tps65217pmic_softc *);
 
-static void tps65217pmic_refresh(struct tps65217pmic_softc *sc);
+static uint16_t tps65217pmic_ppath_max_usb_current(uint8_t);
+static uint16_t tps65217pmic_ppath_max_ac_current(uint8_t);
 
-static uint16_t tps65217pmic_ppath_max_usb_current(uint8_t ppath);
-static uint16_t tps65217pmic_ppath_max_ac_current(uint8_t ppath);
+static void tps65217pmic_regulator_read_config(struct tps65217pmic_softc *,
+    struct tps_reg_param *);
 
-static void tps65217pmic_regulator_read_config(struct tps65217pmic_softc 
-    *sc, struct tps_reg_param *regulator);
+static void tps65217pmic_print_ppath(struct tps65217pmic_softc *);
+static void tps65217pmic_print_ldos(struct tps65217pmic_softc *);
 
-static void tps65217pmic_print_ppath(struct tps65217pmic_softc *sc);
-static void tps65217pmic_print_ldos(struct tps65217pmic_softc *sc);
+static void tps65217pmic_version(struct tps65217pmic_softc *);
 
-static void tps65217pmic_version(struct tps65217pmic_softc *sc);
+static void tps65217pmic_envsys_register(struct tps65217pmic_softc *);
+static void tps65217pmic_envsys_refresh(struct sysmon_envsys *, envsys_data_t *);
 
 CFATTACH_DECL_NEW(tps65217pmic, sizeof (struct tps65217pmic_softc),
     tps65217pmic_match, tps65217pmic_attach, NULL, NULL);
@@ -289,10 +299,14 @@ tps65217pmic_attach(device_t parent, dev
 	aprint_normal(" Power Management Multi-Channel IC (rev 1.%d)\n", 
 	    sc->sc_revision);
 
+	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+
 	tps65217pmic_refresh(sc);
 
 	tps65217pmic_print_ppath(sc);
 	tps65217pmic_print_ldos(sc);
+
+	tps65217pmic_envsys_register(sc);
 }
 
 static void
@@ -428,13 +442,12 @@ tps65217pmic_print_ldos(struct tps65217p
 	for (i = 0; i < NTPS_REG; i++) {
 		c_reg = &tps_regulators[i];
 
-		if(c_reg->is_enabled) {
-
-			if (c_reg->is_ls) {
+		if (c_reg->is_enabled) {
+			if (c_reg->is_ls)
 				aprint_normal("[%s: LS] ", c_reg->name);
-			} else if (c_reg->is_xadj) {
+			else if (c_reg->is_xadj)
 				aprint_normal("[%s: XADJ] ", c_reg->name);
-			} else
+			else
 				aprint_normal("[%s: %d mV] ", c_reg->name,
 				    c_reg->current_voltage);
 		}
@@ -472,7 +485,6 @@ tps65217pmic_print_ppath(struct tps65217
 	}
 
 	aprint_normal("\n");
-
 }
 
 static uint8_t
@@ -499,3 +511,49 @@ tps65217pmic_reg_read(struct tps65217pmi
 	return rv;
 }
 
+static void
+tps65217pmic_envsys_register(struct tps65217pmic_softc *sc)
+{
+	int i;
+
+	sc->sc_sme = sysmon_envsys_create();
+
+	/* iterate over all regulators and register them as sensors */
+	for(i = 0; i < NTPS_REG; i++) {
+		/* set name */
+		strlcpy(sc->sc_sensor[i].desc, tps_regulators[i].name, 
+		    sizeof(sc->sc_sensor[i].desc));
+		sc->sc_sensor[i].units = ENVSYS_SVOLTS_DC; 
+		sc->sc_sensor[i].state = ENVSYS_SINVALID;
+
+		if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor[i]))
+			aprint_error_dev(sc->sc_dev, 
+			    "error attaching sensor %d\n", i);
+	}
+
+	sc->sc_sme->sme_name = device_xname(sc->sc_dev);
+	sc->sc_sme->sme_cookie = sc;
+	sc->sc_sme->sme_refresh = tps65217pmic_envsys_refresh;
+
+	if (sysmon_envsys_register(sc->sc_sme)) {
+		aprint_error_dev(sc->sc_dev, "unable to register in sysmon\n");
+		sysmon_envsys_destroy(sc->sc_sme);
+	}
+}
+
+static void
+tps65217pmic_envsys_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+	struct tps65217pmic_softc *sc = sme->sme_cookie;	
+
+	mutex_enter(&sc->sc_lock);
+
+	tps65217pmic_refresh(sc);
+
+	/* TODO: handle special cases like LS, XADJ... */
+	edata->value_cur = tps_regulators[edata->sensor].current_voltage * 1000;
+	edata->state = ENVSYS_SVALID;
+	
+	mutex_exit(&sc->sc_lock);
+}
+

Reply via email to