Module Name:    src
Committed By:   jmcneill
Date:           Sun Jun 11 16:19:27 UTC 2017

Modified Files:
        src/sys/arch/arm/samsung: exynos_combiner.c

Log Message:
Use fdtbus_intr_establish to hook in block interrupts instead of
intr_establish.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/samsung/exynos_combiner.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/samsung/exynos_combiner.c
diff -u src/sys/arch/arm/samsung/exynos_combiner.c:1.6 src/sys/arch/arm/samsung/exynos_combiner.c:1.7
--- src/sys/arch/arm/samsung/exynos_combiner.c:1.6	Tue Jan  5 21:53:48 2016
+++ src/sys/arch/arm/samsung/exynos_combiner.c	Sun Jun 11 16:19:27 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: exynos_combiner.c,v 1.6 2016/01/05 21:53:48 marty Exp $ */
+/*	$NetBSD: exynos_combiner.c,v 1.7 2017/06/11 16:19:27 jmcneill Exp $ */
 
 /*-
 * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #include "gpio.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: exynos_combiner.c,v 1.6 2016/01/05 21:53:48 marty Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exynos_combiner.c,v 1.7 2017/06/11 16:19:27 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -66,6 +66,7 @@ struct exynos_combiner_irq_entry {
 	int (*irq_handler)(void *);
 	void *				irq_arg;
 	struct exynos_combiner_irq_entry *irq_next;
+	bool				irq_mpsafe;
 };
 
 struct exynos_combiner_irq_block {
@@ -73,6 +74,7 @@ struct exynos_combiner_irq_block {
 	struct exynos_combiner_softc	*irq_sc;
 	struct exynos_combiner_irq_entry *irq_entries;
 	struct exynos_combiner_irq_block *irq_block_next;
+	void *irq_ih;
 };
 
 struct exynos_combiner_softc {
@@ -173,7 +175,7 @@ exynos_combiner_get_block(struct exynos_
 
 static struct exynos_combiner_irq_entry *
 exynos_combiner_new_irq(struct exynos_combiner_irq_block *block,
-			int irq, int (*func)(void *), void *arg)
+			int irq, bool mpsafe, int (*func)(void *), void *arg)
 {
 	struct exynos_combiner_irq_entry * n = kmem_zalloc(sizeof(*n),
 							   KM_SLEEP);
@@ -181,6 +183,7 @@ exynos_combiner_new_irq(struct exynos_co
 	n->irq_handler = func;
 	n->irq_next = block->irq_entries;
 	n->irq_arg = arg;
+	n->irq_mpsafe = mpsafe;
 	block->irq_entries = n;
 	return n;
 }
@@ -196,7 +199,8 @@ exynos_combiner_get_irq(struct exynos_co
 	return NULL;
 }
 
-static int exynos_combiner_irq(void *cookie)
+static int
+exynos_combiner_irq(void *cookie)
 {
 	struct exynos_combiner_irq_block *blockp = cookie;
 	struct exynos_combiner_softc *sc = blockp->irq_sc;
@@ -211,9 +215,13 @@ static int exynos_combiner_irq(void *coo
 		if (istatus & 1 << irq) {
 			struct exynos_combiner_irq_entry *e =
 				exynos_combiner_get_irq(blockp, irq);
-			if (e)
+			if (e) {
+				if (!e->irq_mpsafe)
+					KERNEL_LOCK(1, curlwp);
 				e->irq_handler(e->irq_arg);
-			else
+				if (!e->irq_mpsafe)
+					KERNEL_UNLOCK_ONE(curlwp);
+			} else
 				printf("%s: Unexpected irq %d, %d\n", __func__,
 				       intr, irq);
 		}
@@ -229,6 +237,7 @@ exynos_combiner_establish(device_t dev, 
 	struct exynos_combiner_softc * const sc = device_private(dev);
 	struct exynos_combiner_irq_block *blockp;
 	struct exynos_combiner_irq_entry *entryp;
+	const bool mpsafe = (flags & FDT_INTR_MPSAFE) != 0;
 
 	const u_int intr = be32toh(specifier[0]);
 	const u_int irq = be32toh(specifier[1]);
@@ -237,18 +246,19 @@ exynos_combiner_establish(device_t dev, 
 		intr / COMBINER_BLOCKS_PER_GROUP * COMBINER_GROUP_SIZE
 		+ COMBINER_IESR_OFFSET;
 
-	blockp =  exynos_combiner_get_block(sc, intr);
+	blockp = exynos_combiner_get_block(sc, intr);
 	if (!blockp) {
 		blockp = exynos_combiner_new_block(sc, intr);
 		KASSERT(blockp);
-		intr_establish(intr, ipl, IST_LEVEL, exynos_combiner_irq,
-			       blockp);
+		blockp->irq_ih = fdtbus_intr_establish(sc->sc_phandle, intr,
+		    IPL_VM /* XXX */, FDT_INTR_MPSAFE, exynos_combiner_irq,
+		    blockp);
 	}
 
 	entryp = exynos_combiner_get_irq(blockp, irq);
 	if (entryp)
 		return NULL;
-	entryp = exynos_combiner_new_irq(blockp, irq, func, arg);
+	entryp = exynos_combiner_new_irq(blockp, irq, mpsafe, func, arg);
 	KASSERT(entryp);
 
 	int istatus =
@@ -262,7 +272,7 @@ static void
 exynos_combiner_disestablish(device_t dev, void *ih)
 {
 	/* MJF: Find the ih and disable the handler. */
-	intr_disestablish(ih);
+	panic("exynos_combiner_disestablish not implemented");
 }
 
 static bool

Reply via email to