hid-for-linus-2024081901
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIVAwUAZsOFw6Zi849r7WBJAQKanRAAxb5R6YdwO8U4VcrVqMWWoLLCp7CvhPT6 QIL19e5hT6UlynLfqHiSlo4olcrUFaSXJhviwgX4Lj35Hq5PbyU7Fqtdomy/8ITl kJ9yYaxnXI9y+LpCMzJsszt6EZ3m0j2VCSEcMiTO34KmZHU3Spln0uiFhzwVB7yU Vp9D+XYaWxH5nf5gXpwPqSEBqjTgE3MvuU2Higd8oWLsAjI2wnyS6kC89g2KndQO vZWQLuq3ZL3c/aDc8zsOrI0gOUAyq5yAz4Y26uH9sFjqTRpJPOXsDxMmV8rZPJye +ByVWNC21rdGc4c8fLxUAaEgofJkWx/+VR8gX4aim+6O9aGBw2b2nByxNuzc3sDM xaWD9+XJ9l32cH6Md/LGn0xlUcjJTtUYbiDgDCsaGlOZa99ASOXUQvAJKrAgxQEe E/7iz16F4UO3DXVVgdG51bTK37axhUPZTsM6YDJStPDdN9Z8IBmPCw9Bd+gDIcD7 3JIsugQLOFjfinNge0ClzCOdbWkK4ireBMBlxs9zX33sAAOX9NbabLOf7/+t0rrI WOxUPev6Dzi2JKk4P/5WPjLXAY7tTgVoUnHOuACPdIK153UbDzE8H8opgtksBDPN Z8l+yvsmPtD6iTjgoe4hsM7gtXoWkom5sLVhIY4Lskfk/qulNt5p6B7z+KuRNxXY wFcrq2FJDK4= =iUQo -----END PGP SIGNATURE----- Merge tag 'hid-for-linus-2024081901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid Pull HID fixes from Jiri Kosina: - memory corruption fixes for hid-cougar (Camila Alvarez) and hid-amd_sfh (Olivier Sobrie) - fix for regression in Wacom driver of twist gesture handling (Jason Gerecke) - two new device IDs for hid-multitouch (Dmitry Savin) and hid-asus (Luke D. Jones) * tag 'hid-for-linus-2024081901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: HID: wacom: Defer calculation of resolution until resolution_code is known HID: multitouch: Add support for GT7868Q HID: amd_sfh: free driver_data after destroying hid device hid-asus: add ROG Ally X prod ID to quirk list HID: cougar: fix slab-out-of-bounds Read in cougar_report_fixup
This commit is contained in:
commit
6e4436539a
@ -171,11 +171,13 @@ err_hid_data:
|
|||||||
void amdtp_hid_remove(struct amdtp_cl_data *cli_data)
|
void amdtp_hid_remove(struct amdtp_cl_data *cli_data)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
struct amdtp_hid_data *hid_data;
|
||||||
|
|
||||||
for (i = 0; i < cli_data->num_hid_devices; ++i) {
|
for (i = 0; i < cli_data->num_hid_devices; ++i) {
|
||||||
if (cli_data->hid_sensor_hubs[i]) {
|
if (cli_data->hid_sensor_hubs[i]) {
|
||||||
kfree(cli_data->hid_sensor_hubs[i]->driver_data);
|
hid_data = cli_data->hid_sensor_hubs[i]->driver_data;
|
||||||
hid_destroy_device(cli_data->hid_sensor_hubs[i]);
|
hid_destroy_device(cli_data->hid_sensor_hubs[i]);
|
||||||
|
kfree(hid_data);
|
||||||
cli_data->hid_sensor_hubs[i] = NULL;
|
cli_data->hid_sensor_hubs[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1248,6 +1248,9 @@ static const struct hid_device_id asus_devices[] = {
|
|||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
|
||||||
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY),
|
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY),
|
||||||
QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
|
QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
|
||||||
|
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X),
|
||||||
|
QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
|
||||||
USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD),
|
USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD),
|
||||||
QUIRK_ROG_CLAYMORE_II_KEYBOARD },
|
QUIRK_ROG_CLAYMORE_II_KEYBOARD },
|
||||||
|
@ -106,7 +106,7 @@ static void cougar_fix_g6_mapping(void)
|
|||||||
static __u8 *cougar_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
static __u8 *cougar_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||||
unsigned int *rsize)
|
unsigned int *rsize)
|
||||||
{
|
{
|
||||||
if (rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
|
if (*rsize >= 117 && rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
|
||||||
(rdesc[115] | rdesc[116] << 8) >= HID_MAX_USAGES) {
|
(rdesc[115] | rdesc[116] << 8) >= HID_MAX_USAGES) {
|
||||||
hid_info(hdev,
|
hid_info(hdev,
|
||||||
"usage count exceeds max: fixing up report descriptor\n");
|
"usage count exceeds max: fixing up report descriptor\n");
|
||||||
|
@ -210,6 +210,7 @@
|
|||||||
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3 0x1a30
|
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3 0x1a30
|
||||||
#define USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR 0x18c6
|
#define USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR 0x18c6
|
||||||
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY 0x1abe
|
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY 0x1abe
|
||||||
|
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X 0x1b4c
|
||||||
#define USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD 0x196b
|
#define USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD 0x196b
|
||||||
#define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869
|
#define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869
|
||||||
|
|
||||||
@ -520,6 +521,8 @@
|
|||||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
|
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
|
||||||
|
|
||||||
#define I2C_VENDOR_ID_GOODIX 0x27c6
|
#define I2C_VENDOR_ID_GOODIX 0x27c6
|
||||||
|
#define I2C_DEVICE_ID_GOODIX_01E8 0x01e8
|
||||||
|
#define I2C_DEVICE_ID_GOODIX_01E9 0x01e9
|
||||||
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
|
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
|
||||||
|
|
||||||
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
|
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
|
||||||
|
@ -1441,6 +1441,30 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __u8 *mt_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||||
|
unsigned int *size)
|
||||||
|
{
|
||||||
|
if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
|
||||||
|
(hdev->product == I2C_DEVICE_ID_GOODIX_01E8 ||
|
||||||
|
hdev->product == I2C_DEVICE_ID_GOODIX_01E9)) {
|
||||||
|
if (rdesc[607] == 0x15) {
|
||||||
|
rdesc[607] = 0x25;
|
||||||
|
dev_info(
|
||||||
|
&hdev->dev,
|
||||||
|
"GT7868Q report descriptor fixup is applied.\n");
|
||||||
|
} else {
|
||||||
|
dev_info(
|
||||||
|
&hdev->dev,
|
||||||
|
"The byte is not expected for fixing the report descriptor. \
|
||||||
|
It's possible that the touchpad firmware is not suitable for applying the fix. \
|
||||||
|
got: %x\n",
|
||||||
|
rdesc[607]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rdesc;
|
||||||
|
}
|
||||||
|
|
||||||
static void mt_report(struct hid_device *hid, struct hid_report *report)
|
static void mt_report(struct hid_device *hid, struct hid_report *report)
|
||||||
{
|
{
|
||||||
struct mt_device *td = hid_get_drvdata(hid);
|
struct mt_device *td = hid_get_drvdata(hid);
|
||||||
@ -2035,6 +2059,14 @@ static const struct hid_device_id mt_devices[] = {
|
|||||||
MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
|
MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
|
||||||
USB_DEVICE_ID_GAMETEL_MT_MODE) },
|
USB_DEVICE_ID_GAMETEL_MT_MODE) },
|
||||||
|
|
||||||
|
/* Goodix GT7868Q devices */
|
||||||
|
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
|
||||||
|
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
|
||||||
|
I2C_DEVICE_ID_GOODIX_01E8) },
|
||||||
|
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
|
||||||
|
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
|
||||||
|
I2C_DEVICE_ID_GOODIX_01E8) },
|
||||||
|
|
||||||
/* GoodTouch panels */
|
/* GoodTouch panels */
|
||||||
{ .driver_data = MT_CLS_NSMU,
|
{ .driver_data = MT_CLS_NSMU,
|
||||||
MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
|
MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
|
||||||
@ -2270,6 +2302,7 @@ static struct hid_driver mt_driver = {
|
|||||||
.feature_mapping = mt_feature_mapping,
|
.feature_mapping = mt_feature_mapping,
|
||||||
.usage_table = mt_grabbed_usages,
|
.usage_table = mt_grabbed_usages,
|
||||||
.event = mt_event,
|
.event = mt_event,
|
||||||
|
.report_fixup = mt_report_fixup,
|
||||||
.report = mt_report,
|
.report = mt_report,
|
||||||
.suspend = pm_ptr(mt_suspend),
|
.suspend = pm_ptr(mt_suspend),
|
||||||
.reset_resume = pm_ptr(mt_reset_resume),
|
.reset_resume = pm_ptr(mt_reset_resume),
|
||||||
|
@ -1878,12 +1878,14 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
|
|||||||
int fmax = field->logical_maximum;
|
int fmax = field->logical_maximum;
|
||||||
unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
|
unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
|
||||||
int resolution_code = code;
|
int resolution_code = code;
|
||||||
int resolution = hidinput_calc_abs_res(field, resolution_code);
|
int resolution;
|
||||||
|
|
||||||
if (equivalent_usage == HID_DG_TWIST) {
|
if (equivalent_usage == HID_DG_TWIST) {
|
||||||
resolution_code = ABS_RZ;
|
resolution_code = ABS_RZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resolution = hidinput_calc_abs_res(field, resolution_code);
|
||||||
|
|
||||||
if (equivalent_usage == HID_GD_X) {
|
if (equivalent_usage == HID_GD_X) {
|
||||||
fmin += features->offset_left;
|
fmin += features->offset_left;
|
||||||
fmax -= features->offset_right;
|
fmax -= features->offset_right;
|
||||||
|
Loading…
Reference in New Issue
Block a user