]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
HID: wacom: Remove AES power_supply after extended inactivity
authorTatsunosuke Tobita <tatsunosuke.wacom@gmail.com>
Tue, 14 Nov 2023 23:57:29 +0000 (08:57 +0900)
committerBenjamin Tissoires <bentiss@kernel.org>
Wed, 29 Nov 2023 15:13:21 +0000 (16:13 +0100)
Even if a user does not use their AES pen for an extended period,
the battery power supply attributes continue to exist.
This results in the desktop showing battery status for a pen
that is no longer in use and which may in fact be in a different
state (e.g. the user may be charging the pen).
To avoid confusion and ensure userspace has an accurate view
of the battery state, this patch automatically removes
the power_supply after 30 minutes of inactivity.

Signed-off-by: Tatsunosuke Tobita <tatsunosuke.tobita@wacom.com>
Reviewed-by: Jason Gerecke <Jason.Gerecke@wacom.com>
Reviewed-by: Aaron Skomra <aaron.skomra@wacom.com>
Reviewed-by: Josh Dickens <joshua.dickens@wacom.com>
Link: https://lore.kernel.org/r/20231114235729.6867-1-tatsunosuke.wacom@gmail.com
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
drivers/hid/wacom.h
drivers/hid/wacom_sys.c
drivers/hid/wacom_wac.c
drivers/hid/wacom_wac.h

index 166a76c9bcad383dfdeb91a1c31bad74d6a3de12..77c5fb26cd14c29bde5aec10a275e2402a5de99b 100644 (file)
@@ -164,6 +164,7 @@ struct wacom {
        struct work_struct battery_work;
        struct work_struct remote_work;
        struct delayed_work init_work;
+       struct delayed_work aes_battery_work;
        struct wacom_remote *remote;
        struct work_struct mode_change_work;
        struct timer_list idleprox_timer;
index 3f704b8072e8a0904dc13de442552719e98d2c47..b613f11ed9498d7045f8649496049dc1b0b91839 100644 (file)
@@ -1813,6 +1813,13 @@ static void wacom_destroy_battery(struct wacom *wacom)
        }
 }
 
+static void wacom_aes_battery_handler(struct work_struct *work)
+{
+       struct wacom *wacom = container_of(work, struct wacom, aes_battery_work.work);
+
+       wacom_destroy_battery(wacom);
+}
+
 static ssize_t wacom_show_speed(struct device *dev,
                                struct device_attribute
                                *attr, char *buf)
@@ -2794,6 +2801,7 @@ static int wacom_probe(struct hid_device *hdev,
 
        mutex_init(&wacom->lock);
        INIT_DELAYED_WORK(&wacom->init_work, wacom_init_work);
+       INIT_DELAYED_WORK(&wacom->aes_battery_work, wacom_aes_battery_handler);
        INIT_WORK(&wacom->wireless_work, wacom_wireless_work);
        INIT_WORK(&wacom->battery_work, wacom_battery_work);
        INIT_WORK(&wacom->remote_work, wacom_remote_work);
index 471db78dbbf02d8d940fe6c69f595a7bb4e1f8bc..c205198ded118cdac7a5c5b70a2dbc3379ddd1f8 100644 (file)
@@ -2528,11 +2528,12 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
        struct input_dev *input = wacom_wac->pen_input;
        bool range = wacom_wac->hid_data.inrange_state;
        bool sense = wacom_wac->hid_data.sense_state;
+       bool entering_range = !wacom_wac->tool[0] && range;
 
        if (wacom_wac->is_invalid_bt_frame)
                return;
 
-       if (!wacom_wac->tool[0] && range) { /* first in range */
+       if (entering_range) { /* first in range */
                /* Going into range select tool */
                if (wacom_wac->hid_data.invert_state)
                        wacom_wac->tool[0] = BTN_TOOL_RUBBER;
@@ -2583,6 +2584,15 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
                input_sync(input);
        }
 
+       /* Handle AES battery timeout behavior */
+       if (wacom_wac->features.quirks & WACOM_QUIRK_AESPEN) {
+               if (entering_range)
+                       cancel_delayed_work(&wacom->aes_battery_work);
+               if (!sense)
+                       schedule_delayed_work(&wacom->aes_battery_work,
+                                             msecs_to_jiffies(WACOM_AES_BATTERY_TIMEOUT));
+       }
+
        if (!sense) {
                wacom_wac->tool[0] = 0;
                wacom_wac->id[0] = 0;
index 57e185f18d53da281b9d7bec4748b4aafdf8c750..e63b1e806e347088822b6a70b720c04272b3187d 100644 (file)
@@ -14,6 +14,7 @@
 #define WACOM_MAX_REMOTES      5
 #define WACOM_STATUS_UNKNOWN   255
 #define WACOM_REMOTE_BATTERY_TIMEOUT   21000000000ll
+#define WACOM_AES_BATTERY_TIMEOUT       1800000
 
 /* packet length for individual models */
 #define WACOM_PKGLEN_BBFUN      9