diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-10-03 01:59:21 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-10-03 01:59:21 +0000 |
commit | 375a05d4b5479dd868dda3641b4f39f0ea27612a (patch) | |
tree | a2c8837b14b7bfa6da2d78c10ee88bb6ad15b501 /sys/arch/armv7 | |
parent | d48f5fb6697380ae3d7d1d339154eda3ff7d6c79 (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/GENERIC | 4 | ||||
-rw-r--r-- | sys/arch/armv7/conf/RAMDISK | 4 | ||||
-rw-r--r-- | sys/arch/armv7/omap/files.omap | 6 | ||||
-rw-r--r-- | sys/arch/armv7/omap/omap.c | 3 | ||||
-rw-r--r-- | sys/arch/armv7/omap/ompinmux.c | 138 |
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; +} |