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 <jmcne...@invisible.ca> @@ -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++;