@@ -113,6 +113,11 @@ static void wacom_notify_battery(struct wacom_wac *wacom_wac,
113113 bool bat_connected , bool ps_connected )
114114{
115115 struct wacom * wacom = container_of (wacom_wac , struct wacom , wacom_wac );
116+ bool bat_initialized = wacom -> battery .battery ;
117+ bool has_quirk = wacom_wac -> features .quirks & WACOM_QUIRK_BATTERY ;
118+
119+ if (bat_initialized != has_quirk )
120+ wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
116121
117122 __wacom_notify_battery (& wacom -> battery , bat_status , bat_capacity ,
118123 bat_charging , bat_connected , ps_connected );
@@ -1308,6 +1313,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13081313
13091314 struct input_dev * pen_input = wacom -> pen_input ;
13101315 unsigned char * data = wacom -> data ;
1316+ int number_of_valid_frames = 0 ;
1317+ int time_interval = 15000000 ;
1318+ ktime_t time_packet_received = ktime_get ();
13111319 int i ;
13121320
13131321 if (wacom -> features .type == INTUOSP2_BT ||
@@ -1328,12 +1336,30 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13281336 wacom -> id [0 ] |= (wacom -> serial [0 ] >> 32 ) & 0xFFFFF ;
13291337 }
13301338
1339+ /* number of valid frames */
13311340 for (i = 0 ; i < pen_frames ; i ++ ) {
13321341 unsigned char * frame = & data [i * pen_frame_len + 1 ];
13331342 bool valid = frame [0 ] & 0x80 ;
1343+
1344+ if (valid )
1345+ number_of_valid_frames ++ ;
1346+ }
1347+
1348+ if (number_of_valid_frames ) {
1349+ if (wacom -> hid_data .time_delayed )
1350+ time_interval = ktime_get () - wacom -> hid_data .time_delayed ;
1351+ time_interval /= number_of_valid_frames ;
1352+ wacom -> hid_data .time_delayed = time_packet_received ;
1353+ }
1354+
1355+ for (i = 0 ; i < number_of_valid_frames ; i ++ ) {
1356+ unsigned char * frame = & data [i * pen_frame_len + 1 ];
1357+ bool valid = frame [0 ] & 0x80 ;
13341358 bool prox = frame [0 ] & 0x40 ;
13351359 bool range = frame [0 ] & 0x20 ;
13361360 bool invert = frame [0 ] & 0x10 ;
1361+ int frames_number_reversed = number_of_valid_frames - i - 1 ;
1362+ int event_timestamp = time_packet_received - frames_number_reversed * time_interval ;
13371363
13381364 if (!valid )
13391365 continue ;
@@ -1346,6 +1372,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13461372 wacom -> tool [0 ] = 0 ;
13471373 wacom -> id [0 ] = 0 ;
13481374 wacom -> serial [0 ] = 0 ;
1375+ wacom -> hid_data .time_delayed = 0 ;
13491376 return ;
13501377 }
13511378
@@ -1382,6 +1409,7 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
13821409 get_unaligned_le16 (& frame [11 ]));
13831410 }
13841411 }
1412+
13851413 if (wacom -> tool [0 ]) {
13861414 input_report_abs (pen_input , ABS_PRESSURE , get_unaligned_le16 (& frame [5 ]));
13871415 if (wacom -> features .type == INTUOSP2_BT ||
@@ -1405,6 +1433,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
14051433
14061434 wacom -> shared -> stylus_in_proximity = prox ;
14071435
1436+ /* add timestamp to unpack the frames */
1437+ input_set_timestamp (pen_input , event_timestamp );
1438+
14081439 input_sync (pen_input );
14091440 }
14101441}
@@ -1895,6 +1926,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
18951926 int fmax = field -> logical_maximum ;
18961927 unsigned int equivalent_usage = wacom_equivalent_usage (usage -> hid );
18971928 int resolution_code = code ;
1929+ int resolution = hidinput_calc_abs_res (field , resolution_code );
18981930
18991931 if (equivalent_usage == HID_DG_TWIST ) {
19001932 resolution_code = ABS_RZ ;
@@ -1915,8 +1947,15 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
19151947 switch (type ) {
19161948 case EV_ABS :
19171949 input_set_abs_params (input , code , fmin , fmax , fuzz , 0 );
1918- input_abs_set_res (input , code ,
1919- hidinput_calc_abs_res (field , resolution_code ));
1950+
1951+ /* older tablet may miss physical usage */
1952+ if ((code == ABS_X || code == ABS_Y ) && !resolution ) {
1953+ resolution = WACOM_INTUOS_RES ;
1954+ hid_warn (input ,
1955+ "Wacom usage (%d) missing resolution \n" ,
1956+ code );
1957+ }
1958+ input_abs_set_res (input , code , resolution );
19201959 break ;
19211960 case EV_KEY :
19221961 case EV_MSC :
@@ -1929,18 +1968,7 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
19291968static void wacom_wac_battery_usage_mapping (struct hid_device * hdev ,
19301969 struct hid_field * field , struct hid_usage * usage )
19311970{
1932- struct wacom * wacom = hid_get_drvdata (hdev );
1933- struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1934- struct wacom_features * features = & wacom_wac -> features ;
1935- unsigned equivalent_usage = wacom_equivalent_usage (usage -> hid );
1936-
1937- switch (equivalent_usage ) {
1938- case HID_DG_BATTERYSTRENGTH :
1939- case WACOM_HID_WD_BATTERY_LEVEL :
1940- case WACOM_HID_WD_BATTERY_CHARGING :
1941- features -> quirks |= WACOM_QUIRK_BATTERY ;
1942- break ;
1943- }
1971+ return ;
19441972}
19451973
19461974static void wacom_wac_battery_event (struct hid_device * hdev , struct hid_field * field ,
@@ -1961,18 +1989,21 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f
19611989 wacom_wac -> hid_data .bat_connected = 1 ;
19621990 wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
19631991 }
1992+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
19641993 break ;
19651994 case WACOM_HID_WD_BATTERY_LEVEL :
19661995 value = value * 100 / (field -> logical_maximum - field -> logical_minimum );
19671996 wacom_wac -> hid_data .battery_capacity = value ;
19681997 wacom_wac -> hid_data .bat_connected = 1 ;
19691998 wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
1999+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
19702000 break ;
19712001 case WACOM_HID_WD_BATTERY_CHARGING :
19722002 wacom_wac -> hid_data .bat_charging = value ;
19732003 wacom_wac -> hid_data .ps_connected = value ;
19742004 wacom_wac -> hid_data .bat_connected = 1 ;
19752005 wacom_wac -> hid_data .bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO ;
2006+ wacom_wac -> features .quirks |= WACOM_QUIRK_BATTERY ;
19762007 break ;
19772008 }
19782009}
@@ -1988,18 +2019,15 @@ static void wacom_wac_battery_report(struct hid_device *hdev,
19882019{
19892020 struct wacom * wacom = hid_get_drvdata (hdev );
19902021 struct wacom_wac * wacom_wac = & wacom -> wacom_wac ;
1991- struct wacom_features * features = & wacom_wac -> features ;
19922022
1993- if (features -> quirks & WACOM_QUIRK_BATTERY ) {
1994- int status = wacom_wac -> hid_data .bat_status ;
1995- int capacity = wacom_wac -> hid_data .battery_capacity ;
1996- bool charging = wacom_wac -> hid_data .bat_charging ;
1997- bool connected = wacom_wac -> hid_data .bat_connected ;
1998- bool powered = wacom_wac -> hid_data .ps_connected ;
2023+ int status = wacom_wac -> hid_data .bat_status ;
2024+ int capacity = wacom_wac -> hid_data .battery_capacity ;
2025+ bool charging = wacom_wac -> hid_data .bat_charging ;
2026+ bool connected = wacom_wac -> hid_data .bat_connected ;
2027+ bool powered = wacom_wac -> hid_data .ps_connected ;
19992028
2000- wacom_notify_battery (wacom_wac , status , capacity , charging ,
2001- connected , powered );
2002- }
2029+ wacom_notify_battery (wacom_wac , status , capacity , charging ,
2030+ connected , powered );
20032031}
20042032
20052033static void wacom_wac_pad_usage_mapping (struct hid_device * hdev ,
@@ -3365,19 +3393,13 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
33653393 int battery = (data [8 ] & 0x3f ) * 100 / 31 ;
33663394 bool charging = !!(data [8 ] & 0x80 );
33673395
3396+ features -> quirks |= WACOM_QUIRK_BATTERY ;
33683397 wacom_notify_battery (wacom_wac , WACOM_POWER_SUPPLY_STATUS_AUTO ,
33693398 battery , charging , battery || charging , 1 );
3370-
3371- if (!wacom -> battery .battery &&
3372- !(features -> quirks & WACOM_QUIRK_BATTERY )) {
3373- features -> quirks |= WACOM_QUIRK_BATTERY ;
3374- wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
3375- }
33763399 }
33773400 else if ((features -> quirks & WACOM_QUIRK_BATTERY ) &&
33783401 wacom -> battery .battery ) {
33793402 features -> quirks &= ~WACOM_QUIRK_BATTERY ;
3380- wacom_schedule_work (wacom_wac , WACOM_WORKER_BATTERY );
33813403 wacom_notify_battery (wacom_wac , POWER_SUPPLY_STATUS_UNKNOWN , 0 , 0 , 0 , 0 );
33823404 }
33833405 return 0 ;
0 commit comments