Базовый модуль драйвера 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).

0 ответов

Другие вопросы по тегам