summaryrefslogtreecommitdiff
path: root/sys/arch/armv7
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2016-10-03 01:59:21 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2016-10-03 01:59:21 +0000
commit375a05d4b5479dd868dda3641b4f39f0ea27612a (patch)
treea2c8837b14b7bfa6da2d78c10ee88bb6ad15b501 /sys/arch/armv7
parentd48f5fb6697380ae3d7d1d339154eda3ff7d6c79 (diff)
Disable sitaracm and add a new ompinmux driver for omap pin muxing/pad
configuration that attaches with the fdt and writes values to registers based on the pinctrl data in the fdt. Handles 16 bit values (OMAP3/OMAP4) and 32 bit values (AM335x/AM57xx). Feedback from and ok kettenis@ tom@ on an earlier version.
Diffstat (limited to 'sys/arch/armv7')
-rw-r--r--sys/arch/armv7/conf/GENERIC4
-rw-r--r--sys/arch/armv7/conf/RAMDISK4
-rw-r--r--sys/arch/armv7/omap/files.omap6
-rw-r--r--sys/arch/armv7/omap/omap.c3
-rw-r--r--sys/arch/armv7/omap/ompinmux.c138
5 files changed, 148 insertions, 7 deletions
diff --git a/sys/arch/armv7/conf/GENERIC b/sys/arch/armv7/conf/GENERIC
index 49a90ad6816..2bc096dfbc5 100644
--- a/sys/arch/armv7/conf/GENERIC
+++ b/sys/arch/armv7/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.56 2016/09/23 17:59:17 kettenis Exp $
+# $OpenBSD: GENERIC,v 1.57 2016/10/03 01:59:20 jsg Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -66,7 +66,7 @@ intc* at fdt? # OMAP3 interrupt controller
omwugen* at fdt? # Wake-up generator
#edma* at omap? # OMAP3 dma controller
prcm* at omap? # power/clock controller
-sitaracm* at omap? # sitara control module
+ompinmux* at fdt? # pin muxing
omdog* at fdt? # watchdog timer
omgpio* at fdt? # user-visible GPIO pins?
gpio* at omgpio?
diff --git a/sys/arch/armv7/conf/RAMDISK b/sys/arch/armv7/conf/RAMDISK
index 5ac1004bb22..c7d8259fc10 100644
--- a/sys/arch/armv7/conf/RAMDISK
+++ b/sys/arch/armv7/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.51 2016/09/23 17:59:17 kettenis Exp $
+# $OpenBSD: RAMDISK,v 1.52 2016/10/03 01:59:20 jsg Exp $
machine armv7 arm
@@ -64,7 +64,7 @@ intc* at fdt? # OMAP3 interrupt controller
omwugen* at fdt? # Wake-up generator
#edma* at omap? # OMAP3 dma controller
prcm* at omap? # power/clock controller
-sitaracm* at omap? # sitara control module
+ompinmux* at fdt? # pin muxing
omdog* at fdt? # watchdog timer
omgpio* at fdt? # user-visible GPIO pins?
gpio* at omgpio?
diff --git a/sys/arch/armv7/omap/files.omap b/sys/arch/armv7/omap/files.omap
index f4c22f18a09..411288d7756 100644
--- a/sys/arch/armv7/omap/files.omap
+++ b/sys/arch/armv7/omap/files.omap
@@ -1,4 +1,4 @@
-# $OpenBSD: files.omap,v 1.18 2016/09/15 21:55:51 jsg Exp $
+# $OpenBSD: files.omap,v 1.19 2016/10/03 01:59:20 jsg Exp $
define omap {}
device omap: omap
@@ -26,6 +26,10 @@ attach sitaracm at omap
file arch/armv7/omap/am335x_cm_padconf.c sitaracm
file arch/armv7/omap/sitara_cm.c sitaracm
+device ompinmux
+attach ompinmux at fdt
+file arch/armv7/omap/ompinmux.c ompinmux
+
device omgpio: gpiobus
attach omgpio at fdt
file arch/armv7/omap/omgpio.c omgpio
diff --git a/sys/arch/armv7/omap/omap.c b/sys/arch/armv7/omap/omap.c
index 435d6921e37..542633b08f3 100644
--- a/sys/arch/armv7/omap/omap.c
+++ b/sys/arch/armv7/omap/omap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: omap.c,v 1.19 2016/08/11 04:33:06 jsg Exp $ */
+/* $OpenBSD: omap.c,v 1.20 2016/10/03 01:59:20 jsg Exp $ */
/*
* Copyright (c) 2005,2008 Dale Rahn <drahn@openbsd.com>
*
@@ -47,7 +47,6 @@ struct board_dev omap3_dev[] = {
struct board_dev am33xx_dev[] = {
{ "prcm", 0 },
- { "sitaracm", 0 },
{ "edma", 0 },
{ "dmtimer", 0 },
{ "dmtimer", 1 },
diff --git a/sys/arch/armv7/omap/ompinmux.c b/sys/arch/armv7/omap/ompinmux.c
new file mode 100644
index 00000000000..10a5b06ddfd
--- /dev/null
+++ b/sys/arch/armv7/omap/ompinmux.c
@@ -0,0 +1,138 @@
+/* $OpenBSD: ompinmux.c,v 1.1 2016/10/03 01:59:20 jsg Exp $ */
+/*
+ * Copyright (c) 2016 Jonathan Gray <jsg@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/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+
+#include <machine/bus.h>
+#include <machine/fdt.h>
+#include <armv7/armv7/armv7var.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_pinctrl.h>
+#include <dev/ofw/fdt.h>
+
+struct ompinmux_softc {
+ struct device sc_dev;
+ bus_space_tag_t sc_iot;
+ bus_space_handle_t sc_ioh;
+ int sc_node;
+};
+
+int ompinmux_match(struct device *, void *, void *);
+void ompinmux_attach(struct device *, struct device *, void *);
+int ompinmux_pinctrl(uint32_t, void *);
+
+struct cfattach ompinmux_ca = {
+ sizeof (struct ompinmux_softc), ompinmux_match, ompinmux_attach
+};
+
+struct cfdriver ompinmux_cd = {
+ NULL, "ompinmux", DV_DULL
+};
+
+int
+ompinmux_match(struct device *parent, void *match, void *aux)
+{
+ struct fdt_attach_args *faa = aux;
+
+ return OF_is_compatible(faa->fa_node, "pinctrl-single");
+}
+
+void
+ompinmux_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct fdt_attach_args *faa = aux;
+ struct ompinmux_softc *sc = (struct ompinmux_softc *) self;
+
+ sc->sc_iot = faa->fa_iot;
+ if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr,
+ faa->fa_reg[0].size, 0, &sc->sc_ioh))
+ panic("%s: bus_space_map failed!", __func__);
+
+ sc->sc_node = faa->fa_node;
+ pinctrl_register(faa->fa_node, ompinmux_pinctrl, sc);
+
+ pinctrl_byname(faa->fa_node, "default");
+
+ printf("\n");
+}
+
+int
+ompinmux_pinctrl(uint32_t phandle, void *cookie)
+{
+ struct ompinmux_softc *sc = cookie;
+ uint32_t *pins;
+ int npins;
+ int node;
+ int len;
+ int i, j;
+ int regwidth;
+
+ if (sc == NULL)
+ return -1;
+
+ node = OF_getnodebyphandle(phandle);
+ if (node == 0)
+ return -1;
+
+ len = OF_getproplen(node, "pinctrl-single,pins");
+ if (len <= 0)
+ return -1;
+
+ pins = malloc(len, M_TEMP, M_WAITOK);
+ OF_getpropintarray(node, "pinctrl-single,pins", pins, len);
+ npins = len / (2 * sizeof(uint32_t));
+
+ regwidth = OF_getpropint(sc->sc_node, "pinctrl-single,register-width",
+ 0);
+
+ if (regwidth == 16) {
+ uint16_t regmask = OF_getpropint(sc->sc_node,
+ "pinctrl-single,function-mask", 0xffff);
+ uint32_t conf_reg;
+ uint16_t conf_val;
+
+ for (i = 0, j = 0; i < npins; i++, j += 2) {
+ conf_reg = pins[2 * i + 0];
+
+ conf_val = (bus_space_read_2(sc->sc_iot, sc->sc_ioh,
+ conf_reg) & ~regmask) | pins[2 * i + 1];
+ bus_space_write_2(sc->sc_iot, sc->sc_ioh, conf_reg,
+ conf_val);
+ }
+ } else if (regwidth == 32) {
+ uint32_t regmask = OF_getpropint(sc->sc_node,
+ "pinctrl-single,function-mask", 0xffffffff);
+ uint32_t conf_reg, conf_val;
+
+ for (i = 0, j = 0; i < npins; i++, j += 2) {
+ conf_reg = pins[2 * i + 0];
+
+ conf_val = (bus_space_read_4(sc->sc_iot, sc->sc_ioh,
+ conf_reg) & ~regmask) | pins[2 * i + 1];
+ bus_space_write_4(sc->sc_iot, sc->sc_ioh, conf_reg,
+ conf_val);
+ }
+ }
+
+ free(pins, M_TEMP, len);
+ return 0;
+}