Index: uspace/drv/audio/sb16/main.c
===================================================================
--- uspace/drv/audio/sb16/main.c	(revision 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ 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 */
Index: uspace/lib/c/generic/device/hw_res.c
===================================================================
--- uspace/lib/c/generic/device/hw_res.c	(revision 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ uspace/lib/c/generic/device/hw_res.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -75,13 +75,13 @@
 }
 
-bool hw_res_enable_interrupt(async_sess_t *sess)
+int hw_res_enable_interrupt(async_sess_t *sess, int irq)
 {
 	async_exch_t *exch = async_exchange_begin(sess);
 	
-	int rc = async_req_1_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
-	    HW_RES_ENABLE_INTERRUPT);
+	int rc = async_req_2_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE),
+	    HW_RES_ENABLE_INTERRUPT, irq);
 	async_exchange_end(exch);
 	
-	return (rc == EOK);
+	return rc;
 }
 
Index: uspace/lib/c/include/device/hw_res.h
===================================================================
--- uspace/lib/c/include/device/hw_res.h	(revision 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ uspace/lib/c/include/device/hw_res.h	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -115,5 +115,5 @@
 
 extern int hw_res_get_resource_list(async_sess_t *, hw_resource_list_t *);
-extern bool hw_res_enable_interrupt(async_sess_t *);
+extern int hw_res_enable_interrupt(async_sess_t *, int);
 
 extern int hw_res_dma_channel_setup(async_sess_t *, unsigned int, uint32_t,
Index: uspace/lib/drv/generic/remote_hw_res.c
===================================================================
--- uspace/lib/drv/generic/remote_hw_res.c	(revision 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ uspace/lib/drv/generic/remote_hw_res.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -67,10 +67,12 @@
 	hw_res_ops_t *hw_res_ops = (hw_res_ops_t *) ops;
 	
-	if (hw_res_ops->enable_interrupt == NULL)
+	if (hw_res_ops->enable_interrupt == NULL) {
 		async_answer_0(callid, ENOTSUP);
-	else if (hw_res_ops->enable_interrupt(fun))
-		async_answer_0(callid, EOK);
-	else
-		async_answer_0(callid, EREFUSED);
+		return;
+	}
+	
+	const int irq = DEV_IPC_GET_ARG1(*call);
+	const int ret = hw_res_ops->enable_interrupt(fun, irq);
+	async_answer_0(callid, ret);
 }
 
Index: uspace/lib/drv/include/ops/hw_res.h
===================================================================
--- uspace/lib/drv/include/ops/hw_res.h	(revision 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ uspace/lib/drv/include/ops/hw_res.h	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -44,5 +44,5 @@
 typedef struct {
 	hw_resource_list_t *(*get_resource_list)(ddf_fun_t *);
-	bool (*enable_interrupt)(ddf_fun_t *);
+	int (*enable_interrupt)(ddf_fun_t *, int);
 	int (*dma_channel_setup)(ddf_fun_t *, unsigned, uint32_t, uint32_t, uint8_t);
 	int (*dma_channel_remain)(ddf_fun_t *, unsigned, size_t *);
Index: uspace/lib/usbhost/include/usb/host/ddf_helpers.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -70,5 +70,5 @@
 hcd_t *dev_to_hcd(ddf_dev_t *dev);
 
-int hcd_ddf_enable_interrupts(ddf_dev_t *device);
+int hcd_ddf_enable_interrupt(ddf_dev_t *device, int);
 int hcd_ddf_get_registers(ddf_dev_t *device, hw_res_list_parsed_t *hw_res);
 int hcd_ddf_setup_interrupts(ddf_dev_t *device,
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 2bdf92a5421dca631f166390174abc1a586d1c26)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
@@ -692,10 +692,11 @@
 
 //TODO: Cache parent session in HCD
-/** Call the parent driver with a request to enable interrupts
+/** Call the parent driver with a request to enable interrupt
  *
  * @param[in] device Device asking for interrupts
+ * @param[in] inum Interrupt number
  * @return Error code.
  */
-int hcd_ddf_enable_interrupts(ddf_dev_t *device)
+int hcd_ddf_enable_interrupt(ddf_dev_t *device, int inum)
 {
 	async_sess_t *parent_sess = ddf_dev_parent_sess_get(device);
@@ -703,7 +704,5 @@
 		return EIO;
 
-	const bool enabled = hw_res_enable_interrupt(parent_sess);
-
-	return enabled ? EOK : EIO;
+	return hw_res_enable_interrupt(parent_sess, inum);
 }
 
@@ -776,5 +775,5 @@
 
 	/* Enable interrupts */
-	int ret = hcd_ddf_enable_interrupts(device);
+	int ret = hcd_ddf_enable_interrupt(device, irq);
 	if (ret != EOK) {
 		usb_log_error("Failed to register interrupt handler: %s.\n",
