Index: kernel/arch/sparc64/include/drivers/fhc.h
===================================================================
--- kernel/arch/sparc64/include/drivers/fhc.h	(revision dfd77382ed9624f5671e5680cd92fad49f395b3a)
+++ kernel/arch/sparc64/include/drivers/fhc.h	(revision 57e76cb2b99587198056fdcf3441d24f54f93a56)
@@ -45,7 +45,7 @@
 extern fhc_t *central_fhc;
 
-extern fhc_t *fhc_init(ofw_tree_node_t *node);
-extern void fhc_enable_interrupt(fhc_t *fhc, int inr);
-extern void fhc_clear_interrupt(fhc_t *fhc, int inr);
+extern fhc_t *fhc_init(ofw_tree_node_t *);
+extern void fhc_enable_interrupt(fhc_t *, int);
+extern void fhc_clear_interrupt(void *, int);
 
 #endif
Index: kernel/arch/sparc64/include/drivers/pci.h
===================================================================
--- kernel/arch/sparc64/include/drivers/pci.h	(revision dfd77382ed9624f5671e5680cd92fad49f395b3a)
+++ kernel/arch/sparc64/include/drivers/pci.h	(revision 57e76cb2b99587198056fdcf3441d24f54f93a56)
@@ -52,6 +52,6 @@
 
 struct pci_operations {
-	void (* enable_interrupt)(pci_t *pci, int inr);
-	void (* clear_interrupt)(pci_t *pci, int inr);
+	void (* enable_interrupt)(pci_t *, int);
+	void (* clear_interrupt)(pci_t *, int);
 };
 
@@ -62,7 +62,7 @@
 };
 
-extern pci_t *pci_init(ofw_tree_node_t *node);
-extern void pci_enable_interrupt(pci_t *pci, int inr);
-extern void pci_clear_interrupt(pci_t *pci, int inr);
+extern pci_t *pci_init(ofw_tree_node_t *);
+extern void pci_enable_interrupt(pci_t *, int);
+extern void pci_clear_interrupt(void *, int);
 
 #endif
Index: kernel/arch/sparc64/src/drivers/fhc.c
===================================================================
--- kernel/arch/sparc64/src/drivers/fhc.c	(revision dfd77382ed9624f5671e5680cd92fad49f395b3a)
+++ kernel/arch/sparc64/src/drivers/fhc.c	(revision 57e76cb2b99587198056fdcf3441d24f54f93a56)
@@ -102,6 +102,7 @@
 }
 
-void fhc_clear_interrupt(fhc_t *fhc, int inr)
+void fhc_clear_interrupt(void *fhcp, int inr)
 {
+	fhc_t *fhc = (fhc_t *)fhcp;
 	ASSERT(fhc->uart_imap);
 
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision dfd77382ed9624f5671e5680cd92fad49f395b3a)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision 57e76cb2b99587198056fdcf3441d24f54f93a56)
@@ -64,4 +64,6 @@
 	ofw_tree_property_t *prop;
 	const char *name;
+	cir_t cir;
+	void *cir_arg;
 	
 	name = ofw_tree_node_name(node);
@@ -110,5 +112,6 @@
 		}
 		if (!ofw_fhc_map_interrupt(node->parent,
-		    ((ofw_fhc_reg_t *) prop->value), interrupts, &inr)) {
+		    ((ofw_fhc_reg_t *) prop->value), interrupts, &inr, &cir,
+		    &cir_arg)) {
 			printf("Failed to determine keyboard interrupt.\n");
 			return;
@@ -124,5 +127,6 @@
 		}
 		if (!ofw_ebus_map_interrupt(node->parent,
-		    ((ofw_ebus_reg_t *) prop->value), interrupts, &inr)) {
+		    ((ofw_ebus_reg_t *) prop->value), interrupts, &inr, &cir,
+		    &cir_arg)) {
 			printf("Failed to determine keyboard interrupt.\n");
 			return;
@@ -147,10 +151,10 @@
 #ifdef CONFIG_Z8530
 	case KBD_Z8530:
-		z8530_init(devno, inr, vaddr);
+		z8530_init(devno, vaddr, inr, cir, cir_arg);
 		break;
 #endif
 #ifdef CONFIG_NS16550
 	case KBD_NS16550:
-		ns16550_init(devno, inr, (ioport_t)vaddr);
+		ns16550_init(devno, (ioport_t)vaddr, inr, cir, cir_arg);
 		break;
 #endif
Index: kernel/arch/sparc64/src/drivers/pci.c
===================================================================
--- kernel/arch/sparc64/src/drivers/pci.c	(revision dfd77382ed9624f5671e5680cd92fad49f395b3a)
+++ kernel/arch/sparc64/src/drivers/pci.c	(revision 57e76cb2b99587198056fdcf3441d24f54f93a56)
@@ -55,9 +55,9 @@
 #define OBIO_CIR(ino)	(OBIO_CIR_BASE + ((ino) & INO_MASK))
 
-static void obio_enable_interrupt(pci_t *pci, int inr);
-static void obio_clear_interrupt(pci_t *pci, int inr);
-
-static pci_t *pci_sabre_init(ofw_tree_node_t *node);
-static pci_t *pci_psycho_init(ofw_tree_node_t *node);
+static void obio_enable_interrupt(pci_t *, int);
+static void obio_clear_interrupt(pci_t *, int);
+
+static pci_t *pci_sabre_init(ofw_tree_node_t *);
+static pci_t *pci_psycho_init(ofw_tree_node_t *);
 
 /** PCI operations for Sabre model. */
@@ -209,6 +209,8 @@
 }
 
-void pci_clear_interrupt(pci_t *pci, int inr)
-{
+void pci_clear_interrupt(void *pcip, int inr)
+{
+	pci_t *pci = (pci_t *)pcip;
+
 	ASSERT(pci->op && pci->op->clear_interrupt);
 	pci->op->clear_interrupt(pci, inr);
Index: kernel/arch/sparc64/src/trap/interrupt.c
===================================================================
--- kernel/arch/sparc64/src/trap/interrupt.c	(revision dfd77382ed9624f5671e5680cd92fad49f395b3a)
+++ kernel/arch/sparc64/src/trap/interrupt.c	(revision 57e76cb2b99587198056fdcf3441d24f54f93a56)
@@ -80,4 +80,10 @@
 		 */
 		irq->handler(irq, irq->arg);
+		/*
+		 * See if there is a clear-interrupt-routine and call it.
+		 */
+		if (irq->cir) {
+			irq->cir(irq->cir_arg, irq->inr);
+		}
 		spinlock_unlock(&irq->lock);
 	} else if (data0 > config.base) {
@@ -99,5 +105,5 @@
 #ifdef CONFIG_DEBUG
 		printf("cpu%u: spurious interrupt (intrcv=%#" PRIx64
-			", data0=%#" PRIx64 ")\n", CPU->id, intrcv, data0);
+		    ", data0=%#" PRIx64 ")\n", CPU->id, intrcv, data0);
 #endif
 	}
