Базовый модуль драйвера ядра HWMon для чипа LPC?

#linux-kernel #kernel #linux-device-driver #kernel-module #linux-development

Вопрос:

Я работаю над написанием модуля драйвера ядра 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 = amp;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(amp;platform_dev->dev, "qnap_ec_hwmon", NULL,
    amp;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/__exit, могу ли я все еще зарегистрировать драйвер с помощью функции devm_hwmon_device_register_with_info или мне нужно использовать другой подход (драйвер it87, например, использует функцию platform_driver_register, но я не уверен, почему, поскольку, похоже, нет никакой документации о правильном подходе для устройств LPC).

Комментарии:

1. Является ли это платформой с поддержкой ACPI? Во многих биологических системах доступ должен основываться исключительно на вызове методов ACPI (интерфейс WMI или EC).

2. В соответствии с вашим вопросом, каждый водитель должен использовать разделы инициализации и выхода.