drivers/platform/x86/bitland-mifs-wmi.c

Source file repositories/reference/linux-study-clean/drivers/platform/x86/bitland-mifs-wmi.c

File Facts

System
Linux kernel
Corpus path
drivers/platform/x86/bitland-mifs-wmi.c
Extension
.c
Size
21121 bytes
Lines
838
Domain
Driver Families
Bucket
drivers/platform
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 bitland_mifs_input {
	u8 reserved1;
	u8 operation;
	u8 reserved2;
	u8 function;
	u8 payload[28];
} __packed;

struct bitland_mifs_output {
	u8 reserved1;
	u8 operation;
	u8 reserved2;
	u8 function;
	u8 data[28];
} __packed;

struct bitland_mifs_event {
	u8 event_type;
	u8 event_id;
	u8 value_low;	/* For most events, this is the value */
	u8 value_high;	/* For fan speed events, combined with value_low */
	u8 reserved[4];
} __packed;

static BLOCKING_NOTIFIER_HEAD(bitland_notifier_list);

enum bitland_notifier_actions {
	BITLAND_NOTIFY_KBD_BRIGHTNESS,
	BITLAND_NOTIFY_PLATFORM_PROFILE,
	BITLAND_NOTIFY_HWMON,
};

struct bitland_fan_notify_data {
	int channel; /* 0 = CPU, 1 = GPU */
	u16 speed;
};

struct bitland_mifs_wmi_data {
	struct wmi_device *wdev;
	struct mutex lock;		/* Protects WMI calls */
	struct led_classdev kbd_led;
	struct notifier_block notifier;
	struct input_dev *input_dev;
	struct device *hwmon_dev;
	struct device *pp_dev;
	enum platform_profile_option saved_profile;
};

static int bitland_mifs_wmi_call(struct bitland_mifs_wmi_data *data,
				 const struct bitland_mifs_input *input,
				 struct bitland_mifs_output *output)
{
	struct wmi_buffer in_buf = { .length = sizeof(*input), .data = (void *)input };
	struct wmi_buffer out_buf = { 0 };
	int ret;

	guard(mutex)(&data->lock);

	if (!output)
		return wmidev_invoke_procedure(data->wdev, 0, 1, &in_buf);

	ret = wmidev_invoke_method(data->wdev, 0, 1, &in_buf, &out_buf, sizeof(*output));
	if (ret)
		return ret;

	memcpy(output, out_buf.data, sizeof(*output));
	kfree(out_buf.data);

	return 0;
}

static int laptop_profile_get(struct device *dev,
			      enum platform_profile_option *profile)
{
	struct bitland_mifs_wmi_data *data = dev_get_drvdata(dev);
	struct bitland_mifs_input input = {
		.reserved1 = 0,
		.operation = WMI_METHOD_GET,
		.reserved2 = 0,
		.function = WMI_FN_SYSTEM_PER_MODE,
	};
	struct bitland_mifs_output result;
	int ret;

	ret = bitland_mifs_wmi_call(data, &input, &result);
	if (ret)
		return ret;

	switch (result.data[0]) {
	case WMI_PP_BALANCED:

Annotation

Implementation Notes