Skip to content

Commit

Permalink
Input: wacom - use HID core to actually fetch the report descriptor
Browse files Browse the repository at this point in the history
HID core already retrieves the report descritor. There is no need
to ask ourself for one.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Reviewed-by: Jason Gerecke <killertofu@gmail.com>
Tested-by: Jason Gerecke <killertofu@gmail.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Benjamin Tissoires authored and Dmitry Torokhov committed Jul 26, 2014
1 parent 27b20a9 commit ba9a354
Showing 1 changed file with 10 additions and 60 deletions.
70 changes: 10 additions & 60 deletions drivers/input/tablet/wacom_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,13 @@
#include "wacom.h"
#include <linux/hid.h>

/* defines to get HID report descriptor */
#define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01)
#define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02)
#define HID_HDESC_USAGE_UNDEFINED 0x00
#define HID_HDESC_USAGE_PAGE 0x05
#define HID_HDESC_USAGE 0x09
#define HID_HDESC_COLLECTION 0xa1
#define HID_HDESC_COLLECTION_LOGICAL 0x02
#define HID_HDESC_COLLECTION_END 0xc0

struct wac_hid_descriptor {
struct usb_descriptor_header header;
__le16 bcdHID;
u8 bCountryCode;
u8 bNumDescriptors;
u8 bDescriptorType;
__le16 wDescriptorLength;
} __attribute__ ((packed));

#define WAC_MSG_RETRIES 5

#define WAC_CMD_LED_CONTROL 0x20
Expand Down Expand Up @@ -230,39 +218,14 @@ static void wacom_retrieve_report_data(struct hid_device *hdev,
* this after returning from this function.
*/
static int wacom_parse_hid(struct hid_device *hdev,
struct wac_hid_descriptor *hid_desc,
struct wacom_features *features)
{
struct wacom *wacom = hid_get_drvdata(hdev);
struct usb_interface *intf = wacom->intf;
struct usb_device *dev = interface_to_usbdev(intf);
char limit = 0;
/* result has to be defined as int for some devices */
int result = 0, touch_max = 0;
int i = 0, page = 0, finger = 0, pen = 0;
unsigned char *report;
unsigned char *report = hdev->rdesc;

report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL);
if (!report)
return -ENOMEM;

/* retrive report descriptors */
do {
result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
USB_REQ_GET_DESCRIPTOR,
USB_RECIP_INTERFACE | USB_DIR_IN,
HID_DEVICET_REPORT << 8,
intf->altsetting[0].desc.bInterfaceNumber, /* interface */
report,
hid_desc->wDescriptorLength,
5000); /* 5 secs */
} while (result < 0 && limit++ < WAC_MSG_RETRIES);

/* No need to parse the Descriptor. It isn't an error though */
if (result < 0)
goto out;

for (i = 0; i < hid_desc->wDescriptorLength; i++) {
for (i = 0; i < hdev->rsize; i++) {

switch (report[i]) {
case HID_HDESC_USAGE_PAGE:
Expand Down Expand Up @@ -452,11 +415,9 @@ static int wacom_parse_hid(struct hid_device *hdev,
}
}

out:
if (!features->touch_max && touch_max)
features->touch_max = touch_max;
result = 0;
kfree(report);
return result;
}

Expand Down Expand Up @@ -519,8 +480,6 @@ static int wacom_retrieve_hid_descriptor(struct hid_device *hdev,
int error = 0;
struct wacom *wacom = hid_get_drvdata(hdev);
struct usb_interface *intf = wacom->intf;
struct usb_host_interface *interface = intf->cur_altsetting;
struct wac_hid_descriptor *hid_desc;

/* default features */
features->device_type = BTN_TOOL_PEN;
Expand Down Expand Up @@ -549,17 +508,7 @@ static int wacom_retrieve_hid_descriptor(struct hid_device *hdev,
goto out;
}

error = usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc);
if (error) {
error = usb_get_extra_descriptor(&interface->endpoint[0],
HID_DEVICET_REPORT, &hid_desc);
if (error) {
hid_err(hdev,
"can not retrieve extra class descriptor\n");
goto out;
}
}
error = wacom_parse_hid(hdev, hid_desc, features);
error = wacom_parse_hid(hdev, features);

out:
return error;
Expand Down Expand Up @@ -1296,6 +1245,13 @@ static int wacom_probe(struct hid_device *hdev,
hid_set_drvdata(hdev, wacom);
wacom->hdev = hdev;

/* ask for the report descriptor to be loaded by HID */
error = hid_parse(hdev);
if (error) {
hid_err(hdev, "parse failed\n");
goto fail1;
}

wacom_wac = &wacom->wacom_wac;
wacom_wac->features = *((struct wacom_features *)id->driver_data);
features = &wacom_wac->features;
Expand Down Expand Up @@ -1389,12 +1345,6 @@ static int wacom_probe(struct hid_device *hdev,
wacom_query_tablet_data(hdev, features);

/* Regular HID work starts now */
error = hid_parse(hdev);
if (error) {
hid_err(hdev, "parse failed\n");
goto fail4;
}

error = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
if (error) {
hid_err(hdev, "hw start failed\n");
Expand Down

0 comments on commit ba9a354

Please sign in to comment.