summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2017-03-05 20:53:20 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2017-03-05 20:53:20 +0000
commitf1a7723221ba707463948428b57eb471cbf657bd (patch)
tree31ce458f54492641568ffc8b5ddacf0b332fbb3c
parent6a15cbd70e98f6f1be51ec7678674c04f8a3462c (diff)
Turn exgpio(4) into a pinctrl driver.
-rw-r--r--sys/arch/armv7/conf/GENERIC4
-rw-r--r--sys/arch/armv7/exynos/exehci.c3
-rw-r--r--sys/arch/armv7/exynos/exesdhc.c9
-rw-r--r--sys/arch/armv7/exynos/exgpio.c390
-rw-r--r--sys/arch/armv7/exynos/exgpiovar.h41
-rw-r--r--sys/arch/armv7/exynos/exiic.c1
-rw-r--r--sys/arch/armv7/exynos/files.exynos4
7 files changed, 172 insertions, 280 deletions
diff --git a/sys/arch/armv7/conf/GENERIC b/sys/arch/armv7/conf/GENERIC
index 3da2e6867d9..48c98dab856 100644
--- a/sys/arch/armv7/conf/GENERIC
+++ b/sys/arch/armv7/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.73 2017/03/04 18:17:24 kettenis Exp $
+# $OpenBSD: GENERIC,v 1.74 2017/03/05 20:53:19 kettenis Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -120,7 +120,7 @@ expower* at fdt? early 1
exsysreg* at fdt? early 1
exmct* at fdt? early 1
exdog* at fdt?
-exgpio* at exynos?
+exgpio* at fdt? early 1
exiic* at exynos?
iic* at exiic?
exehci* at fdt?
diff --git a/sys/arch/armv7/exynos/exehci.c b/sys/arch/armv7/exynos/exehci.c
index b0f7f73e6fd..347b08bbb87 100644
--- a/sys/arch/armv7/exynos/exehci.c
+++ b/sys/arch/armv7/exynos/exehci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exehci.c,v 1.5 2017/03/04 18:17:24 kettenis Exp $ */
+/* $OpenBSD: exehci.c,v 1.6 2017/03/05 20:53:19 kettenis Exp $ */
/*
* Copyright (c) 2012-2013 Patrick Wildt <patrick@blueri.se>
*
@@ -32,7 +32,6 @@
#include <armv7/armv7/armv7var.h>
#include <armv7/exynos/exsysregvar.h>
#include <armv7/exynos/expowervar.h>
-#include <armv7/exynos/exgpiovar.h>
#include <dev/ofw/openfirm.h>
#include <dev/ofw/ofw_clock.h>
diff --git a/sys/arch/armv7/exynos/exesdhc.c b/sys/arch/armv7/exynos/exesdhc.c
index 3a913d631bb..0cb87c40d02 100644
--- a/sys/arch/armv7/exynos/exesdhc.c
+++ b/sys/arch/armv7/exynos/exesdhc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exesdhc.c,v 1.10 2017/03/04 18:17:24 kettenis Exp $ */
+/* $OpenBSD: exesdhc.c,v 1.11 2017/03/05 20:53:19 kettenis Exp $ */
/*
* Copyright (c) 2009 Dale Rahn <drahn@openbsd.org>
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -42,7 +42,6 @@
#include <armv7/armv7/armv7var.h>
#include <armv7/exynos/exclockvar.h>
-#include <armv7/exynos/exgpiovar.h>
/* registers */
#define SDHC_DS_ADDR 0x00
@@ -266,6 +265,8 @@ exesdhc_attach(struct device *parent, struct device *self, void *aux)
struct sdmmcbus_attach_args saa;
uint32_t caps;
+ pinctrl_byname(faa->fa_node, "default");
+
sc->sc_iot = faa->fa_iot;
if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr,
@@ -446,6 +447,7 @@ exesdhc_host_maxblklen(sdmmc_chipset_handle_t sch)
int
exesdhc_card_detect(sdmmc_chipset_handle_t sch)
{
+#if 0
struct exesdhc_softc *sc = sch;
int gpio;
@@ -466,6 +468,9 @@ exesdhc_card_detect(sdmmc_chipset_handle_t sch)
default:
return 1;
}
+#else
+ return 1;
+#endif
}
/*
diff --git a/sys/arch/armv7/exynos/exgpio.c b/sys/arch/armv7/exynos/exgpio.c
index beaa9a2a8b7..981e8293dbf 100644
--- a/sys/arch/armv7/exynos/exgpio.c
+++ b/sys/arch/armv7/exynos/exgpio.c
@@ -1,7 +1,8 @@
-/* $OpenBSD: exgpio.c,v 1.4 2016/07/26 22:10:10 patrick Exp $ */
+/* $OpenBSD: exgpio.c,v 1.5 2017/03/05 20:53:19 kettenis Exp $ */
/*
* Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
* Copyright (c) 2012-2013 Patrick Wildt <patrick@blueri.se>
+ * Copyright (c) 2017 Mark Kettenis <kettenis@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
@@ -18,83 +19,45 @@
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/queue.h>
#include <sys/device.h>
#include <sys/malloc.h>
-#include <sys/evcount.h>
-
-#include <arm/cpufunc.h>
#include <machine/bus.h>
-#if NFDT > 0
#include <machine/fdt.h>
-#endif
#include <machine/intr.h>
-#include <armv7/armv7/armv7var.h>
-#include <armv7/exynos/exgpiovar.h>
-
-/* Exynos5 registers */
-#define GPIO_BANK_SIZE 0x20
-#define GPIO_BANK(x) (GPIO_BANK_SIZE * ((x) / 8))
-#define GPIO_CON(x) (GPIO_BANK(x) + 0x00)
-#define GPIO_DAT(x) (GPIO_BANK(x) + 0x04)
-#define GPIO_PULL(x) (GPIO_BANK(x) + 0x08)
-#define GPIO_DRV(x) (GPIO_BANK(x) + 0x0c)
-#define GPIO_PDN_CON(x) (GPIO_BANK(x) + 0x10)
-#define GPIO_PDN_PULL(x) (GPIO_BANK(x) + 0x14)
-
-/* bits and bytes */
-#define GPIO_PIN(x) ((x) % 8)
-#define GPIO_CON_INPUT(x) (0x0 << (GPIO_PIN(x) << 2))
-#define GPIO_CON_OUTPUT(x) (0x1 << (GPIO_PIN(x) << 2))
-#define GPIO_CON_IRQ(x) (0xf << (GPIO_PIN(x) << 2))
-#define GPIO_CON_MASK(x) (0xf << (GPIO_PIN(x) << 2))
-#define GPIO_DAT_SET(x) (0x1 << (GPIO_PIN(x) << 0))
-#define GPIO_DAT_MASK(x) (0x1 << (GPIO_PIN(x) << 0))
-#define GPIO_PULL_NONE(x) (0x0 << (GPIO_PIN(x) << 1))
-#define GPIO_PULL_DOWN(x) (0x1 << (GPIO_PIN(x) << 1))
-#define GPIO_PULL_UP(x) (0x3 << (GPIO_PIN(x) << 1))
-#define GPIO_PULL_MASK(x) (0x3 << (GPIO_PIN(x) << 1))
-#define GPIO_DRV_1X(x) (0x0 << (GPIO_PIN(x) << 1))
-#define GPIO_DRV_2X(x) (0x1 << (GPIO_PIN(x) << 1))
-#define GPIO_DRV_3X(x) (0x2 << (GPIO_PIN(x) << 1))
-#define GPIO_DRV_4X(x) (0x3 << (GPIO_PIN(x) << 1))
-#define GPIO_DRV_MASK(x) (0x3 << (GPIO_PIN(x) << 1))
-
-#define GPIO_PINS_PER_BANK 8
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_pinctrl.h>
+#include <dev/ofw/fdt.h>
+
+#define GPXCON(x) ((x) + 0x0000)
+#define GPXDAT(x) ((x) + 0x0004)
+#define GPXPUD(x) ((x) + 0x0008)
+#define GPXDRV(x) ((x) + 0x000c)
+
+#define HREAD4(sc, reg) \
+ (bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg)))
+#define HWRITE4(sc, reg, val) \
+ bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
+
+struct exgpio_bank {
+ const char name[8];
+ bus_addr_t addr;
+};
struct exgpio_softc {
struct device sc_dev;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
- int sc_ngpio;
- unsigned int (*sc_get_bit)(struct exgpio_softc *sc,
- unsigned int gpio);
- void (*sc_set_bit)(struct exgpio_softc *sc,
- unsigned int gpio);
- void (*sc_clear_bit)(struct exgpio_softc *sc,
- unsigned int gpio);
- void (*sc_set_dir)(struct exgpio_softc *sc,
- unsigned int gpio, unsigned int dir);
-};
-
-int exgpio_match(struct device *parent, void *v, void *aux);
-void exgpio_attach(struct device *parent, struct device *self, void *args);
-struct exgpio_softc *exgpio_pin_to_inst(unsigned int);
-unsigned int exgpio_pin_to_offset(unsigned int);
-unsigned int exgpio_v5_get_bit(struct exgpio_softc *, unsigned int);
-void exgpio_v5_set_bit(struct exgpio_softc *, unsigned int);
-void exgpio_v5_clear_bit(struct exgpio_softc *, unsigned int);
-void exgpio_v5_set_dir(struct exgpio_softc *, unsigned int, unsigned int);
-unsigned int exgpio_v5_get_dir(struct exgpio_softc *, unsigned int);
+ struct exgpio_bank *sc_banks;
+ int sc_nbanks;
+};
+int exgpio_match(struct device *, void *, void *);
+void exgpio_attach(struct device *, struct device *, void *);
struct cfattach exgpio_ca = {
- sizeof (struct exgpio_softc), NULL, exgpio_attach
-};
-struct cfattach exgpio_fdt_ca = {
sizeof (struct exgpio_softc), exgpio_match, exgpio_attach
};
@@ -102,192 +65,159 @@ struct cfdriver exgpio_cd = {
NULL, "exgpio", DV_DULL
};
+/* Exynos 5420/5422 */
+struct exgpio_bank exynos5420_banks[] = {
+ /* Controller 0 */
+ { "gpy7", 0x0000 },
+ { "gpx0", 0x0c00 },
+ { "gpx1", 0x0c20 },
+ { "gpx2", 0x0c40 },
+ { "gpx3", 0x0c60 },
+
+ /* Controller 1 */
+ { "gpc0", 0x0000 },
+ { "gpc1", 0x0020 },
+ { "gpc2", 0x0040 },
+ { "gpc3", 0x0060 },
+ { "gpc4", 0x0080 },
+ { "gpd1", 0x00a0 },
+ { "gpy0", 0x00c0 },
+ { "gpy1", 0x00e0 },
+ { "gpy2", 0x0100 },
+ { "gpy3", 0x0120 },
+ { "gpy4", 0x0140 },
+ { "gpy5", 0x0160 },
+ { "gpy6", 0x0180 },
+
+ /* Controller 2 */
+ { "gpe0", 0x0000 },
+ { "gpe1", 0x0020 },
+ { "gpf0", 0x0040 },
+ { "gpf1", 0x0060 },
+ { "gpg0", 0x0080 },
+ { "gpg1", 0x00a0 },
+ { "gpg2", 0x00c0 },
+ { "gpj4", 0x00e0 },
+
+ /* Controller 3 */
+ { "gpa0", 0x0000 },
+ { "gpa1", 0x0020 },
+ { "gpa2", 0x0040 },
+ { "gpb0", 0x0060 },
+ { "gpb1", 0x0080 },
+ { "gpb2", 0x00a0 },
+ { "gpb3", 0x00c0 },
+ { "gpb4", 0x00e0 },
+ { "gph0", 0x0100 },
+
+ /* Controller 4 */
+ { "gpz", 0x0000 },
+};
+
+int exgpio_pinctrl(uint32_t, void *);
+
int
-exgpio_match(struct device *parent, void *v, void *aux)
+exgpio_match(struct device *parent, void *match, void *aux)
{
-#if NFDT > 0
- struct armv7_attach_args *aa = aux;
-
- if (fdt_node_compatible("samsung,exynos5250-pinctrl", aa->aa_node))
- return 1;
-#endif
+ struct fdt_attach_args *faa = aux;
- return 0;
+ return OF_is_compatible(faa->fa_node, "samsung,exynos5420-pinctrl");
}
void
-exgpio_attach(struct device *parent, struct device *self, void *args)
+exgpio_attach(struct device *parent, struct device *self, void *aux)
{
- struct armv7_attach_args *aa = args;
- struct exgpio_softc *sc = (struct exgpio_softc *) self;
- struct armv7mem mem;
-
- sc->sc_iot = aa->aa_iot;
-#if NFDT > 0
- if (aa->aa_node) {
- struct fdt_reg reg;
- if (fdt_get_reg(aa->aa_node, 0, &reg))
- panic("%s: could not extract memory data from FDT",
- __func__);
- mem.addr = reg.addr;
- mem.size = reg.size;
- } else
-#endif
- {
- mem.addr = aa->aa_dev->mem[0].addr;
- mem.size = aa->aa_dev->mem[0].size;
- }
- if (bus_space_map(sc->sc_iot, mem.addr, mem.size, 0, &sc->sc_ioh))
- panic("%s: bus_space_map failed!", __func__);
-
- sc->sc_ngpio = (mem.size / GPIO_BANK_SIZE) * GPIO_PINS_PER_BANK;
+ struct exgpio_softc *sc = (struct exgpio_softc *)self;
+ struct fdt_attach_args *faa = aux;
- sc->sc_get_bit = exgpio_v5_get_bit;
- sc->sc_set_bit = exgpio_v5_set_bit;
- sc->sc_clear_bit = exgpio_v5_clear_bit;
- sc->sc_set_dir = exgpio_v5_set_dir;
-
- printf("\n");
+ sc->sc_iot = faa->fa_iot;
- /* XXX - IRQ */
- /* XXX - SYSCONFIG */
- /* XXX - CTRL */
- /* XXX - DEBOUNCE */
-}
-
-struct exgpio_softc *
-exgpio_pin_to_inst(unsigned int gpio)
-{
- int i;
+ 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__);
- for (i = 0; exgpio_cd.cd_devs[i] != NULL; i++)
- {
- struct exgpio_softc *sc = exgpio_cd.cd_devs[i];
- if (gpio < sc->sc_ngpio)
- return sc;
- else
- gpio -= sc->sc_ngpio;
+ if (OF_is_compatible(faa->fa_node, "samsung,exynos5420-pinctrl")) {
+ sc->sc_banks = exynos5420_banks;
+ sc->sc_nbanks = nitems(exynos5420_banks);
}
- return NULL;
+ pinctrl_register(faa->fa_node, exgpio_pinctrl, sc);
+ printf("\n");
}
-unsigned int
-exgpio_pin_to_offset(unsigned int gpio)
+int
+exgpio_pinctrl(uint32_t phandle, void *cookie)
{
+ struct exgpio_softc *sc = cookie;
+ char *pins;
+ char *bank, *next;
+ uint32_t func, val, pud, drv;
+ uint32_t reg;
+ int node;
+ int len;
+ int pin;
int i;
- for (i = 0; exgpio_cd.cd_devs[i] != NULL; i++)
- {
- struct exgpio_softc *sc = exgpio_cd.cd_devs[i];
- if (gpio < sc->sc_ngpio)
- return gpio;
- else
- gpio -= sc->sc_ngpio;
+ node = OF_getnodebyphandle(phandle);
+ if (node == 0)
+ return -1;
+
+ len = OF_getproplen(node, "samsung,pins");
+ if (len <= 0)
+ return -1;
+
+ pins = malloc(len, M_TEMP, M_WAITOK);
+ OF_getprop(node, "samsung,pins", pins, len);
+
+ func = OF_getpropint(node, "samsung,pin-function", 0);
+ val = OF_getpropint(node, "samsung,pin-val", 0);
+ pud = OF_getpropint(node, "samsung,pin-pud", 1);
+ drv = OF_getpropint(node, "samsung,pin-drv", 0);
+
+ bank = pins;
+ while (bank < pins + len) {
+ next = strchr(bank, '-');
+ if (next == NULL)
+ return -1;
+ *next++ = 0;
+ pin = *next++ - '0';
+ if (pin < 0 || pin > 7)
+ return -1;
+ next++;
+
+ for (i = 0; i < sc->sc_nbanks; i++) {
+ if (strcmp(bank, sc->sc_banks[i].name) != 0)
+ break;
+
+ reg = HREAD4(sc, GPXCON(sc->sc_banks[i].addr));
+ reg &= ~(0xf << (pin * 4));
+ reg |= (func << (pin * 4));
+ HWRITE4(sc, GPXCON(sc->sc_banks[i].addr), reg);
+
+ reg = HREAD4(sc, GPXDAT(sc->sc_banks[i].addr));
+ if (val)
+ reg |= (1 << pin);
+ else
+ reg &= ~(1 << pin);
+ HWRITE4(sc, GPXDAT(sc->sc_banks[i].addr), reg);
+
+ reg = HREAD4(sc, GPXPUD(sc->sc_banks[i].addr));
+ reg &= ~(0x3 << (pin * 2));
+ reg |= (pud << (pin * 2));
+ HWRITE4(sc, GPXPUD(sc->sc_banks[i].addr), reg);
+
+ reg = HREAD4(sc, GPXDRV(sc->sc_banks[i].addr));
+ reg &= ~(0x3 << (pin * 2));
+ reg |= (drv << (pin * 2));
+ HWRITE4(sc, GPXDRV(sc->sc_banks[i].addr), reg);
+ break;
+ }
+ if (i == sc->sc_nbanks)
+ return -1;
+
+ bank = next;
}
+ free(pins, M_TEMP, len);
return 0;
}
-
-unsigned int
-exgpio_get_bit(unsigned int gpio)
-{
- struct exgpio_softc *sc = exgpio_pin_to_inst(gpio);
-
- return sc->sc_get_bit(sc, gpio);
-}
-
-void
-exgpio_set_bit(unsigned int gpio)
-{
- struct exgpio_softc *sc = exgpio_pin_to_inst(gpio);
-
- sc->sc_set_bit(sc, gpio);
-}
-
-void
-exgpio_clear_bit(unsigned int gpio)
-{
- struct exgpio_softc *sc = exgpio_pin_to_inst(gpio);
-
- sc->sc_clear_bit(sc, gpio);
-}
-void
-exgpio_set_dir(unsigned int gpio, unsigned int dir)
-{
- struct exgpio_softc *sc = exgpio_pin_to_inst(gpio);
-
- sc->sc_set_dir(sc, gpio, dir);
-}
-
-unsigned int
-exgpio_v5_get_bit(struct exgpio_softc *sc, unsigned int gpio)
-{
- u_int32_t val;
-
- gpio = exgpio_pin_to_offset(gpio);
- val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, GPIO_DAT(gpio));
-
- return !!(val & GPIO_DAT_SET(gpio));
-}
-
-void
-exgpio_v5_set_bit(struct exgpio_softc *sc, unsigned int gpio)
-{
- u_int32_t val;
-
- gpio = exgpio_pin_to_offset(gpio);
- val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, GPIO_DAT(gpio));
-
- bus_space_write_4(sc->sc_iot, sc->sc_ioh, GPIO_DAT(gpio),
- val | GPIO_DAT_SET(gpio));
-}
-
-void
-exgpio_v5_clear_bit(struct exgpio_softc *sc, unsigned int gpio)
-{
- u_int32_t val;
-
- gpio = exgpio_pin_to_offset(gpio);
- val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, GPIO_DAT(gpio));
-
- bus_space_write_4(sc->sc_iot, sc->sc_ioh, GPIO_DAT(gpio),
- val & ~GPIO_DAT_MASK(gpio));
-}
-
-void
-exgpio_v5_set_dir(struct exgpio_softc *sc, unsigned int gpio, unsigned int dir)
-{
- int s;
- u_int32_t val;
-
- gpio = exgpio_pin_to_offset(gpio);
- s = splhigh();
-
- val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, GPIO_CON(gpio));
- val &= ~GPIO_CON_OUTPUT(gpio);
- if (dir == EXGPIO_DIR_OUT)
- val |= GPIO_CON_OUTPUT(gpio);
- bus_space_write_4(sc->sc_iot, sc->sc_ioh, GPIO_CON(gpio), val);
-
- splx(s);
-}
-
-unsigned int
-exgpio_v5_get_dir(struct exgpio_softc *sc, unsigned int gpio)
-{
- int s;
- u_int32_t val;
-
- gpio = exgpio_pin_to_offset(gpio);
- s = splhigh();
-
- val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, GPIO_CON(gpio));
- if (val & GPIO_CON_OUTPUT(gpio))
- val = EXGPIO_DIR_OUT;
- else
- val = EXGPIO_DIR_IN;
-
- splx(s);
- return val;
-}
diff --git a/sys/arch/armv7/exynos/exgpiovar.h b/sys/arch/armv7/exynos/exgpiovar.h
deleted file mode 100644
index a53b9fedd3d..00000000000
--- a/sys/arch/armv7/exynos/exgpiovar.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $OpenBSD: exgpiovar.h,v 1.1 2015/01/26 02:48:24 bmercer Exp $ */
-/*
- * Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
- * Copyright (c) 2012-2013 Patrick Wildt <patrick@blueri.se>
- *
- * 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.
- */
-
-#ifndef EXGPIOVAR_H
-#define EXGPIOVAR_H
-
-#define EXGPIO_DIR_IN 0
-#define EXGPIO_DIR_OUT 1
-
-unsigned int exgpio_get_function(unsigned int gpio, unsigned int fn);
-void exgpio_set_function(unsigned int gpio, unsigned int fn);
-unsigned int exgpio_get_bit(unsigned int gpio);
-void exgpio_set_bit(unsigned int gpio);
-void exgpio_clear_bit(unsigned int gpio);
-void exgpio_set_dir(unsigned int gpio, unsigned int dir);
-
-/* interrupts */
-void exgpio_clear_intr(unsigned int gpio);
-void exgpio_intr_mask(unsigned int gpio);
-void exgpio_intr_unmask(unsigned int gpio);
-void exgpio_intr_level(unsigned int gpio, unsigned int level);
-void *exgpio_intr_establish(unsigned int gpio, int level, int spl,
- int (*func)(void *), void *arg, char *name);
-void exgpio_intr_disestablish(void *cookie);
-
-#endif /* EXGPIOVAR_H */
diff --git a/sys/arch/armv7/exynos/exiic.c b/sys/arch/armv7/exynos/exiic.c
index de4f90da738..c69c94563d7 100644
--- a/sys/arch/armv7/exynos/exiic.c
+++ b/sys/arch/armv7/exynos/exiic.c
@@ -26,7 +26,6 @@
#endif
#include <armv7/armv7/armv7var.h>
-#include <armv7/exynos/exgpiovar.h>
#include <armv7/exynos/exiicvar.h>
#include <armv7/exynos/exclockvar.h>
diff --git a/sys/arch/armv7/exynos/files.exynos b/sys/arch/armv7/exynos/files.exynos
index 76def465539..d8a02f5f6ff 100644
--- a/sys/arch/armv7/exynos/files.exynos
+++ b/sys/arch/armv7/exynos/files.exynos
@@ -1,4 +1,4 @@
-# $OpenBSD: files.exynos,v 1.6 2017/03/04 18:17:24 kettenis Exp $
+# $OpenBSD: files.exynos,v 1.7 2017/03/05 20:53:19 kettenis Exp $
define exynos {}
device exynos: exynos
@@ -38,7 +38,7 @@ attach exdog at fdt
file arch/armv7/exynos/exdog.c exdog
device exgpio
-attach exgpio at exynos
+attach exgpio at fdt
file arch/armv7/exynos/exgpio.c exgpio
device exiic: i2cbus