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

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


Signed-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent 1f342790
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+8 −0
Original line number Diff line number Diff line
@@ -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);
+11 −1
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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