Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 6210a33343b1115d76fd228ca78e85283b526ee6)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision 026271d5b6f0c2f02cd1ddb46545d5290a89565e)
@@ -125,38 +125,4 @@
 	code->cmds[3].addr = (void *) &registers->interrupt_status;
 	OHCI_WR(code->cmds[1].value, OHCI_USED_INTERRUPTS);
-
-	return EOK;
-}
-
-/** Register interrupt handler.
- *
- * @param[in] device Host controller DDF device
- * @param[in] regs Register range
- * @param[in] irq Interrupt number
- * @paran[in] handler Interrupt handler
- *
- * @return EOK on success or negative error code
- */
-int hc_register_irq_handler(ddf_dev_t *device, addr_range_t *regs, int irq,
-    interrupt_handler_t handler)
-{
-	irq_code_t irq_code = { 0 };
-
-	int ret = hc_gen_irq_code(&irq_code, regs);
-	if (ret != EOK) {
-		usb_log_error("Failed to generate IRQ code: %s.\n",
-		    str_error(ret));
-		return ret;
-	}
-
-	//TODO we leak memory here
-
-	/* Register handler to avoid interrupt lockup */
-	ret = register_interrupt_handler(device, irq, handler, &irq_code);
-	if (ret != EOK) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(ret));
-		return ret;
-	}
 
 	return EOK;
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision 6210a33343b1115d76fd228ca78e85283b526ee6)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision 026271d5b6f0c2f02cd1ddb46545d5290a89565e)
@@ -73,6 +73,4 @@
 
 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
-int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int,
-    interrupt_handler_t);
 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun);
 int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts);
Index: uspace/drv/bus/usb/ohci/ohci.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.c	(revision 6210a33343b1115d76fd228ca78e85283b526ee6)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision 026271d5b6f0c2f02cd1ddb46545d5290a89565e)
@@ -103,8 +103,8 @@
 	}
 
-	ret = hc_register_irq_handler(device, &regs, irq, irq_handler);
-	if (ret != EOK) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(ret));
+	hc_t *hc = malloc(sizeof(hc_t));
+	if (!hc) {
+		usb_log_error("Failed to allocate driver structure.\n");
+		ret = ENOMEM;
 		goto ddf_hc_clean;
 	}
@@ -112,5 +112,6 @@
 	/* Try to enable interrupts */
 	bool interrupts = false;
-	ret = hcd_ddf_enable_interrupts(device);
+	ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
+	    hc_gen_irq_code);
 	if (ret != EOK) {
 		usb_log_warning("Failed to enable interrupts: %s."
@@ -123,16 +124,9 @@
 	}
 
-	hc_t *hc = malloc(sizeof(hc_t));
-	if (!hc) {
-		usb_log_error("Failed to allocate driver structure.\n");
-		ret = ENOMEM;
-		goto unregister_irq;
-	}
-
 	/* Initialize OHCI HC */
 	ret = hc_init(hc, &regs, interrupts);
 	if (ret != EOK) {
 		usb_log_error("Failed to init hc: %s.\n", str_error(ret));
-		goto hc_free;
+		goto unregister_irq;
 	}
 
@@ -147,8 +141,7 @@
 		    str_error(ret));
 		hc_fini(hc);
-hc_free:
-		free(hc);
 unregister_irq:
 		unregister_interrupt_handler(device, irq);
+		free(hc);
 ddf_hc_clean:
 		hcd_ddf_clean_hc(device);
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision 6210a33343b1115d76fd228ca78e85283b526ee6)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision 026271d5b6f0c2f02cd1ddb46545d5290a89565e)
@@ -127,39 +127,4 @@
 }
 
-/** Register interrupt handler.
- *
- * @param[in] device Host controller DDF device
- * @param[in] regs Register range
- * @param[in] irq Interrupt number
- * @paran[in] handler Interrupt handler
- *
- * @return EOK on success or negative error code
- */
-int hc_register_irq_handler(ddf_dev_t *device, addr_range_t *regs, int irq,
-    interrupt_handler_t handler)
-{
-	assert(device);
-
-	irq_code_t irq_code = { 0 };
-
-	int ret = hc_gen_irq_code(&irq_code, regs);
-	if (ret != EOK) {
-		usb_log_error("Failed to generate IRQ commands: %s.\n",
-		    str_error(ret));
-		return ret;
-	}
-	//TODO we leak memory here
-
-        /* Register handler to avoid interrupt lockup */
-        ret = register_interrupt_handler(device, irq, handler, &irq_code);
-        if (ret != EOK) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(ret));
-		return ret;
-	}
-
-	return EOK;
-}
-
 /** Take action based on the interrupt cause.
  *
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision 6210a33343b1115d76fd228ca78e85283b526ee6)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision 026271d5b6f0c2f02cd1ddb46545d5290a89565e)
@@ -124,6 +124,4 @@
 } hc_t;
 
-int hc_register_irq_handler(ddf_dev_t *, addr_range_t *, int,
-    interrupt_handler_t);
 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
 void hc_interrupt(hc_t *instance, uint16_t status);
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision 6210a33343b1115d76fd228ca78e85283b526ee6)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision 026271d5b6f0c2f02cd1ddb46545d5290a89565e)
@@ -109,13 +109,7 @@
 	}
 
-	ret = hc_register_irq_handler(device, &regs, irq, irq_handler);
-	if (ret != EOK) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(ret));
-		goto hc_free;
-	}
-
 	bool interrupts = false;
-	ret = hcd_ddf_enable_interrupts(device);
+	ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
+	    hc_gen_irq_code);
 	if (ret != EOK) {
 		usb_log_warning("Failed to enable interrupts: %s."
@@ -154,5 +148,4 @@
 irq_unregister:
 		unregister_interrupt_handler(device, irq);
-hc_free:
 		free(hc);
 ddf_hc_clean:
