drivers/platform/x86/dasharo-acpi.c

Source file repositories/reference/linux-study-clean/drivers/platform/x86/dasharo-acpi.c

File Facts

System
Linux kernel
Corpus path
drivers/platform/x86/dasharo-acpi.c
Extension
.c
Size
9038 bytes
Lines
361
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 dasharo_capability {
	unsigned int group;
	unsigned int index;
	char name[16];
};

#define MAX_CAPS_PER_FEAT 24

struct dasharo_data {
	struct platform_device *pdev;
	int caps_found[DASHARO_FEATURE_MAX];
	struct dasharo_capability capabilities[DASHARO_FEATURE_MAX][MAX_CAPS_PER_FEAT];
};

static int dasharo_get_feature_cap_count(struct dasharo_data *data, enum dasharo_feature feat, int cap)
{
	struct acpi_object_list obj_list;
	union acpi_object obj[2];
	acpi_handle handle;
	acpi_status status;
	u64 count;

	obj[0].type = ACPI_TYPE_INTEGER;
	obj[0].integer.value = feat;
	obj[1].type = ACPI_TYPE_INTEGER;
	obj[1].integer.value = cap;
	obj_list.count = 2;
	obj_list.pointer = &obj[0];

	handle = ACPI_HANDLE(&data->pdev->dev);
	status = acpi_evaluate_integer(handle, "GFCP", &obj_list, &count);
	if (ACPI_FAILURE(status))
		return -ENODEV;

	return count;
}

static int dasharo_read_channel(struct dasharo_data *data, char *method, enum dasharo_feature feat, int channel, long *value)
{
	struct acpi_object_list obj_list;
	union acpi_object obj[2];
	acpi_handle handle;
	acpi_status status;
	u64 val;

	if (feat >= ARRAY_SIZE(data->capabilities))
		return -EINVAL;

	if (channel >= data->caps_found[feat])
		return -EINVAL;

	obj[0].type = ACPI_TYPE_INTEGER;
	obj[0].integer.value = data->capabilities[feat][channel].group;
	obj[1].type = ACPI_TYPE_INTEGER;
	obj[1].integer.value = data->capabilities[feat][channel].index;
	obj_list.count = 2;
	obj_list.pointer = &obj[0];

	handle = ACPI_HANDLE(&data->pdev->dev);
	status = acpi_evaluate_integer(handle, method, &obj_list, &val);
	if (ACPI_FAILURE(status))
		return -ENODEV;

	*value = val;
	return 0;
}

static int dasharo_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
			      u32 attr, int channel, long *val)
{
	struct dasharo_data *data = dev_get_drvdata(dev);
	long value;
	int ret;

	switch (type) {
	case hwmon_temp:
		ret = dasharo_read_channel(data, "GTMP", DASHARO_FEATURE_TEMPERATURE, channel, &value);
		if (!ret)
			*val = value * MILLIDEGREE_PER_DEGREE;
		break;
	case hwmon_fan:
		ret = dasharo_read_channel(data, "GFTH", DASHARO_FEATURE_FAN_TACH, channel, &value);
		if (!ret)
			*val = value;
		break;
	case hwmon_pwm:
		ret = dasharo_read_channel(data, "GFDC", DASHARO_FEATURE_FAN_PWM, channel, &value);
		if (!ret)
			*val = value;
		break;

Annotation

Implementation Notes