Module Name:    src
Committed By:   jakllsch
Date:           Wed Jun  6 19:49:51 UTC 2018

Modified Files:
        src/sys/arch/arm/fdt: gic_fdt.c

Log Message:
more completely gic_fdt_disestablish() such that it's possible to
re-establish later


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 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.8 src/sys/arch/arm/fdt/gic_fdt.c:1.9
--- src/sys/arch/arm/fdt/gic_fdt.c:1.8	Thu Nov 30 14:42:37 2017
+++ src/sys/arch/arm/fdt/gic_fdt.c	Wed Jun  6 19:49:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: gic_fdt.c,v 1.8 2017/11/30 14:42:37 skrll Exp $ */
+/* $NetBSD: gic_fdt.c,v 1.9 2018/06/06 19:49:51 jakllsch 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.8 2017/11/30 14:42:37 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gic_fdt.c,v 1.9 2018/06/06 19:49:51 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -80,6 +80,7 @@ struct gic_fdt_irq {
 	int			intr_level;
 	int			intr_mpsafe;
 	TAILQ_HEAD(, gic_fdt_irqhandler) intr_handlers;
+	int			intr_irq;
 };
 
 struct gic_fdt_softc {
@@ -190,6 +191,7 @@ gic_fdt_establish(device_t dev, u_int *s
 		firq->intr_level = level;
 		firq->intr_mpsafe = mpsafe;
 		TAILQ_INIT(&firq->intr_handlers);
+		firq->intr_irq = irq;
 		if (arg == NULL) {
 			firq->intr_ih = intr_establish(irq, ipl, level | mpsafe,
 			    func, NULL);
@@ -239,8 +241,10 @@ gic_fdt_establish(device_t dev, u_int *s
 static void
 gic_fdt_disestablish(device_t dev, void *ih)
 {
+	struct gic_fdt_softc * const sc = device_private(dev);
 	struct gic_fdt_irqhandler *firqh = ih;
 	struct gic_fdt_irq *firq = firqh->ih_irq;
+	const int irq = firq->intr_irq;
 
 	KASSERT(firq->intr_refcnt > 0);
 
@@ -251,6 +255,7 @@ gic_fdt_disestablish(device_t dev, void 
 	if (firq->intr_refcnt == 0) {
 		intr_disestablish(firq->intr_ih);
 		kmem_free(firq, sizeof(*firq));
+		sc->sc_irq[irq] = NULL;
 	}
 }
 

Reply via email to