Skip to content

Commit

Permalink
Input: wacom - compute the HID report size to get the actual packet size
Browse files Browse the repository at this point in the history
This removes an USB dependency and is more accurate: the computed pktlen
is the actual maximum size of the reports forwarded by the device.

Given that the pktlen is correctly computed/validated, we can store it now
in the features struct instead of having a special handling in the rest of
the code.

Likewise, this information is not mandatory anymore in the description
of devices in wacom_wac.c. They will be removed in a separate patch.

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 ba9a354 commit 01c846f
Showing 1 changed file with 26 additions and 32 deletions.
58 changes: 26 additions & 32 deletions drivers/input/tablet/wacom_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,6 @@ static int wacom_parse_logical_collection(unsigned char *report,
if (features->type == BAMBOO_PT) {

/* Logical collection is only used by 3rd gen Bamboo Touch */
features->pktlen = WACOM_PKGLEN_BBTOUCH3;
features->device_type = BTN_TOOL_FINGER;

features->x_max = features->y_max =
Expand Down Expand Up @@ -240,29 +239,6 @@ static int wacom_parse_hid(struct hid_device *hdev,
features->device_type = BTN_TOOL_FINGER;
/* touch device at least supports one touch point */
touch_max = 1;
switch (features->type) {
case TABLETPC2FG:
features->pktlen = WACOM_PKGLEN_TPC2FG;
break;

case MTSCREEN:
case WACOM_24HDT:
features->pktlen = WACOM_PKGLEN_MTOUCH;
break;

case MTTPC:
case MTTPC_B:
features->pktlen = WACOM_PKGLEN_MTTPC;
break;

case BAMBOO_PT:
features->pktlen = WACOM_PKGLEN_BBTOUCH;
break;

default:
features->pktlen = WACOM_PKGLEN_GRAPHIRE;
break;
}

switch (features->type) {
case BAMBOO_PT:
Expand Down Expand Up @@ -305,8 +281,6 @@ static int wacom_parse_hid(struct hid_device *hdev,
}
} else if (pen) {
/* penabled only accepts exact bytes of data */
if (features->type >= TABLETPC)
features->pktlen = WACOM_PKGLEN_GRAPHIRE;
features->device_type = BTN_TOOL_PEN;
features->x_max =
get_unaligned_le16(&report[i + 3]);
Expand Down Expand Up @@ -1224,12 +1198,34 @@ static void wacom_calculate_res(struct wacom_features *features)
features->unitExpo);
}

static int wacom_hid_report_len(struct hid_report *report)
{
/* equivalent to DIV_ROUND_UP(report->size, 8) + !!(report->id > 0) */
return ((report->size - 1) >> 3) + 1 + (report->id > 0);
}

static size_t wacom_compute_pktlen(struct hid_device *hdev)
{
struct hid_report_enum *report_enum;
struct hid_report *report;
size_t size = 0;

report_enum = hdev->report_enum + HID_INPUT_REPORT;

list_for_each_entry(report, &report_enum->report_list, list) {
size_t report_size = wacom_hid_report_len(report);
if (report_size > size)
size = report_size;
}

return size;
}

static int wacom_probe(struct hid_device *hdev,
const struct hid_device_id *id)
{
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
struct usb_device *dev = interface_to_usbdev(intf);
struct usb_endpoint_descriptor *endpoint;
struct wacom *wacom;
struct wacom_wac *wacom_wac;
struct wacom_features *features;
Expand All @@ -1255,6 +1251,7 @@ static int wacom_probe(struct hid_device *hdev,
wacom_wac = &wacom->wacom_wac;
wacom_wac->features = *((struct wacom_features *)id->driver_data);
features = &wacom_wac->features;
features->pktlen = wacom_compute_pktlen(hdev);
if (features->pktlen > WACOM_PKGLEN_MAX) {
error = -EINVAL;
goto fail1;
Expand All @@ -1272,8 +1269,6 @@ static int wacom_probe(struct hid_device *hdev,
usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
strlcat(wacom->phys, "/input0", sizeof(wacom->phys));

endpoint = &intf->cur_altsetting->endpoint[0].desc;

/* set the default size in case we do not get them from hid */
wacom_set_default_phy(features);

Expand All @@ -1284,13 +1279,12 @@ static int wacom_probe(struct hid_device *hdev,

/*
* Intuos5 has no useful data about its touch interface in its
* HID descriptor. If this is the touch interface (wMaxPacketSize
* HID descriptor. If this is the touch interface (PacketSize
* of WACOM_PKGLEN_BBTOUCH3), override the table values.
*/
if (features->type >= INTUOS5S && features->type <= INTUOSHT) {
if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
features->device_type = BTN_TOOL_FINGER;
features->pktlen = WACOM_PKGLEN_BBTOUCH3;

features->x_max = 4096;
features->y_max = 4096;
Expand Down

0 comments on commit 01c846f

Please sign in to comment.