Index: uspace/lib/c/generic/ddi.c
===================================================================
--- uspace/lib/c/generic/ddi.c	(revision 9e470c044532b6b2ea25db65312a9ac28f71af23)
+++ uspace/lib/c/generic/ddi.c	(revision 46eb2c4eee45c63d2a2d1ef420c1917ec6c890fa)
@@ -136,4 +136,46 @@
 }
 
+/** Enable PIO for specified HW resource.
+ *
+ * @param win      PIO window. May be NULL if the resources are known to be
+ *                 absolute.
+ * @param res      Resources specifying the I/O range wrt. to the PIO window.
+ * @param virt     Virtual address for application's PIO operations.
+ *
+ * @return EOK on success.
+ * @return Negative error code on failure.
+ *
+ */
+int pio_enable_resource(pio_window_t *win, hw_resource_t *res, void **virt)
+{
+	uintptr_t addr;
+	size_t size;
+
+	switch (res->type) {
+	case IO_RANGE:
+		addr = res->res.io_range.address;
+		if (res->res.io_range.relative) {
+			if (!win)
+				return EINVAL;
+			addr += win->io.base;
+		}
+		size = res->res.io_range.size;
+		break;
+	case MEM_RANGE:
+		addr = res->res.mem_range.address;
+		if (res->res.mem_range.relative) {
+			if (!win)
+				return EINVAL;
+			addr += win->mem.base;
+		}
+		size = res->res.mem_range.size;
+		break;
+	default:
+		return EINVAL;
+	}
+
+	return pio_enable((void *) addr, size, virt);	
+}
+
 /** Enable PIO for specified I/O range.
  *
Index: uspace/lib/c/include/ddi.h
===================================================================
--- uspace/lib/c/include/ddi.h	(revision 9e470c044532b6b2ea25db65312a9ac28f71af23)
+++ uspace/lib/c/include/ddi.h	(revision 46eb2c4eee45c63d2a2d1ef420c1917ec6c890fa)
@@ -40,4 +40,6 @@
 #include <sys/time.h>
 #include <abi/ddi/irq.h>
+#include <device/hw_res.h>
+#include <device/pio_window.h>
 #include <task.h>
 
@@ -55,4 +57,5 @@
 extern int dmamem_unmap_anonymous(void *);
 
+extern int pio_enable_resource(pio_window_t *, hw_resource_t *, void **);
 extern int pio_enable(void *, size_t, void **);
 
