Index: uspace/drv/bus/usb/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision af8c9b54de66025028c03fef7ccf760e7bab133b)
+++ uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision c5b6db5336d3a1455e16c9047748a71e1337c382)
@@ -190,6 +190,23 @@
 /*----------------------------------------------------------------------------*/
 
-static int usb_generic_hid_create_function(usb_hid_dev_t *hid_dev)
-{	
+void usb_generic_hid_deinit(usb_hid_dev_t *hid_dev, void *data)
+{
+	ddf_fun_t *fun = data;
+	const int ret = ddf_fun_unbind(fun);
+	if (ret != EOK) {
+		usb_log_error("ailed to unbind generic hid fun.\n");
+		return;
+	}
+	ddf_fun_destroy(fun);
+}
+
+/*----------------------------------------------------------------------------*/
+
+int usb_generic_hid_init(usb_hid_dev_t *hid_dev, void **data)
+{
+	if (hid_dev == NULL) {
+		return EINVAL;
+	}
+
 	/* Create the exposed function. */
 	/** @todo Generate numbers for the devices? */
@@ -214,17 +231,7 @@
 
 	usb_log_debug("HID function created. Handle: %" PRIun "\n", fun->handle);
-
-	return EOK;
-}
-
-/*----------------------------------------------------------------------------*/
-
-int usb_generic_hid_init(usb_hid_dev_t *hid_dev, void **data)
-{
-	if (hid_dev == NULL) {
-		return EINVAL;
-	}
-
-	return usb_generic_hid_create_function(hid_dev);
+	*data = fun;
+
+	return EOK;
 }
 
Index: uspace/drv/bus/usb/usbhid/generic/hiddev.h
===================================================================
--- uspace/drv/bus/usb/usbhid/generic/hiddev.h	(revision af8c9b54de66025028c03fef7ccf760e7bab133b)
+++ uspace/drv/bus/usb/usbhid/generic/hiddev.h	(revision c5b6db5336d3a1455e16c9047748a71e1337c382)
@@ -50,4 +50,6 @@
 int usb_generic_hid_init(struct usb_hid_dev *hid_dev, void **data);
 
+void usb_generic_hid_deinit(struct usb_hid_dev *hid_dev, void *data);
+
 bool usb_generic_hid_polling_callback(struct usb_hid_dev *hid_dev, void *data);
 
Index: uspace/drv/bus/usb/usbhid/usbhid.c
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.c	(revision af8c9b54de66025028c03fef7ccf760e7bab133b)
+++ uspace/drv/bus/usb/usbhid/usbhid.c	(revision c5b6db5336d3a1455e16c9047748a71e1337c382)
@@ -155,5 +155,6 @@
 
 	// set the deinit callback
-	hid_dev->subdrivers[hid_dev->subdriver_count].deinit = NULL;
+	hid_dev->subdrivers[hid_dev->subdriver_count].deinit =
+	    usb_generic_hid_deinit;
 
 	// set subdriver count
@@ -270,5 +271,5 @@
 	hid_dev->subdrivers[count].init = usb_generic_hid_init;
 	hid_dev->subdrivers[count].poll = usb_generic_hid_polling_callback;
-	hid_dev->subdrivers[count].deinit = NULL;
+	hid_dev->subdrivers[count].deinit = usb_generic_hid_deinit;
 	hid_dev->subdrivers[count].poll_end = NULL;
 
