Index: kernel/genarch/include/kbd/i8042.h
===================================================================
--- kernel/genarch/include/kbd/i8042.h	(revision 45448840d542ead240f5fefb8c8e9d8f889335c9)
+++ kernel/genarch/include/kbd/i8042.h	(revision f32d90be790669d71082aea8e9d0e239043b61e7)
@@ -37,5 +37,5 @@
 
 #include <arch/types.h>
-#include <console/chardev.h>
+#include <typedefs.h>
 
 struct i8042 {
@@ -53,5 +53,4 @@
 extern void i8042_grab(void);
 extern void i8042_release(void);
-extern char i8042_key_read(chardev_t *d);
 
 #endif
Index: kernel/genarch/include/kbd/ns16550.h
===================================================================
--- kernel/genarch/include/kbd/ns16550.h	(revision 45448840d542ead240f5fefb8c8e9d8f889335c9)
+++ kernel/genarch/include/kbd/ns16550.h	(revision f32d90be790669d71082aea8e9d0e239043b61e7)
@@ -38,27 +38,7 @@
 #define KERN_NS16550_H_
 
-#include <console/chardev.h>
 #include <ddi/irq.h>
-#include <ipc/irq.h>
-
-extern void ns16550_init(devno_t, uintptr_t, inr_t, cir_t, void *);
-extern void ns16550_poll(void);
-extern void ns16550_grab(void);
-extern void ns16550_release(void);
-extern char ns16550_key_read(chardev_t *);
-extern irq_ownership_t ns16550_claim(void *);
-extern void ns16550_irq_handler(irq_t *);
-
 #include <arch/types.h>
 #include <arch/drivers/kbd.h>
-
-/* NS16550 registers */
-#define RBR_REG		0	/** Receiver Buffer Register. */
-#define IER_REG		1	/** Interrupt Enable Register. */
-#define IIR_REG		2	/** Interrupt Ident Register (read). */
-#define FCR_REG		2	/** FIFO control register (write). */
-#define LCR_REG		3	/** Line Control register. */
-#define MCR_REG		4	/** Modem Control Register. */
-#define LSR_REG		5	/** Line Status Register. */
 
 #define IER_ERBFI	0x01	/** Enable Receive Buffer Full Interrupt. */
@@ -68,64 +48,30 @@
 #define MCR_OUT2	0x08	/** OUT2. */
 
+/** NS16550 registers. */
+struct ns16550 {
+	ioport8_t rbr;	/**< Receiver Buffer Register. */
+	ioport8_t ier;	/**< Interrupt Enable Register. */
+	union {
+		ioport8_t iir;	/**< Interrupt Ident Register (read). */
+		ioport8_t fcr;	/**< FIFO control register (write). */
+	} __attribute__ ((packed));
+	ioport8_t lcr;	/**< Line Control register. */
+	ioport8_t mcr;	/**< Modem Control Register. */
+	ioport8_t lsr;	/**< Line Status Register. */
+} __attribute__ ((packed));
+typedef struct ns16550 ns16550_t;
+
 /** Structure representing the ns16550 device. */
-typedef struct {
+typedef struct ns16550_instance {
 	devno_t devno;
-	/** Memory mapped registers of the ns16550. */
-	volatile ioport_t io_port;
-} ns16550_t;
+	ns16550_t *ns16550;
+	irq_t *irq;
+} ns16550_instance_t;
 
-static inline uint8_t ns16550_rbr_read(ns16550_t *dev)
-{
-	return pio_read_8(dev->io_port + RBR_REG);
-}
-static inline void ns16550_rbr_write(ns16550_t *dev, uint8_t v)
-{
-	pio_write_8(dev->io_port + RBR_REG, v);
-}
-
-static inline uint8_t ns16550_ier_read(ns16550_t *dev)
-{
-	return pio_read_8(dev->io_port + IER_REG);
-}
-
-static inline void ns16550_ier_write(ns16550_t *dev, uint8_t v)
-{
-	pio_write_8(dev->io_port + IER_REG, v);
-}
-
-static inline uint8_t ns16550_iir_read(ns16550_t *dev)
-{
-	return pio_read_8(dev->io_port + IIR_REG);
-}
-
-static inline void ns16550_fcr_write(ns16550_t *dev, uint8_t v)
-{
-	pio_write_8(dev->io_port + FCR_REG, v);
-}
-
-static inline uint8_t ns16550_lcr_read(ns16550_t *dev)
-{
-	return pio_read_8(dev->io_port + LCR_REG);
-}
-
-static inline void ns16550_lcr_write(ns16550_t *dev, uint8_t v)
-{
-	pio_write_8(dev->io_port + LCR_REG, v);
-}
-
-static inline uint8_t ns16550_lsr_read(ns16550_t *dev)
-{
-	return pio_read_8(dev->io_port + LSR_REG);
-}
-
-static inline uint8_t ns16550_mcr_read(ns16550_t *dev)
-{
-	return pio_read_8(dev->io_port + MCR_REG);
-}
-
-static inline void ns16550_mcr_write(ns16550_t *dev, uint8_t v)
-{
-	pio_write_8(dev->io_port + MCR_REG, v);
-}
+extern bool ns16550_init(ns16550_t *, devno_t, inr_t, cir_t, void *);
+extern void ns16550_grab(void);
+extern void ns16550_release(void);
+extern irq_ownership_t ns16550_claim(void *);
+extern void ns16550_irq_handler(irq_t *);
 
 #endif
