Index: uspace/drv/audio/sb16/main.c
===================================================================
--- uspace/drv/audio/sb16/main.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/audio/sb16/main.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -50,5 +50,5 @@
 static int sb_get_res(ddf_dev_t *device, addr_range_t **pp_sb_regs,
     addr_range_t **pp_mpu_regs, int *irq, int *dma8, int *dma16);
-static int sb_enable_interrupts(ddf_dev_t *device);
+static int sb_enable_interrupt(ddf_dev_t *device, int irq);
 
 static driver_ops_t sb_driver_ops = {
@@ -134,5 +134,5 @@
 	handler_regd = true;
 
-	rc = sb_enable_interrupts(device);
+	rc = sb_enable_interrupt(device, irq);
 	if (rc != EOK) {
 		ddf_log_error("Failed to enable interrupts: %s.",
@@ -242,5 +242,5 @@
 }
 
-int sb_enable_interrupts(ddf_dev_t *device)
+static int sb_enable_interrupt(ddf_dev_t *device, int irq)
 {
 	async_sess_t *parent_sess = ddf_dev_parent_sess_get(device);
@@ -248,7 +248,5 @@
 		return ENOMEM;
 
-	bool enabled = hw_res_enable_interrupt(parent_sess);
-
-	return enabled ? EOK : EIO;
+	return hw_res_enable_interrupt(parent_sess, irq);
 }
 
Index: uspace/drv/bus/isa/isa.c
===================================================================
--- uspace/drv/bus/isa/isa.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/bus/isa/isa.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -115,24 +115,24 @@
 }
 
-static bool isa_fun_enable_interrupt(ddf_fun_t *fnode)
-{
-	/* This is an old ugly way, copied from pci driver */
-	assert(fnode);
+static int isa_fun_enable_interrupt(ddf_fun_t *fnode, int irq)
+{
 	isa_fun_t *fun = isa_fun(fnode);
-	assert(fun);
-
 	const hw_resource_list_t *res = &fun->hw_resources;
-	assert(res);
+	bool found;
+
+	/* Check that specified irq really belongs to the function */
+	found = false;
 	for (size_t i = 0; i < res->count; ++i) {
-		if (res->resources[i].type == INTERRUPT) {
-			int rc = irc_enable_interrupt(
-			    res->resources[i].res.interrupt.irq);
-
-			if (rc != EOK)
-				return false;
-		}
-	}
-
-	return true;
+		if (res->resources[i].type == INTERRUPT &&
+		    res->resources[i].res.interrupt.irq == irq) {
+			found = true;
+			break;
+		}
+	}
+
+	if (!found)
+		return EINVAL;
+
+	return irc_enable_interrupt(irq);
 }
 
Index: uspace/drv/bus/pci/pciintel/pci.c
===================================================================
--- uspace/drv/bus/pci/pciintel/pci.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/bus/pci/pciintel/pci.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -99,23 +99,24 @@
 }
 
-static bool pciintel_enable_interrupt(ddf_fun_t *fnode)
-{
-	/* This is an old ugly way */
-	assert(fnode);
+static int pciintel_enable_interrupt(ddf_fun_t *fnode, int irq)
+{
 	pci_fun_t *dev_data = pci_fun(fnode);
 	
-	size_t i = 0;
+	size_t i;
 	hw_resource_list_t *res = &dev_data->hw_resources;
-	for (; i < res->count; i++) {
+	bool found = false;
+	
+	found = false;
+	for (i = 0; i < res->count; i++) {
 		if (res->resources[i].type == INTERRUPT) {
-			int rc = irc_enable_interrupt(
-			    res->resources[i].res.interrupt.irq);
-			
-			if (rc != EOK)
-				return false;
+			found = true;
+			break;
 		}
 	}
 	
-	return true;
+	if (!found)
+		return EINVAL;
+	
+	return irc_enable_interrupt(irq);
 }
 
Index: uspace/drv/char/i8042/i8042.c
===================================================================
--- uspace/drv/char/i8042/i8042.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/char/i8042/i8042.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -291,7 +291,15 @@
 	assert(parent_sess != NULL);
 	
-	const bool enabled = hw_res_enable_interrupt(parent_sess);
-	if (!enabled) {
-		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed to enable interrupts: %s.",
+	rc = hw_res_enable_interrupt(parent_sess, irq_kbd);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed to enable keyboard interrupt: %s.",
+		    ddf_dev_get_name(ddf_dev));
+		rc = EIO;
+		goto error;
+	}
+
+	rc = hw_res_enable_interrupt(parent_sess, irq_mouse);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed to enable mouse interrupt: %s.",
 		    ddf_dev_get_name(ddf_dev));
 		rc = EIO;
Index: uspace/drv/platform/amdm37x/main.c
===================================================================
--- uspace/drv/platform/amdm37x/main.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/platform/amdm37x/main.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -150,5 +150,5 @@
 
 static hw_resource_list_t *amdm37x_get_resources(ddf_fun_t *fnode);
-static bool amdm37x_enable_interrupt(ddf_fun_t *fun);
+static int amdm37x_enable_interrupt(ddf_fun_t *fun, int);
 
 static hw_res_ops_t fun_hw_res_ops = {
@@ -265,5 +265,5 @@
 }
 
-static bool amdm37x_enable_interrupt(ddf_fun_t *fun)
+static int amdm37x_enable_interrupt(ddf_fun_t *fun, int irq)
 {
 	//TODO: Implement
Index: uspace/drv/platform/icp/icp.c
===================================================================
--- uspace/drv/platform/icp/icp.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/platform/icp/icp.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -142,5 +142,5 @@
 }
 
-static bool icp_enable_interrupt(ddf_fun_t *fun)
+static int icp_enable_interrupt(ddf_fun_t *fun, int irq)
 {
 	/* TODO */
Index: uspace/drv/platform/mac/mac.c
===================================================================
--- uspace/drv/platform/mac/mac.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/platform/mac/mac.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -227,5 +227,5 @@
 }
 
-static bool mac_enable_interrupt(ddf_fun_t *fun)
+static int mac_enable_interrupt(ddf_fun_t *fun, int irq)
 {
 	/* TODO */
Index: uspace/drv/platform/malta/malta.c
===================================================================
--- uspace/drv/platform/malta/malta.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/platform/malta/malta.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -143,5 +143,5 @@
 }
 
-static bool malta_enable_interrupt(ddf_fun_t *fun)
+static int malta_enable_interrupt(ddf_fun_t *fun, int irq)
 {
 	/* TODO */
Index: uspace/drv/platform/msim/msim.c
===================================================================
--- uspace/drv/platform/msim/msim.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/platform/msim/msim.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -121,5 +121,5 @@
 }
 
-static bool msim_enable_interrupt(ddf_fun_t *fun)
+static int msim_enable_interrupt(ddf_fun_t *fun, int irq)
 {
 	/* Nothing to do. */
Index: uspace/drv/platform/pc/pc.c
===================================================================
--- uspace/drv/platform/pc/pc.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/platform/pc/pc.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -125,5 +125,5 @@
 }
 
-static bool pc_enable_interrupt(ddf_fun_t *fun)
+static int pc_enable_interrupt(ddf_fun_t *fun, int irq)
 {
 	/* TODO */
Index: uspace/drv/platform/sun4u/sun4u.c
===================================================================
--- uspace/drv/platform/sun4u/sun4u.c	(revision 07cb0108f9a269b86e7dd3c0635e5f78a12c9a37)
+++ uspace/drv/platform/sun4u/sun4u.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -130,5 +130,5 @@
 }
 
-static bool sun4u_enable_interrupt(ddf_fun_t *fun)
+static int sun4u_enable_interrupt(ddf_fun_t *fun, int irq)
 {
 	/* TODO */
