#include "hid-ids.h"
 
-/* Driver data */
-struct uclogic_drvdata {
-       /* Interface parameters */
-       struct uclogic_params params;
-       /* Pointer to the replacement report descriptor. NULL if none. */
-       __u8 *desc_ptr;
-       /*
-        * Size of the replacement report descriptor.
-        * Only valid if desc_ptr is not NULL
-        */
-       unsigned int desc_size;
-       /* Pen input device */
-       struct input_dev *pen_input;
-       /* In-range timer */
-       struct timer_list inrange_timer;
-       /* Last rotary encoder state, or U8_MAX for none */
-       u8 re_state;
-};
-
 /**
  * uclogic_inrange_timeout - handle pen in-range state timeout.
  * Emulate input events normally generated when pen goes out of range for
        }
        timer_setup(&drvdata->inrange_timer, uclogic_inrange_timeout, 0);
        drvdata->re_state = U8_MAX;
+       drvdata->quirks = id->driver_data;
        hid_set_drvdata(hdev, drvdata);
 
        /* Initialize the device and retrieve interface parameters */
 
                                       struct hid_device *hdev)
 {
        int rc = 0;
+       struct uclogic_drvdata *drvdata;
        struct usb_interface *iface;
        __u8 bInterfaceNumber;
        const int str_desc_len = 12;
                goto cleanup;
        }
 
+       drvdata = hid_get_drvdata(hdev);
        iface = to_usb_interface(hdev->dev.parent);
        bInterfaceNumber = iface->cur_altsetting->desc.bInterfaceNumber;
 
        p.pen.subreport_list[0].id = UCLOGIC_RDESC_V1_FRAME_ID;
 
        /* Initialize the frame interface */
+       if (drvdata->quirks & UCLOGIC_MOUSE_FRAME_QUIRK)
+               frame_type = UCLOGIC_PARAMS_FRAME_MOUSE;
+
        switch (frame_type) {
        case UCLOGIC_PARAMS_FRAME_DIAL:
        case UCLOGIC_PARAMS_FRAME_MOUSE:
 
 #include <linux/usb.h>
 #include <linux/hid.h>
 
+#define UCLOGIC_MOUSE_FRAME_QUIRK      BIT(0)
+
 /* Types of pen in-range reporting */
 enum uclogic_params_pen_inrange {
        /* Normal reports: zero - out of proximity, one - in proximity */
        struct uclogic_params_frame frame_list[3];
 };
 
+/* Driver data */
+struct uclogic_drvdata {
+       /* Interface parameters */
+       struct uclogic_params params;
+       /* Pointer to the replacement report descriptor. NULL if none. */
+       __u8 *desc_ptr;
+       /*
+        * Size of the replacement report descriptor.
+        * Only valid if desc_ptr is not NULL
+        */
+       unsigned int desc_size;
+       /* Pen input device */
+       struct input_dev *pen_input;
+       /* In-range timer */
+       struct timer_list inrange_timer;
+       /* Last rotary encoder state, or U8_MAX for none */
+       u8 re_state;
+       /* Device quirks */
+       unsigned long quirks;
+};
+
 /* Initialize a tablet interface and discover its parameters */
 extern int uclogic_params_init(struct uclogic_params *params,
                                struct hid_device *hdev);