> Date: Thu, 16 Sep 2021 06:14:39 +0000
> From: Klemens Nanni <k...@openbsd.org>
> 
> On 5 September 2021 01:22:53 GMT+05:00, Klemens Nanni <k...@openbsd.org> 
> wrote:
> >Read a single GPIO pin indicating whether AC is plugged in or not.
> >
> >This gives me a sensor on my Pinebook Pro.
> >cwfg(4) already provides battery information but not the charger bits.
> >
> >apm(4) integration can follow separately.
> >
> >Feedback? OK?
> 
> Ping.
> The diff applies after the "new gpioleds driver" one.
> 
> >diff 4e7699b4cf65fba4bf837b202fb68ee0f66e6d07 refs/heads/master
> >blob - b92b1f60934ba60f92341ce94570d0ae96e78c1d
> >blob + 549a8316b874e4e5a6e1ede1640eeefadd9af0d4
> >--- distrib/sets/lists/man/mi
> >+++ distrib/sets/lists/man/mi
> >@@ -1417,6 +1417,7 @@
> > ./usr/share/man/man4/glenv.4
> > ./usr/share/man/man4/glkgpio.4
> > ./usr/share/man/man4/gpio.4
> >+./usr/share/man/man4/gpiocharger.4
> > ./usr/share/man/man4/gpiodcf.4
> > ./usr/share/man/man4/gpioiic.4
> > ./usr/share/man/man4/gpioleds.4
> >blob - bb62c44d32f152ecf64aa77d60a1a5a3454d3968
> >blob + a40cf91ec22f638f9c030aa7128d10bf75748305
> >--- share/man/man4/Makefile
> >+++ share/man/man4/Makefile
> >@@ -35,7 +35,8 @@ MAN=       aac.4 abcrtc.4 abl.4 ac97.4 acphy.4 acrtc.4 \
> >     eso.4 ess.4 et.4 etherip.4 etphy.4 ex.4 exphy.4 exrtc.4 \
> >     fanpwr.4 fd.4 fdc.4 fec.4 fido.4 fins.4 fintek.4 fms.4 fusbtc.4 \
> >     fuse.4 fxp.4 \
> >-    gdt.4 gentbi.4 gem.4 gfrtc.4 gif.4 glenv.4 glkgpio.4 gpio.4 gpiodcf.4 \
> >+    gdt.4 gentbi.4 gem.4 gfrtc.4 gif.4 glenv.4 glkgpio.4 gpio.4 \
> >+    gpiocharger.4 gpiodcf.4 \
> >     gpioiic.4 gpioleds.4 gpioow.4 graphaudio.4 gre.4 gscsio.4 \
> >     hds.4 hiclock.4 hidwusb.4 hifn.4 hil.4 hilid.4 hilkbd.4 hilms.4 \
> >     hireset.4 hitemp.4 hme.4 hotplug.4 hsq.4 \
> >blob - /dev/null
> >blob + 12aa353d9367f57f07a89ae30dc3966c373032f8 (mode 644)
> >--- /dev/null
> >+++ share/man/man4/gpiocharger.4
> >@@ -0,0 +1,51 @@
> >+.\" $OpenBSD: $
> >+.\"
> >+.\" Copyright (c) 2021 Klemens Nanni <k...@openbsd.org>
> >+.\"
> >+.\" Permission to use, copy, modify, and distribute this software for any
> >+.\" purpose with or without fee is hereby granted, provided that the above
> >+.\" copyright notice and this permission notice appear in all copies.
> >+.\"
> >+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> >+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> >+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> >+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> >+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> >+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> >+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> >+.\"
> >+.Dd $Mdocdate: September 04 2021 $
> >+.Dt GPIOCHARGER 4
> >+.Os
> >+.Sh NAME
> >+.Nm gpiocharger
> >+.Nd GPIO battery charger
> >+.Sh SYNOPSIS
> >+.Cd "gpiocharger* at fdt?"
> >+.Sh DESCRIPTION
> >+The
> >+.Nm
> >+driver provides support for battery chargers connected to GPIO pins.
> >+Currently, only power supply status events are supported.
> >+.Pp
> >+The power supply status (connected or disconnected) is set up as a sensor
> >+and can be monitored using
> >+.Xr sysctl 8
> >+or
> >+.Xr sensorsd 8 .
> >+.Sh SEE ALSO
> >+.Xr gpio 4 ,
> >+.Xr intro 4 ,
> >+.Xr sensorsd 8 ,
> >+.Xr sysctl 8
> >+.Sh HISTORY
> >+The
> >+.Nm
> >+driver first appeared in
> >+.Ox 7.0 .
> >+.Sh AUTHORS
> >+.An -nosplit
> >+The
> >+.Nm
> >+driver was written by
> >+.An Klemens Nanni Aq Mt k...@openbsd.org .
> >blob - d3c3afb621f20013dc2475b4d87bd959e4127c9d
> >blob + b0702181cd2e510ef5267460dc71b68a8abd508a
> >--- sys/arch/arm64/conf/GENERIC
> >+++ sys/arch/arm64/conf/GENERIC
> >@@ -132,6 +132,7 @@ drm*             at amdgpu?
> > wsdisplay*  at amdgpu?
> > 
> > gpioleds*   at fdt?
> >+gpiocharger*        at fdt?
> > 
> > # Apple
> > apldart*    at fdt?
> >blob - f749803b07408179ddc090d484ed4f79bfcb52a7
> >blob + f91263405dc183dd60e8ddc1fe69c5fbaf38b651
> >--- sys/dev/fdt/files.fdt
> >+++ sys/dev/fdt/files.fdt
> >@@ -592,3 +592,7 @@ file     dev/fdt/dapmic.c                dapmic
> > device      gpioleds
> > attach      gpioleds at fdt
> > file        dev/fdt/gpioleds.c              gpioleds
> >+
> >+device      gpiocharger
> >+attach      gpiocharger at fdt
> >+file        dev/fdt/gpiocharger.c           gpiocharger
> >blob - /dev/null
> >blob + dbf6bf50a13029438b9b7e969306c34640c5747e (mode 644)
> >--- /dev/null
> >+++ sys/dev/fdt/gpiocharger.c
> >@@ -0,0 +1,116 @@
> >+/*  $OpenBSD: $     */
> >+/*
> >+ * Copyright (c) 2021 Klemens Nanni <k...@openbsd.org>
> >+ *
> >+ * Permission to use, copy, modify, and distribute this software for any
> >+ * purpose with or without fee is hereby granted, provided that the above
> >+ * copyright notice and this permission notice appear in all copies.
> >+ *
> >+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> >+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> >+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> >+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> >+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> >+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> >+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> >+ */
> >+
> >+#include <sys/param.h>
> >+#include <sys/systm.h>
> >+#include <sys/device.h>
> >+#include <sys/gpio.h>
> >+#include <sys/malloc.h>
> >+
> >+#include <machine/bus.h>
> >+#include <machine/fdt.h>
> >+
> >+#include <dev/gpio/gpiovar.h>
> >+#include <dev/ofw/ofw_gpio.h>
> >+#include <dev/ofw/ofw_pinctrl.h>
> >+#include <dev/ofw/openfirm.h>
> >+#include <dev/ofw/fdt.h>
> >+
> >+#include <sys/sensors.h>
> >+
> >+struct gpiocharger_softc {
> >+    struct device            sc_dev;
> >+    int                      sc_node;
> >+    uint32_t                *sc_charger_pin;
> >+    struct ksensor           sc_sensor;
> >+    struct ksensordev        sc_sensordev;
> >+};
> >+
> >+int  gpiocharger_match(struct device *, void *, void *);
> >+void         gpiocharger_attach(struct device *, struct device *, void *);
> >+
> >+struct cfattach     gpiocharger_ca = {
> >+    sizeof (struct gpiocharger_softc), gpiocharger_match, gpiocharger_attach
> >+};
> >+
> >+struct cfdriver gpiocharger_cd = {
> >+    NULL, "gpiocharger", DV_DULL
> >+};
> >+
> >+void         gpiocharger_update_charger(void *);
> >+
> >+int
> >+gpiocharger_match(struct device *parent, void *match, void *aux)
> >+{
> >+    const struct fdt_attach_args    *faa = aux;
> >+
> >+    return OF_is_compatible(faa->fa_node, "gpio-charger");
> >+}
> >+
> >+void
> >+gpiocharger_attach(struct device *parent, struct device *self, void *aux)
> >+{
> >+    struct gpiocharger_softc        *sc = (struct gpiocharger_softc *)self;
> >+    struct fdt_attach_args          *faa = aux;
> >+    char                            *charger_type, *gpios_property;
> >+    int                              charger_type_len, gpios_len;
> >+    int                              node = faa->fa_node;
> >+
> >+    pinctrl_byname(node, "default");
> >+
> >+    charger_type_len = OF_getproplen(node, "charger-type");
> >+    if (charger_type_len <= 0)
> >+            goto nocharger;
> >+    gpios_len = OF_getproplen(node, gpios_property = "gpios");
> >+    if (gpios_len <= 0) {
> >+            gpios_len = OF_getproplen(node,
> >+                gpios_property = "charger-status-gpios");

No, please don't hide assignment statements as function arguments.

> >+            if (gpios_len <= 0)
> >+                    goto nocharger;
> >+    }
> >+
> >+    charger_type = malloc(charger_type_len, M_TEMP, M_WAITOK);
> >+    OF_getprop(node, "charger-type", charger_type, charger_type_len);
> >+    sc->sc_charger_pin = malloc(gpios_len, M_DEVBUF, M_WAITOK);
> >+    OF_getpropintarray(node, gpios_property, sc->sc_charger_pin, gpios_len);
> >+    gpio_controller_config_pin(sc->sc_charger_pin, GPIO_CONFIG_INPUT);
> >+
> >+    strlcpy(sc->sc_sensor.desc, charger_type, sizeof(sc->sc_sensor.desc));
> >+    strlcat(sc->sc_sensor.desc, " power supply",
> >+        sizeof(sc->sc_sensor.desc));
> >+    sc->sc_sensor.type = SENSOR_INDICATOR;
> >+    sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);
> >+    strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
> >+        sizeof(sc->sc_sensordev.xname));
> >+    sensordev_install(&sc->sc_sensordev);
> >+    sensor_task_register(sc, gpiocharger_update_charger, 5);
> >+
> >+    printf(": \"%s\"\n", charger_type);
> >+    free(charger_type, M_TEMP, charger_type_len);
> >+    return;
> >+
> >+nocharger:
> >+    printf(": no charger\n");
> >+}
> >+
> >+void
> >+gpiocharger_update_charger(void *arg)
> >+{
> >+    struct gpiocharger_softc        *sc = arg;
> >+
> >+    sc->sc_sensor.value = gpio_controller_get_pin(sc->sc_charger_pin);
> >+}
> >
> 
> 

Reply via email to