On Wed, Jan 4, 2012 at 4:43 PM, Ping Cheng <pinglinux@xxxxxxxxx> wrote: > From the HID usage table when it is supported. > > Tested-by: Chris Bagwell <chris@xxxxxxxxxxxxxx> > Reviewed-by: Chris Bagwell <chris@xxxxxxxxxxxxxx> > Signed-off-by: Ping Cheng <pingc@xxxxxxxxx> Hi Dmitry, Any ack/naks on this patch series from Ping? I'm asking because of patch 1/4 (I must have deleted that email so I'm reply to 2/4) because it makes a change that all new Wacom touch drivers need to align with. I have a patch for Wireless Bamboo support to submit and my patch looks slightly different depending on if it comes before or after that patch. Thanks, Chris > --- > > v2: updated with Chris' comments. > > drivers/input/tablet/wacom_sys.c | 31 ++++++++++++++++++++++++++++++- > drivers/input/tablet/wacom_wac.c | 10 ++++------ > drivers/input/tablet/wacom_wac.h | 1 + > 3 files changed, 35 insertions(+), 7 deletions(-) > > diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c > index c9588ee..f7fe091 100644 > --- a/drivers/input/tablet/wacom_sys.c > +++ b/drivers/input/tablet/wacom_sys.c > @@ -28,6 +28,7 @@ > #define HID_USAGE_Y_TILT 0x3e > #define HID_USAGE_FINGER 0x22 > #define HID_USAGE_STYLUS 0x20 > +#define HID_USAGE_CONTACTMAX 0x55 > #define HID_COLLECTION 0xa1 > #define HID_COLLECTION_LOGICAL 0x02 > #define HID_COLLECTION_END 0xc0 > @@ -191,11 +192,30 @@ static int wacom_parse_logical_collection(unsigned char *report, > features->x_max = features->y_max = > get_unaligned_le16(&report[10]); > > + features->touch_max = 16; > length = 11; > } > return length; > } > > +static void wacom_retrieve_report_data(struct usb_interface *intf, > + struct wacom_features *features) > +{ > + int result = 0; > + unsigned char *rep_data; > + > + rep_data = kmalloc(2, GFP_KERNEL); > + if (!rep_data) > + return; > + > + rep_data[0] = 12; > + result = wacom_get_report(intf, WAC_HID_FEATURE_REPORT, > + rep_data[0], rep_data, 2, WAC_MSG_RETRIES); > + > + if ((result >= 0) && (rep_data[1] > 2)) > + features->touch_max = rep_data[1]; > +} > + > /* > * Interface Descriptor of wacom devices can be incomplete and > * inconsistent so wacom_features table is used to store stylus > @@ -286,16 +306,19 @@ static int wacom_parse_hid(struct usb_interface *intf, > if (features->type == TABLETPC2FG) { > /* need to reset back */ > features->pktlen = WACOM_PKGLEN_TPC2FG; > + features->touch_max = 2; > } > if (features->type == BAMBOO_PT) { > /* need to reset back */ > features->pktlen = WACOM_PKGLEN_BBTOUCH; > + features->touch_max = 2; > features->x_phy = > get_unaligned_le16(&report[i + 5]); > features->x_max = > get_unaligned_le16(&report[i + 8]); > i += 15; > } else { > + features->touch_max = 1; > features->x_max = > get_unaligned_le16(&report[i + 3]); > features->x_phy = > @@ -369,6 +392,11 @@ static int wacom_parse_hid(struct usb_interface *intf, > pen = 1; > i++; > break; > + > + case HID_USAGE_CONTACTMAX: > + wacom_retrieve_report_data(intf, features); > + i++; > + break; > } > break; > > @@ -873,7 +901,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i > > endpoint = &intf->cur_altsetting->endpoint[0].desc; > > - /* Retrieve the physical and logical size for OEM devices */ > + /* Retrieve the physical and logical size for touch devices */ > + features->touch_max = 0; > error = wacom_retrieve_hid_descriptor(intf, features); > if (error) > goto fail3; > diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c > index e18f362..33a4359 100644 > --- a/drivers/input/tablet/wacom_wac.c > +++ b/drivers/input/tablet/wacom_wac.c > @@ -830,7 +830,8 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) > { > char *data = wacom->data; > > - dbg("wacom_tpc_irq: received report #%d", data[0]); > + dbg("wacom_tpc_irq: received report #%d with %d contacts", > + data[0], wacom->features.touch_max); > > if (len == WACOM_PKGLEN_TPC1FG || data[0] == WACOM_REPORT_TPC1FG) > return wacom_tpc_single_touch(wacom, len); > @@ -1319,7 +1320,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, > case TABLETPC2FG: > if (features->device_type == BTN_TOOL_FINGER) { > > - input_mt_init_slots(input_dev, 2); > + input_mt_init_slots(input_dev, features->touch_max); > input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE, > 0, MT_TOOL_MAX, 0, 0); > input_set_abs_params(input_dev, ABS_MT_POSITION_X, > @@ -1374,6 +1375,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, > > __set_bit(BTN_TOOL_FINGER, input_dev->keybit); > __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); > + input_mt_init_slots(input_dev, features->touch_max); > > if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) { > __set_bit(BTN_TOOL_TRIPLETAP, > @@ -1381,13 +1383,9 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, > __set_bit(BTN_TOOL_QUADTAP, > input_dev->keybit); > > - input_mt_init_slots(input_dev, 16); > - > input_set_abs_params(input_dev, > ABS_MT_TOUCH_MAJOR, > 0, 255, 0, 0); > - } else { > - input_mt_init_slots(input_dev, 2); > } > > input_set_abs_params(input_dev, ABS_MT_POSITION_X, > diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h > index 050acae..6ddd2e4 100644 > --- a/drivers/input/tablet/wacom_wac.h > +++ b/drivers/input/tablet/wacom_wac.h > @@ -89,6 +89,7 @@ struct wacom_features { > int pressure_fuzz; > int distance_fuzz; > unsigned quirks; > + unsigned touch_max; > }; > > struct wacom_shared { > -- > 1.7.6.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-input" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html