Index: uspace/drv/uhci-hcd/root_hub.c
===================================================================
--- uspace/drv/uhci-hcd/root_hub.c	(revision e9e58ea356f4509c318f149355d750f9421118ac)
+++ uspace/drv/uhci-hcd/root_hub.c	(revision 6cbe7dad3eadd8cd3b5d4e2b9d98081057e8621e)
@@ -35,4 +35,6 @@
 #include <errno.h>
 #include <stdio.h>
+#include <ops/hw_res.h>
+
 #include <usb_iface.h>
 #include <usb/debug.h>
@@ -41,4 +43,5 @@
 #include "uhci.h"
 
+/*----------------------------------------------------------------------------*/
 static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun,
     devman_handle_t *handle)
@@ -51,5 +54,5 @@
 	return EOK;
 }
-
+/*----------------------------------------------------------------------------*/
 static int usb_iface_get_address_rh_impl(ddf_fun_t *fun, devman_handle_t handle,
     usb_address_t *address)
@@ -73,14 +76,42 @@
 	return EOK;
 }
-
+/*----------------------------------------------------------------------------*/
 usb_iface_t usb_iface_root_hub_fun_impl = {
 	.get_hc_handle = usb_iface_get_hc_handle_rh_impl,
 	.get_address = usb_iface_get_address_rh_impl
 };
+/*----------------------------------------------------------------------------*/
+static hw_resource_list_t *get_resource_list(ddf_fun_t *dev)
+{
+	assert(dev);
+	ddf_fun_t *hc_ddf_instance = dev->driver_data;
+	assert(hc_ddf_instance);
+	uhci_t *hc = hc_ddf_instance->driver_data;
+	assert(hc);
 
+	//TODO: fix memory leak
+	hw_resource_list_t *resource_list = malloc(sizeof(hw_resource_list_t));
+	assert(resource_list);
+	resource_list->count = 1;
+	resource_list->resources = malloc(sizeof(hw_resource_t));
+	assert(resource_list->resources);
+	resource_list->resources[0].type = IO_RANGE;
+	resource_list->resources[0].res.io_range.address =
+	    ((uintptr_t)hc->registers) + 0x10; // see UHCI design guide
+	resource_list->resources[0].res.io_range.size = 4;
+	resource_list->resources[0].res.io_range.endianness = LITTLE_ENDIAN;
+
+	return resource_list;
+}
+/*----------------------------------------------------------------------------*/
+static hw_res_ops_t hw_res_iface = {
+	.get_resource_list = get_resource_list,
+	.enable_interrupt = NULL
+};
+/*----------------------------------------------------------------------------*/
 static ddf_dev_ops_t root_hub_ops = {
-	.interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl
+	.interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl,
+	.interfaces[HW_RES_DEV_IFACE] = &hw_res_iface
 };
-
 /*----------------------------------------------------------------------------*/
 int setup_root_hub(ddf_fun_t **fun, ddf_dev_t *hc)
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision e9e58ea356f4509c318f149355d750f9421118ac)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 6cbe7dad3eadd8cd3b5d4e2b9d98081057e8621e)
@@ -61,4 +61,5 @@
 };
 
+
 static int usb_iface_get_address(ddf_fun_t *fun, devman_handle_t handle,
     usb_address_t *address)
@@ -80,6 +81,5 @@
 	return EOK;
 }
-
-
+/*----------------------------------------------------------------------------*/
 static usb_iface_t hc_usb_iface = {
 	.get_hc_handle = usb_iface_get_hc_handle_hc_impl,
@@ -89,5 +89,5 @@
 static ddf_dev_ops_t uhci_ops = {
 	.interfaces[USB_DEV_IFACE] = &hc_usb_iface,
-	.interfaces[USBHC_DEV_IFACE] = &uhci_iface
+	.interfaces[USBHC_DEV_IFACE] = &uhci_iface,
 };
 
Index: uspace/drv/uhci-rhd/main.c
===================================================================
--- uspace/drv/uhci-rhd/main.c	(revision e9e58ea356f4509c318f149355d750f9421118ac)
+++ uspace/drv/uhci-rhd/main.c	(revision 6cbe7dad3eadd8cd3b5d4e2b9d98081057e8621e)
@@ -33,4 +33,6 @@
  */
 #include <ddf/driver.h>
+#include <devman.h>
+#include <device/hw_res.h>
 #include <usb_iface.h>
 #include <usb/ddfiface.h>
@@ -43,4 +45,6 @@
 
 #define NAME "uhci-rhd"
+static int hc_get_my_registers(ddf_dev_t *dev,
+    uintptr_t *io_reg_address, size_t *io_reg_size);
 
 static int usb_iface_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle)
@@ -80,6 +84,13 @@
 	}
 
-	/* TODO: get register values from hc */
-	int ret = uhci_root_hub_init(rh, (void*)0xc030, 4, device);
+	uintptr_t io_regs = 0;
+	size_t io_size = 0;
+
+	int ret = hc_get_my_registers(device, &io_regs, &io_size);
+	assert(ret == EOK);
+
+	/* TODO: verify values from hc */
+	usb_log_info("I/O regs at 0x%X (size %zu).\n", io_regs, io_size);
+	ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device);
 	if (ret != EOK) {
 		usb_log_error("Failed(%d) to initialize driver instance.\n", ret);
@@ -102,5 +113,5 @@
 	.driver_ops = &uhci_rh_driver_ops
 };
-
+/*----------------------------------------------------------------------------*/
 int main(int argc, char *argv[])
 {
@@ -108,4 +119,60 @@
 	return ddf_driver_main(&uhci_rh_driver);
 }
+/*----------------------------------------------------------------------------*/
+int hc_get_my_registers(ddf_dev_t *dev,
+    uintptr_t *io_reg_address, size_t *io_reg_size)
+{
+	assert(dev != NULL);
+
+	int parent_phone = devman_parent_device_connect(dev->handle,
+	    IPC_FLAG_BLOCKING);
+	if (parent_phone < 0) {
+		return parent_phone;
+	}
+
+	int rc;
+
+	hw_resource_list_t hw_resources;
+	rc = hw_res_get_resource_list(parent_phone, &hw_resources);
+	if (rc != EOK) {
+		goto leave;
+	}
+
+	uintptr_t io_address = 0;
+	size_t io_size = 0;
+	bool io_found = false;
+
+	size_t i;
+	for (i = 0; i < hw_resources.count; i++) {
+		hw_resource_t *res = &hw_resources.resources[i];
+		switch (res->type) {
+			case IO_RANGE:
+				io_address = (uintptr_t)
+				    res->res.io_range.address;
+				io_size = res->res.io_range.size;
+				io_found = true;
+				break;
+			default:
+				break;
+		}
+	}
+
+	if (!io_found) {
+		rc = ENOENT;
+		goto leave;
+	}
+
+	if (io_reg_address != NULL) {
+		*io_reg_address = io_address;
+	}
+	if (io_reg_size != NULL) {
+		*io_reg_size = io_size;
+	}
+	rc = EOK;
+leave:
+	async_hangup(parent_phone);
+
+	return rc;
+}
 /**
  * @}
Index: uspace/drv/uhci-rhd/root_hub.c
===================================================================
--- uspace/drv/uhci-rhd/root_hub.c	(revision e9e58ea356f4509c318f149355d750f9421118ac)
+++ uspace/drv/uhci-rhd/root_hub.c	(revision 6cbe7dad3eadd8cd3b5d4e2b9d98081057e8621e)
@@ -39,5 +39,4 @@
 
 #include "root_hub.h"
-
 
 int uhci_root_hub_init(
