On Tue, Nov 21, 2017 at 10:31:47PM +0100, Mark Kettenis wrote:
> The diff below exposes voltage regulators as sensors. This makes it
> easy to look at the current settings of these regulators. The
> downside is that these aren't really sensors as the voltages are not
> actually measured.
>
> The functionality is optional; callers can pass NULL in the
> regulator_register() if the regulators aren't particularly
> interesting.
>
> This is what it looks like on the rk3399-firefly:
>
> milhaud$ sysctl hw.sensors
> hw.sensors.rktemp0.temp0=23.89 degC (CPU)
> hw.sensors.rktemp0.temp1=28.75 degC (GPU)
> hw.sensors.rkpmic0.volt0=0.90 VDC (vdd_cpu_l)
> hw.sensors.rkpmic0.volt1=1.80 VDC (vcc1v8_dvp)
> hw.sensors.rkpmic0.volt2=1.80 VDC (vcc1v8_pmu)
> hw.sensors.rkpmic0.volt3=3.00 VDC (vcc_sd)
> hw.sensors.rkpmic0.volt4=1.80 VDC (vcca1v8_codec)
> hw.sensors.rkpmic0.volt5=3.00 VDC (vcc_3v0)
>
> thoughts?
>
How about increasing usefulness by skipping those where:
regulator-min == -max && regulator-always-on ?
"eeprom -p" does cover those as is.
-Artturi
>
> Index: sys/dev/ofw/ofw_regulator.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/ofw/ofw_regulator.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 ofw_regulator.c
> --- sys/dev/ofw/ofw_regulator.c 18 Nov 2017 13:48:50 -0000 1.2
> +++ sys/dev/ofw/ofw_regulator.c 21 Nov 2017 21:19:59 -0000
> @@ -15,9 +15,10 @@
> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> */
>
> -#include <sys/types.h>
> +#include <sys/param.h>
> #include <sys/systm.h>
> #include <sys/malloc.h>
> +#include <sys/sensors.h>
>
> #include <dev/ofw/openfirm.h>
> #include <dev/ofw/ofw_gpio.h>
> @@ -28,13 +29,24 @@ LIST_HEAD(, regulator_device) regulator_
> LIST_HEAD_INITIALIZER(regulator_devices);
>
> void
> -regulator_register(struct regulator_device *rd)
> +regulator_register(struct regulator_device *rd, struct ksensordev *sensdev)
> {
> rd->rd_phandle = OF_getpropint(rd->rd_node, "phandle", 0);
> if (rd->rd_phandle == 0)
> return;
>
> LIST_INSERT_HEAD(®ulator_devices, rd, rd_list);
> +
> + if (sensdev) {
> + rd->rd_sens = malloc(sizeof(struct ksensor), M_DEVBUF,
> + M_WAITOK | M_ZERO);
> + OF_getprop(rd->rd_node, "regulator-name",
> + rd->rd_sens->desc, sizeof(rd->rd_sens->desc));
> + rd->rd_sens->desc[sizeof(rd->rd_sens->desc) - 1] = 0;
> + rd->rd_sens->type = SENSOR_VOLTS_DC;
> + rd->rd_sens->value = rd->rd_get_voltage(rd->rd_cookie);
> + sensor_attach(sensdev, rd->rd_sens);
> + }
> }
>
> int
> @@ -121,14 +133,20 @@ int
> regulator_set_voltage(uint32_t phandle, uint32_t voltage)
> {
> struct regulator_device *rd;
> + int ret;
>
> LIST_FOREACH(rd, ®ulator_devices, rd_list) {
> if (rd->rd_phandle == phandle)
> break;
> }
>
> - if (rd && rd->rd_set_voltage)
> - return rd->rd_set_voltage(rd->rd_cookie, voltage);
> + if (rd && rd->rd_set_voltage) {
> + ret = rd->rd_set_voltage(rd->rd_cookie, voltage);
> + if (ret == 0 && rd->rd_sens)
> + rd->rd_sens->value = rd->rd_get_voltage(rd->rd_cookie);
> +
> + return ret;
> + }
>
> return -1;
> }
> Index: sys/dev/ofw/ofw_regulator.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/ofw/ofw_regulator.h,v
> retrieving revision 1.3
> diff -u -p -r1.3 ofw_regulator.h
> --- sys/dev/ofw/ofw_regulator.h 18 Nov 2017 21:03:23 -0000 1.3
> +++ sys/dev/ofw/ofw_regulator.h 21 Nov 2017 21:19:59 -0000
> @@ -18,6 +18,9 @@
> #ifndef _DEV_OFW_REGULATOR_H_
> #define _DEV_OFW_REGULATOR_H_
>
> +struct ksensor;
> +struct ksensordev;
> +
> struct regulator_device {
> int rd_node;
> void *rd_cookie;
> @@ -26,9 +29,11 @@ struct regulator_device {
>
> LIST_ENTRY(regulator_device) rd_list;
> uint32_t rd_phandle;
> +
> + struct ksensor *rd_sens;
> };
>
> -void regulator_register(struct regulator_device *);
> +void regulator_register(struct regulator_device *, struct ksensordev *);
>
> int regulator_enable(uint32_t);
> int regulator_disable(uint32_t);
> Index: sys/dev/fdt/rkpmic.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/fdt/rkpmic.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 rkpmic.c
> --- sys/dev/fdt/rkpmic.c 18 Nov 2017 20:29:51 -0000 1.3
> +++ sys/dev/fdt/rkpmic.c 21 Nov 2017 21:19:59 -0000
> @@ -19,6 +19,7 @@
> #include <sys/systm.h>
> #include <sys/device.h>
> #include <sys/malloc.h>
> +#include <sys/sensors.h>
>
> #include <dev/ofw/openfirm.h>
> #include <dev/ofw/ofw_regulator.h>
> @@ -70,6 +71,7 @@ struct rkpmic_softc {
> i2c_addr_t sc_addr;
>
> struct todr_chip_handle sc_todr;
> + struct ksensordev sc_sensordev;
> };
>
> int rkpmic_match(struct device *, void *, void *);
> @@ -122,6 +124,11 @@ rkpmic_attach(struct device *parent, str
> return;
> for (node = OF_child(node); node; node = OF_peer(node))
> rkpmic_attach_regulator(sc, node);
> +
> + /* Register sensors. */
> + strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
> + sizeof(sc->sc_sensordev.xname));
> + sensordev_install(&sc->sc_sensordev);
> }
>
> struct rkpmic_regulator {
> @@ -163,7 +170,7 @@ rkpmic_attach_regulator(struct rkpmic_so
> rr->rr_rd.rd_node = node;
> rr->rr_rd.rd_cookie = rr;
> rr->rr_rd.rd_get_voltage = rkpmic_get_voltage;
> - regulator_register(&rr->rr_rd);
> + regulator_register(&rr->rr_rd, &sc->sc_sensordev);
> }
>
> uint32_t
>