Add gpiocharger(4) for arm64
authorkn <kn@openbsd.org>
Sat, 25 Sep 2021 18:40:07 +0000 (18:40 +0000)
committerkn <kn@openbsd.org>
Sat, 25 Sep 2021 18:40:07 +0000 (18:40 +0000)
This driver provides support for battery chargers connected to GPIO pins,
such as those found on the Pinebook Pro.

OK kettenis

distrib/sets/lists/man/mi
share/man/man4/Makefile
share/man/man4/gpiocharger.4 [new file with mode: 0644]
sys/arch/arm64/conf/GENERIC
sys/dev/fdt/files.fdt
sys/dev/fdt/gpiocharger.c [new file with mode: 0644]

index 2edf3c9..3a28fd1 100644 (file)
 ./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
index e914597..cfa5cb1 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.807 2021/09/25 10:43:23 kn Exp $
+#      $OpenBSD: Makefile,v 1.808 2021/09/25 18:40:08 kn Exp $
 
 MAN=   aac.4 abcrtc.4 abl.4 ac97.4 acphy.4 acrtc.4 \
        acpi.4 acpiac.4 acpials.4 acpiasus.4 acpibat.4 \
@@ -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 \
diff --git a/share/man/man4/gpiocharger.4 b/share/man/man4/gpiocharger.4
new file mode 100644 (file)
index 0000000..061b699
--- /dev/null
@@ -0,0 +1,51 @@
+.\"    $OpenBSD: gpiocharger.4,v 1.1 2021/09/25 18:40:07 kn Exp $
+.\"
+.\" Copyright (c) 2021 Klemens Nanni <kn@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 25 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.1 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+driver was written by
+.An Klemens Nanni Aq Mt kn@openbsd.org .
index bcc95cd..ec63688 100644 (file)
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.207 2021/09/25 10:43:24 kn Exp $
+# $OpenBSD: GENERIC,v 1.208 2021/09/25 18:40:08 kn Exp $
 #
 # GENERIC machine description file
 #
@@ -132,6 +132,7 @@ drm*                at amdgpu?
 wsdisplay*     at amdgpu?
 
 gpioleds*      at fdt?
+gpiocharger*   at fdt?
 
 # Apple
 apldart*       at fdt?
index 7d36eab..301500e 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: files.fdt,v 1.156 2021/09/25 10:43:24 kn Exp $
+#      $OpenBSD: files.fdt,v 1.157 2021/09/25 18:40:08 kn Exp $
 #
 # Config file and device description for machine-independent FDT code.
 # Included by ports that need it.
@@ -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
diff --git a/sys/dev/fdt/gpiocharger.c b/sys/dev/fdt/gpiocharger.c
new file mode 100644 (file)
index 0000000..eae1dd6
--- /dev/null
@@ -0,0 +1,117 @@
+/*     $OpenBSD: gpiocharger.c,v 1.1 2021/09/25 18:40:08 kn Exp $      */
+/*
+ * Copyright (c) 2021 Klemens Nanni <kn@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_property = "gpios";
+       gpios_len = OF_getproplen(node, gpios_property);
+       if (gpios_len <= 0) {
+               gpios_property = "charger-status-gpios";
+               gpios_len = OF_getproplen(node, gpios_property);
+               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);
+}