Index: uspace/srv/hid/kbd/Makefile
===================================================================
--- uspace/srv/hid/kbd/Makefile	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/Makefile	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -49,9 +49,21 @@
 	layout/cz.c \
 	layout/us_qwerty.c \
-	layout/us_dvorak.c
+	layout/us_dvorak.c \
+	port/adb.c \
+	port/chardev.c \
+	port/dummy.c \
+	port/gxemul.c \
+	port/msim.c \
+	port/niagara.c \
+	port/ns16550.c \
+	port/pl050.c \
+	port/sgcn.c \
+	port/ski.c \
+	port/sun.c \
+	port/z8530.c
+
 
 ifeq ($(UARCH),amd64)
 	SOURCES += \
-		port/chardev.c \
 		ctl/pc.c
 endif
@@ -60,11 +72,7 @@
 	ifeq ($(MACHINE),gta02)
 		SOURCES += \
-			port/chardev.c \
 			ctl/stty.c
 	endif
 	ifeq ($(MACHINE),testarm)
-		SOURCES += \
-			port/gxemul.c
-		
 		ifeq ($(CONFIG_FB),y)
 			SOURCES += \
@@ -77,5 +85,4 @@
 	ifeq ($(MACHINE),integratorcp)
 		SOURCES += \
-			port/pl050.c \
 			ctl/pc.c
 	endif
@@ -84,5 +91,4 @@
 ifeq ($(UARCH),ia32)
 	SOURCES += \
-		port/chardev.c \
 		ctl/pc.c
 endif
@@ -90,5 +96,4 @@
 ifeq ($(MACHINE),i460GX)
 	SOURCES += \
-		port/chardev.c \
 		ctl/pc.c
 endif
@@ -96,5 +101,4 @@
 ifeq ($(MACHINE),ski)
 	SOURCES += \
-		port/ski.c \
 		ctl/stty.c
 endif
@@ -102,12 +106,8 @@
 ifeq ($(MACHINE),msim)
 	SOURCES += \
-		port/msim.c \
 		ctl/stty.c
 endif
 
 ifeq ($(MACHINE),lgxemul)
-	SOURCES += \
-		port/gxemul.c
-	
 	ifeq ($(CONFIG_FB),y)
 		SOURCES += \
@@ -120,7 +120,4 @@
 
 ifeq ($(MACHINE),bgxemul)
-	SOURCES += \
-		port/gxemul.c
-	
 	ifeq ($(CONFIG_FB),y)
 		SOURCES += \
@@ -134,5 +131,4 @@
 ifeq ($(UARCH),ppc32)
 	SOURCES += \
-		port/adb.c \
 		ctl/apple.c
 endif
@@ -141,18 +137,13 @@
 	ifeq ($(PROCESSOR),sun4v)
 		SOURCES += \
-			port/niagara.c \
 			ctl/stty.c
 	else
 		ifeq ($(MACHINE),serengeti)
 			SOURCES += \
-				port/sgcn.c \
 				ctl/stty.c
 		endif
 		ifeq ($(MACHINE),generic)
 			SOURCES += \
-			port/sun.c \
-			port/z8530.c \
-			port/ns16550.c \
-			ctl/sun.c
+				ctl/sun.c
 		endif
 	endif
@@ -161,5 +152,4 @@
 ifeq ($(UARCH),abs32le)
 	SOURCES += \
-		port/dummy.c \
 		ctl/pc.c
 endif
Index: uspace/srv/hid/kbd/ctl/apple.c
===================================================================
--- uspace/srv/hid/kbd/ctl/apple.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/ctl/apple.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -40,4 +40,5 @@
 #include <io/keycode.h>
 #include <kbd_ctl.h>
+#include <kbd_port.h>
 
 #define KBD_KEY_RELEASE		0x80
@@ -45,6 +46,7 @@
 static int scanmap[];
 
-int kbd_ctl_init(void)
+int kbd_ctl_init(kbd_port_ops_t *kbd_port)
 {
+	(void) kbd_port;
 	return 0;
 }
Index: uspace/srv/hid/kbd/ctl/gxe_fb.c
===================================================================
--- uspace/srv/hid/kbd/ctl/gxe_fb.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/ctl/gxe_fb.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -40,4 +40,5 @@
 #include <io/keycode.h>
 #include <kbd_ctl.h>
+#include <kbd_port.h>
 #include <gsp.h>
 #include <stroke.h>
@@ -207,6 +208,7 @@
 };
 
-int kbd_ctl_init(void)
+int kbd_ctl_init(kbd_port_ops_t *kbd_port)
 {
+	(void) kbd_port;
 	ds = 0;
 
Index: uspace/srv/hid/kbd/ctl/pc.c
===================================================================
--- uspace/srv/hid/kbd/ctl/pc.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/ctl/pc.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -64,4 +64,5 @@
 
 static enum dec_state ds;
+static kbd_port_ops_t *kbd_port;
 
 static int scanmap_simple[] = {
@@ -197,6 +198,7 @@
 };
 
-int kbd_ctl_init(void)
+int kbd_ctl_init(kbd_port_ops_t *kbd_p)
 {
+	kbd_port = kbd_p;
 	ds = ds_s;
 	return 0;
@@ -265,6 +267,6 @@
 		b = b | LI_SCROLL;
 
-	kbd_port_write(KBD_CMD_SET_LEDS);
-	kbd_port_write(b);
+	(*kbd_port->write)(KBD_CMD_SET_LEDS);
+	(*kbd_port->write)(b);
 }
 
Index: uspace/srv/hid/kbd/ctl/stty.c
===================================================================
--- uspace/srv/hid/kbd/ctl/stty.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/ctl/stty.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -39,4 +39,5 @@
 #include <io/keycode.h>
 #include <kbd_ctl.h>
+#include <kbd_port.h>
 #include <gsp.h>
 #include <stroke.h>
@@ -206,6 +207,7 @@
 };
 
-int kbd_ctl_init(void)
+int kbd_ctl_init(kbd_port_ops_t *kbd_port)
 {
+	(void) kbd_port;
 	ds = 0;
 
Index: uspace/srv/hid/kbd/ctl/sun.c
===================================================================
--- uspace/srv/hid/kbd/ctl/sun.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/ctl/sun.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -40,4 +40,5 @@
 #include <io/keycode.h>
 #include <kbd_ctl.h>
+#include <kbd_port.h>
 
 #define KBD_KEY_RELEASE		0x80
@@ -46,5 +47,5 @@
 static int scanmap_simple[];
 
-int kbd_ctl_init(void)
+int kbd_ctl_init(kbd_port_ops_t *kbd_port)
 {
 	return 0;
Index: uspace/srv/hid/kbd/generic/kbd.c
===================================================================
--- uspace/srv/hid/kbd/generic/kbd.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/generic/kbd.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -71,4 +71,6 @@
 static unsigned lock_keys;
 
+static kbd_port_ops_t *kbd_port;
+
 bool irc_service = false;
 int irc_phone = -1;
@@ -201,9 +203,9 @@
 			break;
 		case KBD_YIELD:
-			kbd_port_yield();
+			(*kbd_port->yield)();
 			retval = 0;
 			break;
 		case KBD_RECLAIM:
-			kbd_port_reclaim();
+			(*kbd_port->reclaim)();
 			retval = 0;
 			break;
@@ -215,4 +217,39 @@
 }
 
+static kbd_port_ops_t *kbd_select_port(void)
+{
+	kbd_port_ops_t *kbd_port;
+
+#if defined(UARCH_amd64)
+	kbd_port = &chardev_port;
+#elif defined(UARCH_arm32) && defined(MACHINE_gta02)
+	kbd_port = &chardev_port;
+#elif defined(UARCH_arm32) && defined(MACHINE_testarm)
+	kbd_port = &gxemul_port;
+#elif defined(UARCH_arm32) && defined(MACHINE_integratorcp)
+	kbd_port = &pl050_port;
+#elif defined(UARCH_ia32)
+	kbd_port = &chardev_port;
+#elif defined(MACHINE_i460GX)
+	kbd_port = &chardev_port;
+#elif defined(MACHINE_ski)
+	kbd_port = &ski_port;
+#elif defined(MACHINE_msim)
+	kbd_port = &msim_port;
+#elif defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul)
+	kbd_port = &gxemul_port;
+#elif defined(UARCH_ppc32)
+	kbd_port = &adb_port;
+#elif defined(UARCH_sparc64) && defined(PROCESSOR_sun4v)
+	kbd_port = &niagara_port;
+#elif defined(UARCH_sparc64) && defined(MACHINE_serengeti)
+	kbd_port = &sgcn_port;
+#elif defined(UARCH_sparc64) && defined(MACHINE_generic)
+	kbd_port = &sun_port;
+#else
+	kbd_port = &dummy_port;
+#endif
+	return kbd_port;
+}
 
 int main(int argc, char **argv)
@@ -232,10 +269,13 @@
 	}
 	
+	/* Select port driver. */
+	kbd_port = kbd_select_port();
+
 	/* Initialize port driver. */
-	if (kbd_port_init() != 0)
+	if ((*kbd_port->init)() != 0)
 		return -1;
 
 	/* Initialize controller driver. */
-	if (kbd_ctl_init() != 0)
+	if (kbd_ctl_init(kbd_port) != 0)
 		return -1;
 
Index: uspace/srv/hid/kbd/include/kbd_ctl.h
===================================================================
--- uspace/srv/hid/kbd/include/kbd_ctl.h	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/include/kbd_ctl.h	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -38,6 +38,8 @@
 #define KBD_CTL_H_
 
+#include <kbd_port.h>
+
 extern void kbd_ctl_parse_scancode(int);
-extern int kbd_ctl_init(void);
+extern int kbd_ctl_init(kbd_port_ops_t *);
 extern void kbd_ctl_set_ind(unsigned);
 
Index: uspace/srv/hid/kbd/include/kbd_port.h
===================================================================
--- uspace/srv/hid/kbd/include/kbd_port.h	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/include/kbd_port.h	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2009 Jiri Svoboda
+ * Copyright (c) 2011 Jiri Svoboda
  * All rights reserved.
  *
@@ -40,8 +40,23 @@
 #include <sys/types.h>
 
-extern int kbd_port_init(void);
-extern void kbd_port_yield(void);
-extern void kbd_port_reclaim(void);
-extern void kbd_port_write(uint8_t);
+typedef struct {
+	int (*init)(void);
+	void (*yield)(void);
+	void (*reclaim)(void);
+	void (*write)(uint8_t);
+} kbd_port_ops_t;
+
+extern kbd_port_ops_t adb_port;
+extern kbd_port_ops_t chardev_port;
+extern kbd_port_ops_t dummy_port;
+extern kbd_port_ops_t gxemul_port;
+extern kbd_port_ops_t msim_port;
+extern kbd_port_ops_t niagara_port;
+extern kbd_port_ops_t ns16550_port;
+extern kbd_port_ops_t pl050_port;
+extern kbd_port_ops_t sgcn_port;
+extern kbd_port_ops_t ski_port;
+extern kbd_port_ops_t sun_port;
+extern kbd_port_ops_t z8530_port;
 
 #endif
Index: uspace/srv/hid/kbd/port/adb.c
===================================================================
--- uspace/srv/hid/kbd/port/adb.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/adb.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -49,9 +49,21 @@
 static void adb_kbd_reg0_data(uint16_t data);
 
+static int adb_port_init(void);
+static void adb_port_yield(void);
+static void adb_port_reclaim(void);
+static void adb_port_write(uint8_t data);
+
+kbd_port_ops_t adb_port = {
+	.init = adb_port_init,
+	.yield = adb_port_yield,
+	.reclaim = adb_port_reclaim,
+	.write = adb_port_write
+};
+
 static int dev_phone;
 
 #define NAME "kbd"
 
-int kbd_port_init(void)
+static int adb_port_init(void)
 {
 	const char *dev = "adb/kbd";
@@ -78,13 +90,13 @@
 }
 
-void kbd_port_yield(void)
+static void adb_port_yield(void)
 {
 }
 
-void kbd_port_reclaim(void)
+static void adb_port_reclaim(void)
 {
 }
 
-void kbd_port_write(uint8_t data)
+static void adb_port_write(uint8_t data)
 {
 	/*async_msg_1(dev_phone, CHAR_WRITE_BYTE, data);*/
Index: uspace/srv/hid/kbd/port/chardev.c
===================================================================
--- uspace/srv/hid/kbd/port/chardev.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/chardev.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -49,4 +49,16 @@
 static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall);
 
+static int chardev_port_init(void);
+static void chardev_port_yield(void);
+static void chardev_port_reclaim(void);
+static void chardev_port_write(uint8_t data);
+
+kbd_port_ops_t chardev_port = {
+	.init = chardev_port_init,
+	.yield = chardev_port_yield,
+	.reclaim = chardev_port_reclaim,
+	.write = chardev_port_write
+};
+
 static int dev_phone;
 
@@ -59,5 +71,5 @@
 static const unsigned int num_devs = sizeof(in_devs) / sizeof(in_devs[0]);
 
-int kbd_port_init(void)
+static int chardev_port_init(void)
 {
 	devmap_handle_t handle;
@@ -91,13 +103,13 @@
 }
 
-void kbd_port_yield(void)
+static void chardev_port_yield(void)
 {
 }
 
-void kbd_port_reclaim(void)
+static void chardev_port_reclaim(void)
 {
 }
 
-void kbd_port_write(uint8_t data)
+static void chardev_port_write(uint8_t data)
 {
 	async_obsolete_msg_1(dev_phone, CHAR_WRITE_BYTE, data);
Index: uspace/srv/hid/kbd/port/dummy.c
===================================================================
--- uspace/srv/hid/kbd/port/dummy.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/dummy.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -38,18 +38,31 @@
 #include <kbd.h>
 
-int kbd_port_init(void)
+static int dummy_port_init(void);
+static void dummy_port_yield(void);
+static void dummy_port_reclaim(void);
+static void dummy_port_write(uint8_t data);
+
+kbd_port_ops_t dummy_port = {
+	.init = dummy_port_init,
+	.yield = dummy_port_yield,
+	.reclaim = dummy_port_reclaim,
+	.write = dummy_port_write
+};
+
+
+static int dummy_port_init(void)
 {
 	return 0;
 }
 
-void kbd_port_yield(void)
+static void dummy_port_yield(void)
 {
 }
 
-void kbd_port_reclaim(void)
+static void dummy_port_reclaim(void)
 {
 }
 
-void kbd_port_write(uint8_t data)
+static void dummy_port_write(uint8_t data)
 {
 	(void) data;
Index: uspace/srv/hid/kbd/port/gxemul.c
===================================================================
--- uspace/srv/hid/kbd/port/gxemul.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/gxemul.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -42,4 +42,16 @@
 #include <errno.h>
 
+static int gxemul_port_init(void);
+static void gxemul_port_yield(void);
+static void gxemul_port_reclaim(void);
+static void gxemul_port_write(uint8_t data);
+
+kbd_port_ops_t gxemul_port = {
+	.init = gxemul_port_init,
+	.yield = gxemul_port_yield,
+	.reclaim = gxemul_port_reclaim,
+	.write = gxemul_port_write
+};
+
 static irq_cmd_t gxemul_cmds[] = {
 	{ 
@@ -61,5 +73,5 @@
 
 /** Initializes keyboard handler. */
-int kbd_port_init(void)
+static int gxemul_port_init(void)
 {
 	sysarg_t addr;
@@ -77,13 +89,13 @@
 }
 
-void kbd_port_yield(void)
+static void gxemul_port_yield(void)
 {
 }
 
-void kbd_port_reclaim(void)
+static void gxemul_port_reclaim(void)
 {
 }
 
-void kbd_port_write(uint8_t data)
+static void gxemul_port_write(uint8_t data)
 {
 	(void) data;
Index: uspace/srv/hid/kbd/port/msim.c
===================================================================
--- uspace/srv/hid/kbd/port/msim.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/msim.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -42,5 +42,17 @@
 #include <errno.h>
 
-irq_cmd_t msim_cmds[] = {
+static int msim_port_init(void);
+static void msim_port_yield(void);
+static void msim_port_reclaim(void);
+static void msim_port_write(uint8_t data);
+
+kbd_port_ops_t msim_port = {
+	.init = msim_port_init,
+	.yield = msim_port_yield,
+	.reclaim = msim_port_reclaim,
+	.write = msim_port_write
+};
+
+static irq_cmd_t msim_cmds[] = {
 	{
 		.cmd = CMD_PIO_READ_8,
@@ -51,8 +63,7 @@
 		.cmd = CMD_ACCEPT
 	}
-	
 };
 
-irq_code_t msim_kbd = {
+static irq_code_t msim_kbd = {
 	sizeof(msim_cmds) / sizeof(irq_cmd_t),
 	msim_cmds
@@ -61,5 +72,5 @@
 static void msim_irq_handler(ipc_callid_t iid, ipc_call_t *call);
 
-int kbd_port_init(void)
+static int msim_port_init(void)
 {
 	sysarg_t vaddr;
@@ -78,13 +89,13 @@
 }
 
-void kbd_port_yield(void)
+static void msim_port_yield(void)
 {
 }
 
-void kbd_port_reclaim(void)
+static void msim_port_reclaim(void)
 {
 }
 
-void kbd_port_write(uint8_t data)
+static void msim_port_write(uint8_t data)
 {
 	(void) data;
Index: uspace/srv/hid/kbd/port/niagara.c
===================================================================
--- uspace/srv/hid/kbd/port/niagara.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/niagara.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -46,4 +46,16 @@
 #include <errno.h>
 
+static int niagara_port_init(void);
+static void niagara_port_yield(void);
+static void niagara_port_reclaim(void);
+static void niagara_port_write(uint8_t data);
+
+kbd_port_ops_t niagara_port = {
+	.init = niagara_port_init,
+	.yield = niagara_port_yield,
+	.reclaim = niagara_port_reclaim,
+	.write = niagara_port_write
+};
+
 #define POLL_INTERVAL  10000
 
@@ -70,5 +82,5 @@
 
 /* virtual address of the shared buffer */
-input_buffer_t input_buffer;
+static input_buffer_t input_buffer;
 
 static volatile bool polling_disabled = false;
@@ -79,5 +91,5 @@
  * Maps the shared buffer and creates the polling thread. 
  */
-int kbd_port_init(void)
+static int niagara_port_init(void)
 {
 	sysarg_t paddr;
@@ -105,15 +117,15 @@
 }
 
-void kbd_port_yield(void)
+static void niagara_port_yield(void)
 {
 	polling_disabled = true;
 }
 
-void kbd_port_reclaim(void)
+static void niagara_port_reclaim(void)
 {
 	polling_disabled = false;
 }
 
-void kbd_port_write(uint8_t data)
+static void niagara_port_write(uint8_t data)
 {
 	(void) data;
Index: uspace/srv/hid/kbd/port/pl050.c
===================================================================
--- uspace/srv/hid/kbd/port/pl050.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/pl050.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -46,4 +46,16 @@
 #include <errno.h>
 
+static int pl050_port_init(void);
+static void pl050_port_yield(void);
+static void pl050_port_reclaim(void);
+static void pl050_port_write(uint8_t data);
+
+kbd_port_ops_t pl050_port = {
+	.init = pl050_port_init,
+	.yield = pl050_port_yield,
+	.reclaim = pl050_port_reclaim,
+	.write = pl050_port_write
+};
+
 #define PL050_STAT_RXFULL  (1 << 4)
 
@@ -82,5 +94,5 @@
 static void pl050_irq_handler(ipc_callid_t iid, ipc_call_t *call);
 
-int kbd_port_init(void)
+static int pl050_port_init(void)
 {
 	sysarg_t addr;
@@ -105,13 +117,13 @@
 }
 
-void kbd_port_yield(void)
+static void pl050_port_yield(void)
 {
 }
 
-void kbd_port_reclaim(void)
+static void pl050_port_reclaim(void)
 {
 }
 
-void kbd_port_write(uint8_t data)
+static void pl050_port_write(uint8_t data)
 {
 	(void) data;
Index: uspace/srv/hid/kbd/port/sgcn.c
===================================================================
--- uspace/srv/hid/kbd/port/sgcn.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/sgcn.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -46,4 +46,16 @@
 #include <errno.h>
 
+static int sgcn_port_init(void);
+static void sgcn_port_yield(void);
+static void sgcn_port_reclaim(void);
+static void sgcn_port_write(uint8_t data);
+
+kbd_port_ops_t sgcn_port = {
+	.init = sgcn_port_init,
+	.yield = sgcn_port_yield,
+	.reclaim = sgcn_port_reclaim,
+	.write = sgcn_port_write
+};
+
 #define POLL_INTERVAL  10000
 
@@ -101,5 +113,5 @@
  * Maps the physical memory (SRAM) and creates the polling thread. 
  */
-int kbd_port_init(void)
+static int sgcn_port_init(void)
 {
 	sysarg_t sram_paddr;
@@ -130,15 +142,15 @@
 }
 
-void kbd_port_yield(void)
+static void sgcn_port_yield(void)
 {
 	polling_disabled = true;
 }
 
-void kbd_port_reclaim(void)
+static void sgcn_port_reclaim(void)
 {
 	polling_disabled = false;
 }
 
-void kbd_port_write(uint8_t data)
+static void sgcn_port_write(uint8_t data)
 {
 	(void) data;
Index: uspace/srv/hid/kbd/port/ski.c
===================================================================
--- uspace/srv/hid/kbd/port/ski.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/ski.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -45,4 +45,16 @@
 #include <bool.h>
 
+static int ski_port_init(void);
+static void ski_port_yield(void);
+static void ski_port_reclaim(void);
+static void ski_port_write(uint8_t data);
+
+kbd_port_ops_t ski_port = {
+	.init = ski_port_init,
+	.yield = ski_port_yield,
+	.reclaim = ski_port_reclaim,
+	.write = ski_port_write
+};
+
 #define SKI_GETCHAR		21
 
@@ -55,5 +67,5 @@
 
 /** Initialize Ski port driver. */
-int kbd_port_init(void)
+static int ski_port_init(void)
 {
 	thread_id_t tid;
@@ -68,15 +80,15 @@
 }
 
-void kbd_port_yield(void)
+static void ski_port_yield(void)
 {
 	polling_disabled = true;
 }
 
-void kbd_port_reclaim(void)
+static void ski_port_reclaim(void)
 {
 	polling_disabled = false;
 }
 
-void kbd_port_write(uint8_t data)
+static void ski_port_write(uint8_t data)
 {
 	(void) data;
@@ -112,4 +124,5 @@
 	uint64_t ch;
 	
+#ifdef UARCH_ia64
 	asm volatile (
 		"mov r15 = %1\n"
@@ -121,5 +134,7 @@
 		: "r15", "r8"
 	);
-
+#else
+	ch = 0;
+#endif
 	return (int32_t) ch;
 }
Index: uspace/srv/hid/kbd/port/sun.c
===================================================================
--- uspace/srv/hid/kbd/port/sun.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/sun.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -42,4 +42,17 @@
 #include <bool.h>
 
+static int sun_port_init(void);
+static void sun_port_yield(void);
+static void sun_port_reclaim(void);
+static void sun_port_write(uint8_t data);
+
+kbd_port_ops_t sun_port = {
+	.init = sun_port_init,
+	.yield = sun_port_yield,
+	.reclaim = sun_port_reclaim,
+	.write = sun_port_write
+};
+
+
 /** Sun keyboard virtual port driver.
  *
@@ -50,5 +63,5 @@
  *
  */
-int kbd_port_init(void)
+static int sun_port_init(void)
 {
 	sysarg_t z8530;
@@ -73,13 +86,13 @@
 }
 
-void kbd_port_yield(void)
+static void sun_port_yield(void)
 {
 }
 
-void kbd_port_reclaim(void)
+static void sun_port_reclaim(void)
 {
 }
 
-void kbd_port_write(uint8_t data)
+static void sun_port_write(uint8_t data)
 {
 	(void) data;
Index: uspace/srv/hid/kbd/port/z8530.c
===================================================================
--- uspace/srv/hid/kbd/port/z8530.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
+++ uspace/srv/hid/kbd/port/z8530.c	(revision b1bdc7a40ece021baf719fb60fce641c683e3401)
@@ -77,6 +77,6 @@
 	}
 };
-	
-irq_code_t z8530_kbd = {
+
+static irq_code_t z8530_kbd = {
 	sizeof(z8530_cmds) / sizeof(irq_cmd_t),
 	z8530_cmds
