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.

Dependency Surface

Detected Declarations

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

Implementation Notes