Index: uspace/drv/bus/usb/uhci/res.c
===================================================================
--- uspace/drv/bus/usb/uhci/res.c	(revision 39bcc9955086903b554e287d7e7ec03dfe6b2f56)
+++ uspace/drv/bus/usb/uhci/res.c	(revision 24e58cc0ff53327f65d95ecaa6c8b745606ba2f0)
@@ -62,5 +62,5 @@
 	hw_res_list_parsed_t hw_res;
 	hw_res_list_parsed_init(&hw_res);
-	const int ret =  hw_res_get_list_parsed(parent_sess, &hw_res, 0);
+	const int ret = hw_res_get_list_parsed(parent_sess, &hw_res, 0);
 	async_hangup(parent_sess);
 	if (ret != EOK) {
Index: uspace/drv/bus/usb/uhci/root_hub.c
===================================================================
--- uspace/drv/bus/usb/uhci/root_hub.c	(revision 39bcc9955086903b554e287d7e7ec03dfe6b2f56)
+++ uspace/drv/bus/usb/uhci/root_hub.c	(revision 24e58cc0ff53327f65d95ecaa6c8b745606ba2f0)
@@ -36,4 +36,5 @@
 #include <str_error.h>
 #include <stdio.h>
+#include <device/hw_res_parsed.h>
 
 #include <usb/debug.h>
@@ -48,8 +49,16 @@
  * @return Error code.
  */
-int rh_init(rh_t *instance, ddf_fun_t *fun, uintptr_t reg_addr, size_t reg_size)
+int
+rh_init(rh_t *instance, ddf_fun_t *fun, addr_range_t *regs, uintptr_t reg_addr,
+    size_t reg_size)
 {
 	assert(instance);
 	assert(fun);
+
+	/* Crop the PIO window to the absolute address range of UHCI I/O. */
+	instance->pio_window.mem.base = 0;
+	instance->pio_window.mem.size = 0;
+	instance->pio_window.io.base = RNGABS(*regs);
+	instance->pio_window.io.size = RNGSZ(*regs);
 
 	/* Initialize resource structure */
@@ -60,4 +69,5 @@
 	instance->io_regs.res.io_range.address = reg_addr;
 	instance->io_regs.res.io_range.size = reg_size;
+	instance->io_regs.res.io_range.relative = true;
 	instance->io_regs.res.io_range.endianness = LITTLE_ENDIAN;
 
Index: uspace/drv/bus/usb/uhci/root_hub.h
===================================================================
--- uspace/drv/bus/usb/uhci/root_hub.h	(revision 39bcc9955086903b554e287d7e7ec03dfe6b2f56)
+++ uspace/drv/bus/usb/uhci/root_hub.h	(revision 24e58cc0ff53327f65d95ecaa6c8b745606ba2f0)
@@ -38,4 +38,5 @@
 #include <ddf/driver.h>
 #include <ops/hw_res.h>
+#include <ops/pio_window.h>
 
 /** DDF support structure for uhci_rhd driver, provides I/O resources */
@@ -45,8 +46,9 @@
 	/** The only resource in the RH resource list */
 	hw_resource_t io_regs;
+	/** PIO window in which the RH will operate. */
+	pio_window_t pio_window;	
 } rh_t;
 
-int rh_init(
-    rh_t *instance, ddf_fun_t *fun, uintptr_t reg_addr, size_t reg_size);
+extern int rh_init(rh_t *, ddf_fun_t *, addr_range_t *, uintptr_t, size_t);
 
 #endif
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision 39bcc9955086903b554e287d7e7ec03dfe6b2f56)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision 24e58cc0ff53327f65d95ecaa6c8b745606ba2f0)
@@ -132,8 +132,22 @@
 };
 
+static pio_window_t *get_pio_window(ddf_fun_t *fun)
+{
+	rh_t *rh = ddf_fun_data_get(fun);
+	
+	if (rh == NULL)
+		return NULL;
+	return &rh->pio_window;
+}
+
+static pio_window_ops_t pio_window_iface = {
+	.get_pio_window = get_pio_window
+};
+
 /** RH function support for uhci_rhd */
 static ddf_dev_ops_t rh_ops = {
 	.interfaces[USB_DEV_IFACE] = &usb_iface,
-	.interfaces[HW_RES_DEV_IFACE] = &hw_res_iface
+	.interfaces[HW_RES_DEV_IFACE] = &hw_res_iface,
+	.interfaces[PIO_WINDOW_DEV_IFACE] = &pio_window_iface
 };
 
@@ -246,6 +260,5 @@
 	}
 
-	rc = rh_init(&instance->rh, instance->rh_fun,
-	    (uintptr_t)instance->hc.registers + 0x10, 4);
+	rc = rh_init(&instance->rh, instance->rh_fun, &regs, 0x10, 4);
 	if (rc != EOK) {
 		usb_log_error("Failed to setup UHCI root hub: %s.\n",
Index: uspace/drv/bus/usb/uhcirh/main.c
===================================================================
--- uspace/drv/bus/usb/uhcirh/main.c	(revision 39bcc9955086903b554e287d7e7ec03dfe6b2f56)
+++ uspace/drv/bus/usb/uhcirh/main.c	(revision 24e58cc0ff53327f65d95ecaa6c8b745606ba2f0)
@@ -138,5 +138,5 @@
 	hw_res_list_parsed_t hw_res;
 	hw_res_list_parsed_init(&hw_res);
-	const int ret =  hw_res_get_list_parsed(parent_sess, &hw_res, 0);
+	const int ret = hw_res_get_list_parsed(parent_sess, &hw_res, 0);
 	async_hangup(parent_sess);
 	if (ret != EOK) {
