如何在运行时 declare/define 客户端驱动程序中 linux hwmon 传感器属性

how to declare/define hwmon sensor attributes in linux client driver at runtime

我正在寻找一种在运行时从 Linux 内核驱动程序创建 hwmon sysfs 节点的方法,因为客户端驱动程序不会在驱动程序中维护传感器列表。

我们的 Linux 内核客户端驱动程序在编译时不知道传感器 attributes/list。该驱动程序将在运行时从 firmware 获取可用的传感器列表。 基于传感器,客户端驱动程序必须 create/register 具有 hwmon 驱动程序的 sysfs 节点。

我知道 declaring/adding sysfs 节点在编译时使用以下代码片段使用 hwmon 设备。

/* In client driver */
static ssize_t show_sensor1_info(struct device *dev, struct device_attribute *da, char *buf)
{
   // client driver displays sensor1 data
}

static struct sensor_device_attribute sensor_attr1 =
        SENSOR_ATTR(sensor1, 0444, show_sensor1_info, NULL, 0);

struct device *hdev = hwmon_device_register(&pdev->dev);

err = device_create_file(hdev, &sensor_attr1.dev_attr);

输出

$ ls /sys/class/hwmon/hwmon*/sensor1
sensor1

查询: 客户端驱动程序不会在编译时维护传感器列表。因此,如何在运行时执行相同的工作,因为客户端驱动程序不知道可用的传感器列表。

只有加载了这个驱动才知道。调用此驱动程序的探测器后,它会从硬件监视器固件中请求所有可用的传感器列表。

我找到了一种基于运行时传感器计数创建 hwmon sysfs 节点的方法。 我引用了这段代码https://elixir.bootlin.com/linux/v4.3/source/drivers/hwmon/acpi_power_meter.c#L630,它解决了我的要求。谢谢