Index: kernel/genarch/src/drivers/dsrln/dsrlnin.c
===================================================================
--- kernel/genarch/src/drivers/dsrln/dsrlnin.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
+++ kernel/genarch/src/drivers/dsrln/dsrlnin.c	(revision 402de0c55e1244d9577ac32ddd4be299249808be)
@@ -41,8 +41,4 @@
 #include <ddi/device.h>
 
-static indev_operations_t kbrdin_ops = {
-	.poll = NULL
-};
-
 static irq_ownership_t dsrlnin_claim(irq_t *irq)
 {
@@ -55,27 +51,33 @@
 	dsrlnin_t *dev = instance->dsrlnin;
 	
-	indev_push_character(&instance->kbrdin, pio_read_8(&dev->data));
+	indev_push_character(instance->srlnin, pio_read_8(&dev->data));
 }
 
-indev_t *dsrlnin_init(dsrlnin_t *dev, inr_t inr)
+dsrlnin_instance_t *dsrlnin_init(dsrlnin_t *dev, inr_t inr)
 {
 	dsrlnin_instance_t *instance
 	    = malloc(sizeof(dsrlnin_instance_t), FRAME_ATOMIC);
-	if (!instance)
-		return NULL;
+	if (instance) {
+		instance->dsrlnin = dev;
+		instance->srlnin = NULL;
+		
+		irq_initialize(&instance->irq);
+		instance->irq.devno = device_assign_devno();
+		instance->irq.inr = inr;
+		instance->irq.claim = dsrlnin_claim;
+		instance->irq.handler = dsrlnin_irq_handler;
+		instance->irq.instance = instance;
+	}
 	
-	indev_initialize("dsrlnin", &instance->kbrdin, &kbrdin_ops);
+	return instance;
+}
+
+void dsrlnin_wire(dsrlnin_instance_t *instance, indev_t *srlnin)
+{
+	ASSERT(instance);
+	ASSERT(srlnin);
 	
-	instance->dsrlnin = dev;
-	
-	irq_initialize(&instance->irq);
-	instance->irq.devno = device_assign_devno();
-	instance->irq.inr = inr;
-	instance->irq.claim = dsrlnin_claim;
-	instance->irq.handler = dsrlnin_irq_handler;
-	instance->irq.instance = instance;
+	instance->srlnin = srlnin;
 	irq_register(&instance->irq);
-	
-	return &instance->kbrdin;
 }
 
Index: kernel/genarch/src/drivers/i8042/i8042.c
===================================================================
--- kernel/genarch/src/drivers/i8042/i8042.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
+++ kernel/genarch/src/drivers/i8042/i8042.c	(revision 402de0c55e1244d9577ac32ddd4be299249808be)
@@ -45,8 +45,4 @@
 #include <ddi/device.h>
 
-static indev_operations_t kbrdin_ops = {
-	.poll = NULL
-};
-
 #define i8042_SET_COMMAND  0x60
 #define i8042_COMMAND      0x69
@@ -75,33 +71,44 @@
 	if (((status = pio_read_8(&dev->status)) & i8042_BUFFER_FULL_MASK)) {
 		uint8_t data = pio_read_8(&dev->data);
-		indev_push_character(&instance->kbrdin, data);
+		indev_push_character(instance->kbrdin, data);
 	}
 }
 
+/**< Clear input buffer. */
+static void i8042_clear_buffer(i8042_t *dev)
+{
+	while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
+		(void) pio_read_8(&dev->data);
+}
+
 /** Initialize i8042. */
-indev_t *i8042_init(i8042_t *dev, inr_t inr)
+i8042_instance_t *i8042_init(i8042_t *dev, inr_t inr)
 {
 	i8042_instance_t *instance
 	    = malloc(sizeof(i8042_instance_t), FRAME_ATOMIC);
-	if (!instance)
-		return NULL;
+	if (instance) {
+		instance->i8042 = dev;
+		instance->kbrdin = NULL;
+		
+		irq_initialize(&instance->irq);
+		instance->irq.devno = device_assign_devno();
+		instance->irq.inr = inr;
+		instance->irq.claim = i8042_claim;
+		instance->irq.handler = i8042_irq_handler;
+		instance->irq.instance = instance;
+		
+	}
 	
-	indev_initialize("i8042", &instance->kbrdin, &kbrdin_ops);
+	return instance;
+}
+
+void i8042_wire(i8042_instance_t *instance, indev_t *kbrdin)
+{
+	ASSERT(instance);
+	ASSERT(kbrdin);
 	
-	instance->i8042 = dev;
-	
-	irq_initialize(&instance->irq);
-	instance->irq.devno = device_assign_devno();
-	instance->irq.inr = inr;
-	instance->irq.claim = i8042_claim;
-	instance->irq.handler = i8042_irq_handler;
-	instance->irq.instance = instance;
+	instance->kbrdin = kbrdin;
 	irq_register(&instance->irq);
-	
-	/* Clear input buffer */
-	while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
-		(void) pio_read_8(&dev->data);
-	
-	return &instance->kbrdin;
+	i8042_clear_buffer(instance->i8042);
 }
 
@@ -111,7 +118,5 @@
 	interrupts_disable();
 	
-	/* Clear input buffer */
-	while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
-		(void) pio_read_8(&dev->data);
+	i8042_clear_buffer(dev);
 	
 	/* Reset CPU */
Index: kernel/genarch/src/drivers/ns16550/ns16550.c
===================================================================
--- kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
+++ kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 402de0c55e1244d9577ac32ddd4be299249808be)
@@ -44,8 +44,4 @@
 #define LSR_DATA_READY  0x01
 
-static indev_operations_t kbrdin_ops = {
-	.poll = NULL
-};
-
 static irq_ownership_t ns16550_claim(irq_t *irq)
 {
@@ -65,7 +61,14 @@
 	
 	if (pio_read_8(&dev->lsr) & LSR_DATA_READY) {
-		uint8_t x = pio_read_8(&dev->rbr);
-		indev_push_character(&instance->kbrdin, x);
+		uint8_t data = pio_read_8(&dev->rbr);
+		indev_push_character(instance->kbrdin, data);
 	}
+}
+
+/**< Clear input buffer. */
+static void ns16550_clear_buffer(ns16550_t *dev)
+{
+	while ((pio_read_8(&dev->lsr) & LSR_DATA_READY))
+		(void) pio_read_8(&dev->rbr);
 }
 
@@ -78,36 +81,41 @@
  * @param cir_arg  First argument to cir.
  *
- * @return Keyboard device pointer or NULL on failure.
+ * @return Keyboard instance or NULL on failure.
  *
  */
-indev_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg)
+ns16550_instance_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg)
 {
 	ns16550_instance_t *instance
 	    = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC);
-	if (!instance)
-		return NULL;
+	if (instance) {
+		instance->ns16550 = dev;
+		instance->kbrdin = NULL;
+		
+		irq_initialize(&instance->irq);
+		instance->irq.devno = device_assign_devno();
+		instance->irq.inr = inr;
+		instance->irq.claim = ns16550_claim;
+		instance->irq.handler = ns16550_irq_handler;
+		instance->irq.instance = instance;
+		instance->irq.cir = cir;
+		instance->irq.cir_arg = cir_arg;
+	}
 	
-	indev_initialize("ns16550", &instance->kbrdin, &kbrdin_ops);
+	return instance;
+}
+
+void ns16550_wire(ns16550_instance_t *instance, indev_t *kbrdin)
+{
+	ASSERT(instance);
+	ASSERT(kbrdin);
 	
-	instance->ns16550 = dev;
-	
-	irq_initialize(&instance->irq);
-	instance->irq.devno = device_assign_devno();
-	instance->irq.inr = inr;
-	instance->irq.claim = ns16550_claim;
-	instance->irq.handler = ns16550_irq_handler;
-	instance->irq.instance = instance;
-	instance->irq.cir = cir;
-	instance->irq.cir_arg = cir_arg;
+	instance->kbrdin = kbrdin;
 	irq_register(&instance->irq);
 	
-	while ((pio_read_8(&dev->lsr) & LSR_DATA_READY))
-		(void) pio_read_8(&dev->rbr);
+	ns16550_clear_buffer(instance->ns16550);
 	
 	/* Enable interrupts */
-	pio_write_8(&dev->ier, IER_ERBFI);
-	pio_write_8(&dev->mcr, MCR_OUT2);
-	
-	return &instance->kbrdin;
+	pio_write_8(&instance->ns16550->ier, IER_ERBFI);
+	pio_write_8(&instance->ns16550->mcr, MCR_OUT2);
 }
 
Index: kernel/genarch/src/drivers/via-cuda/cuda.c
===================================================================
--- kernel/genarch/src/drivers/via-cuda/cuda.c	(revision 402de0c55e1244d9577ac32ddd4be299249808be)
+++ kernel/genarch/src/drivers/via-cuda/cuda.c	(revision 402de0c55e1244d9577ac32ddd4be299249808be)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2006 Martin Decky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup genarch
+ * @{
+ */
+/** @file
+ */
+
+#include <genarch/drivers/via-cuda/cuda.h>
+#include <console/chardev.h>
+#include <ddi/irq.h>
+#include <arch/asm.h>
+#include <mm/slab.h>
+#include <ddi/device.h>
+
+static irq_ownership_t cuda_claim(irq_t *irq)
+{
+	return IRQ_DECLINE;
+}
+
+static void cuda_irq_handler(irq_t *irq)
+{
+}
+
+cuda_instance_t *cuda_init(cuda_t *dev, inr_t inr, cir_t cir, void *cir_arg)
+{
+	cuda_instance_t *instance
+	    = malloc(sizeof(cuda_instance_t), FRAME_ATOMIC);
+	if (instance) {
+		instance->cuda = dev;
+		instance->kbrdin = NULL;
+		
+		irq_initialize(&instance->irq);
+		instance->irq.devno = device_assign_devno();
+		instance->irq.inr = inr;
+		instance->irq.claim = cuda_claim;
+		instance->irq.handler = cuda_irq_handler;
+		instance->irq.instance = instance;
+		instance->irq.cir = cir;
+		instance->irq.cir_arg = cir_arg;
+	}
+	
+	return instance;
+}
+
+void cuda_wire(cuda_instance_t *instance, indev_t *kbrdin)
+{
+}
+
+
+/** @}
+ */
Index: kernel/genarch/src/drivers/z8530/z8530.c
===================================================================
--- kernel/genarch/src/drivers/z8530/z8530.c	(revision 149d14e522aa5c449b696ad4420f3caa33ca9b8e)
+++ kernel/genarch/src/drivers/z8530/z8530.c	(revision 402de0c55e1244d9577ac32ddd4be299249808be)
@@ -42,8 +42,4 @@
 #include <ddi/device.h>
 
-static indev_operations_t kbrdin_ops = {
-	.poll = NULL
-};
-
 static inline void z8530_write(ioport8_t *ctl, uint8_t reg, uint8_t val)
 {
@@ -83,32 +79,41 @@
 	
 	if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) {
-		uint8_t x = z8530_read(&dev->ctl_a, RR8);
-		indev_push_character(&instance->kbrdin, x);
+		uint8_t data = z8530_read(&dev->ctl_a, RR8);
+		indev_push_character(instance->kbrdin, data);
 	}
 }
 
 /** Initialize z8530. */
-indev_t *z8530_init(z8530_t *dev, inr_t inr, cir_t cir, void *cir_arg)
+z8530_instance_t *z8530_init(z8530_t *dev, inr_t inr, cir_t cir, void *cir_arg)
 {
 	z8530_instance_t *instance
 	    = malloc(sizeof(z8530_instance_t), FRAME_ATOMIC);
-	if (!instance)
-		return false;
+	if (instance) {
+		instance->z8530 = dev;
+		instance->kbrdin = NULL;
+		
+		irq_initialize(&instance->irq);
+		instance->irq.devno = device_assign_devno();
+		instance->irq.inr = inr;
+		instance->irq.claim = z8530_claim;
+		instance->irq.handler = z8530_irq_handler;
+		instance->irq.instance = instance;
+		instance->irq.cir = cir;
+		instance->irq.cir_arg = cir_arg;
+	}
 	
-	indev_initialize("z8530", &instance->kbrdin, &kbrdin_ops);
+	return instance;
+}
+
+void z8530_wire(z8530_instance_t *instance, indev_t *kbrdin)
+{
+	ASSERT(instance);
+	ASSERT(kbrdin);
 	
-	instance->z8530 = dev;
+	instance->kbrdin = kbrdin;
 	
-	irq_initialize(&instance->irq);
-	instance->irq.devno = device_assign_devno();
-	instance->irq.inr = inr;
-	instance->irq.claim = z8530_claim;
-	instance->irq.handler = z8530_irq_handler;
-	instance->irq.instance = instance;
-	instance->irq.cir = cir;
-	instance->irq.cir_arg = cir_arg;
 	irq_register(&instance->irq);
 	
-	(void) z8530_read(&dev->ctl_a, RR8);
+	(void) z8530_read(&instance->z8530->ctl_a, RR8);
 	
 	/*
@@ -116,16 +121,14 @@
 	 * to set FHC UART interrupt state to idle.
 	 */
-	z8530_write(&dev->ctl_a, WR0, WR0_TX_IP_RST);
+	z8530_write(&instance->z8530->ctl_a, WR0, WR0_TX_IP_RST);
 	
 	/* interrupt on all characters */
-	z8530_write(&dev->ctl_a, WR1, WR1_IARCSC);
+	z8530_write(&instance->z8530->ctl_a, WR1, WR1_IARCSC);
 	
 	/* 8 bits per character and enable receiver */
-	z8530_write(&dev->ctl_a, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);
+	z8530_write(&instance->z8530->ctl_a, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);
 	
 	/* Master Interrupt Enable. */
-	z8530_write(&dev->ctl_a, WR9, WR9_MIE);
-	
-	return &instance->kbrdin;
+	z8530_write(&instance->z8530->ctl_a, WR9, WR9_MIE);
 }
 
