Index: uspace/lib/usbhid/include/usb/hid/hidreport.h
===================================================================
--- uspace/lib/usbhid/include/usb/hid/hidreport.h	(revision 9dddb3dfa6c4ae26ceff0ac4e871f83e29b386e2)
+++ uspace/lib/usbhid/include/usb/hid/hidreport.h	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -44,6 +44,8 @@
  * report parser.
  *
- * \param dev USB device representing a HID device.
- * \param parser HID Report parser.
+ * \param[in] dev USB device representing a HID device.
+ * \param[in/out] parser HID Report parser.
+ * \param[out] report_desc Place to save report descriptor into.
+ * \param[out] report_size
  *
  * \retval EOK if successful.
@@ -57,5 +59,5 @@
  */
 int usb_hid_process_report_descriptor(usb_device_t *dev, 
-    usb_hid_report_t *report);
+    usb_hid_report_t *report, uint8_t **report_desc, size_t *report_size);
 
 #endif /* LIBUSB_HIDREPORT_H_ */
Index: uspace/lib/usbhid/src/hidreport.c
===================================================================
--- uspace/lib/usbhid/src/hidreport.c	(revision 9dddb3dfa6c4ae26ceff0ac4e871f83e29b386e2)
+++ uspace/lib/usbhid/src/hidreport.c	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -164,5 +164,5 @@
 
 int usb_hid_process_report_descriptor(usb_device_t *dev, 
-    usb_hid_report_t *report)
+    usb_hid_report_t *report, uint8_t **report_desc, size_t *report_size)
 {
 	if (dev == NULL || report == NULL) {
@@ -172,31 +172,31 @@
 	}
 	
-	uint8_t *report_desc = NULL;
-	size_t report_size;
-	
-	int rc = usb_hid_get_report_descriptor(dev, &report_desc, 
-	    &report_size);
+//	uint8_t *report_desc = NULL;
+//	size_t report_size;
+	
+	int rc = usb_hid_get_report_descriptor(dev, report_desc, report_size);
 	
 	if (rc != EOK) {
 		usb_log_error("Problem with getting Report descriptor: %s.\n",
 		    str_error(rc));
-		if (report_desc != NULL) {
-			free(report_desc);
+		if (*report_desc != NULL) {
+			free(*report_desc);
+			*report_desc = NULL;
 		}
 		return rc;
 	}
 	
-	assert(report_desc != NULL);
-	
-	rc = usb_hid_parse_report_descriptor(report, report_desc, report_size);
+	assert(*report_desc != NULL);
+	
+	rc = usb_hid_parse_report_descriptor(report, *report_desc, *report_size);
 	if (rc != EOK) {
 		usb_log_error("Problem parsing Report descriptor: %s.\n",
 		    str_error(rc));
-		free(report_desc);
+		free(*report_desc);
+		*report_desc = NULL;
 		return rc;
 	}
 	
 	usb_hid_descriptor_print(report);
-	free(report_desc);
 	
 	return EOK;
