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");
>+              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