| .. | .. |
|---|
| 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 | |
|---|