Index: uspace/drv/char/i8042/i8042.c
===================================================================
--- uspace/drv/char/i8042/i8042.c	(revision 7f1669fe501c2d7c9779148576f059af4e423c9a)
+++ uspace/drv/char/i8042/i8042.c	(revision 78aa0abd998668e0ed1e36c0d6015a74837a40d8)
@@ -68,10 +68,4 @@
 
 
-enum {
-	DEVID_PRI = 0, /**< primary device */
-        DEVID_AUX = 1, /**< AUX device */
-	MAX_DEVS  = 2
-};
-
 static irq_cmd_t i8042_cmds[] = {
 	{
@@ -106,18 +100,14 @@
 };
 
-static uintptr_t i8042_physical;
-static uintptr_t i8042_kernel;
-static i8042_regs_t * i8042;
-
-static i8042_port_t i8042_port[MAX_DEVS];
+static i8042_dev_t device;
 
 static void wait_ready(void)
 {
-	while (pio_read_8(&i8042->status) & i8042_INPUT_FULL);
+	while (pio_read_8(&device.regs->status) & i8042_INPUT_FULL);
 }
 
 static void i8042_irq_handler(ipc_callid_t iid, ipc_call_t *call);
 static void i8042_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg);
-static int i8042_init(void);
+static int i8042_init(i8042_dev_t *dev);
 static void i8042_port_write(int devid, uint8_t data);
 
@@ -127,5 +117,5 @@
 	char name[16];
 	int i, rc;
-	char dchar[MAX_DEVS] = { 'a', 'b' };
+	const char dchar[MAX_DEVS] = { 'a', 'b' };
 
 	printf(NAME ": i8042 PS/2 port driver\n");
@@ -137,12 +127,12 @@
 	}
 
-	if (i8042_init() != EOK)
+	if (i8042_init(&device) != EOK)
 		return -1;
 
 	for (i = 0; i < MAX_DEVS; i++) {
-		i8042_port[i].client_sess = NULL;
+		device.port[i].client_sess = NULL;
 
 		snprintf(name, 16, "%s/ps2%c", NAMESPACE, dchar[i]);
-		rc = loc_service_register(name, &i8042_port[i].service_id);
+		rc = loc_service_register(name, &device.port[i].service_id);
 		if (rc != EOK) {
 			printf(NAME ": Unable to register device %s.\n", name);
@@ -160,6 +150,9 @@
 }
 
-static int i8042_init(void)
-{
+static int i8042_init(i8042_dev_t *dev)
+{
+	static uintptr_t i8042_physical;
+	static uintptr_t i8042_kernel;
+	assert(dev);
 	if (sysinfo_get_value("i8042.address.physical", &i8042_physical) != EOK)
 		return -1;
@@ -172,5 +165,5 @@
 		return -1;
 	
-	i8042 = vaddr;
+	dev->regs = vaddr;
 	
 	sysarg_t inr_a;
@@ -187,11 +180,11 @@
 	/* Disable kbd and aux */
 	wait_ready();
-	pio_write_8(&i8042->status, i8042_CMD_WRITE_CMDB);
-	wait_ready();
-	pio_write_8(&i8042->data, i8042_KBD_DISABLE | i8042_AUX_DISABLE);
+	pio_write_8(&dev->regs->status, i8042_CMD_WRITE_CMDB);
+	wait_ready();
+	pio_write_8(&dev->regs->data, i8042_KBD_DISABLE | i8042_AUX_DISABLE);
 
 	/* Flush all current IO */
-	while (pio_read_8(&i8042->status) & i8042_OUTPUT_FULL)
-		(void) pio_read_8(&i8042->data);
+	while (pio_read_8(&dev->regs->status) & i8042_OUTPUT_FULL)
+		(void) pio_read_8(&dev->regs->data);
 
 	i8042_kbd.cmds[0].addr = (void *) &((i8042_regs_t *) i8042_kernel)->status;
@@ -203,7 +196,7 @@
 
 	wait_ready();
-	pio_write_8(&i8042->status, i8042_CMD_WRITE_CMDB);
-	wait_ready();
-	pio_write_8(&i8042->data, i8042_KBD_IE | i8042_KBD_TRANSLATE |
+	pio_write_8(&dev->regs->status, i8042_CMD_WRITE_CMDB);
+	wait_ready();
+	pio_write_8(&dev->regs->data, i8042_KBD_IE | i8042_KBD_TRANSLATE |
 	    i8042_AUX_IE);
 
@@ -229,5 +222,5 @@
 	dev_id = -1;
 	for (i = 0; i < MAX_DEVS; i++) {
-		if (i8042_port[i].service_id == dsid)
+		if (device.port[i].service_id == dsid)
 			dev_id = i;
 	}
@@ -256,6 +249,6 @@
 		    async_callback_receive_start(EXCHANGE_SERIALIZE, &call);
 		if (sess != NULL) {
-			if (i8042_port[dev_id].client_sess == NULL) {
-				i8042_port[dev_id].client_sess = sess;
+			if (device.port[dev_id].client_sess == NULL) {
+				device.port[dev_id].client_sess = sess;
 				retval = EOK;
 			} else
@@ -283,8 +276,8 @@
 	if (devid == DEVID_AUX) {
 		wait_ready();
-		pio_write_8(&i8042->status, i8042_CMD_WRITE_AUX);
-	}
-	wait_ready();
-	pio_write_8(&i8042->data, data);
+		pio_write_8(&device.regs->status, i8042_CMD_WRITE_AUX);
+	}
+	wait_ready();
+	pio_write_8(&device.regs->data, data);
 }
 
@@ -303,7 +296,7 @@
 	}
 
-	if (i8042_port[devid].client_sess != NULL) {
+	if (device.port[devid].client_sess != NULL) {
 		async_exch_t *exch =
-		    async_exchange_begin(i8042_port[devid].client_sess);
+		    async_exchange_begin(device.port[devid].client_sess);
 		async_msg_1(exch, IPC_FIRST_USER_METHOD, data);
 		async_exchange_end(exch);
Index: uspace/drv/char/i8042/i8042.h
===================================================================
--- uspace/drv/char/i8042/i8042.h	(revision 7f1669fe501c2d7c9779148576f059af4e423c9a)
+++ uspace/drv/char/i8042/i8042.h	(revision 78aa0abd998668e0ed1e36c0d6015a74837a40d8)
@@ -56,4 +56,15 @@
 } i8042_port_t;
 
+enum {
+	DEVID_PRI = 0, /**< primary device */
+        DEVID_AUX = 1, /**< AUX device */
+	MAX_DEVS  = 2
+};
+
+typedef struct {
+	i8042_regs_t *regs;
+	i8042_port_t port[MAX_DEVS];
+} i8042_dev_t;
+
 #endif
 
