On Wed, 5 Aug 2015, Jason Gerecke wrote:

> The 'wacom_wireless_work' function does not recalculate the tablet's
> resolution, causing the value contained in the 'features' struct to
> always be reported to userspace. This value is valid only for the pen
> interface, meaning that the value will be incorrect for the touchpad (if
> present). This in particular causes problems for libinput which relies
> on the reported resolution being correct.
> 
> This patch adds the necessary calls to recalculate the resolution for
> each interface. This requires a little bit of code shuffling since both
> the 'wacom_set_default_phy' and 'wacom_calculate_res' are declared below
> their new first point of use in 'wacom_wireless_work'.
> 
> Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
> ---
> Jiri: Would it be possible to target this patch for 4.2?

Just want to understand the context here -- is this a regression? If yes, 
since what version/commit?

Thanks.

> 
>  drivers/hid/wacom_sys.c | 70 
> ++++++++++++++++++++++++++-----------------------
>  1 file changed, 37 insertions(+), 33 deletions(-)
> 
> diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
> index 4c0ffca..7e064b0 100644
> --- a/drivers/hid/wacom_sys.c
> +++ b/drivers/hid/wacom_sys.c
> @@ -1282,6 +1282,39 @@ fail_register_pen_input:
>       return error;
>  }
>  
> +/*
> + * Not all devices report physical dimensions from HID.
> + * Compute the default from hardcoded logical dimension
> + * and resolution before driver overwrites them.
> + */
> +static void wacom_set_default_phy(struct wacom_features *features)
> +{
> +     if (features->x_resolution) {
> +             features->x_phy = (features->x_max * 100) /
> +                                     features->x_resolution;
> +             features->y_phy = (features->y_max * 100) /
> +                                     features->y_resolution;
> +     }
> +}
> +
> +static void wacom_calculate_res(struct wacom_features *features)
> +{
> +     /* set unit to "100th of a mm" for devices not reported by HID */
> +     if (!features->unit) {
> +             features->unit = 0x11;
> +             features->unitExpo = -3;
> +     }
> +
> +     features->x_resolution = wacom_calc_hid_res(features->x_max,
> +                                                 features->x_phy,
> +                                                 features->unit,
> +                                                 features->unitExpo);
> +     features->y_resolution = wacom_calc_hid_res(features->y_max,
> +                                                 features->y_phy,
> +                                                 features->unit,
> +                                                 features->unitExpo);
> +}
> +
>  static void wacom_wireless_work(struct work_struct *work)
>  {
>       struct wacom *wacom = container_of(work, struct wacom, work);
> @@ -1339,6 +1372,8 @@ static void wacom_wireless_work(struct work_struct 
> *work)
>               if (wacom_wac1->features.type != INTUOSHT &&
>                   wacom_wac1->features.type != BAMBOO_PT)
>                       wacom_wac1->features.device_type |= 
> WACOM_DEVICETYPE_PAD;
> +             wacom_set_default_phy(&wacom_wac1->features);
> +             wacom_calculate_res(&wacom_wac1->features);
>               snprintf(wacom_wac1->pen_name, WACOM_NAME_MAX, "%s (WL) Pen",
>                        wacom_wac1->features.name);
>               snprintf(wacom_wac1->pad_name, WACOM_NAME_MAX, "%s (WL) Pad",
> @@ -1357,7 +1392,9 @@ 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_set_default_phy(&wacom_wac2->features);
>                       wacom_wac2->features.x_max = wacom_wac2->features.y_max 
> = 4096;
> +                     wacom_calculate_res(&wacom_wac2->features);
>                       snprintf(wacom_wac2->touch_name, WACOM_NAME_MAX,
>                                "%s (WL) Finger",wacom_wac2->features.name);
>                       snprintf(wacom_wac2->pad_name, WACOM_NAME_MAX,
> @@ -1405,39 +1442,6 @@ void wacom_battery_work(struct work_struct *work)
>       }
>  }
>  
> -/*
> - * Not all devices report physical dimensions from HID.
> - * Compute the default from hardcoded logical dimension
> - * and resolution before driver overwrites them.
> - */
> -static void wacom_set_default_phy(struct wacom_features *features)
> -{
> -     if (features->x_resolution) {
> -             features->x_phy = (features->x_max * 100) /
> -                                     features->x_resolution;
> -             features->y_phy = (features->y_max * 100) /
> -                                     features->y_resolution;
> -     }
> -}
> -
> -static void wacom_calculate_res(struct wacom_features *features)
> -{
> -     /* set unit to "100th of a mm" for devices not reported by HID */
> -     if (!features->unit) {
> -             features->unit = 0x11;
> -             features->unitExpo = -3;
> -     }
> -
> -     features->x_resolution = wacom_calc_hid_res(features->x_max,
> -                                                 features->x_phy,
> -                                                 features->unit,
> -                                                 features->unitExpo);
> -     features->y_resolution = wacom_calc_hid_res(features->y_max,
> -                                                 features->y_phy,
> -                                                 features->unit,
> -                                                 features->unitExpo);
> -}
> -
>  static size_t wacom_compute_pktlen(struct hid_device *hdev)
>  {
>       struct hid_report_enum *report_enum;
> -- 
> 2.5.0
> 

-- 
Jiri Kosina
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to