Module Name: src
Committed By: skrll
Date: Thu Nov 30 14:42:37 UTC 2017
Modified Files:
src/sys/arch/arm/fdt: gic_fdt.c
Log Message:
Handle NULL arg interrupt handlers that want the clock frame.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/fdt/gic_fdt.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/fdt/gic_fdt.c
diff -u src/sys/arch/arm/fdt/gic_fdt.c:1.7 src/sys/arch/arm/fdt/gic_fdt.c:1.8
--- src/sys/arch/arm/fdt/gic_fdt.c:1.7 Sun Jul 2 21:59:14 2017
+++ src/sys/arch/arm/fdt/gic_fdt.c Thu Nov 30 14:42:37 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: gic_fdt.c,v 1.7 2017/07/02 21:59:14 jmcneill Exp $ */
+/* $NetBSD: gic_fdt.c,v 1.8 2017/11/30 14:42:37 skrll Exp $ */
/*-
* Copyright (c) 2015-2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gic_fdt.c,v 1.7 2017/07/02 21:59:14 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gic_fdt.c,v 1.8 2017/11/30 14:42:37 skrll Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -190,26 +190,38 @@ gic_fdt_establish(device_t dev, u_int *s
firq->intr_level = level;
firq->intr_mpsafe = mpsafe;
TAILQ_INIT(&firq->intr_handlers);
- firq->intr_ih = intr_establish(irq, ipl, level | mpsafe,
- gic_fdt_intr, firq);
+ if (arg == NULL) {
+ firq->intr_ih = intr_establish(irq, ipl, level | mpsafe,
+ func, NULL);
+ } else {
+ firq->intr_ih = intr_establish(irq, ipl, level | mpsafe,
+ gic_fdt_intr, firq);
+ }
if (firq->intr_ih == NULL) {
kmem_free(firq, sizeof(*firq));
return NULL;
}
sc->sc_irq[irq] = firq;
- }
-
- if (firq->intr_ipl != ipl) {
- device_printf(dev, "cannot share irq with different ipl\n");
- return NULL;
- }
- if (firq->intr_level != level) {
- device_printf(dev, "cannot share edge and level interrupts\n");
- return NULL;
- }
- if (firq->intr_mpsafe != mpsafe) {
- device_printf(dev, "cannot share between mpsafe/non-mpsafe\n");
- return NULL;
+ } else {
+ if (arg) {
+ device_printf(dev, "cannot share irq with NULL arg\n");
+ return NULL;
+ }
+ if (firq->intr_ipl != ipl) {
+ device_printf(dev, "cannot share irq with different "
+ "ipl\n");
+ return NULL;
+ }
+ if (firq->intr_level != level) {
+ device_printf(dev, "cannot share edge and level "
+ "interrupts\n");
+ return NULL;
+ }
+ if (firq->intr_mpsafe != mpsafe) {
+ device_printf(dev, "cannot share between "
+ "mpsafe/non-mpsafe\n");
+ return NULL;
+ }
}
firq->intr_refcnt++;