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@gmail.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
© 2016 - 2026 Red Hat, Inc.