@@ -123,6 +123,11 @@ static void wacom_notify_battery(struct wacom_wac *wacom_wac,
123
123
bool bat_connected , bool ps_connected )
124
124
{
125
125
struct wacom * wacom = container_of (wacom_wac , struct wacom , wacom_wac );
126
+ bool bat_initialized = wacom -> battery .battery ;
127
+ bool has_quirk = wacom_wac -> features .quirks & WACOM_QUIRK_BATTERY ;
128
+
129
+ if (bat_initialized != has_quirk )
130
+ wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
126
131
127
132
__wacom_notify_battery (& wacom -> battery , bat_status , bat_capacity ,
128
133
bat_charging , bat_connected , ps_connected );
@@ -836,7 +841,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
836
841
/* Enter report */
837
842
if ((data [1 ] & 0xfc ) == 0xc0 ) {
838
843
/* serial number of the tool */
839
- wacom -> serial [idx ] = ((data [3 ] & 0x0f ) << 28 ) +
844
+ wacom -> serial [idx ] = ((__u64 )( data [3 ] & 0x0f ) << 28 ) +
840
845
(data [4 ] << 20 ) + (data [5 ] << 12 ) +
841
846
(data [6 ] << 4 ) + (data [7 ] >> 4 );
842
847
@@ -1985,18 +1990,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
1985
1990
static void wacom_wac_battery_usage_mapping (struct hid_device * hdev ,
1986
1991
struct hid_field * field , struct hid_usage * usage )
1987
1992
{
1988
- struct wacom * wacom = hid_get_drvdata (hdev );
1989
- struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1990
- struct wacom_features * features = & wacom_wac -> features ;
1991
- unsigned equivalent_usage = wacom_equivalent_usage (usage -> hid );
1992
-
1993
- switch (equivalent_usage ) {
1994
- case HID_DG_BATTERYSTRENGTH :
1995
- case WACOM_HID_WD_BATTERY_LEVEL :
1996
- case WACOM_HID_WD_BATTERY_CHARGING :
1997
- features -> quirks |= WACOM_QUIRK_BATTERY ;
1998
- break ;
1999
- }
1993
+ return ;
2000
1994
}
2001
1995
2002
1996
static void wacom_wac_battery_event (struct hid_device * hdev , struct hid_field * field ,
@@ -2017,18 +2011,21 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f
2017
2011
wacom_wac -> hid_data .bat_connected = 1 ;
2018
2012
wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
2019
2013
}
2014
+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
2020
2015
break ;
2021
2016
case WACOM_HID_WD_BATTERY_LEVEL :
2022
2017
value = value * 100 / (field -> logical_maximum - field -> logical_minimum );
2023
2018
wacom_wac -> hid_data .battery_capacity = value ;
2024
2019
wacom_wac -> hid_data .bat_connected = 1 ;
2025
2020
wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
2021
+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
2026
2022
break ;
2027
2023
case WACOM_HID_WD_BATTERY_CHARGING :
2028
2024
wacom_wac -> hid_data .bat_charging = value ;
2029
2025
wacom_wac -> hid_data .ps_connected = value ;
2030
2026
wacom_wac -> hid_data .bat_connected = 1 ;
2031
2027
wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
2028
+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
2032
2029
break ;
2033
2030
}
2034
2031
}
@@ -2044,18 +2041,15 @@ static void wacom_wac_battery_report(struct hid_device *hdev,
2044
2041
{
2045
2042
struct wacom * wacom = hid_get_drvdata (hdev );
2046
2043
struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
2047
- struct wacom_features * features = & wacom_wac -> features ;
2048
2044
2049
- if (features -> quirks & WACOM_QUIRK_BATTERY ) {
2050
- int status = wacom_wac -> hid_data .bat_status ;
2051
- int capacity = wacom_wac -> hid_data .battery_capacity ;
2052
- bool charging = wacom_wac -> hid_data .bat_charging ;
2053
- bool connected = wacom_wac -> hid_data .bat_connected ;
2054
- bool powered = wacom_wac -> hid_data .ps_connected ;
2045
+ int status = wacom_wac -> hid_data .bat_status ;
2046
+ int capacity = wacom_wac -> hid_data .battery_capacity ;
2047
+ bool charging = wacom_wac -> hid_data .bat_charging ;
2048
+ bool connected = wacom_wac -> hid_data .bat_connected ;
2049
+ bool powered = wacom_wac -> hid_data .ps_connected ;
2055
2050
2056
- wacom_notify_battery (wacom_wac , status , capacity , charging ,
2057
- connected , powered );
2058
- }
2051
+ wacom_notify_battery (wacom_wac , status , capacity , charging ,
2052
+ connected , powered );
2059
2053
}
2060
2054
2061
2055
static void wacom_wac_pad_usage_mapping (struct hid_device * hdev ,
@@ -3421,19 +3415,13 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
3421
3415
int battery = (data [8 ] & 0x3f ) * 100 / 31 ;
3422
3416
bool charging = !!(data [8 ] & 0x80 );
3423
3417
3418
+ features -> quirks |= WACOM_QUIRK_BATTERY ;
3424
3419
wacom_notify_battery (wacom_wac , WACOM_POWER_SUPPLY_STATUS_AUTO ,
3425
3420
battery , charging , battery || charging , 1 );
3426
-
3427
- if (!wacom -> battery .battery &&
3428
- !(features -> quirks & WACOM_QUIRK_BATTERY )) {
3429
- features -> quirks |= WACOM_QUIRK_BATTERY ;
3430
- wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
3431
- }
3432
3421
}
3433
3422
else if ((features -> quirks & WACOM_QUIRK_BATTERY ) &&
3434
3423
wacom -> battery .battery ) {
3435
3424
features -> quirks &= ~WACOM_QUIRK_BATTERY ;
3436
- wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
3437
3425
wacom_notify_battery (wacom_wac , POWER_SUPPLY_STATUS_UNKNOWN , 0 , 0 , 0 , 0 );
3438
3426
}
3439
3427
return 0 ;
0 commit comments