Skip to content

Commit d4de578

Browse files
author
Benjamin Tissoires
committed
Merge branch 'for-6.6/wacom' into for-linus
Battery fixes by Aaron Armstrong Skomra
2 parents d5c04a7 + 55ab9b2 commit d4de578

File tree

4 files changed

+37
-19
lines changed

4 files changed

+37
-19
lines changed

drivers/hid/wacom.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ struct wacom_remote {
150150
struct input_dev *input;
151151
bool registered;
152152
struct wacom_battery battery;
153+
ktime_t active_time;
153154
} remotes[WACOM_MAX_REMOTES];
154155
};
155156

drivers/hid/wacom_sys.c

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1997,7 +1997,7 @@ static int wacom_initialize_remotes(struct wacom *wacom)
19971997
spin_lock_init(&remote->remote_lock);
19981998

19991999
error = kfifo_alloc(&remote->remote_fifo,
2000-
5 * sizeof(struct wacom_remote_data),
2000+
5 * sizeof(struct wacom_remote_work_data),
20012001
GFP_KERNEL);
20022002
if (error) {
20032003
hid_err(wacom->hdev, "failed allocating remote_fifo\n");
@@ -2523,6 +2523,18 @@ static void wacom_wireless_work(struct work_struct *work)
25232523
return;
25242524
}
25252525

2526+
static void wacom_remote_destroy_battery(struct wacom *wacom, int index)
2527+
{
2528+
struct wacom_remote *remote = wacom->remote;
2529+
2530+
if (remote->remotes[index].battery.battery) {
2531+
devres_release_group(&wacom->hdev->dev,
2532+
&remote->remotes[index].battery.bat_desc);
2533+
remote->remotes[index].battery.battery = NULL;
2534+
remote->remotes[index].active_time = 0;
2535+
}
2536+
}
2537+
25262538
static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
25272539
{
25282540
struct wacom_remote *remote = wacom->remote;
@@ -2537,17 +2549,14 @@ static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
25372549
remote->remotes[i].registered = false;
25382550
spin_unlock_irqrestore(&remote->remote_lock, flags);
25392551

2540-
if (remote->remotes[i].battery.battery)
2541-
devres_release_group(&wacom->hdev->dev,
2542-
&remote->remotes[i].battery.bat_desc);
2552+
wacom_remote_destroy_battery(wacom, i);
25432553

25442554
if (remote->remotes[i].group.name)
25452555
devres_release_group(&wacom->hdev->dev,
25462556
&remote->remotes[i]);
25472557

25482558
remote->remotes[i].serial = 0;
25492559
remote->remotes[i].group.name = NULL;
2550-
remote->remotes[i].battery.battery = NULL;
25512560
wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
25522561
}
25532562
}
@@ -2632,6 +2641,9 @@ static int wacom_remote_attach_battery(struct wacom *wacom, int index)
26322641
if (remote->remotes[index].battery.battery)
26332642
return 0;
26342643

2644+
if (!remote->remotes[index].active_time)
2645+
return 0;
2646+
26352647
if (wacom->led.groups[index].select == WACOM_STATUS_UNKNOWN)
26362648
return 0;
26372649

@@ -2647,17 +2659,19 @@ static void wacom_remote_work(struct work_struct *work)
26472659
{
26482660
struct wacom *wacom = container_of(work, struct wacom, remote_work);
26492661
struct wacom_remote *remote = wacom->remote;
2650-
struct wacom_remote_data data;
2662+
ktime_t kt = ktime_get();
2663+
struct wacom_remote_work_data remote_work_data;
26512664
unsigned long flags;
26522665
unsigned int count;
2653-
u32 serial;
2666+
u32 work_serial;
26542667
int i;
26552668

26562669
spin_lock_irqsave(&remote->remote_lock, flags);
26572670

2658-
count = kfifo_out(&remote->remote_fifo, &data, sizeof(data));
2671+
count = kfifo_out(&remote->remote_fifo, &remote_work_data,
2672+
sizeof(remote_work_data));
26592673

2660-
if (count != sizeof(data)) {
2674+
if (count != sizeof(remote_work_data)) {
26612675
hid_err(wacom->hdev,
26622676
"workitem triggered without status available\n");
26632677
spin_unlock_irqrestore(&remote->remote_lock, flags);
@@ -2670,18 +2684,22 @@ static void wacom_remote_work(struct work_struct *work)
26702684
spin_unlock_irqrestore(&remote->remote_lock, flags);
26712685

26722686
for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2673-
serial = data.remote[i].serial;
2674-
if (data.remote[i].connected) {
2687+
work_serial = remote_work_data.remote[i].serial;
2688+
if (work_serial) {
2689+
2690+
if (kt - remote->remotes[i].active_time > WACOM_REMOTE_BATTERY_TIMEOUT
2691+
&& remote->remotes[i].active_time != 0)
2692+
wacom_remote_destroy_battery(wacom, i);
26752693

2676-
if (remote->remotes[i].serial == serial) {
2694+
if (remote->remotes[i].serial == work_serial) {
26772695
wacom_remote_attach_battery(wacom, i);
26782696
continue;
26792697
}
26802698

26812699
if (remote->remotes[i].serial)
26822700
wacom_remote_destroy_one(wacom, i);
26832701

2684-
wacom_remote_create_one(wacom, serial, i);
2702+
wacom_remote_create_one(wacom, work_serial, i);
26852703

26862704
} else if (remote->remotes[i].serial) {
26872705
wacom_remote_destroy_one(wacom, i);

drivers/hid/wacom_wac.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,7 @@ static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
11341134
if (index < 0 || !remote->remotes[index].registered)
11351135
goto out;
11361136

1137+
remote->remotes[i].active_time = ktime_get();
11371138
input = remote->remotes[index].input;
11381139

11391140
input_report_key(input, BTN_0, (data[9] & 0x01));
@@ -1196,22 +1197,20 @@ static void wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
11961197
struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
11971198
unsigned char *data = wacom_wac->data;
11981199
struct wacom_remote *remote = wacom->remote;
1199-
struct wacom_remote_data remote_data;
1200+
struct wacom_remote_work_data remote_data;
12001201
unsigned long flags;
12011202
int i, ret;
12021203

12031204
if (data[0] != WACOM_REPORT_DEVICE_LIST)
12041205
return;
12051206

1206-
memset(&remote_data, 0, sizeof(struct wacom_remote_data));
1207+
memset(&remote_data, 0, sizeof(struct wacom_remote_work_data));
12071208

12081209
for (i = 0; i < WACOM_MAX_REMOTES; i++) {
12091210
int j = i * 6;
12101211
int serial = (data[j+6] << 16) + (data[j+5] << 8) + data[j+4];
1211-
bool connected = data[j+2];
12121212

12131213
remote_data.remote[i].serial = serial;
1214-
remote_data.remote[i].connected = connected;
12151214
}
12161215

12171216
spin_lock_irqsave(&remote->remote_lock, flags);

drivers/hid/wacom_wac.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#define WACOM_NAME_MAX 64
1414
#define WACOM_MAX_REMOTES 5
1515
#define WACOM_STATUS_UNKNOWN 255
16+
#define WACOM_REMOTE_BATTERY_TIMEOUT 21000000000ll
1617

1718
/* packet length for individual models */
1819
#define WACOM_PKGLEN_BBFUN 9
@@ -327,10 +328,9 @@ struct hid_data {
327328
ktime_t time_delayed;
328329
};
329330

330-
struct wacom_remote_data {
331+
struct wacom_remote_work_data {
331332
struct {
332333
u32 serial;
333-
bool connected;
334334
} remote[WACOM_MAX_REMOTES];
335335
};
336336

0 commit comments

Comments
 (0)