drivers/hid/hid-corsair-void.c
Source file repositories/reference/linux-study-clean/drivers/hid/hid-corsair-void.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/hid/hid-corsair-void.c- Extension
.c- Size
- 23940 bytes
- Lines
- 833
- Domain
- Driver Families
- Bucket
- drivers/hid
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bitfield.hlinux/bitops.hlinux/device.hlinux/hid.hlinux/module.hlinux/power_supply.hlinux/usb.hlinux/workqueue.hasm/byteorder.hhid-ids.h
Detected Declarations
struct corsair_void_battery_datastruct corsair_void_drvdatafunction Copyrightfunction corsair_void_set_wireless_statusfunction corsair_void_set_unknown_battfunction corsair_void_set_unknown_wireless_datafunction corsair_void_process_receiverfunction corsair_void_battery_get_propertyfunction microphone_up_showfunction fw_version_receiver_showfunction fw_version_headset_showfunction sidetone_max_showfunction send_alert_storefunction corsair_void_set_sidetone_wiredfunction corsair_void_set_sidetone_wirelessfunction set_sidetone_storefunction corsair_void_request_statusfunction corsair_void_status_work_handlerfunction corsair_void_firmware_work_handlerfunction corsair_void_add_batteryfunction corsair_void_battery_work_handlerfunction corsair_void_headset_connectedfunction corsair_void_headset_disconnectedfunction corsair_void_probefunction corsair_void_removefunction corsair_void_raw_event
Annotated Snippet
struct corsair_void_battery_data {
int status;
bool present;
int capacity;
int capacity_level;
};
struct corsair_void_drvdata {
struct hid_device *hid_dev;
struct device *dev;
char *name;
bool is_wired;
unsigned int sidetone_max;
struct corsair_void_battery_data battery_data;
bool mic_up;
bool connected;
int fw_receiver_major;
int fw_receiver_minor;
int fw_headset_major;
int fw_headset_minor;
struct power_supply *battery;
struct power_supply_desc battery_desc;
struct delayed_work delayed_status_work;
struct delayed_work delayed_firmware_work;
unsigned long battery_work_flags;
struct work_struct battery_work;
};
/*
* Functions to process receiver data
*/
static void corsair_void_set_wireless_status(struct corsair_void_drvdata *drvdata)
{
struct usb_interface *usb_if = to_usb_interface(drvdata->dev->parent);
if (drvdata->is_wired)
return;
usb_set_wireless_status(usb_if, drvdata->connected ?
USB_WIRELESS_STATUS_CONNECTED :
USB_WIRELESS_STATUS_DISCONNECTED);
}
static void corsair_void_set_unknown_batt(struct corsair_void_drvdata *drvdata)
{
struct corsair_void_battery_data *battery_data = &drvdata->battery_data;
battery_data->status = POWER_SUPPLY_STATUS_UNKNOWN;
battery_data->present = false;
battery_data->capacity = 0;
battery_data->capacity_level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
}
/* Reset data that may change between wireless connections */
static void corsair_void_set_unknown_wireless_data(struct corsair_void_drvdata *drvdata)
{
/* Only 0 out headset, receiver is always known if relevant */
drvdata->fw_headset_major = 0;
drvdata->fw_headset_minor = 0;
drvdata->connected = false;
drvdata->mic_up = false;
corsair_void_set_wireless_status(drvdata);
}
static void corsair_void_process_receiver(struct corsair_void_drvdata *drvdata,
int raw_battery_capacity,
int raw_connection_status,
int raw_battery_status)
{
struct corsair_void_battery_data *battery_data = &drvdata->battery_data;
struct corsair_void_battery_data orig_battery_data;
/* Save initial battery data, to compare later */
orig_battery_data = *battery_data;
/* Headset not connected, or it's wired */
if (raw_connection_status != CORSAIR_VOID_WIRELESS_CONNECTED)
goto unknown_battery;
/* Battery information unavailable */
if (raw_battery_status == 0)
goto unknown_battery;
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/bitops.h`, `linux/device.h`, `linux/hid.h`, `linux/module.h`, `linux/power_supply.h`, `linux/usb.h`, `linux/workqueue.h`.
- Detected declarations: `struct corsair_void_battery_data`, `struct corsair_void_drvdata`, `function Copyright`, `function corsair_void_set_wireless_status`, `function corsair_void_set_unknown_batt`, `function corsair_void_set_unknown_wireless_data`, `function corsair_void_process_receiver`, `function corsair_void_battery_get_property`, `function microphone_up_show`, `function fw_version_receiver_show`.
- Atlas domain: Driver Families / drivers/hid.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.