Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision c9e954c5d2bc19b38973a2834ef7eb10f79df43f)
@@ -76,4 +76,7 @@
 	/** Driver implementation */
 	hc_driver_t driver;
+
+	/** Interrupt replacement fibril */
+	fid_t polling_fibril;
 };
 
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision c9e954c5d2bc19b38973a2834ef7eb10f79df43f)
@@ -717,7 +717,6 @@
 
 	assert(device);
-	assert(hw_res);
-	assert(handler);
-	assert(gen_irq_code);
+	if (!handler || !gen_irq_code)
+		return ENOTSUP;
 
 	irq_code_t irq_code = {0};
@@ -768,4 +767,23 @@
 	hcd->driver.irq_hook(hcd, status);
 }
+
+static int interrupt_polling(void *arg)
+{
+	hcd_t *hcd = arg;
+	assert(hcd);
+	if (!hcd->driver.status_hook || !hcd->driver.irq_hook)
+		return ENOTSUP;
+	uint32_t status = 0;
+	while (hcd->driver.status_hook(hcd, &status) == EOK) {
+		hcd->driver.irq_hook(hcd, status);
+		status = 0;
+		/* We should wait 1 frame - 1ms here, but this polling is a
+		 * lame crutch anyway so don't hog the system. 10ms is still
+		 * good enough for emergency mode */
+		async_usleep(10000);
+	}
+	return EOK;
+}
+
 /** Initialize hc and rh DDF structures and their respective drivers.
  *
@@ -816,17 +834,28 @@
 	const int irq = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
 	    gen_irq_code);
-	if (irq < 0) {
+	if (!(irq < 0)) {
+		usb_log_debug("Hw interrupts enabled.\n");
+	}
+
+	/* Init hw driver */
+	hcd_t *hcd = dev_to_hcd(device);
+	ret = driver_init(hcd, &hw_res, !(irq < 0));
+	hw_res_list_parsed_clean(&hw_res);
+	if (ret != EOK) {
+		usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret));
+		goto irq_unregister;
+	}
+
+	/* Need working irq replacement to setup root hub */
+	if ((irq < 0) && hcd->driver.status_hook) {
+		hcd->polling_fibril = fibril_create(interrupt_polling, hcd);
+		if (hcd->polling_fibril == 0) {
+			usb_log_error("Failed to create polling fibril\n");
+			ret = ENOMEM;
+			goto irq_unregister;
+		}
+		fibril_add_ready(hcd->polling_fibril);
 		usb_log_warning("Failed to enable interrupts: %s."
 		    " Falling back to polling.\n", str_error(irq));
-	} else {
-		usb_log_debug("Hw interrupts enabled.\n");
-	}
-
-	/* Init hw driver */
-	ret = driver_init(dev_to_hcd(device), &hw_res, !(irq < 0));
-	hw_res_list_parsed_clean(&hw_res);
-	if (ret != EOK) {
-		usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret));
-		goto irq_unregister;
 	}
 
