2222
2323#include "hid-ids.h"
2424
25- /* Driver data */
26- struct uclogic_drvdata {
27- /* Interface parameters */
28- struct uclogic_params params ;
29- /* Pointer to the replacement report descriptor. NULL if none. */
30- __u8 * desc_ptr ;
31- /*
32- * Size of the replacement report descriptor.
33- * Only valid if desc_ptr is not NULL
34- */
35- unsigned int desc_size ;
36- /* Pen input device */
37- struct input_dev * pen_input ;
38- /* In-range timer */
39- struct timer_list inrange_timer ;
40- /* Last rotary encoder state, or U8_MAX for none */
41- u8 re_state ;
42- };
43-
4425/**
4526 * uclogic_inrange_timeout - handle pen in-range state timeout.
4627 * Emulate input events normally generated when pen goes out of range for
@@ -202,6 +183,7 @@ static int uclogic_probe(struct hid_device *hdev,
202183 }
203184 timer_setup (& drvdata -> inrange_timer , uclogic_inrange_timeout , 0 );
204185 drvdata -> re_state = U8_MAX ;
186+ drvdata -> quirks = id -> driver_data ;
205187 hid_set_drvdata (hdev , drvdata );
206188
207189 /* Initialize the device and retrieve interface parameters */
@@ -267,6 +249,34 @@ static int uclogic_resume(struct hid_device *hdev)
267249}
268250#endif
269251
252+ /**
253+ * uclogic_exec_event_hook - if the received event is hooked schedules the
254+ * associated work.
255+ *
256+ * @p: Tablet interface report parameters.
257+ * @event: Raw event.
258+ * @size: The size of event.
259+ *
260+ * Returns:
261+ * Whether the event was hooked or not.
262+ */
263+ static bool uclogic_exec_event_hook (struct uclogic_params * p , u8 * event , int size )
264+ {
265+ struct uclogic_raw_event_hook * curr ;
266+
267+ if (!p -> event_hooks )
268+ return false;
269+
270+ list_for_each_entry (curr , & p -> event_hooks -> list , list ) {
271+ if (curr -> size == size && memcmp (curr -> event , event , size ) == 0 ) {
272+ schedule_work (& curr -> work );
273+ return true;
274+ }
275+ }
276+
277+ return false;
278+ }
279+
270280/**
271281 * uclogic_raw_event_pen - handle raw pen events (pen HID reports).
272282 *
@@ -425,6 +435,9 @@ static int uclogic_raw_event(struct hid_device *hdev,
425435 if (report -> type != HID_INPUT_REPORT )
426436 return 0 ;
427437
438+ if (uclogic_exec_event_hook (params , data , size ))
439+ return 0 ;
440+
428441 while (true) {
429442 /* Tweak pen reports, if necessary */
430443 if ((report_id == params -> pen .id ) && (size >= 2 )) {
@@ -529,8 +542,14 @@ static const struct hid_device_id uclogic_devices[] = {
529542 USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO01_V2 ) },
530543 { HID_USB_DEVICE (USB_VENDOR_ID_UGEE ,
531544 USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_L ) },
545+ { HID_USB_DEVICE (USB_VENDOR_ID_UGEE ,
546+ USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_PRO_MW ),
547+ .driver_data = UCLOGIC_MOUSE_FRAME_QUIRK | UCLOGIC_BATTERY_QUIRK },
532548 { HID_USB_DEVICE (USB_VENDOR_ID_UGEE ,
533549 USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_PRO_S ) },
550+ { HID_USB_DEVICE (USB_VENDOR_ID_UGEE ,
551+ USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_PRO_SW ),
552+ .driver_data = UCLOGIC_MOUSE_FRAME_QUIRK | UCLOGIC_BATTERY_QUIRK },
534553 { HID_USB_DEVICE (USB_VENDOR_ID_UGEE ,
535554 USB_DEVICE_ID_UGEE_XPPEN_TABLET_STAR06 ) },
536555 { }
@@ -556,3 +575,7 @@ module_hid_driver(uclogic_driver);
556575MODULE_AUTHOR ("Martin Rusko" );
557576MODULE_AUTHOR ("Nikolai Kondrashov" );
558577MODULE_LICENSE ("GPL" );
578+
579+ #ifdef CONFIG_HID_KUNIT_TEST
580+ #include "hid-uclogic-core-test.c"
581+ #endif
0 commit comments