Базовый модуль драйвера HWMon ядра для чипа LPC?
Я работаю над написанием модуля драйвера ядра hwmon для чипа, который обменивается данными через LPC (шина в стиле ISA). Пока у меня есть следующий код
umode_t qnap_ec_is_visible(const void* data, enum hwmon_sensor_types type, u32 attr, int channel)
{
}
int qnap_ec_read(struct device* dev, enum hwmon_sensor_types type, u32 attr, int channel, long* val)
{
}
int qnap_ec_write(struct device* dev, enum hwmon_sensor_types type, u32 attr, int channel, long val)
{
}
static const struct hwmon_ops qnap_ec_ops = {
.is_visible = qnap_ec_is_visible,
.read = qnap_ec_read,
.write = qnap_ec_write
};
static const struct hwmon_channel_info *qnap_ec_channel_info[] = {
HWMON_CHANNEL_INFO(pwm, HWMON_PWM_INPUT),
HWMON_CHANNEL_INFO(fan, HWMON_F_INPUT),
HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
NULL
};
static const struct hwmon_chip_info qnap_ec_chip_info = {
.ops = &qnap_ec_ops,
.info = qnap_ec_channel_info
};
static int qnap_ec_probe(struct platform_device* platform_dev)
{
struct device* dev;
dev = devm_hwmon_device_register_with_info(&platform_dev->dev, "qnap_ec_hwmon", NULL,
&qnap_ec_chip_info, NULL);
return PTR_ERR_OR_ZERO(dev);
}
static const struct of_device_id qnap_ec_of_match[] = {
{ .compatible = "???" },
{}
};
MODULE_DEVICE_TABLE(of, qnap_ec_of_match);
static struct platform_driver qnap_ec_driver = {
.driver = {
.name = "qnap_ec_hwmon",
.of_match_table = qnap_ec_of_match
},
.probe = qnap_ec_probe
};
module_platform_driver(qnap_ec_driver);
однако я почти уверен, что этот подход (использование идентификатора устройства и вызов ядром функции проверки при обнаружении этого идентификатора устройства в системе) не сработает для чего-то на шине LPC. Драйвер IT87, который также обменивается данными по шине LPC, использует функции __init / __ exit для входа в драйвер, однако этот драйвер очень большой и, вероятно, не является идеальным примером простого модуля драйвера. Существуют ли какие-либо примеры того, как написать базовый (т.е. без реальной функциональности, только скелет) драйвер hwmon ядра для устройства LPC? Например, если я использую функции выхода __init / __, могу ли я зарегистрировать драйвер с помощью функции devm_hwmon_device_register_with_info или мне нужно использовать другой подход (например, драйвер it87 использует функция platform_driver_register, но яЯ не уверен, почему, поскольку, похоже, нет документации о правильном подходе к устройствам LPC).