Merge branch 'for-4.18/hid-redragon' into for-linus

Redragon Asura support from Robert Munteanu
This commit is contained in:
Jiri Kosina 2018-06-08 10:21:47 +02:00
commit 79b83b05b0
4 changed files with 95 additions and 0 deletions

View File

@ -575,6 +575,13 @@ config HID_MAYFLASH
Say Y here if you have HJZ Mayflash PS3 game controller adapters
and want to enable force feedback support.
config HID_REDRAGON
tristate "Redragon keyboards"
depends on HID
default !EXPERT
---help---
Support for Redragon keyboards that need fix-ups to work properly.
config HID_MICROSOFT
tristate "Microsoft non-fully HID-compliant devices"
depends on HID

View File

@ -86,6 +86,7 @@ hid-picolcd-$(CONFIG_DEBUG_FS) += hid-picolcd_debugfs.o
obj-$(CONFIG_HID_PLANTRONICS) += hid-plantronics.o
obj-$(CONFIG_HID_PRIMAX) += hid-primax.o
obj-$(CONFIG_HID_REDRAGON) += hid-redragon.o
obj-$(CONFIG_HID_RETRODE) += hid-retrode.o
obj-$(CONFIG_HID_ROCCAT) += hid-roccat.o hid-roccat-common.o \
hid-roccat-arvo.o hid-roccat-isku.o hid-roccat-kone.o \

View File

@ -615,6 +615,7 @@
#define USB_VENDOR_ID_JESS 0x0c45
#define USB_DEVICE_ID_JESS_YUREX 0x1010
#define USB_DEVICE_ID_ASUS_MD_5112 0x5112
#define USB_DEVICE_ID_REDRAGON_ASURA 0x760b
#define USB_VENDOR_ID_JESS2 0x0f30
#define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111

View File

@ -0,0 +1,86 @@
/*
* HID driver for Redragon keyboards
*
* Copyright (c) 2017 Robert Munteanu
* SPDX-License-Identifier: GPL-2.0+
*/
/*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*/
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include "hid-ids.h"
/*
* The Redragon Asura keyboard sends an incorrect HID descriptor.
* At byte 100 it contains
*
* 0x81, 0x00
*
* which is Input (Data, Arr, Abs), but it should be
*
* 0x81, 0x02
*
* which is Input (Data, Var, Abs), which is consistent with the way
* key codes are generated.
*/
static __u8 *redragon_report_fixup(struct hid_device *hdev, __u8 *rdesc,
unsigned int *rsize)
{
if (*rsize >= 102 && rdesc[100] == 0x81 && rdesc[101] == 0x00) {
dev_info(&hdev->dev, "Fixing Redragon ASURA report descriptor.\n");
rdesc[101] = 0x02;
}
return rdesc;
}
static int redragon_probe(struct hid_device *dev,
const struct hid_device_id *id)
{
int ret;
ret = hid_parse(dev);
if (ret) {
hid_err(dev, "parse failed\n");
return ret;
}
/* do not register unused input device */
if (dev->maxapplication == 1)
return 0;
ret = hid_hw_start(dev, HID_CONNECT_DEFAULT);
if (ret) {
hid_err(dev, "hw start failed\n");
return ret;
}
return 0;
}
static const struct hid_device_id redragon_devices[] = {
{HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_REDRAGON_ASURA)},
{}
};
MODULE_DEVICE_TABLE(hid, redragon_devices);
static struct hid_driver redragon_driver = {
.name = "redragon",
.id_table = redragon_devices,
.report_fixup = redragon_report_fixup,
.probe = redragon_probe
};
module_hid_driver(redragon_driver);
MODULE_LICENSE("GPL");