summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2016-08-06 10:07:46 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2016-08-06 10:07:46 +0000
commit70abd43de7f6fa40cf4e9206d0d104911f401488 (patch)
tree80e0ec7e38110668ecfde5895eb2bee11b3c706d /sys
parent6718712b7fab343432a5e7d4e1799c0debf58e81 (diff)
Dynamically attach intc(4) using the FDT and switch omap/am335x
drivers that use the FDT over to the FDT interrupt establish API. ok kettenis@
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/armv7/conf/GENERIC4
-rw-r--r--sys/arch/armv7/conf/RAMDISK4
-rw-r--r--sys/arch/armv7/omap/files.omap4
-rw-r--r--sys/arch/armv7/omap/if_cpsw.c28
-rw-r--r--sys/arch/armv7/omap/intc.c49
-rw-r--r--sys/arch/armv7/omap/omap.c4
-rw-r--r--sys/arch/armv7/omap/omap_com.c12
-rw-r--r--sys/arch/armv7/omap/ommmc.c13
-rw-r--r--sys/arch/armv7/omap/ti_iic.c13
9 files changed, 64 insertions, 67 deletions
diff --git a/sys/arch/armv7/conf/GENERIC b/sys/arch/armv7/conf/GENERIC
index b8d069dd49d..d11f539442c 100644
--- a/sys/arch/armv7/conf/GENERIC
+++ b/sys/arch/armv7/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.40 2016/08/06 09:50:55 jsg Exp $
+# $OpenBSD: GENERIC,v 1.41 2016/08/06 10:07:45 jsg Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -61,7 +61,7 @@ omap0 at mainbus?
omapid* at omap?
# OMAP on-chip devices
-intc* at omap? # OMAP3 interrupt controller
+intc* at fdt? # OMAP3 interrupt controller
#edma* at omap? # OMAP3 dma controller
prcm* at omap? # power/clock controller
sitaracm* at omap? # sitara control module
diff --git a/sys/arch/armv7/conf/RAMDISK b/sys/arch/armv7/conf/RAMDISK
index a97e95e2069..a46d11ee966 100644
--- a/sys/arch/armv7/conf/RAMDISK
+++ b/sys/arch/armv7/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.37 2016/08/06 09:50:55 jsg Exp $
+# $OpenBSD: RAMDISK,v 1.38 2016/08/06 10:07:45 jsg Exp $
machine armv7 arm
@@ -60,7 +60,7 @@ omap0 at mainbus?
omapid* at omap?
# OMAP on-chip devices
-intc* at omap? # OMAP3 interrupt controller
+intc* at fdt? # OMAP3 interrupt controller
#edma* at omap? # OMAP3 dma controller
prcm* at omap? # power/clock controller
sitaracm* at omap? # sitara control module
diff --git a/sys/arch/armv7/omap/files.omap b/sys/arch/armv7/omap/files.omap
index 9567097aff2..a8326a87cf0 100644
--- a/sys/arch/armv7/omap/files.omap
+++ b/sys/arch/armv7/omap/files.omap
@@ -1,4 +1,4 @@
-# $OpenBSD: files.omap,v 1.13 2016/06/26 09:06:35 jsg Exp $
+# $OpenBSD: files.omap,v 1.14 2016/08/06 10:07:45 jsg Exp $
define omap {}
device omap: omap
@@ -39,7 +39,7 @@ attach edma at omap
file arch/armv7/omap/edma.c edma
device intc
-attach intc at omap
+attach intc at fdt
file arch/armv7/omap/intc.c intc
device gptimer
diff --git a/sys/arch/armv7/omap/if_cpsw.c b/sys/arch/armv7/omap/if_cpsw.c
index 5566e476103..38f8a3374aa 100644
--- a/sys/arch/armv7/omap/if_cpsw.c
+++ b/sys/arch/armv7/omap/if_cpsw.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_cpsw.c,v 1.38 2016/07/27 11:45:02 patrick Exp $ */
+/* $OpenBSD: if_cpsw.c,v 1.39 2016/08/06 10:07:45 jsg Exp $ */
/* $NetBSD: if_cpsw.c,v 1.3 2013/04/17 14:36:34 bouyer Exp $ */
/*
@@ -338,20 +338,12 @@ cpsw_attach(struct device *parent, struct device *self, void *aux)
int error;
int node;
u_int i;
- uint32_t intr[4];
uint32_t memsize;
char name[32];
- if (faa->fa_nreg < 1 || (faa->fa_nintr != 4 && faa->fa_nintr != 12))
+ if (faa->fa_nreg < 1)
return;
- for (i = 0; i < 4; i++) {
- if (faa->fa_nintr == 4)
- intr[i] = faa->fa_intr[i];
- else
- intr[i] = faa->fa_intr[(3 * i) + 1];
- }
-
/*
* fa_reg[0].size is size of CPSW_SS and CPSW_PORT
* fa_reg[1].size is size of CPSW_WR
@@ -378,14 +370,14 @@ cpsw_attach(struct device *parent, struct device *self, void *aux)
memcpy(sc->sc_ac.ac_enaddr, sc->sc_port_config[0].enaddr,
ETHER_ADDR_LEN);
- sc->sc_rxthih = arm_intr_establish(intr[0], IPL_NET, cpsw_rxthintr, sc,
- DEVNAME(sc));
- sc->sc_rxih = arm_intr_establish(intr[1], IPL_NET, cpsw_rxintr, sc,
- DEVNAME(sc));
- sc->sc_txih = arm_intr_establish(intr[2], IPL_NET, cpsw_txintr, sc,
- DEVNAME(sc));
- sc->sc_miscih = arm_intr_establish(intr[3], IPL_NET, cpsw_miscintr, sc,
- DEVNAME(sc));
+ sc->sc_rxthih = arm_intr_establish_fdt_idx(faa->fa_node, 0, IPL_NET,
+ cpsw_rxthintr, sc, DEVNAME(sc));
+ sc->sc_rxih = arm_intr_establish_fdt_idx(faa->fa_node, 1, IPL_NET,
+ cpsw_rxintr, sc, DEVNAME(sc));
+ sc->sc_txih = arm_intr_establish_fdt_idx(faa->fa_node, 2, IPL_NET,
+ cpsw_txintr, sc, DEVNAME(sc));
+ sc->sc_miscih = arm_intr_establish_fdt_idx(faa->fa_node, 3, IPL_NET,
+ cpsw_miscintr, sc, DEVNAME(sc));
sc->sc_bst = faa->fa_iot;
sc->sc_bdt = faa->fa_dmat;
diff --git a/sys/arch/armv7/omap/intc.c b/sys/arch/armv7/omap/intc.c
index fcb63c2951d..6fb563266d0 100644
--- a/sys/arch/armv7/omap/intc.c
+++ b/sys/arch/armv7/omap/intc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: intc.c,v 1.5 2016/07/17 00:28:46 jsg Exp $ */
+/* $OpenBSD: intc.c,v 1.6 2016/08/06 10:07:45 jsg Exp $ */
/*
* Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
*
@@ -21,9 +21,13 @@
#include <sys/malloc.h>
#include <sys/device.h>
#include <sys/evcount.h>
+
#include <machine/bus.h>
+#include <machine/fdt.h>
+
#include <armv7/armv7/armv7var.h>
+#include <dev/ofw/openfirm.h>
#include <dev/ofw/fdt.h>
#include "intc.h"
@@ -92,19 +96,23 @@ volatile int softint_pending;
struct intrq intc_handler[INTC_MAX_IRQ];
u_int32_t intc_smask[NIPL];
u_int32_t intc_imask[INTC_MAX_BANKS][NIPL];
+struct interrupt_controller intc_ic;
bus_space_tag_t intc_iot;
bus_space_handle_t intc_ioh;
int intc_nirq;
+int intc_match(struct device *, void *, void *);
void intc_attach(struct device *, struct device *, void *);
int intc_spllower(int new);
int intc_splraise(int new);
void intc_setipl(int new);
void intc_calc_mask(void);
+void *intc_intr_establish_fdt(void *, int *, int, int (*)(void *),
+ void *, char *);
struct cfattach intc_ca = {
- sizeof (struct device), NULL, intc_attach
+ sizeof (struct device), intc_match, intc_attach
};
struct cfdriver intc_cd = {
@@ -113,21 +121,25 @@ struct cfdriver intc_cd = {
int intc_attached = 0;
+int
+intc_match(struct device *parent, void *match, void *aux)
+{
+ struct fdt_attach_args *faa = aux;
+
+ return (OF_is_compatible(faa->fa_node, "ti,omap3-intc") ||
+ OF_is_compatible(faa->fa_node, "ti,am33xx-intc"));
+}
+
void
-intc_attach(struct device *parent, struct device *self, void *args)
+intc_attach(struct device *parent, struct device *self, void *aux)
{
- struct armv7_attach_args *aa = args;
+ struct fdt_attach_args *faa = aux;
int i;
u_int32_t rev;
- void *node;
- node = fdt_find_node("/");
- if (node == NULL)
- panic("%s: could not get fdt root node", __func__);
-
- intc_iot = aa->aa_iot;
- if (bus_space_map(intc_iot, aa->aa_dev->mem[0].addr,
- aa->aa_dev->mem[0].size, 0, &intc_ioh))
+ intc_iot = faa->fa_iot;
+ if (bus_space_map(intc_iot, faa->fa_reg[0].addr,
+ faa->fa_reg[0].size, 0, &intc_ioh))
panic("intc_attach: bus_space_map failed!");
rev = bus_space_read_4(intc_iot, intc_ioh, INTC_REVISION);
@@ -145,7 +157,7 @@ intc_attach(struct device *parent, struct device *self, void *args)
bus_space_write_4(intc_iot, intc_ioh, INTC_SYSCONFIG,
INTC_SYSCONFIG_AUTOIDLE);
- if (fdt_is_compatible(node, "ti,am33xx"))
+ if (OF_is_compatible(faa->fa_node, "ti,am33xx-intc"))
intc_nirq = 128;
else
intc_nirq = 96;
@@ -175,6 +187,10 @@ intc_attach(struct device *parent, struct device *self, void *args)
intc_setipl(IPL_HIGH); /* XXX ??? */
enable_interrupts(PSR_I);
+
+ intc_ic.ic_node = faa->fa_node;
+ intc_ic.ic_establish = intc_intr_establish_fdt;
+ arm_intr_register_fdt(&intc_ic);
}
void
@@ -374,6 +390,13 @@ intc_intr_establish(int irqno, int level, int (*func)(void *),
return (ih);
}
+void *
+intc_intr_establish_fdt(void *cookie, int *cell, int level,
+ int (*func)(void *), void *arg, char *name)
+{
+ return intc_intr_establish(cell[0], level, func, arg, name);
+}
+
void
intc_intr_disestablish(void *cookie)
{
diff --git a/sys/arch/armv7/omap/omap.c b/sys/arch/armv7/omap/omap.c
index 8a8f0895313..1fb7c975ee4 100644
--- a/sys/arch/armv7/omap/omap.c
+++ b/sys/arch/armv7/omap/omap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: omap.c,v 1.16 2016/07/10 03:04:00 jsg Exp $ */
+/* $OpenBSD: omap.c,v 1.17 2016/08/06 10:07:45 jsg Exp $ */
/*
* Copyright (c) 2005,2008 Dale Rahn <drahn@openbsd.com>
*
@@ -40,7 +40,6 @@ struct cfdriver omap_cd = {
struct board_dev omap3_dev[] = {
{ "prcm", 0 },
- { "intc", 0 },
{ "gptimer", 0 },
{ "gptimer", 1 },
{ "omgpio", 0 },
@@ -55,7 +54,6 @@ struct board_dev omap3_dev[] = {
struct board_dev am33xx_dev[] = {
{ "prcm", 0 },
{ "sitaracm", 0 },
- { "intc", 0 },
{ "edma", 0 },
{ "dmtimer", 0 },
{ "dmtimer", 1 },
diff --git a/sys/arch/armv7/omap/omap_com.c b/sys/arch/armv7/omap/omap_com.c
index 20a51b493fd..610c6097134 100644
--- a/sys/arch/armv7/omap/omap_com.c
+++ b/sys/arch/armv7/omap/omap_com.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: omap_com.c,v 1.8 2016/07/27 11:45:02 patrick Exp $ */
+/* $OpenBSD: omap_com.c,v 1.9 2016/08/06 10:07:45 jsg Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
* All rights reserved.
@@ -102,9 +102,8 @@ omapuart_attach(struct device *parent, struct device *self, void *aux)
{
struct com_softc *sc = (struct com_softc *)self;
struct fdt_attach_args *faa = aux;
- int irq;
- if (faa->fa_nreg != 1 || (faa->fa_nintr != 1 && faa->fa_nintr != 3))
+ if (faa->fa_nreg < 1)
return;
sc->sc_iot = &armv7_a4x_bs_tag; /* XXX: This sucks */
@@ -112,11 +111,6 @@ omapuart_attach(struct device *parent, struct device *self, void *aux)
sc->sc_frequency = 48000000;
sc->sc_uarttype = COM_UART_TI16750;
- if (faa->fa_nintr == 1)
- irq = faa->fa_intr[0];
- else
- irq = faa->fa_intr[1];
-
if (bus_space_map(sc->sc_iot, sc->sc_iobase,
faa->fa_reg[0].size, 0, &sc->sc_ioh)) {
printf("%s: bus_space_map failed\n", __func__);
@@ -127,7 +121,7 @@ omapuart_attach(struct device *parent, struct device *self, void *aux)
com_attach_subr(sc);
- (void)arm_intr_establish(irq, IPL_TTY, comintr,
+ (void)arm_intr_establish_fdt(faa->fa_node, IPL_TTY, comintr,
sc, sc->sc_dev.dv_xname);
}
diff --git a/sys/arch/armv7/omap/ommmc.c b/sys/arch/armv7/omap/ommmc.c
index bf0451cae88..05f9647adc1 100644
--- a/sys/arch/armv7/omap/ommmc.c
+++ b/sys/arch/armv7/omap/ommmc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ommmc.c,v 1.27 2016/07/27 11:45:02 patrick Exp $ */
+/* $OpenBSD: ommmc.c,v 1.28 2016/08/06 10:07:45 jsg Exp $ */
/*
* Copyright (c) 2009 Dale Rahn <drahn@openbsd.org>
@@ -299,11 +299,11 @@ ommmc_attach(struct device *parent, struct device *self, void *aux)
struct fdt_attach_args *faa = aux;
struct sdmmcbus_attach_args saa;
uint32_t caps;
- uint32_t addr, size, irq;
+ uint32_t addr, size;
int len, unit;
char hwmods[128];
- if (faa->fa_nreg != 1 || (faa->fa_nintr != 1 && faa->fa_nintr != 3))
+ if (faa->fa_nreg < 1)
return;
if (faa->fa_reg[0].size <= 0x100)
@@ -317,11 +317,6 @@ ommmc_attach(struct device *parent, struct device *self, void *aux)
size = faa->fa_reg[0].size;
}
- if (faa->fa_nintr == 1)
- irq = faa->fa_intr[0];
- else
- irq = faa->fa_intr[1];
-
unit = 0;
if ((len = OF_getprop(faa->fa_node, "ti,hwmods", hwmods,
sizeof(hwmods))) == 5) {
@@ -341,7 +336,7 @@ ommmc_attach(struct device *parent, struct device *self, void *aux)
/* Enable ICLKEN, FCLKEN? */
prcm_enablemodule(PRCM_MMC0 + unit);
- sc->sc_ih = arm_intr_establish(irq, IPL_SDMMC,
+ sc->sc_ih = arm_intr_establish_fdt(faa->fa_node, IPL_SDMMC,
ommmc_intr, sc, DEVNAME(sc));
if (sc->sc_ih == NULL) {
printf("%s: cannot map interrupt\n", DEVNAME(sc));
diff --git a/sys/arch/armv7/omap/ti_iic.c b/sys/arch/armv7/omap/ti_iic.c
index 046a822aab3..c50bee2665d 100644
--- a/sys/arch/armv7/omap/ti_iic.c
+++ b/sys/arch/armv7/omap/ti_iic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ti_iic.c,v 1.7 2016/07/27 11:45:02 patrick Exp $ */
+/* $OpenBSD: ti_iic.c,v 1.8 2016/08/06 10:07:45 jsg Exp $ */
/* $NetBSD: ti_iic.c,v 1.4 2013/04/25 13:04:27 rkujawa Exp $ */
/*
@@ -165,19 +165,14 @@ ti_iic_attach(struct device *parent, struct device *self, void *aux)
struct fdt_attach_args *faa = aux;
struct i2cbus_attach_args iba;
uint16_t rev;
- int irq, unit, len;
+ int unit, len;
char hwmods[128];
- if (faa->fa_nreg != 1 || (faa->fa_nintr != 1 && faa->fa_nintr != 3))
+ if (faa->fa_nreg < 1)
return;
sc->sc_iot = faa->fa_iot;
sc->sc_node = faa->fa_node;
-
- if (faa->fa_nintr == 1)
- irq = faa->fa_intr[0];
- else
- irq = faa->fa_intr[1];
unit = 0;
if ((len = OF_getprop(faa->fa_node, "ti,hwmods", hwmods,
@@ -197,7 +192,7 @@ ti_iic_attach(struct device *parent, struct device *self, void *aux)
sitara_cm_pinctrlbyname(faa->fa_node, "default");
- sc->sc_ih = arm_intr_establish(irq, IPL_NET,
+ sc->sc_ih = arm_intr_establish_fdt(faa->fa_node, IPL_NET,
ti_iic_intr, sc, DEVNAME(sc));
prcm_enablemodule(PRCM_I2C0 + unit);