.. | .. |
---|
160 | 160 | { |
---|
161 | 161 | struct wacom *wacom = hid_get_drvdata(hdev); |
---|
162 | 162 | |
---|
| 163 | + if (wacom->wacom_wac.features.type == BOOTLOADER) |
---|
| 164 | + return 0; |
---|
| 165 | + |
---|
163 | 166 | if (size > WACOM_PKGLEN_MAX) |
---|
164 | 167 | return 1; |
---|
165 | 168 | |
---|
.. | .. |
---|
2416 | 2419 | goto fail_quirks; |
---|
2417 | 2420 | } |
---|
2418 | 2421 | |
---|
2419 | | - if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) |
---|
| 2422 | + if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) { |
---|
2420 | 2423 | error = hid_hw_open(hdev); |
---|
| 2424 | + if (error) { |
---|
| 2425 | + hid_err(hdev, "hw open failed\n"); |
---|
| 2426 | + goto fail_quirks; |
---|
| 2427 | + } |
---|
| 2428 | + } |
---|
2421 | 2429 | |
---|
2422 | 2430 | wacom_set_shared_values(wacom_wac); |
---|
2423 | 2431 | devres_close_group(&hdev->dev, wacom); |
---|
.. | .. |
---|
2521 | 2529 | return; |
---|
2522 | 2530 | } |
---|
2523 | 2531 | |
---|
| 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 | + |
---|
2524 | 2544 | static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index) |
---|
2525 | 2545 | { |
---|
2526 | 2546 | struct wacom_remote *remote = wacom->remote; |
---|
.. | .. |
---|
2535 | 2555 | remote->remotes[i].registered = false; |
---|
2536 | 2556 | spin_unlock_irqrestore(&remote->remote_lock, flags); |
---|
2537 | 2557 | |
---|
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); |
---|
2541 | 2559 | |
---|
2542 | 2560 | if (remote->remotes[i].group.name) |
---|
2543 | 2561 | devres_release_group(&wacom->hdev->dev, |
---|
.. | .. |
---|
2545 | 2563 | |
---|
2546 | 2564 | remote->remotes[i].serial = 0; |
---|
2547 | 2565 | remote->remotes[i].group.name = NULL; |
---|
2548 | | - remote->remotes[i].battery.battery = NULL; |
---|
2549 | 2566 | wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN; |
---|
2550 | 2567 | } |
---|
2551 | 2568 | } |
---|
.. | .. |
---|
2630 | 2647 | if (remote->remotes[index].battery.battery) |
---|
2631 | 2648 | return 0; |
---|
2632 | 2649 | |
---|
| 2650 | + if (!remote->remotes[index].active_time) |
---|
| 2651 | + return 0; |
---|
| 2652 | + |
---|
2633 | 2653 | if (wacom->led.groups[index].select == WACOM_STATUS_UNKNOWN) |
---|
2634 | 2654 | return 0; |
---|
2635 | 2655 | |
---|
.. | .. |
---|
2645 | 2665 | { |
---|
2646 | 2666 | struct wacom *wacom = container_of(work, struct wacom, remote_work); |
---|
2647 | 2667 | struct wacom_remote *remote = wacom->remote; |
---|
| 2668 | + ktime_t kt = ktime_get(); |
---|
2648 | 2669 | struct wacom_remote_data data; |
---|
2649 | 2670 | unsigned long flags; |
---|
2650 | 2671 | unsigned int count; |
---|
.. | .. |
---|
2670 | 2691 | for (i = 0; i < WACOM_MAX_REMOTES; i++) { |
---|
2671 | 2692 | serial = data.remote[i].serial; |
---|
2672 | 2693 | 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); |
---|
2673 | 2698 | |
---|
2674 | 2699 | if (remote->remotes[i].serial == serial) { |
---|
2675 | 2700 | wacom_remote_attach_battery(wacom, i); |
---|
.. | .. |
---|
2778 | 2803 | INIT_WORK(&wacom->battery_work, wacom_battery_work); |
---|
2779 | 2804 | INIT_WORK(&wacom->remote_work, wacom_remote_work); |
---|
2780 | 2805 | INIT_WORK(&wacom->mode_change_work, wacom_mode_change_work); |
---|
| 2806 | + timer_setup(&wacom->idleprox_timer, &wacom_idleprox_timeout, TIMER_DEFERRABLE); |
---|
2781 | 2807 | |
---|
2782 | 2808 | /* ask for the report descriptor to be loaded by HID */ |
---|
2783 | 2809 | error = hid_parse(hdev); |
---|
2784 | 2810 | if (error) { |
---|
2785 | 2811 | hid_err(hdev, "parse failed\n"); |
---|
2786 | 2812 | 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); |
---|
2787 | 2818 | } |
---|
2788 | 2819 | |
---|
2789 | 2820 | error = wacom_parse_and_register(wacom, false); |
---|
.. | .. |
---|
2817 | 2848 | cancel_work_sync(&wacom->battery_work); |
---|
2818 | 2849 | cancel_work_sync(&wacom->remote_work); |
---|
2819 | 2850 | cancel_work_sync(&wacom->mode_change_work); |
---|
| 2851 | + del_timer_sync(&wacom->idleprox_timer); |
---|
2820 | 2852 | if (hdev->bus == BUS_BLUETOOTH) |
---|
2821 | 2853 | device_remove_file(&hdev->dev, &dev_attr_speed); |
---|
2822 | 2854 | |
---|