On 6/4/2015 11:59 AM, Benjamin Tissoires wrote:
> On Jun 03 2015 or thereabouts, Jason Gerecke wrote:
>> The USB devices that this driver has historically supported segregate the
>> pen and touch portions of the tablet. Oftentimes the segregation would be
>> done at the interface level, though on occasion (e.g. Cintiq 24HDT) the
>> tablet would combine two totally independent USB devices behind an internal
>> USB hub. Because pen and touch never shared the same interface, it made
>> sense for the 'device_type' to store a single value: "pen" or "touch".
>>
>> Recently, however, some I2C devices have been created which combine the
>> two. A first step to accomodating this is to expand 'device_type' so that
>> it can represent two (or potentially more) types simultaneously. To do
>> this, we treat it as a bitfield and set/check individual bits rather
>> than using the '=' and '==' operators.
>>
>> This should not result in any functional change since no supported devices
>> (that I'm aware of, at least) have HID descriptors that indicate both
>> pen and touch reports on a single interface.
>>
>> Signed-off-by: Jason Gerecke <[email protected]>
>> ---
>>  drivers/hid/wacom_sys.c | 35 ++++++++++++++++++-----------------
>>  drivers/hid/wacom_wac.c | 30 +++++++++++++++---------------
>>  drivers/hid/wacom_wac.h |  5 +++++
>>  3 files changed, 38 insertions(+), 32 deletions(-)
>>
>> diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
>> index bdf31c9..2b4cbd8 100644
>> --- a/drivers/hid/wacom_sys.c
>> +++ b/drivers/hid/wacom_sys.c
>> @@ -197,9 +197,9 @@ static void wacom_usage_mapping(struct hid_device *hdev,
>>      * values commonly reported.
>>      */
>>      if (pen)
>> -            features->device_type = BTN_TOOL_PEN;
>> +            features->device_type |= WACOM_DEVICETYPE_PEN;
>>      else if (finger)
>> -            features->device_type = BTN_TOOL_FINGER;
>> +            features->device_type |= WACOM_DEVICETYPE_TOUCH;
>>      else
>>              return;
>>  
>> @@ -411,7 +411,7 @@ static int wacom_query_tablet_data(struct hid_device 
>> *hdev,
>>      if (features->type == HID_GENERIC)
>>              return wacom_hid_set_device_mode(hdev);
>>  
>> -    if (features->device_type == BTN_TOOL_FINGER) {
>> +    if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
>>              if (features->type > TABLETPC) {
>>                      /* MT Tablet PC touch */
>>                      return wacom_set_device_mode(hdev, 3, 4, 4);
>> @@ -425,7 +425,7 @@ static int wacom_query_tablet_data(struct hid_device 
>> *hdev,
>>              else if (features->type == BAMBOO_PAD) {
>>                      return wacom_set_device_mode(hdev, 2, 2, 2);
>>              }
>> -    } else if (features->device_type == BTN_TOOL_PEN) {
>> +    } else if (features->device_type & WACOM_DEVICETYPE_PEN) {
>>              if (features->type <= BAMBOO_PT && features->type != WIRELESS) {
>>                      return wacom_set_device_mode(hdev, 2, 2, 2);
>>              }
>> @@ -454,9 +454,9 @@ static void wacom_retrieve_hid_descriptor(struct 
>> hid_device *hdev,
>>       */
>>      if (features->type == WIRELESS) {
>>              if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
>> -                    features->device_type = 0;
>> +                    features->device_type = WACOM_DEVICETYPE_NONE;
>>              } else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) {
>> -                    features->device_type = BTN_TOOL_FINGER;
>> +                    features->device_type |= WACOM_DEVICETYPE_TOUCH;
>>                      features->pktlen = WACOM_PKGLEN_BBTOUCH3;
>>              }
>>      }
>> @@ -538,9 +538,9 @@ static int wacom_add_shared_data(struct hid_device *hdev)
>>  
>>      wacom_wac->shared = &data->shared;
>>  
>> -    if (wacom_wac->features.device_type == BTN_TOOL_FINGER)
>> +    if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)
>>              wacom_wac->shared->touch = hdev;
>> -    else if (wacom_wac->features.device_type == BTN_TOOL_PEN)
>> +    else if (wacom_wac->features.device_type & WACOM_DEVICETYPE_PEN)
>>              wacom_wac->shared->pen = hdev;
>>  
>>  out:
>> @@ -892,7 +892,7 @@ static int wacom_initialize_leds(struct wacom *wacom)
>>      case INTUOSPS:
>>      case INTUOSPM:
>>      case INTUOSPL:
>> -            if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN) {
>> +            if (wacom->wacom_wac.features.device_type & 
>> WACOM_DEVICETYPE_PEN) {
>>                      wacom->led.select[0] = 0;
>>                      wacom->led.select[1] = 0;
>>                      wacom->led.llv = 32;
>> @@ -948,7 +948,7 @@ static void wacom_destroy_leds(struct wacom *wacom)
>>      case INTUOSPS:
>>      case INTUOSPM:
>>      case INTUOSPL:
>> -            if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN)
>> +            if (wacom->wacom_wac.features.device_type & 
>> WACOM_DEVICETYPE_PEN)
>>                      sysfs_remove_group(&wacom->hdev->dev.kobj,
>>                                         &intuos5_led_attr_group);
>>              break;
>> @@ -1296,7 +1296,7 @@ static void wacom_wireless_work(struct work_struct 
>> *work)
>>              /* Stylus interface */
>>              wacom_wac1->features =
>>                      *((struct wacom_features *)id->driver_data);
>> -            wacom_wac1->features.device_type = BTN_TOOL_PEN;
>> +            wacom_wac1->features.device_type |= WACOM_DEVICETYPE_PEN;
>>              snprintf(wacom_wac1->name, WACOM_NAME_MAX, "%s (WL) Pen",
>>                       wacom_wac1->features.name);
>>              snprintf(wacom_wac1->pad_name, WACOM_NAME_MAX, "%s (WL) Pad",
>> @@ -1315,7 +1315,7 @@ static void wacom_wireless_work(struct work_struct 
>> *work)
>>                      wacom_wac2->features =
>>                              *((struct wacom_features *)id->driver_data);
>>                      wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
>> -                    wacom_wac2->features.device_type = BTN_TOOL_FINGER;
>> +                    wacom_wac2->features.device_type |= 
>> WACOM_DEVICETYPE_TOUCH;
>>                      wacom_wac2->features.x_max = wacom_wac2->features.y_max 
>> = 4096;
>>                      if (wacom_wac2->features.touch_max)
>>                              snprintf(wacom_wac2->name, WACOM_NAME_MAX,
>> @@ -1451,11 +1451,11 @@ static void wacom_update_name(struct wacom *wacom)
>>      snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name),
>>              "%s Pad", name);
>>  
>> -    if (features->device_type == BTN_TOOL_PEN) {
>> +    if (features->device_type & WACOM_DEVICETYPE_PEN) {
>>              snprintf(wacom_wac->name, sizeof(wacom_wac->name),
>>                      "%s Pen", name);
>>      }
>> -    else if (features->device_type == BTN_TOOL_FINGER) {
>> +    else if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
>>              if (features->touch_max)
>>                      snprintf(wacom_wac->name, sizeof(wacom_wac->name),
>>                              "%s Finger", name);
>> @@ -1545,7 +1545,8 @@ static int wacom_probe(struct hid_device *hdev,
>>      wacom_retrieve_hid_descriptor(hdev, features);
>>      wacom_setup_device_quirks(wacom);
>>  
>> -    if (!features->device_type && features->type != WIRELESS) {
>> +    if (features->device_type == WACOM_DEVICETYPE_NONE &&
>> +        features->type != WIRELESS) {
>>              error = features->type == HID_GENERIC ? -ENODEV : 0;
>>  
>>              dev_warn(&hdev->dev, "Unknown device_type for '%s'. %s.",
>> @@ -1555,7 +1556,7 @@ static int wacom_probe(struct hid_device *hdev,
>>              if (error)
>>                      goto fail_shared_data;
>>  
>> -            features->device_type = BTN_TOOL_PEN;
>> +            features->device_type |= WACOM_DEVICETYPE_PEN;
>>      }
>>  
>>      wacom_calculate_res(features);
>> @@ -1604,7 +1605,7 @@ static int wacom_probe(struct hid_device *hdev,
>>              error = hid_hw_open(hdev);
>>  
>>      if (wacom_wac->features.type == INTUOSHT && 
>> wacom_wac->features.touch_max) {
>> -            if (wacom_wac->features.device_type == BTN_TOOL_FINGER)
>> +            if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)
>>                      wacom_wac->shared->touch_input = wacom_wac->input;
>>      }
>>  
>> diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
>> index a52fc25..5e7710d 100644
>> --- a/drivers/hid/wacom_wac.c
>> +++ b/drivers/hid/wacom_wac.c
>> @@ -2168,7 +2168,7 @@ void wacom_setup_device_quirks(struct wacom *wacom)
>>      struct wacom_features *features = &wacom->wacom_wac.features;
>>  
>>      /* touch device found but size is not defined. use default */
>> -    if (features->device_type == BTN_TOOL_FINGER && !features->x_max) {
>> +    if (features->device_type & WACOM_DEVICETYPE_TOUCH && !features->x_max) 
>> {
>>              features->x_max = 1023;
>>              features->y_max = 1023;
> 
> As you mentioned, we are safe right now because there is no device that
> shares both pen and touch on the same HID interface (expect the one you
> are making the patch series for).
> 
> I am just wondering if this will not bite us back when we will have to
> use a features->x_pen_max and features_x_touch_max for the same
> interface.
> No need to change it now (I guess we are fine with HID generic devices
> right now), but this is something we might want to have in our heads in
> the future.
> 
> Cheers,
> Benjamin
> 
See my comments on patch 5. I'm in complete agreement -- I don't think
it's an issue (thanks to HID_GENERIC), but the design is a little creaky
given the kinds of devices out there. I'd like to see the driver be more
tool-centric and not have to repeat myself three times in every function
to e.g. set the name of the pen, touch, and pad device.

-- 
Jason
---
Now instead of four in the eights place /
you’ve got three, ‘Cause you added one /
(That is to say, eight) to the two, /
But you can’t take seven from three, /
So you look at the sixty-fours....

>>      }
>> @@ -2182,7 +2182,7 @@ void wacom_setup_device_quirks(struct wacom *wacom)
>>      if ((features->type >= INTUOS5S && features->type <= INTUOSHT) ||
>>              (features->type == BAMBOO_PT)) {
>>              if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
>> -                    features->device_type = BTN_TOOL_FINGER;
>> +                    features->device_type |= WACOM_DEVICETYPE_TOUCH;
>>  
>>                      features->x_max = 4096;
>>                      features->y_max = 4096;
>> @@ -2197,7 +2197,7 @@ void wacom_setup_device_quirks(struct wacom *wacom)
>>       * so rewrite this one to be of type BTN_TOOL_FINGER.
>>       */
>>      if (features->type == BAMBOO_PAD)
>> -            features->device_type = BTN_TOOL_FINGER;
>> +            features->device_type |= WACOM_DEVICETYPE_TOUCH;
>>  
>>      if (wacom->hdev->bus == BUS_BLUETOOTH)
>>              features->quirks |= WACOM_QUIRK_BATTERY;
>> @@ -2218,7 +2218,7 @@ void wacom_setup_device_quirks(struct wacom *wacom)
>>              features->quirks |= WACOM_QUIRK_NO_INPUT;
>>  
>>              /* must be monitor interface if no device_type set */
>> -            if (!features->device_type) {
>> +            if (features->device_type == WACOM_DEVICETYPE_NONE) {
>>                      features->quirks |= WACOM_QUIRK_MONITOR;
>>                      features->quirks |= WACOM_QUIRK_BATTERY;
>>              }
>> @@ -2230,7 +2230,7 @@ static void wacom_abs_set_axis(struct input_dev 
>> *input_dev,
>>  {
>>      struct wacom_features *features = &wacom_wac->features;
>>  
>> -    if (features->device_type == BTN_TOOL_PEN) {
>> +    if (features->device_type & WACOM_DEVICETYPE_PEN) {
>>              input_set_abs_params(input_dev, ABS_X, features->x_min,
>>                                   features->x_max, features->x_fuzz, 0);
>>              input_set_abs_params(input_dev, ABS_Y, features->y_min,
>> @@ -2349,7 +2349,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>      case INTUOSPS:
>>              __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
>>  
>> -            if (features->device_type == BTN_TOOL_PEN) {
>> +            if (features->device_type & WACOM_DEVICETYPE_PEN) {
>>                      input_set_abs_params(input_dev, ABS_DISTANCE, 0,
>>                                            features->distance_max,
>>                                            0, 0);
>> @@ -2358,7 +2358,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>                      input_abs_set_res(input_dev, ABS_Z, 287);
>>  
>>                      wacom_setup_intuos(wacom_wac);
>> -            } else if (features->device_type == BTN_TOOL_FINGER) {
>> +            } else if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
>>                      __clear_bit(ABS_MISC, input_dev->absbit);
>>  
>>                      input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
>> @@ -2370,7 +2370,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>              break;
>>  
>>      case WACOM_24HDT:
>> -            if (features->device_type == BTN_TOOL_FINGER) {
>> +            if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
>>                      input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 
>> features->x_max, 0, 0);
>>                      input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 
>> features->x_max, 0, 0);
>>                      input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, 
>> features->y_max, 0, 0);
>> @@ -2383,7 +2383,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>      case MTTPC:
>>      case MTTPC_B:
>>      case TABLETPC2FG:
>> -            if (features->device_type == BTN_TOOL_FINGER && 
>> features->touch_max > 1)
>> +            if (features->device_type & WACOM_DEVICETYPE_TOUCH && 
>> features->touch_max > 1)
>>                      input_mt_init_slots(input_dev, features->touch_max, 
>> INPUT_MT_DIRECT);
>>              /* fall through */
>>  
>> @@ -2393,7 +2393,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>  
>>              __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
>>  
>> -            if (features->device_type != BTN_TOOL_PEN)
>> +            if (!(features->device_type & WACOM_DEVICETYPE_PEN))
>>                      break;  /* no need to process stylus stuff */
>>  
>>              /* fall through */
>> @@ -2424,7 +2424,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>  
>>      case INTUOSHT:
>>              if (features->touch_max &&
>> -                features->device_type == BTN_TOOL_FINGER) {
>> +                features->device_type & WACOM_DEVICETYPE_TOUCH) {
>>                      input_dev->evbit[0] |= BIT_MASK(EV_SW);
>>                      __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
>>              }
>> @@ -2433,7 +2433,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>      case BAMBOO_PT:
>>              __clear_bit(ABS_MISC, input_dev->absbit);
>>  
>> -            if (features->device_type == BTN_TOOL_FINGER) {
>> +            if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
>>  
>>                      if (features->touch_max) {
>>                              if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
>> @@ -2454,7 +2454,7 @@ int wacom_setup_pentouch_input_capabilities(struct 
>> input_dev *input_dev,
>>                              /* PAD is setup by 
>> wacom_setup_pad_input_capabilities later */
>>                              return 1;
>>                      }
>> -            } else if (features->device_type == BTN_TOOL_PEN) {
>> +            } else if (features->device_type & WACOM_DEVICETYPE_PEN) {
>>                      __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
>>                      __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
>>                      __set_bit(BTN_TOOL_PEN, input_dev->keybit);
>> @@ -2619,7 +2619,7 @@ int wacom_setup_pad_input_capabilities(struct 
>> input_dev *input_dev,
>>      case INTUOS5S:
>>      case INTUOSPS:
>>              /* touch interface does not have the pad device */
>> -            if (features->device_type != BTN_TOOL_PEN)
>> +            if (!(features->device_type & WACOM_DEVICETYPE_PEN))
>>                      return -ENODEV;
>>  
>>              for (i = 0; i < 7; i++)
>> @@ -2664,7 +2664,7 @@ int wacom_setup_pad_input_capabilities(struct 
>> input_dev *input_dev,
>>      case INTUOSHT:
>>      case BAMBOO_PT:
>>              /* pad device is on the touch interface */
>> -            if ((features->device_type != BTN_TOOL_FINGER) ||
>> +            if (!(features->device_type & WACOM_DEVICETYPE_TOUCH) ||
>>                  /* Bamboo Pen only tablet does not have pad */
>>                  ((features->type == BAMBOO_PT) && !features->touch_max))
>>                      return -ENODEV;
>> diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
>> index 9a5ee62..da2b309 100644
>> --- a/drivers/hid/wacom_wac.h
>> +++ b/drivers/hid/wacom_wac.h
>> @@ -72,6 +72,11 @@
>>  #define WACOM_QUIRK_MONITOR         0x0004
>>  #define WACOM_QUIRK_BATTERY         0x0008
>>  
>> +/* device types */
>> +#define WACOM_DEVICETYPE_NONE           0x0000
>> +#define WACOM_DEVICETYPE_PEN            0x0001
>> +#define WACOM_DEVICETYPE_TOUCH          0x0002
>> +
>>  #define WACOM_VENDORDEFINED_PEN             0xff0d0001
>>  
>>  #define WACOM_PEN_FIELD(f)  (((f)->logical == HID_DG_STYLUS) || \
>> -- 
>> 2.4.1
>>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to