Skip to content

Commit c3a6ef3

Browse files
author
Jiri Kosina
committed
Merge branch 'for-6.4/wacom' into for-linus
- improved handling of battery quirk (Jason Gerecke) - lazy initialization of battery interfaces (Jason Gerecke)
2 parents ab396fb + bea407a commit c3a6ef3

File tree

3 files changed

+54
-41
lines changed

3 files changed

+54
-41
lines changed

drivers/hid/wacom_sys.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2372,13 +2372,6 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
23722372
if (error)
23732373
goto fail;
23742374

2375-
if (!(features->device_type & WACOM_DEVICETYPE_WL_MONITOR) &&
2376-
(features->quirks & WACOM_QUIRK_BATTERY)) {
2377-
error = wacom_initialize_battery(wacom);
2378-
if (error)
2379-
goto fail;
2380-
}
2381-
23822375
error = wacom_register_inputs(wacom);
23832376
if (error)
23842377
goto fail;
@@ -2509,9 +2502,6 @@ static void wacom_wireless_work(struct work_struct *work)
25092502

25102503
strscpy(wacom_wac->name, wacom_wac1->name,
25112504
sizeof(wacom_wac->name));
2512-
error = wacom_initialize_battery(wacom);
2513-
if (error)
2514-
goto fail;
25152505
}
25162506

25172507
return;

drivers/hid/wacom_wac.c

Lines changed: 53 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ static void wacom_notify_battery(struct wacom_wac *wacom_wac,
113113
bool bat_connected, bool ps_connected)
114114
{
115115
struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
116+
bool bat_initialized = wacom->battery.battery;
117+
bool has_quirk = wacom_wac->features.quirks & WACOM_QUIRK_BATTERY;
118+
119+
if (bat_initialized != has_quirk)
120+
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
116121

117122
__wacom_notify_battery(&wacom->battery, bat_status, bat_capacity,
118123
bat_charging, bat_connected, ps_connected);
@@ -1308,6 +1313,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13081313

13091314
struct input_dev *pen_input = wacom->pen_input;
13101315
unsigned char *data = wacom->data;
1316+
int number_of_valid_frames = 0;
1317+
int time_interval = 15000000;
1318+
ktime_t time_packet_received = ktime_get();
13111319
int i;
13121320

13131321
if (wacom->features.type == INTUOSP2_BT ||
@@ -1328,12 +1336,30 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13281336
wacom->id[0] |= (wacom->serial[0] >> 32) & 0xFFFFF;
13291337
}
13301338

1339+
/* number of valid frames */
13311340
for (i = 0; i < pen_frames; i++) {
13321341
unsigned char *frame = &data[i*pen_frame_len + 1];
13331342
bool valid = frame[0] & 0x80;
1343+
1344+
if (valid)
1345+
number_of_valid_frames++;
1346+
}
1347+
1348+
if (number_of_valid_frames) {
1349+
if (wacom->hid_data.time_delayed)
1350+
time_interval = ktime_get() - wacom->hid_data.time_delayed;
1351+
time_interval /= number_of_valid_frames;
1352+
wacom->hid_data.time_delayed = time_packet_received;
1353+
}
1354+
1355+
for (i = 0; i < number_of_valid_frames; i++) {
1356+
unsigned char *frame = &data[i*pen_frame_len + 1];
1357+
bool valid = frame[0] & 0x80;
13341358
bool prox = frame[0] & 0x40;
13351359
bool range = frame[0] & 0x20;
13361360
bool invert = frame[0] & 0x10;
1361+
int frames_number_reversed = number_of_valid_frames - i - 1;
1362+
int event_timestamp = time_packet_received - frames_number_reversed * time_interval;
13371363

13381364
if (!valid)
13391365
continue;
@@ -1346,6 +1372,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13461372
wacom->tool[0] = 0;
13471373
wacom->id[0] = 0;
13481374
wacom->serial[0] = 0;
1375+
wacom->hid_data.time_delayed = 0;
13491376
return;
13501377
}
13511378

@@ -1382,6 +1409,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13821409
get_unaligned_le16(&frame[11]));
13831410
}
13841411
}
1412+
13851413
if (wacom->tool[0]) {
13861414
input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5]));
13871415
if (wacom->features.type == INTUOSP2_BT ||
@@ -1405,6 +1433,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
14051433

14061434
wacom->shared->stylus_in_proximity = prox;
14071435

1436+
/* add timestamp to unpack the frames */
1437+
input_set_timestamp(pen_input, event_timestamp);
1438+
14081439
input_sync(pen_input);
14091440
}
14101441
}
@@ -1895,6 +1926,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
18951926
int fmax = field->logical_maximum;
18961927
unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
18971928
int resolution_code = code;
1929+
int resolution = hidinput_calc_abs_res(field, resolution_code);
18981930

18991931
if (equivalent_usage == HID_DG_TWIST) {
19001932
resolution_code = ABS_RZ;
@@ -1915,8 +1947,15 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
19151947
switch (type) {
19161948
case EV_ABS:
19171949
input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
1918-
input_abs_set_res(input, code,
1919-
hidinput_calc_abs_res(field, resolution_code));
1950+
1951+
/* older tablet may miss physical usage */
1952+
if ((code == ABS_X || code == ABS_Y) && !resolution) {
1953+
resolution = WACOM_INTUOS_RES;
1954+
hid_warn(input,
1955+
"Wacom usage (%d) missing resolution \n",
1956+
code);
1957+
}
1958+
input_abs_set_res(input, code, resolution);
19201959
break;
19211960
case EV_KEY:
19221961
case EV_MSC:
@@ -1929,18 +1968,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
19291968
static void wacom_wac_battery_usage_mapping(struct hid_device *hdev,
19301969
struct hid_field *field, struct hid_usage *usage)
19311970
{
1932-
struct wacom *wacom = hid_get_drvdata(hdev);
1933-
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1934-
struct wacom_features *features = &wacom_wac->features;
1935-
unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1936-
1937-
switch (equivalent_usage) {
1938-
case HID_DG_BATTERYSTRENGTH:
1939-
case WACOM_HID_WD_BATTERY_LEVEL:
1940-
case WACOM_HID_WD_BATTERY_CHARGING:
1941-
features->quirks |= WACOM_QUIRK_BATTERY;
1942-
break;
1943-
}
1971+
return;
19441972
}
19451973

19461974
static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *field,
@@ -1961,18 +1989,21 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f
19611989
wacom_wac->hid_data.bat_connected = 1;
19621990
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
19631991
}
1992+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
19641993
break;
19651994
case WACOM_HID_WD_BATTERY_LEVEL:
19661995
value = value * 100 / (field->logical_maximum - field->logical_minimum);
19671996
wacom_wac->hid_data.battery_capacity = value;
19681997
wacom_wac->hid_data.bat_connected = 1;
19691998
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
1999+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
19702000
break;
19712001
case WACOM_HID_WD_BATTERY_CHARGING:
19722002
wacom_wac->hid_data.bat_charging = value;
19732003
wacom_wac->hid_data.ps_connected = value;
19742004
wacom_wac->hid_data.bat_connected = 1;
19752005
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
2006+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
19762007
break;
19772008
}
19782009
}
@@ -1988,18 +2019,15 @@ static void wacom_wac_battery_report(struct hid_device *hdev,
19882019
{
19892020
struct wacom *wacom = hid_get_drvdata(hdev);
19902021
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1991-
struct wacom_features *features = &wacom_wac->features;
19922022

1993-
if (features->quirks & WACOM_QUIRK_BATTERY) {
1994-
int status = wacom_wac->hid_data.bat_status;
1995-
int capacity = wacom_wac->hid_data.battery_capacity;
1996-
bool charging = wacom_wac->hid_data.bat_charging;
1997-
bool connected = wacom_wac->hid_data.bat_connected;
1998-
bool powered = wacom_wac->hid_data.ps_connected;
2023+
int status = wacom_wac->hid_data.bat_status;
2024+
int capacity = wacom_wac->hid_data.battery_capacity;
2025+
bool charging = wacom_wac->hid_data.bat_charging;
2026+
bool connected = wacom_wac->hid_data.bat_connected;
2027+
bool powered = wacom_wac->hid_data.ps_connected;
19992028

2000-
wacom_notify_battery(wacom_wac, status, capacity, charging,
2001-
connected, powered);
2002-
}
2029+
wacom_notify_battery(wacom_wac, status, capacity, charging,
2030+
connected, powered);
20032031
}
20042032

20052033
static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
@@ -3365,19 +3393,13 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
33653393
int battery = (data[8] & 0x3f) * 100 / 31;
33663394
bool charging = !!(data[8] & 0x80);
33673395

3396+
features->quirks |= WACOM_QUIRK_BATTERY;
33683397
wacom_notify_battery(wacom_wac, WACOM_POWER_SUPPLY_STATUS_AUTO,
33693398
battery, charging, battery || charging, 1);
3370-
3371-
if (!wacom->battery.battery &&
3372-
!(features->quirks & WACOM_QUIRK_BATTERY)) {
3373-
features->quirks |= WACOM_QUIRK_BATTERY;
3374-
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
3375-
}
33763399
}
33773400
else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
33783401
wacom->battery.battery) {
33793402
features->quirks &= ~WACOM_QUIRK_BATTERY;
3380-
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
33813403
wacom_notify_battery(wacom_wac, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0);
33823404
}
33833405
return 0;

drivers/hid/wacom_wac.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ struct hid_data {
324324
int ps_connected;
325325
bool pad_input_event_flag;
326326
unsigned short sequence_number;
327+
int time_delayed;
327328
};
328329

329330
struct wacom_remote_data {

0 commit comments

Comments
 (0)