From 3862db58b117b7e7d5f82bc83788ed25f23f8913 Mon Sep 17 00:00:00 2001 From: Tatsunosuke Tobita Date: Fri, 15 Dec 2023 13:20:44 +0900 Subject: [PATCH] HID: wacom: Remove AES power_supply after extended inactivity 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 Reviewed-by: Jason Gerecke Reviewed-by: Aaron Skomra Reviewed-by: Josh Dickens Link: https://lore.kernel.org/r/20231114235729.6867-1-tatsunosuke.wacom@gmail.com Signed-off-by: Benjamin Tissoires [tatsunosuke.tobita@wacom.com: Imported into input-wacom (fd2a9b29dc9c)] Signed-off-by: Tatsunosuke Tobita Fixes:fd2a9b29dc9c ("HID: wacom: Remove AES power_supply after extended inactivity") --- 4.5/wacom.h | 1 + 4.5/wacom_sys.c | 8 ++++++++ 4.5/wacom_wac.c | 12 +++++++++++- 4.5/wacom_wac.h | 1 + 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/4.5/wacom.h b/4.5/wacom.h index a259469b..ce31055d 100644 --- a/4.5/wacom.h +++ b/4.5/wacom.h @@ -182,6 +182,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; diff --git a/4.5/wacom_sys.c b/4.5/wacom_sys.c index d98375c3..96f3689c 100644 --- a/4.5/wacom_sys.c +++ b/4.5/wacom_sys.c @@ -1871,6 +1871,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) @@ -2873,6 +2880,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); diff --git a/4.5/wacom_wac.c b/4.5/wacom_wac.c index 9fb007ac..6e137756 100644 --- a/4.5/wacom_wac.c +++ b/4.5/wacom_wac.c @@ -2554,11 +2554,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; @@ -2609,6 +2610,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; diff --git a/4.5/wacom_wac.h b/4.5/wacom_wac.h index a7c5c75a..aa2c2c94 100644 --- a/4.5/wacom_wac.h +++ b/4.5/wacom_wac.h @@ -17,6 +17,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