Index: uspace/drv/bus/usb/ehci/ehci.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci.c	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/ehci/ehci.c	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -94,5 +94,4 @@
 		return ret;
 	}
-	addr_range_t regs = hw_res.mem_ranges.ranges[0];
 
 	/* Initialize generic HCD driver */
@@ -127,5 +126,5 @@
 
 	/* Initialize EHCI HC */
-	ret = hc_init(hc, &regs, interrupts);
+	ret = hc_init(hc, &hw_res, interrupts);
 	hw_res_list_parsed_clean(&hw_res);
 	if (ret != EOK) {
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -157,9 +157,15 @@
  * @return Error code
  */
-int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts)
-{
-	assert(instance);
-
-	int ret = pio_enable_range(regs, (void **) &instance->caps);
+int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interrupts)
+{
+	assert(instance);
+	assert(hw_res);
+	if (hw_res->mem_ranges.count != 1 ||
+	    hw_res->mem_ranges.ranges[0].size <
+	        (sizeof(ehci_caps_regs_t) + sizeof(ehci_regs_t)))
+	    return EINVAL;
+
+	int ret = pio_enable_range(&hw_res->mem_ranges.ranges[0],
+	    (void **)&instance->caps);
 	if (ret != EOK) {
 		usb_log_error("Failed to gain access to device registers: %s.\n",
@@ -167,4 +173,7 @@
 		return ret;
 	}
+	usb_log_debug("Device registers at %" PRIx64 " (%zuB) accessible.\n",
+	    hw_res->mem_ranges.ranges[0].address.absolute,
+	    hw_res->mem_ranges.ranges[0].size);
 	instance->registers =
 	    (void*)instance->caps + EHCI_RD8(instance->caps->caplength);
@@ -194,4 +203,14 @@
 	return EOK;
 }
+
+/** Safely dispose host controller internal structures
+ *
+ * @param[in] instance Host controller structure to use.
+ */
+void hc_fini(hc_t *instance)
+{
+	assert(instance);
+	/* TODO: implement*/
+};
 
 void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep)
Index: uspace/drv/bus/usb/ehci/hc.h
===================================================================
--- uspace/drv/bus/usb/ehci/hc.h	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/ehci/hc.h	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -76,11 +76,6 @@
 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);
-
-/** Safely dispose host controller internal structures
- *
- * @param[in] instance Host controller structure to use.
- */
-static inline void hc_fini(hc_t *instance) { /* TODO: implement*/ };
+int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interrupts);
+void hc_fini(hc_t *instance);
 
 void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep);
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -148,18 +148,26 @@
  *
  * @param[in] instance Memory place for the structure.
- * @param[in] regs Device's I/O registers range.
+ * @param[in] regs Device's resources
  * @param[in] interrupts True if w interrupts should be used
  * @return Error code
  */
-int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts)
-{
-	assert(instance);
-
-	int ret = pio_enable_range(regs, (void **) &instance->registers);
+int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interrupts)
+{
+	assert(instance);
+	assert(hw_res);
+	if (hw_res->mem_ranges.count != 1 ||
+	    hw_res->mem_ranges.ranges[0].size < sizeof(ohci_regs_t))
+	    return EINVAL;
+
+	int ret = pio_enable_range(&hw_res->mem_ranges.ranges[0],
+	    (void **) &instance->registers);
 	if (ret != EOK) {
-		usb_log_error("Failed to gain access to device registers: %s.\n",
+		usb_log_error("Failed to gain access to registers: %s.\n",
 		    str_error(ret));
 		return ret;
 	}
+	usb_log_debug("Device registers at %" PRIx64 " (%zuB) accessible.\n",
+	    hw_res->mem_ranges.ranges[0].address.absolute,
+	    hw_res->mem_ranges.ranges[0].size);
 
 	list_initialize(&instance->pending_batches);
@@ -186,4 +194,14 @@
 	return EOK;
 }
+
+/** Safely dispose host controller internal structures
+ *
+ * @param[in] instance Host controller structure to use.
+ */
+void hc_fini(hc_t *instance)
+{
+	assert(instance);
+	/* TODO: implement*/
+};
 
 void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep)
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -77,11 +77,6 @@
 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);
-
-/** Safely dispose host controller internal structures
- *
- * @param[in] instance Host controller structure to use.
- */
-static inline void hc_fini(hc_t *instance) { /* TODO: implement*/ };
+int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interrupts);
+void hc_fini(hc_t *instance);
 
 void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep);
Index: uspace/drv/bus/usb/ohci/ohci.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.c	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -87,6 +87,5 @@
 	hw_res_list_parsed_t hw_res;
 	int ret = hcd_ddf_get_registers(device, &hw_res);
-	if (ret != EOK ||
-	    hw_res.irqs.count != 1 || hw_res.mem_ranges.count != 1) {
+	if (ret != EOK) {
 		usb_log_error("Failed to get register memory addresses "
 		    "for %" PRIun ": %s.\n", ddf_dev_get_handle(device),
@@ -94,5 +93,4 @@
 		return ret;
 	}
-	addr_range_t regs = hw_res.mem_ranges.ranges[0];
 
 	/* Initialize generic HCD driver */
@@ -127,5 +125,5 @@
 
 	/* Initialize OHCI HC */
-	ret = hc_init(hc, &regs, interrupts);
+	ret = hc_init(hc, &hw_res, interrupts);
 	hw_res_list_parsed_clean(&hw_res);
 	if (ret != EOK) {
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -212,9 +212,11 @@
  * interrupt fibrils.
  */
-int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts)
-{
-	assert(instance);
-	assert(regs);
-	assert(regs->size >= sizeof(uhci_regs_t));
+int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interrupts)
+{
+	assert(instance);
+	assert(hw_res);
+	if (hw_res->io_ranges.count != 1 ||
+	    hw_res->io_ranges.ranges[0].size < sizeof(uhci_regs_t))
+	    return EINVAL;
 
 	instance->hw_interrupts = interrupts;
@@ -222,15 +224,15 @@
 
 	/* allow access to hc control registers */
-	uhci_regs_t *io;
-	int ret = pio_enable_range(regs, (void **) &io);
+	int ret = pio_enable_range(&hw_res->io_ranges.ranges[0],
+	    (void **) &instance->registers);
 	if (ret != EOK) {
-		usb_log_error("Failed to gain access to registers at %p: %s.\n",
-	            io, str_error(ret));
+		usb_log_error("Failed to gain access to registers: %s.\n",
+	            str_error(ret));
 		return ret;
 	}
-	instance->registers = io;
-
-	usb_log_debug(
-	    "Device registers at %p (%zuB) accessible.\n", io, regs->size);
+
+	usb_log_debug("Device registers at %" PRIx64 " (%zuB) accessible.\n",
+	    hw_res->io_ranges.ranges[0].address.absolute,
+	    hw_res->io_ranges.ranges[0].size);
 
 	ret = hc_init_mem_structures(instance);
@@ -253,4 +255,14 @@
 
 	return EOK;
+}
+
+/** Safely dispose host controller internal structures
+ *
+ * @param[in] instance Host controller structure to use.
+ */
+void hc_fini(hc_t *instance)
+{
+	assert(instance);
+	//TODO Implement
 }
 
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -129,12 +129,8 @@
 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);
+int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interupts);
+void hc_fini(hc_t *instance);
 int hc_schedule(hcd_t *hcd, usb_transfer_batch_t *batch);
 
-/** Safely dispose host controller internal structures
- *
- * @param[in] instance Host controller structure to use.
- */
-static inline void hc_fini(hc_t *instance) {} /* TODO: implement*/
 #endif
 
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision d1df3818a95cee3c47bd9d726fdc58f9a8df71bc)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision 781351656354d292b596e2f57cbf85de18a08a22)
@@ -89,6 +89,5 @@
 	hw_res_list_parsed_t hw_res;
 	int ret = hcd_ddf_get_registers(device, &hw_res);
-	if (ret != EOK ||
-	    hw_res.irqs.count != 1 || hw_res.io_ranges.count != 1) {
+	if (ret != EOK) {
 		usb_log_error("Failed to get register memory addresses "
 		    "for %" PRIun ": %s.\n", ddf_dev_get_handle(device),
@@ -96,5 +95,4 @@
 		return ret;
 	}
-	addr_range_t regs = hw_res.io_ranges.ranges[0];
 
 	ret = hcd_ddf_setup_hc(device, USB_SPEED_FULL,
@@ -125,10 +123,9 @@
 	}
 
-	ret = hc_init(hc, &regs, interrupts);
+	ret = hc_init(hc, &hw_res, interrupts);
 	hw_res_list_parsed_clean(&hw_res);
 	if (ret != EOK) {
 		usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret));
 		goto irq_unregister;
-		// TODO This is unfortunate, we have neither legacy nor real USB
 	}
 
