Takashi Iwai afa2f1
From bea407a427baa019758f29f4d31b26f008bb8cc6 Mon Sep 17 00:00:00 2001
Takashi Iwai afa2f1
From: Jason Gerecke <killertofu@gmail.com>
Takashi Iwai afa2f1
Date: Thu, 13 Apr 2023 11:17:43 -0700
Takashi Iwai afa2f1
Subject: [PATCH] HID: wacom: generic: Set battery quirk only when we see battery data
Takashi Iwai afa2f1
Git-commit: bea407a427baa019758f29f4d31b26f008bb8cc6
Takashi Iwai afa2f1
Patch-mainline: v6.4-rc1
Takashi Iwai afa2f1
References: git-fixes
Takashi Iwai afa2f1
Takashi Iwai afa2f1
Some devices will include battery status usages in the HID descriptor
Takashi Iwai afa2f1
but we won't see that battery data for one reason or another. For example,
Takashi Iwai afa2f1
AES sensors won't send battery data unless an AES pen is in proximity.
Takashi Iwai afa2f1
If a user does not have an AES pen but instead only interacts with the
Takashi Iwai afa2f1
AES touchscreen with their fingers then there is no need for us to create
Takashi Iwai afa2f1
a battery object. Similarly, if a family of peripherals shares the same
Takashi Iwai afa2f1
HID descriptor between wired-only and wireless-capable SKUs, users of the
Takashi Iwai afa2f1
former may never see a battery event and will not want a power_supply
Takashi Iwai afa2f1
object created.
Takashi Iwai afa2f1
Takashi Iwai afa2f1
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217062
Takashi Iwai afa2f1
Link: https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2354
Takashi Iwai afa2f1
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Takashi Iwai afa2f1
Tested-by: Mario Limonciello <mario.limonciello@amd.com>
Takashi Iwai afa2f1
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Takashi Iwai afa2f1
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai afa2f1
Takashi Iwai afa2f1
---
Takashi Iwai afa2f1
 drivers/hid/wacom_wac.c | 33 +++++++++++----------------------
Takashi Iwai afa2f1
 1 file changed, 11 insertions(+), 22 deletions(-)
Takashi Iwai afa2f1
Takashi Iwai afa2f1
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
Takashi Iwai afa2f1
index 0351bce362d2..dc0f7d9a992c 100644
Takashi Iwai afa2f1
--- a/drivers/hid/wacom_wac.c
Takashi Iwai afa2f1
+++ b/drivers/hid/wacom_wac.c
Takashi Iwai afa2f1
@@ -1968,18 +1968,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
Takashi Iwai afa2f1
 static void wacom_wac_battery_usage_mapping(struct hid_device *hdev,
Takashi Iwai afa2f1
 		struct hid_field *field, struct hid_usage *usage)
Takashi Iwai afa2f1
 {
Takashi Iwai afa2f1
-	struct wacom *wacom = hid_get_drvdata(hdev);
Takashi Iwai afa2f1
-	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
Takashi Iwai afa2f1
-	struct wacom_features *features = &wacom_wac->features;
Takashi Iwai afa2f1
-	unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
Takashi Iwai afa2f1
-
Takashi Iwai afa2f1
-	switch (equivalent_usage) {
Takashi Iwai afa2f1
-	case HID_DG_BATTERYSTRENGTH:
Takashi Iwai afa2f1
-	case WACOM_HID_WD_BATTERY_LEVEL:
Takashi Iwai afa2f1
-	case WACOM_HID_WD_BATTERY_CHARGING:
Takashi Iwai afa2f1
-		features->quirks |= WACOM_QUIRK_BATTERY;
Takashi Iwai afa2f1
-		break;
Takashi Iwai afa2f1
-	}
Takashi Iwai afa2f1
+	return;
Takashi Iwai afa2f1
 }
Takashi Iwai afa2f1
 
Takashi Iwai afa2f1
 static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *field,
Takashi Iwai afa2f1
@@ -2000,18 +1989,21 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f
Takashi Iwai afa2f1
 			wacom_wac->hid_data.bat_connected = 1;
Takashi Iwai afa2f1
 			wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
Takashi Iwai afa2f1
 		}
Takashi Iwai afa2f1
+		wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
Takashi Iwai afa2f1
 		break;
Takashi Iwai afa2f1
 	case WACOM_HID_WD_BATTERY_LEVEL:
Takashi Iwai afa2f1
 		value = value * 100 / (field->logical_maximum - field->logical_minimum);
Takashi Iwai afa2f1
 		wacom_wac->hid_data.battery_capacity = value;
Takashi Iwai afa2f1
 		wacom_wac->hid_data.bat_connected = 1;
Takashi Iwai afa2f1
 		wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
Takashi Iwai afa2f1
+		wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
Takashi Iwai afa2f1
 		break;
Takashi Iwai afa2f1
 	case WACOM_HID_WD_BATTERY_CHARGING:
Takashi Iwai afa2f1
 		wacom_wac->hid_data.bat_charging = value;
Takashi Iwai afa2f1
 		wacom_wac->hid_data.ps_connected = value;
Takashi Iwai afa2f1
 		wacom_wac->hid_data.bat_connected = 1;
Takashi Iwai afa2f1
 		wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
Takashi Iwai afa2f1
+		wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
Takashi Iwai afa2f1
 		break;
Takashi Iwai afa2f1
 	}
Takashi Iwai afa2f1
 }
Takashi Iwai afa2f1
@@ -2027,18 +2019,15 @@ static void wacom_wac_battery_report(struct hid_device *hdev,
Takashi Iwai afa2f1
 {
Takashi Iwai afa2f1
 	struct wacom *wacom = hid_get_drvdata(hdev);
Takashi Iwai afa2f1
 	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
Takashi Iwai afa2f1
-	struct wacom_features *features = &wacom_wac->features;
Takashi Iwai afa2f1
 
Takashi Iwai afa2f1
-	if (features->quirks & WACOM_QUIRK_BATTERY) {
Takashi Iwai afa2f1
-		int status = wacom_wac->hid_data.bat_status;
Takashi Iwai afa2f1
-		int capacity = wacom_wac->hid_data.battery_capacity;
Takashi Iwai afa2f1
-		bool charging = wacom_wac->hid_data.bat_charging;
Takashi Iwai afa2f1
-		bool connected = wacom_wac->hid_data.bat_connected;
Takashi Iwai afa2f1
-		bool powered = wacom_wac->hid_data.ps_connected;
Takashi Iwai afa2f1
+	int status = wacom_wac->hid_data.bat_status;
Takashi Iwai afa2f1
+	int capacity = wacom_wac->hid_data.battery_capacity;
Takashi Iwai afa2f1
+	bool charging = wacom_wac->hid_data.bat_charging;
Takashi Iwai afa2f1
+	bool connected = wacom_wac->hid_data.bat_connected;
Takashi Iwai afa2f1
+	bool powered = wacom_wac->hid_data.ps_connected;
Takashi Iwai afa2f1
 
Takashi Iwai afa2f1
-		wacom_notify_battery(wacom_wac, status, capacity, charging,
Takashi Iwai afa2f1
-				     connected, powered);
Takashi Iwai afa2f1
-	}
Takashi Iwai afa2f1
+	wacom_notify_battery(wacom_wac, status, capacity, charging,
Takashi Iwai afa2f1
+			     connected, powered);
Takashi Iwai afa2f1
 }
Takashi Iwai afa2f1
 
Takashi Iwai afa2f1
 static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
Takashi Iwai afa2f1
-- 
Takashi Iwai afa2f1
2.35.3
Takashi Iwai afa2f1