Index: uspace/drv/bus/isa/isa.c
===================================================================
--- uspace/drv/bus/isa/isa.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
+++ uspace/drv/bus/isa/isa.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -115,24 +115,47 @@
 }
 
-static int isa_fun_enable_interrupt(ddf_fun_t *fnode, int irq)
-{
-	isa_fun_t *fun = isa_fun(fnode);
+static bool isa_fun_owns_interrupt(isa_fun_t *fun, int irq)
+{
 	const hw_resource_list_t *res = &fun->hw_resources;
-	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 &&
 		    res->resources[i].res.interrupt.irq == irq) {
-			found = true;
-			break;
-		}
-	}
-
-	if (!found)
+			return true;
+		}
+	}
+
+	return false;
+}
+
+static int isa_fun_enable_interrupt(ddf_fun_t *fnode, int irq)
+{
+	isa_fun_t *fun = isa_fun(fnode);
+
+	if (!isa_fun_owns_interrupt(fun, irq))
 		return EINVAL;
 
 	return irc_enable_interrupt(irq);
+}
+
+static int isa_fun_disable_interrupt(ddf_fun_t *fnode, int irq)
+{
+	isa_fun_t *fun = isa_fun(fnode);
+
+	if (!isa_fun_owns_interrupt(fun, irq))
+		return EINVAL;
+
+	return irc_disable_interrupt(irq);
+}
+
+static int isa_fun_clear_interrupt(ddf_fun_t *fnode, int irq)
+{
+	isa_fun_t *fun = isa_fun(fnode);
+
+	if (!isa_fun_owns_interrupt(fun, irq))
+		return EINVAL;
+
+	return irc_clear_interrupt(irq);
 }
 
@@ -185,4 +208,6 @@
 	.get_resource_list = isa_fun_get_resources,
 	.enable_interrupt = isa_fun_enable_interrupt,
+	.disable_interrupt = isa_fun_disable_interrupt,
+	.clear_interrupt = isa_fun_clear_interrupt,
 	.dma_channel_setup = isa_fun_setup_dma,
 	.dma_channel_remain = isa_fun_remain_dma,
Index: uspace/drv/bus/pci/pciintel/pci.c
===================================================================
--- uspace/drv/bus/pci/pciintel/pci.c	(revision cccd60c3524a3bb23ce0db2ce5c33c181326931e)
+++ uspace/drv/bus/pci/pciintel/pci.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -99,24 +99,47 @@
 }
 
+static int pciintel_fun_owns_interrupt(pci_fun_t *fun, int irq)
+{
+	size_t i;
+	hw_resource_list_t *res = &fun->hw_resources;
+	
+	for (i = 0; i < res->count; i++) {
+		if (res->resources[i].type == INTERRUPT &&
+		    res->resources[i].res.interrupt.irq == irq) {
+			return true;
+		}
+	}
+	
+	return false;
+}
+
 static int pciintel_enable_interrupt(ddf_fun_t *fnode, int irq)
 {
-	pci_fun_t *dev_data = pci_fun(fnode);
-	
-	size_t i;
-	hw_resource_list_t *res = &dev_data->hw_resources;
-	bool found = false;
-	
-	found = false;
-	for (i = 0; i < res->count; i++) {
-		if (res->resources[i].type == INTERRUPT) {
-			found = true;
-			break;
-		}
-	}
-	
-	if (!found)
+	pci_fun_t *fun = pci_fun(fnode);
+	
+	if (!pciintel_fun_owns_interrupt(fun, irq))
 		return EINVAL;
-	
+
 	return irc_enable_interrupt(irq);
+}
+
+static int pciintel_disable_interrupt(ddf_fun_t *fnode, int irq)
+{
+	pci_fun_t *fun = pci_fun(fnode);
+	
+	if (!pciintel_fun_owns_interrupt(fun, irq))
+		return EINVAL;
+
+	return irc_disable_interrupt(irq);
+}
+
+static int pciintel_clear_interrupt(ddf_fun_t *fnode, int irq)
+{
+	pci_fun_t *fun = pci_fun(fnode);
+	
+	if (!pciintel_fun_owns_interrupt(fun, irq))
+		return EINVAL;
+
+	return irc_clear_interrupt(irq);
 }
 
@@ -188,4 +211,6 @@
 	.get_resource_list = &pciintel_get_resources,
 	.enable_interrupt = &pciintel_enable_interrupt,
+	.disable_interrupt = &pciintel_disable_interrupt,
+	.clear_interrupt = &pciintel_clear_interrupt,
 };
 
