hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/drivers/hid/wacom_sys.c
....@@ -160,6 +160,9 @@
160160 {
161161 struct wacom *wacom = hid_get_drvdata(hdev);
162162
163
+ if (wacom->wacom_wac.features.type == BOOTLOADER)
164
+ return 0;
165
+
163166 if (size > WACOM_PKGLEN_MAX)
164167 return 1;
165168
....@@ -2416,8 +2419,13 @@
24162419 goto fail_quirks;
24172420 }
24182421
2419
- if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
2422
+ if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) {
24202423 error = hid_hw_open(hdev);
2424
+ if (error) {
2425
+ hid_err(hdev, "hw open failed\n");
2426
+ goto fail_quirks;
2427
+ }
2428
+ }
24212429
24222430 wacom_set_shared_values(wacom_wac);
24232431 devres_close_group(&hdev->dev, wacom);
....@@ -2521,6 +2529,18 @@
25212529 return;
25222530 }
25232531
2532
+static void wacom_remote_destroy_battery(struct wacom *wacom, int index)
2533
+{
2534
+ struct wacom_remote *remote = wacom->remote;
2535
+
2536
+ if (remote->remotes[index].battery.battery) {
2537
+ devres_release_group(&wacom->hdev->dev,
2538
+ &remote->remotes[index].battery.bat_desc);
2539
+ remote->remotes[index].battery.battery = NULL;
2540
+ remote->remotes[index].active_time = 0;
2541
+ }
2542
+}
2543
+
25242544 static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
25252545 {
25262546 struct wacom_remote *remote = wacom->remote;
....@@ -2535,9 +2555,7 @@
25352555 remote->remotes[i].registered = false;
25362556 spin_unlock_irqrestore(&remote->remote_lock, flags);
25372557
2538
- if (remote->remotes[i].battery.battery)
2539
- devres_release_group(&wacom->hdev->dev,
2540
- &remote->remotes[i].battery.bat_desc);
2558
+ wacom_remote_destroy_battery(wacom, i);
25412559
25422560 if (remote->remotes[i].group.name)
25432561 devres_release_group(&wacom->hdev->dev,
....@@ -2545,7 +2563,6 @@
25452563
25462564 remote->remotes[i].serial = 0;
25472565 remote->remotes[i].group.name = NULL;
2548
- remote->remotes[i].battery.battery = NULL;
25492566 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
25502567 }
25512568 }
....@@ -2630,6 +2647,9 @@
26302647 if (remote->remotes[index].battery.battery)
26312648 return 0;
26322649
2650
+ if (!remote->remotes[index].active_time)
2651
+ return 0;
2652
+
26332653 if (wacom->led.groups[index].select == WACOM_STATUS_UNKNOWN)
26342654 return 0;
26352655
....@@ -2645,6 +2665,7 @@
26452665 {
26462666 struct wacom *wacom = container_of(work, struct wacom, remote_work);
26472667 struct wacom_remote *remote = wacom->remote;
2668
+ ktime_t kt = ktime_get();
26482669 struct wacom_remote_data data;
26492670 unsigned long flags;
26502671 unsigned int count;
....@@ -2670,6 +2691,10 @@
26702691 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
26712692 serial = data.remote[i].serial;
26722693 if (data.remote[i].connected) {
2694
+
2695
+ if (kt - remote->remotes[i].active_time > WACOM_REMOTE_BATTERY_TIMEOUT
2696
+ && remote->remotes[i].active_time != 0)
2697
+ wacom_remote_destroy_battery(wacom, i);
26732698
26742699 if (remote->remotes[i].serial == serial) {
26752700 wacom_remote_attach_battery(wacom, i);
....@@ -2778,12 +2803,18 @@
27782803 INIT_WORK(&wacom->battery_work, wacom_battery_work);
27792804 INIT_WORK(&wacom->remote_work, wacom_remote_work);
27802805 INIT_WORK(&wacom->mode_change_work, wacom_mode_change_work);
2806
+ timer_setup(&wacom->idleprox_timer, &wacom_idleprox_timeout, TIMER_DEFERRABLE);
27812807
27822808 /* ask for the report descriptor to be loaded by HID */
27832809 error = hid_parse(hdev);
27842810 if (error) {
27852811 hid_err(hdev, "parse failed\n");
27862812 return error;
2813
+ }
2814
+
2815
+ if (features->type == BOOTLOADER) {
2816
+ hid_warn(hdev, "Using device in hidraw-only mode");
2817
+ return hid_hw_start(hdev, HID_CONNECT_HIDRAW);
27872818 }
27882819
27892820 error = wacom_parse_and_register(wacom, false);
....@@ -2817,6 +2848,7 @@
28172848 cancel_work_sync(&wacom->battery_work);
28182849 cancel_work_sync(&wacom->remote_work);
28192850 cancel_work_sync(&wacom->mode_change_work);
2851
+ del_timer_sync(&wacom->idleprox_timer);
28202852 if (hdev->bus == BUS_BLUETOOTH)
28212853 device_remove_file(&hdev->dev, &dev_attr_speed);
28222854