[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260120200202.1225216-3-benjaminwheeler0510@gmail.com>
Date: Tue, 20 Jan 2026 15:02:01 -0500
From: Benjamin Wheeler <benjaminwheeler0510@...il.com>
To: srimanachanta@...il.com
Cc: bentiss@...nel.org,
jikos@...nel.org,
linux-input@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [PATCH 2/3] HID: steelseries: Add battery request info (byte flags) to device info.
This way, the device info is decoupled from the functions that call it.
This will allow for simplification of calling these functions.
Signed-off-by: Benjamin Wheeler <benjaminwheeler0510@...il.com>
---
drivers/hid/hid-steelseries.c | 79 +++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/drivers/hid/hid-steelseries.c b/drivers/hid/hid-steelseries.c
index 63b086fa6df0..dabc4763f072 100644
--- a/drivers/hid/hid-steelseries.c
+++ b/drivers/hid/hid-steelseries.c
@@ -31,12 +31,22 @@
/* Legacy quirk flag for SRW-S1 */
#define STEELSERIES_SRWS1 BIT(0)
+/**
+ * Stores info about how to send a report to this device.
+ */
+struct steelseries_report_data {
+ const u8 data[2];
+ const u8 len; // Only ever 1 or 2, no need for size_t.
+ const enum hid_report_type type;
+};
+
struct steelseries_device_info {
u16 product_id;
const char *name;
u8 interface_binding_mode; /* 0 = first enumerated, 1 = specific interface(s) */
u16 valid_interfaces; /* Bitmask when mode = 1, ignored when mode = 0 */
unsigned long capabilities;
+ const struct steelseries_report_data *const report_data;
};
struct steelseries_device {
@@ -382,12 +392,55 @@ static const __u8 *steelseries_srws1_report_fixup(struct hid_device *hdev,
return rdesc;
}
+// Report data for: arctis 1, 1x, 7p, 7x
+static const struct steelseries_report_data report_data__1_1x_7p_7x = {
+ .data = { 0x06, 0x12 },
+ .len = 2,
+ .type = HID_FEATURE_REPORT
+};
+
+// Report data for: arctis 7, 7 v2 (2019 ed.)
+static const struct steelseries_report_data report_data__7_7v2 = {
+ .data = { 0x06, 0x18 },
+ .len = 2,
+ .type = HID_OUTPUT_REPORT
+};
+
+// Report data for: 7 plus, 7 plus P, 7 plus X, 7 plus Destiny, all novas besides nova 3p, nova 3x
+static const struct steelseries_report_data report_data__7plus_nova = {
+ .data = { 0x00, 0xb0 },
+ .len = 2,
+ .type = HID_OUTPUT_REPORT
+};
+
+// Report data for: arctis 9
+static const struct steelseries_report_data report_data__9 = {
+ .data = { 0x00, 0x20 },
+ .len = 2,
+ .type = HID_FEATURE_REPORT
+};
+
+// Report data for: Pro
+static const struct steelseries_report_data report_data__pro = {
+ .data = { 0x40, 0xAA },
+ .len = 2,
+ .type = HID_OUTPUT_REPORT
+};
+
+// Report data for: Nova 3p, 3x
+static const struct steelseries_report_data report_data__nova_3p_3x = {
+ .data = { 0xb0 },
+ .len = 1,
+ .type = HID_OUTPUT_REPORT
+};
+
static const struct steelseries_device_info arctis_1_info = {
.product_id = USB_DEVICE_ID_STEELSERIES_ARCTIS_1,
.name = "Arctis 1 Wireless",
.interface_binding_mode = 1,
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__1_1x_7p_7x,
};
static const struct steelseries_device_info arctis_1_x_info = {
@@ -396,6 +449,7 @@ static const struct steelseries_device_info arctis_1_x_info = {
.interface_binding_mode = 1,
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__1_1x_7p_7x,
};
static const struct steelseries_device_info arctis_7_info = {
@@ -404,6 +458,7 @@ static const struct steelseries_device_info arctis_7_info = {
.interface_binding_mode = 1,
.valid_interfaces = BIT(5),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__7_7v2,
};
static const struct steelseries_device_info arctis_7_p_info = {
@@ -412,6 +467,7 @@ static const struct steelseries_device_info arctis_7_p_info = {
.interface_binding_mode = 1,
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__1_1x_7p_7x,
};
static const struct steelseries_device_info arctis_7_x_info = {
@@ -420,6 +476,7 @@ static const struct steelseries_device_info arctis_7_x_info = {
.interface_binding_mode = 1,
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__1_1x_7p_7x,
};
static const struct steelseries_device_info arctis_7_gen2_info = {
@@ -428,6 +485,7 @@ static const struct steelseries_device_info arctis_7_gen2_info = {
.interface_binding_mode = 1,
.valid_interfaces = BIT(5),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__7_7v2,
};
static const struct steelseries_device_info arctis_7_plus_info = {
@@ -437,6 +495,7 @@ static const struct steelseries_device_info arctis_7_plus_info = {
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY |
SS_CAP_INACTIVE_TIME | SS_CAP_CHATMIX,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_7_plus_p_info = {
@@ -446,6 +505,7 @@ static const struct steelseries_device_info arctis_7_plus_p_info = {
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY |
SS_CAP_INACTIVE_TIME | SS_CAP_CHATMIX,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_7_plus_x_info = {
@@ -455,6 +515,7 @@ static const struct steelseries_device_info arctis_7_plus_x_info = {
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY |
SS_CAP_INACTIVE_TIME | SS_CAP_CHATMIX,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_7_plus_destiny_info = {
@@ -464,6 +525,7 @@ static const struct steelseries_device_info arctis_7_plus_destiny_info = {
.valid_interfaces = BIT(3),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY |
SS_CAP_INACTIVE_TIME | SS_CAP_CHATMIX,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_9_info = {
@@ -473,6 +535,7 @@ static const struct steelseries_device_info arctis_9_info = {
.valid_interfaces = 0,
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY |
SS_CAP_INACTIVE_TIME | SS_CAP_CHATMIX,
+ .report_data = &report_data__9,
};
static const struct steelseries_device_info arctis_pro_info = {
@@ -481,6 +544,7 @@ static const struct steelseries_device_info arctis_pro_info = {
.interface_binding_mode = 0,
.valid_interfaces = 0,
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__pro,
};
static const struct steelseries_device_info arctis_nova_3_info = {
@@ -490,6 +554,7 @@ static const struct steelseries_device_info arctis_nova_3_info = {
.valid_interfaces = BIT(4),
.capabilities = SS_CAP_SIDETONE | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_3_p_info = {
@@ -499,6 +564,7 @@ static const struct steelseries_device_info arctis_nova_3_p_info = {
.valid_interfaces = BIT(0),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY |
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_VOLUME,
+ .report_data = &report_data__nova_3p_3x,
};
static const struct steelseries_device_info arctis_nova_3_x_info = {
@@ -508,6 +574,7 @@ static const struct steelseries_device_info arctis_nova_3_x_info = {
.valid_interfaces = BIT(0),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY |
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_VOLUME,
+ .report_data = &report_data__nova_3p_3x,
};
static const struct steelseries_device_info arctis_nova_5_info = {
@@ -518,6 +585,7 @@ static const struct steelseries_device_info arctis_nova_5_info = {
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_CHATMIX |
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_5_x_info = {
@@ -528,6 +596,7 @@ static const struct steelseries_device_info arctis_nova_5_x_info = {
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_CHATMIX |
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_info = {
@@ -539,6 +608,7 @@ static const struct steelseries_device_info arctis_nova_7_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_x_info = {
@@ -550,6 +620,7 @@ static const struct steelseries_device_info arctis_nova_7_x_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_p_info = {
@@ -561,6 +632,7 @@ static const struct steelseries_device_info arctis_nova_7_p_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_x_rev2_info = {
@@ -572,6 +644,7 @@ static const struct steelseries_device_info arctis_nova_7_x_rev2_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_diablo_info = {
@@ -583,6 +656,7 @@ static const struct steelseries_device_info arctis_nova_7_diablo_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_wow_info = {
@@ -594,6 +668,7 @@ static const struct steelseries_device_info arctis_nova_7_wow_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_gen2_info = {
@@ -605,6 +680,7 @@ static const struct steelseries_device_info arctis_nova_7_gen2_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_7_x_gen2_info = {
@@ -616,6 +692,7 @@ static const struct steelseries_device_info arctis_nova_7_x_gen2_info = {
SS_CAP_INACTIVE_TIME | SS_CAP_MIC_MUTE_LED |
SS_CAP_MIC_VOLUME | SS_CAP_VOLUME_LIMITER |
SS_CAP_BT_POWER_ON | SS_CAP_BT_CALL_VOL,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_pro_info = {
@@ -624,6 +701,7 @@ static const struct steelseries_device_info arctis_nova_pro_info = {
.interface_binding_mode = 1,
.valid_interfaces = BIT(4),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__7plus_nova,
};
static const struct steelseries_device_info arctis_nova_pro_x_info = {
@@ -632,6 +710,7 @@ static const struct steelseries_device_info arctis_nova_pro_x_info = {
.interface_binding_mode = 1,
.valid_interfaces = BIT(4),
.capabilities = SS_CAP_SIDETONE | SS_CAP_BATTERY | SS_CAP_INACTIVE_TIME,
+ .report_data = &report_data__7plus_nova,
};
#define STEELSERIES_HEADSET_BATTERY_TIMEOUT_MS 3000
--
2.52.0
Powered by blists - more mailing lists