HID: wacom: Report correct device resolution when using the wireless adapater
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.gerecke@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
0621809e37
commit
0be017120b
1 changed files with 37 additions and 33 deletions
|
@ -1284,6 +1284,39 @@ static int wacom_register_inputs(struct wacom *wacom)
|
||||||
return error;
|
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)
|
static void wacom_wireless_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct wacom *wacom = container_of(work, struct wacom, work);
|
struct wacom *wacom = container_of(work, struct wacom, work);
|
||||||
|
@ -1341,6 +1374,8 @@ static void wacom_wireless_work(struct work_struct *work)
|
||||||
if (wacom_wac1->features.type != INTUOSHT &&
|
if (wacom_wac1->features.type != INTUOSHT &&
|
||||||
wacom_wac1->features.type != BAMBOO_PT)
|
wacom_wac1->features.type != BAMBOO_PT)
|
||||||
wacom_wac1->features.device_type |= WACOM_DEVICETYPE_PAD;
|
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",
|
snprintf(wacom_wac1->pen_name, WACOM_NAME_MAX, "%s (WL) Pen",
|
||||||
wacom_wac1->features.name);
|
wacom_wac1->features.name);
|
||||||
snprintf(wacom_wac1->pad_name, WACOM_NAME_MAX, "%s (WL) Pad",
|
snprintf(wacom_wac1->pad_name, WACOM_NAME_MAX, "%s (WL) Pad",
|
||||||
|
@ -1359,7 +1394,9 @@ static void wacom_wireless_work(struct work_struct *work)
|
||||||
wacom_wac2->features =
|
wacom_wac2->features =
|
||||||
*((struct wacom_features *)id->driver_data);
|
*((struct wacom_features *)id->driver_data);
|
||||||
wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
|
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_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
|
||||||
|
wacom_calculate_res(&wacom_wac2->features);
|
||||||
snprintf(wacom_wac2->touch_name, WACOM_NAME_MAX,
|
snprintf(wacom_wac2->touch_name, WACOM_NAME_MAX,
|
||||||
"%s (WL) Finger",wacom_wac2->features.name);
|
"%s (WL) Finger",wacom_wac2->features.name);
|
||||||
snprintf(wacom_wac2->pad_name, WACOM_NAME_MAX,
|
snprintf(wacom_wac2->pad_name, WACOM_NAME_MAX,
|
||||||
|
@ -1407,39 +1444,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)
|
static size_t wacom_compute_pktlen(struct hid_device *hdev)
|
||||||
{
|
{
|
||||||
struct hid_report_enum *report_enum;
|
struct hid_report_enum *report_enum;
|
||||||
|
|
Loading…
Reference in a new issue