Index: uspace/drv/bus/usb/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision 05920d23f2a66887d82aa6ae6bdce695c0ab0225)
+++ uspace/drv/bus/usb/usbhid/generic/hiddev.c	(revision 5f047d0841408f4b85e56ff025e7ee806b8bdf9a)
@@ -61,19 +61,12 @@
 
 /*----------------------------------------------------------------------------*/
-
 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun);
-
-static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer, 
+static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer,
     size_t size, size_t *act_size, int *event_nr, unsigned int flags);
-
 static int usb_generic_hid_client_connected(ddf_fun_t *fun);
-
 static size_t usb_generic_get_report_descriptor_length(ddf_fun_t *fun);
-
-static int usb_generic_get_report_descriptor(ddf_fun_t *fun, uint8_t *desc, 
+static int usb_generic_get_report_descriptor(ddf_fun_t *fun, uint8_t *desc,
     size_t size, size_t *actual_size);
-
-/*----------------------------------------------------------------------------*/
-
+/*----------------------------------------------------------------------------*/
 static usbhid_iface_t usb_generic_iface = {
 	.get_event = usb_generic_hid_get_event,
@@ -82,12 +75,10 @@
 	.get_report_descriptor = usb_generic_get_report_descriptor
 };
-
+/*----------------------------------------------------------------------------*/
 static ddf_dev_ops_t usb_generic_hid_ops = {
 	.interfaces[USBHID_DEV_IFACE] = &usb_generic_iface,
 	.open = usb_generic_hid_client_connected
 };
-
-/*----------------------------------------------------------------------------*/
-
+/*----------------------------------------------------------------------------*/
 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun)
 {
@@ -99,5 +90,5 @@
 	}
 
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
+	const usb_hid_dev_t *hid_dev = fun->driver_data;
 
 	usb_log_debug2("hid_dev: %p, Max input report size (%zu).\n",
@@ -106,8 +97,6 @@
 	return hid_dev->max_input_report_size;
 }
-
-/*----------------------------------------------------------------------------*/
-
-static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer, 
+/*----------------------------------------------------------------------------*/
+static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer,
     size_t size, size_t *act_size, int *event_nr, unsigned int flags)
 {
@@ -120,8 +109,8 @@
 	}
 
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
+	const usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
 
 	if (hid_dev->input_report_size > size) {
-		usb_log_debug("input_report_size > size (%zu, %zu)\n", 
+		usb_log_debug("input_report_size > size (%zu, %zu)\n",
 		    hid_dev->input_report_size, size);
 		return EINVAL;	// TODO: other error code
@@ -129,5 +118,5 @@
 
 	/*! @todo This should probably be somehow atomic. */
-	memcpy(buffer, hid_dev->input_report, 
+	memcpy(buffer, hid_dev->input_report,
 	    hid_dev->input_report_size);
 	*act_size = hid_dev->input_report_size;
@@ -138,7 +127,5 @@
 	return EOK;
 }
-
-/*----------------------------------------------------------------------------*/
-
+/*----------------------------------------------------------------------------*/
 static size_t usb_generic_get_report_descriptor_length(ddf_fun_t *fun)
 {
@@ -150,15 +137,13 @@
 	}
 
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
-
-	usb_log_debug2("hid_dev->report_desc_size = %zu\n", 
+	const usb_hid_dev_t *hid_dev = fun->driver_data;
+
+	usb_log_debug2("hid_dev->report_desc_size = %zu\n",
 	    hid_dev->report_desc_size);
 
 	return hid_dev->report_desc_size;
 }
-
-/*----------------------------------------------------------------------------*/
-
-static int usb_generic_get_report_descriptor(ddf_fun_t *fun, uint8_t *desc, 
+/*----------------------------------------------------------------------------*/
+static int usb_generic_get_report_descriptor(ddf_fun_t *fun, uint8_t *desc,
     size_t size, size_t *actual_size)
 {
@@ -170,5 +155,5 @@
 	}
 
-	usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;
+	const usb_hid_dev_t *hid_dev = fun->driver_data;
 
 	if (hid_dev->report_desc_size > size) {
@@ -181,7 +166,5 @@
 	return EOK;
 }
-
-/*----------------------------------------------------------------------------*/
-
+/*----------------------------------------------------------------------------*/
 static int usb_generic_hid_client_connected(ddf_fun_t *fun)
 {
@@ -189,10 +172,11 @@
 	return EOK;
 }
-
-/*----------------------------------------------------------------------------*/
-
+/*----------------------------------------------------------------------------*/
 void usb_generic_hid_deinit(usb_hid_dev_t *hid_dev, void *data)
 {
 	ddf_fun_t *fun = data;
+	if (fun == NULL)
+		return;
+
 	const int ret = ddf_fun_unbind(fun);
 	if (ret != EOK) {
@@ -206,7 +190,5 @@
 	ddf_fun_destroy(fun);
 }
-
-/*----------------------------------------------------------------------------*/
-
+/*----------------------------------------------------------------------------*/
 int usb_generic_hid_init(usb_hid_dev_t *hid_dev, void **data)
 {
@@ -216,5 +198,4 @@
 
 	/* Create the exposed function. */
-	/** @todo Generate numbers for the devices? */
 	usb_log_debug("Creating DDF function %s...\n", HID_GENERIC_FUN_NAME);
 	ddf_fun_t *fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed, 
@@ -225,4 +206,7 @@
 	}
 
+	/* This is nasty, both device and this function have the same
+	 * driver data, thus destruction causes to double free */
+	fun->driver_data = hid_dev;
 	fun->ops = &usb_generic_hid_ops;
 
@@ -231,10 +215,8 @@
 		usb_log_error("Could not bind DDF function: %s.\n",
 		    str_error(rc));
+		fun->driver_data = NULL;
 		ddf_fun_destroy(fun);
 		return rc;
 	}
-	/* This is nasty both device and this function have the same
-	 * driver data, thus destruction would lead to double free */
-	fun->driver_data = hid_dev;
 
 	usb_log_debug("HID function created. Handle: %" PRIun "\n", fun->handle);
@@ -243,12 +225,9 @@
 	return EOK;
 }
-
-/*----------------------------------------------------------------------------*/
-
+/*----------------------------------------------------------------------------*/
 bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, void *data)
 {
 	return true;
 }
-
 /**
  * @}
