Commit fd2a9b29 authored by Tatsunosuke Tobita's avatar Tatsunosuke Tobita Committed by Benjamin Tissoires

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: default avatarTatsunosuke Tobita <tatsunosuke.tobita@wacom.com>
Reviewed-by: default avatarJason Gerecke <Jason.Gerecke@wacom.com>
Reviewed-by: default avatarAaron Skomra <aaron.skomra@wacom.com>
Reviewed-by: default avatarJosh Dickens <joshua.dickens@wacom.com>
Link: https://lore.kernel.org/r/20231114235729.6867-1-tatsunosuke.wacom@gmail.comSigned-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent 1f342790
...@@ -164,6 +164,7 @@ struct wacom { ...@@ -164,6 +164,7 @@ struct wacom {
struct work_struct battery_work; struct work_struct battery_work;
struct work_struct remote_work; struct work_struct remote_work;
struct delayed_work init_work; struct delayed_work init_work;
struct delayed_work aes_battery_work;
struct wacom_remote *remote; struct wacom_remote *remote;
struct work_struct mode_change_work; struct work_struct mode_change_work;
struct timer_list idleprox_timer; struct timer_list idleprox_timer;
......
...@@ -1813,6 +1813,13 @@ static void wacom_destroy_battery(struct wacom *wacom) ...@@ -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, static ssize_t wacom_show_speed(struct device *dev,
struct device_attribute struct device_attribute
*attr, char *buf) *attr, char *buf)
...@@ -2794,6 +2801,7 @@ static int wacom_probe(struct hid_device *hdev, ...@@ -2794,6 +2801,7 @@ static int wacom_probe(struct hid_device *hdev,
mutex_init(&wacom->lock); mutex_init(&wacom->lock);
INIT_DELAYED_WORK(&wacom->init_work, wacom_init_work); 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->wireless_work, wacom_wireless_work);
INIT_WORK(&wacom->battery_work, wacom_battery_work); INIT_WORK(&wacom->battery_work, wacom_battery_work);
INIT_WORK(&wacom->remote_work, wacom_remote_work); INIT_WORK(&wacom->remote_work, wacom_remote_work);
......
...@@ -2528,11 +2528,12 @@ static void wacom_wac_pen_report(struct hid_device *hdev, ...@@ -2528,11 +2528,12 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
struct input_dev *input = wacom_wac->pen_input; struct input_dev *input = wacom_wac->pen_input;
bool range = wacom_wac->hid_data.inrange_state; bool range = wacom_wac->hid_data.inrange_state;
bool sense = wacom_wac->hid_data.sense_state; bool sense = wacom_wac->hid_data.sense_state;
bool entering_range = !wacom_wac->tool[0] && range;
if (wacom_wac->is_invalid_bt_frame) if (wacom_wac->is_invalid_bt_frame)
return; return;
if (!wacom_wac->tool[0] && range) { /* first in range */ if (entering_range) { /* first in range */
/* Going into range select tool */ /* Going into range select tool */
if (wacom_wac->hid_data.invert_state) if (wacom_wac->hid_data.invert_state)
wacom_wac->tool[0] = BTN_TOOL_RUBBER; wacom_wac->tool[0] = BTN_TOOL_RUBBER;
...@@ -2583,6 +2584,15 @@ static void wacom_wac_pen_report(struct hid_device *hdev, ...@@ -2583,6 +2584,15 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
input_sync(input); 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) { if (!sense) {
wacom_wac->tool[0] = 0; wacom_wac->tool[0] = 0;
wacom_wac->id[0] = 0; wacom_wac->id[0] = 0;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#define WACOM_MAX_REMOTES 5 #define WACOM_MAX_REMOTES 5
#define WACOM_STATUS_UNKNOWN 255 #define WACOM_STATUS_UNKNOWN 255
#define WACOM_REMOTE_BATTERY_TIMEOUT 21000000000ll #define WACOM_REMOTE_BATTERY_TIMEOUT 21000000000ll
#define WACOM_AES_BATTERY_TIMEOUT 1800000
/* packet length for individual models */ /* packet length for individual models */
#define WACOM_PKGLEN_BBFUN 9 #define WACOM_PKGLEN_BBFUN 9
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment