Index: uspace/drv/bus/usb/ehci/ehci.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci.c	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/ehci/ehci.c	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -96,8 +96,4 @@
 	addr_range_t regs = hw_res.mem_ranges.ranges[0];
 	const int irq = hw_res.irqs.irqs[0];
-	hw_res_list_parsed_clean(&hw_res);
-
-	usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
-	    RNGABSPTR(regs), RNGSZ(regs), irq);
 
 	/* Initialize generic HCD driver */
@@ -107,4 +103,5 @@
 		usb_log_error("Failed to setup generic hcd structures: %s.",
 		    str_error(ret));
+		hw_res_list_parsed_clean(&hw_res);
 		return ret;
 	}
@@ -113,4 +110,5 @@
 	if (!hc) {
 		usb_log_error("Failed to allocate driver structure.\n");
+		hw_res_list_parsed_clean(&hw_res);
 		ret = ENOMEM;
 		goto ddf_hc_clean;
@@ -119,5 +117,5 @@
 	/* Try to enable interrupts */
 	bool interrupts = false;
-	ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
+	ret = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
 	    hc_gen_irq_code);
 	if (ret != EOK) {
@@ -131,4 +129,5 @@
 	/* Initialize EHCI HC */
 	ret = hc_init(hc, &regs, interrupts);
+	hw_res_list_parsed_clean(&hw_res);
 	if (ret != EOK) {
 		usb_log_error("Failed to init hc: %s.\n", str_error(ret));
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -99,12 +99,19 @@
  * @param[out] cmds Commands buffer.
  * @param[in] cmds_size Size of the commands buffer (bytes).
- * @param[in] regs Device's register range.
+ * @param[in] hw_res Device's resources.
  *
  * @return Error code.
  */
-int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs)
+int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
 {
 	assert(code);
-	if (RNGSZ(*regs) < sizeof(ehci_regs_t))
+	assert(hw_res);
+
+	if (hw_res->irqs.count != 1 || hw_res->mem_ranges.count != 1)
+		return EINVAL;
+
+	addr_range_t regs = hw_res->mem_ranges.ranges[0];
+
+	if (RNGSZ(regs) < sizeof(ehci_regs_t))
 		return EOVERFLOW;
 
@@ -123,19 +130,22 @@
 
 	memcpy(code->ranges, ehci_pio_ranges, sizeof(ehci_pio_ranges));
-	code->ranges[0].base = RNGABS(*regs);
+	code->ranges[0].base = RNGABS(regs);
 
 	memcpy(code->cmds, ehci_irq_commands, sizeof(ehci_irq_commands));
 	ehci_caps_regs_t *caps = NULL;
-	int ret = pio_enable_range(regs, (void**)&caps);
+	int ret = pio_enable_range(&regs, (void**)&caps);
 	if (ret != EOK) {
 		return ret;
 	}
 	ehci_regs_t *registers =
-	    (ehci_regs_t *)(RNGABSPTR(*regs) + EHCI_RD8(caps->caplength));
+	    (ehci_regs_t *)(RNGABSPTR(regs) + EHCI_RD8(caps->caplength));
 	code->cmds[0].addr = (void *) &registers->usbsts;
 	code->cmds[3].addr = (void *) &registers->usbsts;
 	EHCI_WR(code->cmds[1].value, EHCI_USED_INTERRUPTS);
 
-	return EOK;
+	usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
+	    RNGABSPTR(regs), RNGSZ(regs), hw_res->irqs.irqs[0]);
+
+	return hw_res->irqs.irqs[0];
 }
 
Index: uspace/drv/bus/usb/ehci/hc.h
===================================================================
--- uspace/drv/bus/usb/ehci/hc.h	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/ehci/hc.h	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -74,5 +74,5 @@
 } hc_t;
 
-int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
+int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
 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/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -100,12 +100,19 @@
  * @param[out] cmds Commands buffer.
  * @param[in] cmds_size Size of the commands buffer (bytes).
- * @param[in] regs Device's register range.
+ * @param[in] hw_res Device's resources.
  *
  * @return Error code.
  */
-int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs)
+int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
 {
 	assert(code);
-	if (RNGSZ(*regs) < sizeof(ohci_regs_t))
+	assert(hw_res);
+
+	if (hw_res->irqs.count != 1 || hw_res->mem_ranges.count != 1)
+		return EINVAL;
+
+	const addr_range_t regs = hw_res->mem_ranges.ranges[0];
+
+	if (RNGSZ(regs) < sizeof(ohci_regs_t))
 		return EOVERFLOW;
 
@@ -124,13 +131,16 @@
 
 	memcpy(code->ranges, ohci_pio_ranges, sizeof(ohci_pio_ranges));
-	code->ranges[0].base = RNGABS(*regs);
+	code->ranges[0].base = RNGABS(regs);
 
 	memcpy(code->cmds, ohci_irq_commands, sizeof(ohci_irq_commands));
-	ohci_regs_t *registers = (ohci_regs_t *) RNGABSPTR(*regs);
+	ohci_regs_t *registers = (ohci_regs_t *) RNGABSPTR(regs);
 	code->cmds[0].addr = (void *) &registers->interrupt_status;
 	code->cmds[3].addr = (void *) &registers->interrupt_status;
 	OHCI_WR(code->cmds[1].value, OHCI_USED_INTERRUPTS);
 
-	return EOK;
+	usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
+	    RNGABSPTR(regs), RNGSZ(regs), hw_res->irqs.irqs[0]);
+
+	return hw_res->irqs.irqs[0];
 }
 
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -75,5 +75,5 @@
 } hc_t;
 
-int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
+int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
 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 e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -96,8 +96,4 @@
 	addr_range_t regs = hw_res.mem_ranges.ranges[0];
 	const int irq = hw_res.irqs.irqs[0];
-	hw_res_list_parsed_clean(&hw_res);
-
-	usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
-	    RNGABSPTR(regs), RNGSZ(regs), irq);
 
 	/* Initialize generic HCD driver */
@@ -105,4 +101,5 @@
 	    BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
 	if (ret != EOK) {
+		hw_res_list_parsed_clean(&hw_res);
 		usb_log_error("Failed to setup generic hcd structures: %s.",
 		    str_error(ret));
@@ -113,4 +110,5 @@
 	if (!hc) {
 		usb_log_error("Failed to allocate driver structure.\n");
+		hw_res_list_parsed_clean(&hw_res);
 		ret = ENOMEM;
 		goto ddf_hc_clean;
@@ -119,5 +117,5 @@
 	/* Try to enable interrupts */
 	bool interrupts = false;
-	ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
+	ret = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
 	    hc_gen_irq_code);
 	if (ret != EOK) {
@@ -131,4 +129,5 @@
 	/* Initialize OHCI HC */
 	ret = hc_init(hc, &regs, interrupts);
+	hw_res_list_parsed_clean(&hw_res);
 	if (ret != EOK) {
 		usb_log_error("Failed to init hc: %s.\n", str_error(ret));
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -102,13 +102,18 @@
 /** Generate IRQ code.
  * @param[out] code IRQ code structure.
- * @param[in] regs Device's register range.
+ * @param[in] hw_res Device's resources.
  *
  * @return Error code.
  */
-int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs)
+int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
 {
 	assert(code);
-
-	if (RNGSZ(*regs) < sizeof(uhci_regs_t))
+	assert(hw_res);
+
+	if (hw_res->irqs.count != 1 || hw_res->io_ranges.count != 1)
+		return EINVAL;
+	const addr_range_t regs = hw_res->io_ranges.ranges[0];
+
+	if (RNGSZ(regs) < sizeof(uhci_regs_t))
 		return EOVERFLOW;
 
@@ -127,12 +132,15 @@
 
 	memcpy(code->ranges, uhci_irq_pio_ranges, sizeof(uhci_irq_pio_ranges));
-	code->ranges[0].base = RNGABS(*regs);
+	code->ranges[0].base = RNGABS(regs);
 
 	memcpy(code->cmds, uhci_irq_commands, sizeof(uhci_irq_commands));
-	uhci_regs_t *registers = (uhci_regs_t *) RNGABSPTR(*regs);
+	uhci_regs_t *registers = (uhci_regs_t *) RNGABSPTR(regs);
 	code->cmds[0].addr = (void*)&registers->usbsts;
 	code->cmds[3].addr = (void*)&registers->usbsts;
 
-	return EOK;
+	usb_log_debug("I/O regs at %p (size %zu), IRQ %d.\n",
+	    RNGABSPTR(regs), RNGSZ(regs), hw_res->irqs.irqs[0]);
+
+	return hw_res->irqs.irqs[0];
 }
 
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -127,5 +127,5 @@
 } hc_t;
 
-int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
+int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
 void hc_interrupt(hc_t *instance, uint16_t status);
 int hc_init(hc_t *instance, addr_range_t *regs, bool interupts);
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision e3a07bba11969b79195e334d7a3b3f0b62575cfe)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision ba4a03a5128c12a813b86aec7796e57c21dffead)
@@ -98,8 +98,4 @@
 	addr_range_t regs = hw_res.io_ranges.ranges[0];
 	const int irq = hw_res.irqs.irqs[0];
-	hw_res_list_parsed_clean(&hw_res);
-
-	usb_log_debug("I/O regs at %p (size %zu), IRQ %d.\n",
-	    RNGABSPTR(regs), RNGSZ(regs), irq);
 
 	ret = hcd_ddf_setup_hc(device, USB_SPEED_FULL,
@@ -107,4 +103,5 @@
 	if (ret != EOK) {
 		usb_log_error("Failed to setup generic HCD.\n");
+		hw_res_list_parsed_clean(&hw_res);
 		return ret;
 	}
@@ -113,4 +110,5 @@
 	if (!hc) {
 		usb_log_error("Failed to allocate UHCI HC structure.\n");
+		hw_res_list_parsed_clean(&hw_res);
 		ret = ENOMEM;
 		goto ddf_hc_clean;
@@ -118,5 +116,5 @@
 
 	bool interrupts = false;
-	ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
+	ret = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
 	    hc_gen_irq_code);
 	if (ret != EOK) {
@@ -129,4 +127,5 @@
 
 	ret = hc_init(hc, &regs, interrupts);
+	hw_res_list_parsed_clean(&hw_res);
 	if (ret != EOK) {
 		usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret));
