Skip to content

Commit 33f371a

Browse files
Merge pull request linuxwacom#363 from linuxwacom/for-6.4
For 6.4
2 parents 90cc7df + 6aedb34 commit 33f371a

File tree

4 files changed

+41
-47
lines changed

4 files changed

+41
-47
lines changed

3.17/wacom_sys.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2307,8 +2307,13 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
23072307
goto fail_quirks;
23082308
}
23092309

2310-
if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
2310+
if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) {
23112311
error = hid_hw_open(hdev);
2312+
if (error) {
2313+
hid_err(hdev, "hw open failed\n");
2314+
goto fail_quirks;
2315+
}
2316+
}
23122317

23132318
wacom_set_shared_values(wacom_wac);
23142319
devres_close_group(&hdev->dev, wacom);

3.17/wacom_wac.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
846846
/* Enter report */
847847
if ((data[1] & 0xfc) == 0xc0) {
848848
/* serial number of the tool */
849-
wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
849+
wacom->serial[idx] = ((__u64)(data[3] & 0x0f) << 28) +
850850
(data[4] << 20) + (data[5] << 12) +
851851
(data[6] << 4) + (data[7] >> 4);
852852

4.5/wacom_sys.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,7 +2284,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
22842284
} else if (strstr(product_name, "Wacom") ||
22852285
strstr(product_name, "wacom") ||
22862286
strstr(product_name, "WACOM")) {
2287-
strscpy(name, product_name, sizeof(name));
2287+
if (strscpy(name, product_name, sizeof(name)) < 0) {
2288+
hid_warn(wacom->hdev, "String overflow while assembling device name");
2289+
}
22882290
} else {
22892291
snprintf(name, sizeof(name), "Wacom %s", product_name);
22902292
}
@@ -2302,7 +2304,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
23022304
if (name[strlen(name)-1] == ' ')
23032305
name[strlen(name)-1] = '\0';
23042306
} else {
2305-
strscpy(name, features->name, sizeof(name));
2307+
if (strscpy(name, features->name, sizeof(name)) < 0) {
2308+
hid_warn(wacom->hdev, "String overflow while assembling device name");
2309+
}
23062310
}
23072311

23082312
snprintf(wacom_wac->name, sizeof(wacom_wac->name), "%s%s",
@@ -2432,13 +2436,6 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
24322436
if (error)
24332437
goto fail;
24342438

2435-
if (!(features->device_type & WACOM_DEVICETYPE_WL_MONITOR) &&
2436-
(features->quirks & WACOM_QUIRK_BATTERY)) {
2437-
error = wacom_initialize_battery(wacom);
2438-
if (error)
2439-
goto fail;
2440-
}
2441-
24422439
error = wacom_register_inputs(wacom);
24432440
if (error)
24442441
goto fail;
@@ -2477,8 +2474,13 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
24772474
goto fail_quirks;
24782475
}
24792476

2480-
if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
2477+
if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) {
24812478
error = hid_hw_open(hdev);
2479+
if (error) {
2480+
hid_err(hdev, "hw open failed\n");
2481+
goto fail_quirks;
2482+
}
2483+
}
24822484

24832485
wacom_set_shared_values(wacom_wac);
24842486
devres_close_group(&hdev->dev, wacom);
@@ -2567,11 +2569,10 @@ static void wacom_wireless_work(struct work_struct *work)
25672569
goto fail;
25682570
}
25692571

2570-
strscpy(wacom_wac->name, wacom_wac1->name,
2571-
sizeof(wacom_wac->name));
2572-
error = wacom_initialize_battery(wacom);
2573-
if (error)
2574-
goto fail;
2572+
if (strscpy(wacom_wac->name, wacom_wac1->name,
2573+
sizeof(wacom_wac->name)) < 0) {
2574+
hid_warn(wacom->hdev, "String overflow while assembling device name");
2575+
}
25752576
}
25762577

25772578
return;

4.5/wacom_wac.c

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ static void wacom_notify_battery(struct wacom_wac *wacom_wac,
123123
bool bat_connected, bool ps_connected)
124124
{
125125
struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
126+
bool bat_initialized = wacom->battery.battery;
127+
bool has_quirk = wacom_wac->features.quirks & WACOM_QUIRK_BATTERY;
128+
129+
if (bat_initialized != has_quirk)
130+
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
126131

127132
__wacom_notify_battery(&wacom->battery, bat_status, bat_capacity,
128133
bat_charging, bat_connected, ps_connected);
@@ -836,7 +841,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
836841
/* Enter report */
837842
if ((data[1] & 0xfc) == 0xc0) {
838843
/* serial number of the tool */
839-
wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
844+
wacom->serial[idx] = ((__u64)(data[3] & 0x0f) << 28) +
840845
(data[4] << 20) + (data[5] << 12) +
841846
(data[6] << 4) + (data[7] >> 4);
842847

@@ -1985,18 +1990,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
19851990
static void wacom_wac_battery_usage_mapping(struct hid_device *hdev,
19861991
struct hid_field *field, struct hid_usage *usage)
19871992
{
1988-
struct wacom *wacom = hid_get_drvdata(hdev);
1989-
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1990-
struct wacom_features *features = &wacom_wac->features;
1991-
unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1992-
1993-
switch (equivalent_usage) {
1994-
case HID_DG_BATTERYSTRENGTH:
1995-
case WACOM_HID_WD_BATTERY_LEVEL:
1996-
case WACOM_HID_WD_BATTERY_CHARGING:
1997-
features->quirks |= WACOM_QUIRK_BATTERY;
1998-
break;
1999-
}
1993+
return;
20001994
}
20011995

20021996
static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *field,
@@ -2017,18 +2011,21 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f
20172011
wacom_wac->hid_data.bat_connected = 1;
20182012
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
20192013
}
2014+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
20202015
break;
20212016
case WACOM_HID_WD_BATTERY_LEVEL:
20222017
value = value * 100 / (field->logical_maximum - field->logical_minimum);
20232018
wacom_wac->hid_data.battery_capacity = value;
20242019
wacom_wac->hid_data.bat_connected = 1;
20252020
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
2021+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
20262022
break;
20272023
case WACOM_HID_WD_BATTERY_CHARGING:
20282024
wacom_wac->hid_data.bat_charging = value;
20292025
wacom_wac->hid_data.ps_connected = value;
20302026
wacom_wac->hid_data.bat_connected = 1;
20312027
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
2028+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
20322029
break;
20332030
}
20342031
}
@@ -2044,18 +2041,15 @@ static void wacom_wac_battery_report(struct hid_device *hdev,
20442041
{
20452042
struct wacom *wacom = hid_get_drvdata(hdev);
20462043
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2047-
struct wacom_features *features = &wacom_wac->features;
20482044

2049-
if (features->quirks & WACOM_QUIRK_BATTERY) {
2050-
int status = wacom_wac->hid_data.bat_status;
2051-
int capacity = wacom_wac->hid_data.battery_capacity;
2052-
bool charging = wacom_wac->hid_data.bat_charging;
2053-
bool connected = wacom_wac->hid_data.bat_connected;
2054-
bool powered = wacom_wac->hid_data.ps_connected;
2045+
int status = wacom_wac->hid_data.bat_status;
2046+
int capacity = wacom_wac->hid_data.battery_capacity;
2047+
bool charging = wacom_wac->hid_data.bat_charging;
2048+
bool connected = wacom_wac->hid_data.bat_connected;
2049+
bool powered = wacom_wac->hid_data.ps_connected;
20552050

2056-
wacom_notify_battery(wacom_wac, status, capacity, charging,
2057-
connected, powered);
2058-
}
2051+
wacom_notify_battery(wacom_wac, status, capacity, charging,
2052+
connected, powered);
20592053
}
20602054

20612055
static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
@@ -3421,19 +3415,13 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
34213415
int battery = (data[8] & 0x3f) * 100 / 31;
34223416
bool charging = !!(data[8] & 0x80);
34233417

3418+
features->quirks |= WACOM_QUIRK_BATTERY;
34243419
wacom_notify_battery(wacom_wac, WACOM_POWER_SUPPLY_STATUS_AUTO,
34253420
battery, charging, battery || charging, 1);
3426-
3427-
if (!wacom->battery.battery &&
3428-
!(features->quirks & WACOM_QUIRK_BATTERY)) {
3429-
features->quirks |= WACOM_QUIRK_BATTERY;
3430-
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
3431-
}
34323421
}
34333422
else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
34343423
wacom->battery.battery) {
34353424
features->quirks &= ~WACOM_QUIRK_BATTERY;
3436-
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
34373425
wacom_notify_battery(wacom_wac, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0);
34383426
}
34393427
return 0;

0 commit comments

Comments
 (0)