Skip to content

Commit cfb8236

Browse files
committed
backport: HID: wacom: generic: Set battery quirk only when we see battery data
Some devices will include battery status usages in the HID descriptor but we won't see that battery data for one reason or another. For example, AES sensors won't send battery data unless an AES pen is in proximity. If a user does not have an AES pen but instead only interacts with the AES touchscreen with their fingers then there is no need for us to create a battery object. Similarly, if a family of peripherals shares the same HID descriptor between wired-only and wireless-capable SKUs, users of the former may never see a battery event and will not want a power_supply object created. Link: https://bugzilla.kernel.org/show_bug.cgi?id=217062 Link: https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2354 Signed-off-by: Jason Gerecke <[email protected]> Tested-by: Mario Limonciello <[email protected]> Signed-off-by: Jiri Kosina <[email protected]> [[email protected]: Imported into input-wacom (bea407a427ba)] Signed-off-by: Jason Gerecke <[email protected]> [[email protected]: Backported form input-wacom (4546bff)] Signed-off-by: Jason Gerecke <[email protected]>
1 parent f0f55d7 commit cfb8236

File tree

3 files changed

+19
-46
lines changed

3 files changed

+19
-46
lines changed

3.17/wacom_wac.c

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,18 +1959,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
19591959
static void wacom_wac_battery_usage_mapping(struct hid_device *hdev,
19601960
struct hid_field *field, struct hid_usage *usage)
19611961
{
1962-
struct wacom *wacom = hid_get_drvdata(hdev);
1963-
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1964-
struct wacom_features *features = &wacom_wac->features;
1965-
unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1966-
1967-
switch (equivalent_usage) {
1968-
case HID_DG_BATTERYSTRENGTH:
1969-
case WACOM_HID_WD_BATTERY_LEVEL:
1970-
case WACOM_HID_WD_BATTERY_CHARGING:
1971-
features->quirks |= WACOM_QUIRK_BATTERY;
1972-
break;
1973-
}
1962+
return;
19741963
}
19751964

19761965
static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *field,
@@ -1991,18 +1980,21 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f
19911980
wacom_wac->hid_data.bat_connected = 1;
19921981
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
19931982
}
1983+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
19941984
break;
19951985
case WACOM_HID_WD_BATTERY_LEVEL:
19961986
value = value * 100 / (field->logical_maximum - field->logical_minimum);
19971987
wacom_wac->hid_data.battery_capacity = value;
19981988
wacom_wac->hid_data.bat_connected = 1;
19991989
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
1990+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
20001991
break;
20011992
case WACOM_HID_WD_BATTERY_CHARGING:
20021993
wacom_wac->hid_data.bat_charging = value;
20031994
wacom_wac->hid_data.ps_connected = value;
20041995
wacom_wac->hid_data.bat_connected = 1;
20051996
wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
1997+
wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY;
20061998
break;
20071999
}
20082000
}
@@ -2018,18 +2010,15 @@ static void wacom_wac_battery_report(struct hid_device *hdev,
20182010
{
20192011
struct wacom *wacom = hid_get_drvdata(hdev);
20202012
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2021-
struct wacom_features *features = &wacom_wac->features;
20222013

2023-
if (features->quirks & WACOM_QUIRK_BATTERY) {
2024-
int status = wacom_wac->hid_data.bat_status;
2025-
int capacity = wacom_wac->hid_data.battery_capacity;
2026-
bool charging = wacom_wac->hid_data.bat_charging;
2027-
bool connected = wacom_wac->hid_data.bat_connected;
2028-
bool powered = wacom_wac->hid_data.ps_connected;
2014+
int status = wacom_wac->hid_data.bat_status;
2015+
int capacity = wacom_wac->hid_data.battery_capacity;
2016+
bool charging = wacom_wac->hid_data.bat_charging;
2017+
bool connected = wacom_wac->hid_data.bat_connected;
2018+
bool powered = wacom_wac->hid_data.ps_connected;
20292019

2030-
wacom_notify_battery(wacom_wac, status, capacity, charging,
2031-
connected, powered);
2032-
}
2020+
wacom_notify_battery(wacom_wac, status, capacity, charging,
2021+
connected, powered);
20332022
}
20342023

20352024
static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,

3.7/wacom_sys.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,18 +1753,13 @@ static int wacom_remote_create_one(struct wacom *wacom, u32 serial,
17531753
static int wacom_remote_attach_battery(struct wacom *wacom, int index)
17541754
{
17551755
struct wacom_remote *remote = wacom->remote;
1756-
int error;
1756+
17571757
if (!remote->remotes[index].registered)
17581758
return 0;
17591759

17601760
if (WACOM_POWERSUPPLY_DEVICE(remote->remotes[index].battery.battery))
17611761
return 0;
17621762

1763-
error = __wacom_initialize_battery(wacom,
1764-
&wacom->remote->remotes[index].battery);
1765-
if (error)
1766-
return error;
1767-
17681763
return 0;
17691764
}
17701765

@@ -1894,10 +1889,6 @@ static void wacom_wireless_work(struct work_struct *work)
18941889
wacom_wac->shared->touch_input = wacom_wac2->input;
18951890
}
18961891
}
1897-
1898-
error = wacom_initialize_battery(wacom);
1899-
if (error)
1900-
goto fail;
19011892
}
19021893

19031894
return;

3.7/wacom_wac.c

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ static void wacom_notify_battery(struct wacom_wac *wacom_wac,
7777
bool bat_connected, bool ps_connected)
7878
{
7979
struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
80+
bool bat_initialized = WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery);
81+
bool has_quirk = wacom_wac->features.quirks & WACOM_QUIRK_BATTERY;
82+
83+
if (bat_initialized != has_quirk)
84+
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
8085

8186
__wacom_notify_battery(&wacom->battery, bat_status, bat_capacity,
8287
bat_charging, bat_connected, ps_connected);
@@ -1839,19 +1844,13 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
18391844
int battery = (data[8] & 0x3f) * 100 / 31;
18401845
bool charging = !!(data[8] & 0x80);
18411846

1847+
features->quirks |= WACOM_QUIRK_BATTERY;
18421848
wacom_notify_battery(wacom_wac, WACOM_POWER_SUPPLY_STATUS_AUTO,
18431849
battery, charging, battery || charging, 1);
1844-
1845-
if (!WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery) &&
1846-
!(features->quirks & WACOM_QUIRK_BATTERY)) {
1847-
features->quirks |= WACOM_QUIRK_BATTERY;
1848-
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
1849-
}
18501850
}
18511851
else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
18521852
WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery)) {
18531853
features->quirks &= ~WACOM_QUIRK_BATTERY;
1854-
wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
18551854
wacom_notify_battery(wacom_wac, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0);
18561855
}
18571856
return 0;
@@ -1878,7 +1877,6 @@ static void wacom_mspro_touch_toggle(struct wacom_wac *wacom)
18781877

18791878
static int wacom_mspro_device_irq(struct wacom_wac *wacom)
18801879
{
1881-
struct wacom *w = container_of(wacom, struct wacom, wacom_wac);
18821880
struct wacom_features *features = &wacom->features;
18831881
unsigned char *data = wacom->data;
18841882
bool bat_charging;
@@ -1887,12 +1885,7 @@ static int wacom_mspro_device_irq(struct wacom_wac *wacom)
18871885
battery_level = data[1] & 0x7F;
18881886
bat_charging = data[1] & 0x80;
18891887

1890-
if (!WACOM_POWERSUPPLY_DEVICE(w->battery.battery) &&
1891-
!(features->quirks & WACOM_QUIRK_BATTERY)) {
1892-
features->quirks |= WACOM_QUIRK_BATTERY;
1893-
wacom_schedule_work(wacom, WACOM_WORKER_BATTERY);
1894-
}
1895-
1888+
features->quirks |= WACOM_QUIRK_BATTERY;
18961889
wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
18971890
battery_level, bat_charging, 1, bat_charging);
18981891

0 commit comments

Comments
 (0)