Index: uspace/lib/usbhost/include/usb/host/ddf_helpers.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision 45cbf897eae041f9fcdb375736ef47f65e11f98b)
+++ uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision 8d7552ce50d4085490f1c02ae8e6964fdfa30846)
@@ -45,4 +45,22 @@
 #include <device/hw_res_parsed.h>
 
+typedef int (*driver_init_t)(hcd_t *, const hw_res_list_parsed_t *, bool);
+typedef void (*driver_fini_t)(hcd_t *);
+typedef int (*claim_t)(ddf_dev_t *);
+typedef int (*irq_code_gen_t)(irq_code_t *, const hw_res_list_parsed_t *);
+
+typedef struct {
+	hc_driver_t ops;
+	claim_t claim;
+	usb_speed_t hc_speed;
+	driver_init_t init;
+	driver_fini_t fini;
+	interrupt_handler_t *irq_handler;
+	irq_code_gen_t irq_code_gen;
+	const char *name;
+} ddf_hc_driver_t;
+
+int hcd_ddf_add_hc(ddf_dev_t *device, const ddf_hc_driver_t *driver);
+
 int hcd_ddf_setup_hc(ddf_dev_t *device, usb_speed_t max_speed,
     size_t bw, bw_count_func_t bw_count);
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 45cbf897eae041f9fcdb375736ef47f65e11f98b)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 8d7552ce50d4085490f1c02ae8e6964fdfa30846)
@@ -49,4 +49,5 @@
 #include <errno.h>
 #include <fibril_synch.h>
+#include <macros.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -608,4 +609,46 @@
 }
 
+int hcd_ddf_add_hc(ddf_dev_t *device, const ddf_hc_driver_t *driver)
+{
+	assert(driver);
+	static const struct { size_t bw; bw_count_func_t bw_count; }bw[] = {
+	    [USB_SPEED_FULL] = { .bw = BANDWIDTH_AVAILABLE_USB11,
+	                         .bw_count = bandwidth_count_usb11 },
+	    [USB_SPEED_HIGH] = { .bw = BANDWIDTH_AVAILABLE_USB11,
+	                         .bw_count = bandwidth_count_usb11 },
+	};
+
+	int ret = EOK;
+	const usb_speed_t speed = driver->hc_speed;
+	if (speed >= ARRAY_SIZE(bw) || bw[speed].bw == 0) {
+		usb_log_error("Driver `%s' reported unsupported speed: %s",
+		    driver->name, usb_str_speed(speed));
+		return ENOTSUP;
+	}
+
+	if (driver->claim)
+		ret = driver->claim(device);
+	if (ret != EOK) {
+		usb_log_error("Failed to claim `%s' for driver `%s'",
+		    ddf_dev_get_name(device), driver->name);
+		return ret;
+	}
+	interrupt_handler_t *irq_handler =
+	    driver->irq_handler ? driver->irq_handler : ddf_hcd_gen_irq_handler;
+
+	ret = ddf_hcd_device_setup_all(device, speed, bw[speed].bw,
+	    bw[speed].bw_count, irq_handler, driver->irq_code_gen,
+	    driver->init, driver->fini);
+	if (ret != EOK) {
+		usb_log_error("Failed to setup `%s' for driver `%s'",
+		    ddf_dev_get_name(device), driver->name);
+		return ret;
+	}
+
+	usb_log_info("Controlling new `%s' device `%s'.\n",
+	    driver->name, ddf_dev_get_name(device));
+	return EOK;
+}
+
 /** Initialize hc structures.
  *
