#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include "hid-ids.h"
#define RAKK_RDESC_USAGE_MAX_OFFSET 17
#define RAKK_RDESC_USAGE_MAX_ORIG 0x03
#define RAKK_RDESC_USAGE_MAX_FIXED 0x05
#define RAKK_RDESC_USB_SIZE 193
#define RAKK_RDESC_DONGLE_SIZE 150
#define RAKK_RDESC_BT_SIZE 89
static const __u8 *rakk_report_fixup(struct hid_device *hdev, __u8 *rdesc,
unsigned int *rsize)
{
if (((*rsize == RAKK_RDESC_USB_SIZE &&
hdev->product == USB_DEVICE_ID_TELINK_RAKK_DASIG_X) ||
(*rsize == RAKK_RDESC_DONGLE_SIZE &&
hdev->product == USB_DEVICE_ID_TELINK_RAKK_DASIG_X_DONGLE) ||
(*rsize == RAKK_RDESC_BT_SIZE &&
hdev->product == USB_DEVICE_ID_TELINK_RAKK_DASIG_X_BT)) &&
rdesc[RAKK_RDESC_USAGE_MAX_OFFSET] == RAKK_RDESC_USAGE_MAX_ORIG) {
hid_info(hdev, "fixing Rakk Dasig X button count (3 -> 5)\n");
rdesc[RAKK_RDESC_USAGE_MAX_OFFSET] = RAKK_RDESC_USAGE_MAX_FIXED;
}
return rdesc;
}
static const struct hid_device_id rakk_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_TELINK,
USB_DEVICE_ID_TELINK_RAKK_DASIG_X) },
{ HID_USB_DEVICE(USB_VENDOR_ID_TELINK,
USB_DEVICE_ID_TELINK_RAKK_DASIG_X_DONGLE) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TELINK,
USB_DEVICE_ID_TELINK_RAKK_DASIG_X_BT) },
{ }
};
MODULE_DEVICE_TABLE(hid, rakk_devices);
static struct hid_driver rakk_driver = {
.name = "rakk",
.id_table = rakk_devices,
.report_fixup = rakk_report_fixup,
};
module_hid_driver(rakk_driver);
MODULE_DESCRIPTION("HID driver for Rakk Dasig X mouse - fix side button support");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Karl Cayme");