Index: uspace/drv/ohci/ohci_hc.c
===================================================================
--- uspace/drv/ohci/ohci_hc.c	(revision b8e9acb4efa41d5ba167fe8a8e39ae52cd846117)
+++ uspace/drv/ohci/ohci_hc.c	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
@@ -48,5 +48,11 @@
 {
 	assert(instance);
-	ohci_rh_init(&instance->rh, regs, reg_size);
+	int ret = pio_enable((void*)regs, reg_size, (void**)&instance->registers);
+	if (ret != EOK) {
+		usb_log_error("Failed to gain access to device registers.\n");
+		return ret;
+	}
+
+	ohci_rh_init(&instance->rh, instance->registers);
 	/* TODO: implement */
 	/* TODO: register root hub */
Index: uspace/drv/ohci/ohci_hc.h
===================================================================
--- uspace/drv/ohci/ohci_hc.h	(revision b8e9acb4efa41d5ba167fe8a8e39ae52cd846117)
+++ uspace/drv/ohci/ohci_hc.h	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
@@ -45,11 +45,9 @@
 
 #include "batch.h"
+#include "ohci_regs.h"
 #include "ohci_rh.h"
 
-typedef struct ohci_regs {
-} regs_t;
-
-
 typedef struct ohci_hc {
+	ohci_regs_t *registers;
 	usb_address_t rh_address;
 	ohci_rh_t rh;
Index: uspace/drv/ohci/ohci_regs.h
===================================================================
--- uspace/drv/ohci/ohci_regs.h	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
+++ uspace/drv/ohci/ohci_regs.h	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup drvusbohcihc
+ * @{
+ */
+/** @file
+ * @brief OHCI host controller register structure
+ */
+#ifndef DRV_OHCI_OHCI_REGS_H
+#define DRV_OHCI_OHCI_REGS_H
+#include <stdint.h>
+
+typedef struct ohci_regs
+{
+	volatile uint32_t revision;
+	volatile uint32_t control;
+	volatile uint32_t command_status;
+	volatile uint32_t interupt_enable;
+	volatile uint32_t interrupt_disable;
+	volatile uint32_t hcca;
+	volatile uint32_t period_corrent;
+	volatile uint32_t control_head;
+	volatile uint32_t control_current;
+	volatile uint32_t bulk_head;
+	volatile uint32_t bulk_current;
+	volatile uint32_t done_head;
+	volatile uint32_t fm_interval;
+	volatile uint32_t fm_remaining;
+	volatile uint32_t fm_number;
+	volatile uint32_t periodic_start;
+	volatile uint32_t ls_threshold;
+	volatile uint32_t rh_desc_a;
+	volatile uint32_t rh_desc_b;
+	volatile uint32_t rh_status;
+	volatile uint32_t rh_port_status[];
+} ohci_regs_t;
+#endif
+/**
+ * @}
+ */
Index: uspace/drv/ohci/ohci_rh.c
===================================================================
--- uspace/drv/ohci/ohci_rh.c	(revision b8e9acb4efa41d5ba167fe8a8e39ae52cd846117)
+++ uspace/drv/ohci/ohci_rh.c	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
@@ -35,5 +35,4 @@
 #include <errno.h>
 #include <str_error.h>
-#include <stdio.h>
 
 #include <usb/debug.h>
@@ -42,14 +41,14 @@
 
 /** Root hub initialization
- * @param[in] instance RH structure to initialize
- * @param[in] fun DDF function representing UHCI root hub
- * @param[in] reg_addr Address of root hub status and control registers.
- * @param[in] reg_size Size of accessible address space.
  * @return Error code.
  */
-int ohci_rh_init(ohci_rh_t *instance, uintptr_t reg_addr, size_t reg_size)
+int ohci_rh_init(ohci_rh_t *instance, ohci_regs_t *regs)
 {
 	assert(instance);
 	instance->address = 0;
+	instance->registers = regs;
+
+	usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff);
+
 	/* TODO: implement */
 	return EOK;
Index: uspace/drv/ohci/ohci_rh.h
===================================================================
--- uspace/drv/ohci/ohci_rh.h	(revision b8e9acb4efa41d5ba167fe8a8e39ae52cd846117)
+++ uspace/drv/ohci/ohci_rh.h	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
@@ -38,11 +38,13 @@
 #include <usb/usb.h>
 
+#include "ohci_regs.h"
 #include "batch.h"
 
 typedef struct ohci_rh {
+	ohci_regs_t *registers;
 	usb_address_t address;
 } ohci_rh_t;
 
-int ohci_rh_init(ohci_rh_t *instance, uintptr_t reg_addr, size_t reg_size);
+int ohci_rh_init(ohci_rh_t *instance, ohci_regs_t *regs);
 
 void ohci_rh_request(ohci_rh_t *instance, batch_t *request);
