drivers/acpi/pfr_telemetry.c

Source file repositories/reference/linux-study-clean/drivers/acpi/pfr_telemetry.c

File Facts

System
Linux kernel
Corpus path
drivers/acpi/pfr_telemetry.c
Extension
.c
Size
11872 bytes
Lines
435
Domain
Driver Families
Bucket
drivers/acpi
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern 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

static const struct file_operations acpi_pfrt_log_fops = {
	.owner		= THIS_MODULE,
	.mmap		= pfrt_log_mmap,
	.unlocked_ioctl = pfrt_log_ioctl,
	.llseek		= noop_llseek,
};

static void acpi_pfrt_log_remove(struct platform_device *pdev)
{
	struct pfrt_log_device *pfrt_log_dev = platform_get_drvdata(pdev);

	misc_deregister(&pfrt_log_dev->miscdev);
}

static void pfrt_log_put_idx(void *data)
{
	struct pfrt_log_device *pfrt_log_dev = data;

	ida_free(&pfrt_log_ida, pfrt_log_dev->index);
}

static int acpi_pfrt_log_probe(struct platform_device *pdev)
{
	struct pfrt_log_device *pfrt_log_dev;
	acpi_handle handle;
	int ret;

	handle = ACPI_HANDLE(&pdev->dev);
	if (!handle)
		return -ENODEV;

	if (!acpi_has_method(handle, "_DSM")) {
		dev_dbg(&pdev->dev, "Missing _DSM\n");
		return -ENODEV;
	}

	pfrt_log_dev = devm_kzalloc(&pdev->dev, sizeof(*pfrt_log_dev), GFP_KERNEL);
	if (!pfrt_log_dev)
		return -ENOMEM;

	ret = ida_alloc(&pfrt_log_ida, GFP_KERNEL);
	if (ret < 0)
		return ret;

	pfrt_log_dev->index = ret;
	ret = devm_add_action_or_reset(&pdev->dev, pfrt_log_put_idx, pfrt_log_dev);
	if (ret)
		return ret;

	pfrt_log_dev->info.log_revid = PFRT_DEFAULT_REV_ID;
	pfrt_log_dev->parent_dev = &pdev->dev;

	pfrt_log_dev->miscdev.minor = MISC_DYNAMIC_MINOR;
	pfrt_log_dev->miscdev.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
						    "pfrt%d",
						    pfrt_log_dev->index);
	if (!pfrt_log_dev->miscdev.name)
		return -ENOMEM;

	pfrt_log_dev->miscdev.nodename = devm_kasprintf(&pdev->dev, GFP_KERNEL,
							"acpi_pfr_telemetry%d",
							pfrt_log_dev->index);
	if (!pfrt_log_dev->miscdev.nodename)
		return -ENOMEM;

	pfrt_log_dev->miscdev.fops = &acpi_pfrt_log_fops;
	pfrt_log_dev->miscdev.parent = &pdev->dev;

	ret = misc_register(&pfrt_log_dev->miscdev);
	if (ret)
		return ret;

	platform_set_drvdata(pdev, pfrt_log_dev);

	return 0;
}

static const struct acpi_device_id acpi_pfrt_log_ids[] = {
	{"INTC1081"},
	{}
};
MODULE_DEVICE_TABLE(acpi, acpi_pfrt_log_ids);

static struct platform_driver acpi_pfrt_log_driver = {
	.driver = {
		.name = "pfr_telemetry",
		.acpi_match_table = acpi_pfrt_log_ids,
	},
	.probe = acpi_pfrt_log_probe,
	.remove = acpi_pfrt_log_remove,

Annotation

Implementation Notes