From nobody Sat Apr 18 10:45:40 2026 Received: from mout-p-202.mailbox.org (mout-p-202.mailbox.org [80.241.56.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ADFD535F8D1; Tue, 7 Apr 2026 19:49:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=80.241.56.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775591359; cv=none; b=E99fA1q4bWV5MCo5W60WquAZTew+KRZB1IKgqsqGBw9fUMvo1u6GBrW3r5CsyvdPTFxjJih2x4iB1FaKTZ/g9+QtSmApuZdbPWMfJ3uCIvV+iwQw8sN/pszw3GG8hWS4FRKstqgcU6yFWNgYrGs/i+bjACmjB6ACyNnwVtEzpPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775591359; c=relaxed/simple; bh=1XRIRXKHfADw5sPT12qql1nurfrnyJRzWcm5RXwFVnQ=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=l25CeEMkiw+H3m16DV3TOC+HAyGamHpxwjtVRd1t0WRuRLDevxfMErHnFf5fk4kYTpe4lmwspVGcgS+qQej7n7+sDxPvmEQ2lTD5slplMAa791wwXWSphLuME3MgN7bTXgsqNO6hiSuFUZOZfpQzMm9ZRksG8v/E+Uz2YOAMCes= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org; spf=pass smtp.mailfrom=mailbox.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=iGCtZCeI; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=GIt9iBY4; arc=none smtp.client-ip=80.241.56.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mailbox.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="iGCtZCeI"; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="GIt9iBY4" Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-202.mailbox.org (Postfix) with ESMTPS id 4fqxbS4p3vz9tSp; Tue, 7 Apr 2026 21:49:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1775591348; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=rrrin/VRVilJCoqnNHdLFJcLFCETk2bCfvvfa6UW5X4=; b=iGCtZCeIuwoNJPFmJMNCCzH0cr675iTyeLYWveqdJmrOlkBYXUjgoHKhlR0Xu2Lz+H3vIO RsrbEbVx7lY+fuRpPD4XVNkEYqCEHQSlt3AIpmkE0A3OPYJNo+diegpyGTUgTaWVskY8HL iAXJFwMRuH07prXBm1jv4SIaHR7N+C9AvDxqXtISiQOkFm2j80N9Pjq1Q3zn6rxTnZFza6 FkVFftKAkzYg7nHvzUZ5nmB9d/bA0SavSUXpJR4wh+n4tULSmJbDIoa42IGnqcWXU6hXpp oHJyclqrDTbn3yDU3aRq0HC8x+J7eSqJS94QI+nEzG3tTp9ZR/ZX/oYrjbYcDg== Authentication-Results: outgoing_mbo_mout; dkim=pass header.d=mailbox.org header.s=mail20150812 header.b=GIt9iBY4; spf=pass (outgoing_mbo_mout: domain of rosalie@mailbox.org designates 2001:67c:2050:b231:465::102 as permitted sender) smtp.mailfrom=rosalie@mailbox.org From: Rosalie Wanders DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1775591347; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=rrrin/VRVilJCoqnNHdLFJcLFCETk2bCfvvfa6UW5X4=; b=GIt9iBY4AEjvoUzy5F8WMoYsb+K6/hW2IPQayKXylqFl+vcA1+zYsPqZ9t/qehRk0Uaep4 f9KvrSutvnl517v4euXgyf2xEuQqR3ZlnFzGksoczRU6ewoOnbXrneVgoo91mwE3cSq0Sl jcgJiLzp3NSRA3bf5KUn3IUA/JT34dZ/v7vX/GIT1ibT0PNPU85cQne9os3IaS2CuHV7Lq fOt9jQvDZA814ghGT03Jw6D1laqCsPlCfBCFLEZIkRbJt7yOj/0lga2uVeV2rzVfbBd96r ZOLCFz0WBOrSVu6nm8bNCE+EnjOEKVADZgof0wi3LXpBguZYl4ERZMfv+4qqVw== To: Jiri Kosina , Benjamin Tissoires Cc: Rosalie Wanders , Sanjay Govind , Brenton Simpson , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] HID: sony: add support for more instruments Date: Tue, 7 Apr 2026 21:46:36 +0200 Message-ID: <20260407194636.9671-2-rosalie@mailbox.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-MBO-RS-META: a1mfx8k5nd4dx58fsy7cjbi3x561zap9 X-MBO-RS-ID: 9e0216b620e89cbddfb X-Rspamd-Queue-Id: 4fqxbS4p3vz9tSp Content-Type: text/plain; charset="utf-8" This patch adds support for the following instruments: * Rock Band 1/2/3 Wii/PS3 instruments * Rock Band 3 PS3 Pro instruments * DJ Hero Turntable Wii and PS3 instruments are the same besides the vendor and product ID. This patch also fixes the mappings for the existing Guitar Hero instruments. Co-developed-by: Sanjay Govind Signed-off-by: Sanjay Govind Co-developed-by: Brenton Simpson Signed-off-by: Brenton Simpson Signed-off-by: Rosalie Wanders --- changes: v2: correct squier device name and remove non-existent squier usb device drivers/hid/hid-ids.h | 26 +++- drivers/hid/hid-sony.c | 274 ++++++++++++++++++++++++++++++++++------- 2 files changed, 253 insertions(+), 47 deletions(-) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 3e299a30dcde..3dab8b910831 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -664,6 +664,18 @@ #define USB_DEVICE_ID_UGCI_FLYING 0x0020 #define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 =20 +#define USB_VENDOR_ID_HARMONIX 0x1bad +#define USB_DEVICE_ID_HARMONIX_WII_RB1_GUITAR 0x0004 +#define USB_DEVICE_ID_HARMONIX_WII_RB2_GUITAR 0x3010 +#define USB_DEVICE_ID_HARMONIX_WII_RB1_DRUMS 0x0005 +#define USB_DEVICE_ID_HARMONIX_WII_RB2_DRUMS 0x3110 +#define USB_DEVICE_ID_HARMONIX_WII_RB3_MPA_DRUMS_MODE 0x3138 +#define USB_DEVICE_ID_HARMONIX_WII_RB3_MUSTANG_GUITAR 0x3430 +#define USB_DEVICE_ID_HARMONIX_WII_RB3_MPA_MUSTANG_MODE 0x3438 +#define USB_DEVICE_ID_HARMONIX_WII_RB3_MPA_SQUIER_MODE 0x3538 +#define USB_DEVICE_ID_HARMONIX_WII_RB3_KEYBOARD 0x3330 +#define USB_DEVICE_ID_HARMONIX_WII_RB3_MPA_KEYBOARD_MODE 0x3338 + #define USB_VENDOR_ID_HP 0x03f0 #define USB_PRODUCT_ID_HP_ELITE_PRESENTER_MOUSE_464A 0x464a #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A 0x0a4a @@ -1298,8 +1310,18 @@ #define USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER 0x1000 =20 #define USB_VENDOR_ID_SONY_RHYTHM 0x12ba -#define USB_DEVICE_ID_SONY_PS3WIIU_GHLIVE_DONGLE 0x074b -#define USB_DEVICE_ID_SONY_PS3_GUITAR_DONGLE 0x0100 +#define USB_DEVICE_ID_SONY_PS3WIIU_GHLIVE 0x074b +#define USB_DEVICE_ID_SONY_PS3_GH_GUITAR 0x0100 +#define USB_DEVICE_ID_SONY_PS3_GH_DRUMS 0x0120 +#define USB_DEVICE_ID_SONY_PS3_DJH_TURNTABLE 0x0140 +#define USB_DEVICE_ID_SONY_PS3_RB_GUITAR 0x0200 +#define USB_DEVICE_ID_SONY_PS3_RB_DRUMS 0x0210 +#define USB_DEVICE_ID_SONY_PS3_RB3_MPA_DRUMS_MODE 0x0218 +#define USB_DEVICE_ID_SONY_PS3_RB3_MUSTANG_GUITAR 0x2430 +#define USB_DEVICE_ID_SONY_PS3_RB3_MPA_MUSTANG_MODE 0x2438 +#define USB_DEVICE_ID_SONY_PS3_RB3_MPA_SQUIER_MODE 0x2538 +#define USB_DEVICE_ID_SONY_PS3_RB3_KEYBOARD 0x2330 +#define USB_DEVICE_ID_SONY_PS3_RB3_MPA_KEYBOARD_MODE 0x2338 =20 #define USB_VENDOR_ID_SINO_LITE 0x1345 #define USB_DEVICE_ID_SINO_LITE_CONTROLLER 0x3008 diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index a89af14e4acc..a14e730318ce 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * HID driver for Sony / PS2 / PS3 / PS4 BD devices. + * HID driver for Sony / PS2 / PS3 / PS4 / PS5 BD devices. * * Copyright (c) 1999 Andreas Gal * Copyright (c) 2000-2005 Vojtech Pavlik @@ -12,9 +12,10 @@ * Copyright (c) 2014-2016 Frank Praznik * Copyright (c) 2018 Todd Kelner * Copyright (c) 2020-2021 Pascal Giard - * Copyright (c) 2020 Sanjay Govind + * Copyright (c) 2020-2026 Sanjay Govind * Copyright (c) 2021 Daniel Nguyen * Copyright (c) 2026 Rosalie Wanders + * Copyright (c) 2026 Brenton Simpson */ =20 /* @@ -59,12 +60,15 @@ #define NSG_MR5U_REMOTE_BT BIT(11) #define NSG_MR7U_REMOTE_BT BIT(12) #define SHANWAN_GAMEPAD BIT(13) -#define GH_GUITAR_CONTROLLER BIT(14) -#define GHL_GUITAR_PS3WIIU BIT(15) -#define GHL_GUITAR_PS4 BIT(16) -#define RB4_GUITAR_PS4_USB BIT(17) -#define RB4_GUITAR_PS4_BT BIT(18) -#define RB4_GUITAR_PS5 BIT(19) +#define INSTRUMENT BIT(14) +#define GH_GUITAR_TILT BIT(15) +#define GHL_GUITAR_PS3WIIU BIT(16) +#define GHL_GUITAR_PS4 BIT(17) +#define RB4_GUITAR_PS4_USB BIT(18) +#define RB4_GUITAR_PS4_BT BIT(19) +#define RB4_GUITAR_PS5 BIT(20) +#define RB3_PS3_PRO_INSTRUMENT BIT(21) +#define PS3_DJH_TURNTABLE BIT(22) =20 #define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT) #define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT) @@ -87,6 +91,10 @@ #define GHL_GUITAR_POKE_INTERVAL 8 /* In seconds */ #define GUITAR_TILT_USAGE 44 =20 +#define TURNTABLE_EFFECTS_KNOB_USAGE 44 +#define TURNTABLE_PLATTER_BUTTONS_USAGE 45 +#define TURNTABLE_CROSS_FADER_USAGE 46 + /* Magic data taken from GHLtarUtility: * https://github.com/ghlre/GHLtarUtility/blob/master/PS3Guitar.cs * Note: The Wii U and PS3 dongles happen to share the same! @@ -102,6 +110,13 @@ static const char ghl_ps4_magic_data[] =3D { 0x30, 0x02, 0x08, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00 }; =20 +/* Rock Band 3 PS3 Pro Instruments require sending a report + * once an instrument is connected to its dongle. + * We need to retry sending these reports, + * but to avoid doing this too often we delay the retries + */ +#define RB3_PRO_INSTRUMENT_POKE_RETRY_INTERVAL 8 /* In seconds */ + /* PS/3 Motion controller */ static const u8 motion_rdesc[] =3D { 0x05, 0x01, /* Usage Page (Desktop), */ @@ -427,20 +442,25 @@ static const unsigned int rb4_absmap[] =3D { [0x31] =3D ABS_Y, }; =20 -static const unsigned int rb4_keymap[] =3D { - [0x1] =3D BTN_WEST, /* Square */ - [0x2] =3D BTN_SOUTH, /* Cross */ - [0x3] =3D BTN_EAST, /* Circle */ - [0x4] =3D BTN_NORTH, /* Triangle */ - [0x5] =3D BTN_TL, /* L1 */ - [0x6] =3D BTN_TR, /* R1 */ - [0x7] =3D BTN_TL2, /* L2 */ - [0x8] =3D BTN_TR2, /* R2 */ - [0x9] =3D BTN_SELECT, /* Share */ - [0xa] =3D BTN_START, /* Options */ - [0xb] =3D BTN_THUMBL, /* L3 */ - [0xc] =3D BTN_THUMBR, /* R3 */ - [0xd] =3D BTN_MODE, /* PS */ +static const unsigned int ps3_turntable_absmap[] =3D { + [0x32] =3D ABS_X, + [0x35] =3D ABS_Y, +}; + +static const unsigned int instrument_keymap[] =3D { + [0x1] =3D BTN_WEST, + [0x2] =3D BTN_SOUTH, + [0x3] =3D BTN_EAST, + [0x4] =3D BTN_NORTH, + [0x5] =3D BTN_TL, + [0x6] =3D BTN_TR, + [0x7] =3D BTN_TL2, + [0x8] =3D BTN_TR2, + [0x9] =3D BTN_SELECT, + [0xa] =3D BTN_START, + [0xb] =3D BTN_THUMBL, + [0xc] =3D BTN_THUMBR, + [0xd] =3D BTN_MODE, }; =20 static enum power_supply_property sony_battery_props[] =3D { @@ -490,6 +510,7 @@ struct motion_output_report_02 { #define SIXAXIS_REPORT_0xF2_SIZE 17 #define SIXAXIS_REPORT_0xF5_SIZE 8 #define MOTION_REPORT_0x02_SIZE 49 +#define PRO_INSTRUMENT_0x00_SIZE 8 =20 #define SENSOR_SUFFIX " Motion Sensors" #define TOUCHPAD_SUFFIX " Touchpad" @@ -539,6 +560,9 @@ struct sony_sc { /* GH Live */ struct urb *ghl_urb; struct timer_list ghl_poke_timer; + + /* Rock Band 3 Pro Instruments */ + unsigned long rb3_pro_poke_jiffies; }; =20 static void sony_set_leds(struct sony_sc *sc); @@ -610,35 +634,108 @@ static int ghl_init_urb(struct sony_sc *sc, struct u= sb_device *usbdev, return 0; } =20 -static int gh_guitar_mapping(struct hid_device *hdev, struct hid_input *hi, + + +/* + * Sending HID_REQ_SET_REPORT enables the full report. Without this + * Rock Band 3 Pro instruments only report navigation events + */ +static int rb3_pro_instrument_enable_full_report(struct sony_sc *sc) +{ + struct hid_device *hdev =3D sc->hdev; + static const u8 report[] =3D { 0x00, 0xE9, 0x00, 0x89, 0x1B, + 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xE9, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00 }; + u8 *buf; + int ret; + + buf =3D kmemdup(report, sizeof(report), GFP_KERNEL); + if (!buf) + return -ENOMEM; + + ret =3D hid_hw_raw_request(hdev, buf[0], buf, sizeof(report), + HID_FEATURE_REPORT, HID_REQ_SET_REPORT); + + kfree(buf); + + return ret; +} + +static int djh_turntable_mapping(struct hid_device *hdev, struct hid_input= *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { if ((usage->hid & HID_USAGE_PAGE) =3D=3D HID_UP_MSVENDOR) { unsigned int abs =3D usage->hid & HID_USAGE; =20 - if (abs =3D=3D GUITAR_TILT_USAGE) { + if (abs =3D=3D TURNTABLE_CROSS_FADER_USAGE) { + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, ABS_RX); + return 1; + } else if (abs =3D=3D TURNTABLE_EFFECTS_KNOB_USAGE) { hid_map_usage_clear(hi, usage, bit, max, EV_ABS, ABS_RY); return 1; + } else if (abs =3D=3D TURNTABLE_PLATTER_BUTTONS_USAGE) { + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, ABS_RZ); + return 1; } + } else if ((usage->hid & HID_USAGE_PAGE) =3D=3D HID_UP_GENDESK) { + unsigned int abs =3D usage->hid & HID_USAGE; + + if (abs >=3D ARRAY_SIZE(ps3_turntable_absmap)) + return -1; + + abs =3D ps3_turntable_absmap[abs]; + + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); + return 1; } return 0; } =20 -static int rb4_guitar_mapping(struct hid_device *hdev, struct hid_input *h= i, +static int instrument_mapping(struct hid_device *hdev, struct hid_input *h= i, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { if ((usage->hid & HID_USAGE_PAGE) =3D=3D HID_UP_BUTTON) { unsigned int key =3D usage->hid & HID_USAGE; =20 - if (key >=3D ARRAY_SIZE(rb4_keymap)) + if (key >=3D ARRAY_SIZE(instrument_keymap)) return 0; =20 - key =3D rb4_keymap[key]; + key =3D instrument_keymap[key]; hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key); return 1; - } else if ((usage->hid & HID_USAGE_PAGE) =3D=3D HID_UP_GENDESK) { + } + + return 0; +} + +static int gh_guitar_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if ((usage->hid & HID_USAGE_PAGE) =3D=3D HID_UP_MSVENDOR) { + unsigned int abs =3D usage->hid & HID_USAGE; + + if (abs =3D=3D GUITAR_TILT_USAGE) { + hid_map_usage_clear(hi, usage, bit, max, EV_ABS, ABS_RY); + return 1; + } + } + return 0; +} + +static int rb4_guitar_mapping(struct hid_device *hdev, struct hid_input *h= i, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if ((usage->hid & HID_USAGE_PAGE) =3D=3D HID_UP_GENDESK) { unsigned int abs =3D usage->hid & HID_USAGE; =20 /* Let the HID parser deal with the HAT. */ @@ -1052,6 +1149,18 @@ static int sony_raw_event(struct hid_device *hdev, s= truct hid_report *report, return 1; } =20 + /* Rock Band 3 PS3 Pro instruments set rd[24] to 0xE0 when they're + * sending full reports, and 0x02 when only sending navigation. + */ + if ((sc->quirks & RB3_PS3_PRO_INSTRUMENT) && rd[24] =3D=3D 0x02) { + /* Only attempt to enable report every 8 seconds */ + if (time_after(jiffies, sc->rb3_pro_poke_jiffies)) { + sc->rb3_pro_poke_jiffies =3D jiffies + + (RB3_PRO_INSTRUMENT_POKE_RETRY_INTERVAL * HZ); + rb3_pro_instrument_enable_full_report(sc); + } + } + if (sc->defer_initialization) { sc->defer_initialization =3D 0; sony_schedule_work(sc, SONY_WORKER_STATE); @@ -1065,6 +1174,7 @@ static int sony_mapping(struct hid_device *hdev, stru= ct hid_input *hi, unsigned long **bit, int *max) { struct sony_sc *sc =3D hid_get_drvdata(hdev); + int ret; =20 if (sc->quirks & BUZZ_CONTROLLER) { unsigned int key =3D usage->hid & HID_USAGE; @@ -1098,9 +1208,19 @@ static int sony_mapping(struct hid_device *hdev, str= uct hid_input *hi, if (sc->quirks & SIXAXIS_CONTROLLER) return sixaxis_mapping(hdev, hi, field, usage, bit, max); =20 - if (sc->quirks & GH_GUITAR_CONTROLLER) + /* INSTRUMENT quirk is used as a base mapping for instruments */ + if (sc->quirks & INSTRUMENT) { + ret =3D instrument_mapping(hdev, hi, field, usage, bit, max); + if (ret !=3D 0) + return ret; + } + + if (sc->quirks & GH_GUITAR_TILT) return gh_guitar_mapping(hdev, hi, field, usage, bit, max); =20 + if (sc->quirks & PS3_DJH_TURNTABLE) + return djh_turntable_mapping(hdev, hi, field, usage, bit, max); + if (sc->quirks & (RB4_GUITAR_PS4_USB | RB4_GUITAR_PS4_BT)) return rb4_guitar_mapping(hdev, hi, field, usage, bit, max); =20 @@ -2060,6 +2180,19 @@ static int sony_input_configured(struct hid_device *= hdev, } =20 sony_init_output_report(sc, sixaxis_send_output_report); + } else if (sc->quirks & RB3_PS3_PRO_INSTRUMENT) { + /* + * Rock Band 3 PS3 Pro Instruments also do not handle HID Output + * Reports on the interrupt EP like they should, so we need to force + * HID output reports to use HID_REQ_SET_REPORT on the Control EP. + * + * There is also another issue about HID Output Reports via USB, + * these instruments do not want the report_id as part of the data + * packet, so we have to discard buf[0] when sending the actual + * control message, even for numbered reports. + */ + hdev->quirks |=3D HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; + hdev->quirks |=3D HID_QUIRK_SKIP_OUTPUT_REPORT_ID; } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) { /* * The Sony Sixaxis does not handle HID Output Reports on the @@ -2227,6 +2360,10 @@ static int sony_probe(struct hid_device *hdev, const= struct hid_device_id *id) goto err; } =20 + if (sc->quirks & RB3_PS3_PRO_INSTRUMENT) { + sc->rb3_pro_poke_jiffies =3D 0; + } + if (sc->quirks & (GHL_GUITAR_PS3WIIU | GHL_GUITAR_PS4)) { if (!hid_is_usb(hdev)) { ret =3D -EINVAL; @@ -2364,35 +2501,82 @@ static const struct hid_device_id sony_devices[] = =3D { { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_NSG_MR7U_REMO= TE), .driver_data =3D NSG_MR7U_REMOTE_BT }, /* Guitar Hero Live PS3 and Wii U guitar dongles */ - { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3WIIU_GH= LIVE_DONGLE), - .driver_data =3D GHL_GUITAR_PS3WIIU | GH_GUITAR_CONTROLLER }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3WIIU_GH= LIVE), + .driver_data =3D GHL_GUITAR_PS3WIIU | GH_GUITAR_TILT | INSTRUMENT }, /* Guitar Hero PC Guitar Dongle */ { HID_USB_DEVICE(USB_VENDOR_ID_REDOCTANE, USB_DEVICE_ID_REDOCTANE_GUITAR_= DONGLE), - .driver_data =3D GH_GUITAR_CONTROLLER }, - /* Guitar Hero PS3 World Tour Guitar Dongle */ - { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_GUITAR= _DONGLE), - .driver_data =3D GH_GUITAR_CONTROLLER }, + .driver_data =3D GH_GUITAR_TILT | INSTRUMENT }, + /* Guitar Hero PS3 Guitar Dongle */ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_GH_GUI= TAR), + .driver_data =3D GH_GUITAR_TILT | INSTRUMENT }, + /* Guitar Hero PS3 Drum Dongle */ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_GH_DRU= MS), + .driver_data =3D INSTRUMENT }, + /* DJ Hero PS3 Guitar Dongle */ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_DJH_TU= RNTABLE), + .driver_data =3D PS3_DJH_TURNTABLE | INSTRUMENT }, /* Guitar Hero Live PS4 guitar dongles */ { HID_USB_DEVICE(USB_VENDOR_ID_REDOCTANE, USB_DEVICE_ID_REDOCTANE_PS4_GHL= IVE_DONGLE), - .driver_data =3D GHL_GUITAR_PS4 | GH_GUITAR_CONTROLLER }, + .driver_data =3D GHL_GUITAR_PS4 | GH_GUITAR_TILT | INSTRUMENT }, + /* Rock Band 1 Wii instruments */ + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB1_G= UITAR), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB1_D= RUMS), + .driver_data =3D INSTRUMENT }, + /* Rock Band 2 Wii instruments */ + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB2_G= UITAR), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB2_D= RUMS), + .driver_data =3D INSTRUMENT }, + /* Rock Band 3 Wii instruments */ + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB3_M= PA_DRUMS_MODE), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB3_M= USTANG_GUITAR), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB3_M= PA_MUSTANG_MODE), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB3_M= PA_SQUIER_MODE), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB3_K= EYBOARD), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB3_M= PA_KEYBOARD_MODE), + .driver_data =3D INSTRUMENT }, + /* Rock Band 3 PS3 instruments */ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB_GUI= TAR), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB_DRU= MS), + .driver_data =3D INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB3_MP= A_DRUMS_MODE), + .driver_data =3D INSTRUMENT }, + /* Rock Band 3 PS3 Pro instruments */ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB3_MU= STANG_GUITAR), + .driver_data =3D INSTRUMENT | RB3_PS3_PRO_INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB3_MP= A_MUSTANG_MODE), + .driver_data =3D INSTRUMENT | RB3_PS3_PRO_INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB3_MP= A_SQUIER_MODE), + .driver_data =3D INSTRUMENT | RB3_PS3_PRO_INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB3_KE= YBOARD), + .driver_data =3D INSTRUMENT | RB3_PS3_PRO_INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB3_MP= A_KEYBOARD_MODE), + .driver_data =3D INSTRUMENT | RB3_PS3_PRO_INSTRUMENT }, /* Rock Band 4 PS4 guitars */ { HID_USB_DEVICE(USB_VENDOR_ID_PDP, USB_DEVICE_ID_PDP_PS4_RIFFMASTER), - .driver_data =3D RB4_GUITAR_PS4_USB }, + .driver_data =3D RB4_GUITAR_PS4_USB | INSTRUMENT }, { HID_USB_DEVICE(USB_VENDOR_ID_CRKD, USB_DEVICE_ID_CRKD_PS4_GIBSON_SG), - .driver_data =3D RB4_GUITAR_PS4_USB }, + .driver_data =3D RB4_GUITAR_PS4_USB | INSTRUMENT }, { HID_USB_DEVICE(USB_VENDOR_ID_CRKD, USB_DEVICE_ID_CRKD_PS4_GIBSON_SG_DON= GLE), - .driver_data =3D RB4_GUITAR_PS4_USB }, + .driver_data =3D RB4_GUITAR_PS4_USB | INSTRUMENT }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_PDP, USB_DEVICE_ID_PDP_PS4_JAGUAR), - .driver_data =3D RB4_GUITAR_PS4_BT }, + .driver_data =3D RB4_GUITAR_PS4_BT | INSTRUMENT }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_PS4_S= TRATOCASTER), - .driver_data =3D RB4_GUITAR_PS4_BT }, + .driver_data =3D RB4_GUITAR_PS4_BT | INSTRUMENT }, /* Rock Band 4 PS5 guitars */ { HID_USB_DEVICE(USB_VENDOR_ID_PDP, USB_DEVICE_ID_PDP_PS5_RIFFMASTER), - .driver_data =3D RB4_GUITAR_PS5 }, + .driver_data =3D RB4_GUITAR_PS5 | INSTRUMENT }, { HID_USB_DEVICE(USB_VENDOR_ID_CRKD, USB_DEVICE_ID_CRKD_PS5_GIBSON_SG), - .driver_data =3D RB4_GUITAR_PS5 }, + .driver_data =3D RB4_GUITAR_PS5 | INSTRUMENT }, { HID_USB_DEVICE(USB_VENDOR_ID_CRKD, USB_DEVICE_ID_CRKD_PS5_GIBSON_SG_DON= GLE), - .driver_data =3D RB4_GUITAR_PS5 }, + .driver_data =3D RB4_GUITAR_PS5 | INSTRUMENT }, { } }; MODULE_DEVICE_TABLE(hid, sony_devices); @@ -2428,5 +2612,5 @@ static void __exit sony_exit(void) module_init(sony_init); module_exit(sony_exit); =20 -MODULE_DESCRIPTION("HID driver for Sony / PS2 / PS3 / PS4 BD devices"); +MODULE_DESCRIPTION("HID driver for Sony / PS2 / PS3 / PS4 / PS5 BD devices= "); MODULE_LICENSE("GPL"); --=20 2.53.0