Index: kernel/genarch/src/drivers/ns16550/ns16550.c
===================================================================
--- kernel/genarch/src/drivers/ns16550/ns16550.c	(revision aafed151536405cdb1390b88b7e4ac7c285dd53e)
+++ kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 86afbdba227b153ddf1b8a7690fdcfad5ba22c48)
@@ -39,7 +39,9 @@
 #include <genarch/drivers/ns16550/ns16550.h>
 #include <ddi/irq.h>
+#include <ddi/ddi.h>
 #include <arch/asm.h>
 #include <console/chardev.h>
 #include <stdlib.h>
+#include <align.h>
 #include <str.h>
 
@@ -143,9 +145,11 @@
  *
  */
-ns16550_instance_t *ns16550_init(ioport8_t *dev, unsigned reg_shift, inr_t inr,
-    cir_t cir, void *cir_arg, outdev_t **output)
-{
-	ns16550_instance_t *instance =
-	    malloc(sizeof(ns16550_instance_t));
+ns16550_instance_t *ns16550_init(ioport8_t *dev_phys, unsigned reg_shift,
+    inr_t inr, cir_t cir, void *cir_arg, outdev_t **output)
+{
+	size_t size = 6 * (1U << reg_shift);
+	ioport8_t *dev = pio_map((void *) dev_phys, size);
+
+	ns16550_instance_t *instance = malloc(sizeof(ns16550_instance_t));
 	if (instance) {
 		instance->ns16550 = dev;
@@ -158,4 +162,6 @@
 			if (!instance->output) {
 				free(instance);
+				pio_unmap((void *) dev_phys, (void *) dev,
+				    size);
 				return NULL;
 			}
@@ -176,6 +182,7 @@
 
 		ddi_parea_init(&instance->parea);
-		instance->parea.pbase = (uintptr_t) dev;
-		instance->parea.frames = 1;
+		instance->parea.pbase = ALIGN_DOWN((uintptr_t) dev_phys,
+		    PAGE_SIZE);
+		instance->parea.frames = ALIGN_UP(size, PAGE_SIZE);
 		instance->parea.unpriv = false;
 		instance->parea.mapped = false;
