Как согласовать драйверы I2C в ACPI с HID PRP0001

Aug 21 2020

Я пытаюсь создать экземпляр этого датчика в ACPI, используя данные конкретного устройства, то есть Name (_DSD, ...)с совместимой строкой и с ней, например, со следующей выдержкой из ASL:

Device (TOF1) {
    Name (_HID, "PRP0001")
    Name (_DDN, "STMicroelectronics VL53L0X laser rangefinder")
    Name (_CRS, ResourceTemplate () {
        I2cSerialBus (
            0x29,
            ControllerInitiated,
            I2C_SPEED,
            AddressingMode7Bit,
            "\\_SB.PCI0.I2C1.MUX2.CH01",
            0x00,
            ResourceConsumer,,)
    })
    Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
            Package () {"compatible", "st,vl53l0x"},
        }
    })
}

У меня создалось впечатление, что если я укажу свои устройства, как указано в приведенном выше ASL, мне не нужно было бы изменять драйвер (например, добавляя таблицы соответствия ACPI), и я мог бы сопоставить устройство, используя существующую таблицу соответствия OF в Водитель. Однако это только кажется отчасти правдой. Датчик не может выполнить зондирование из-за этой проверки в ядре в i2c-core-base.c :

if (!driver->id_table &&
    !i2c_acpi_match_device(dev->driver->acpi_match_table, client) &&
    !i2c_of_match_device(dev->driver->of_match_table, client))
    return -ENODEV;

Я интерпретирую это утверждение так, что драйвер устройства должен иметь либо (i) таблицу идентификаторов, либо (ii) соответствующую таблицу идентификаторов ACPI, либо (iii) соответствующую таблицу идентификаторов OF. VL53L0X не имеет таблицы идентификаторов или таблицы соответствия ACPI, поэтому я полагаюсь на сопоставление с использованием таблицы OF.

Есть две вещи, которые меня здесь смущают. Во-первых, я printk(KERN_ERR "%s", dev->driver->driver.name)вижу и вижу, что я действительно уже смотрю на правильный драйвер, так почему именно мы проверяем, соответствует ли драйвер снова?

Во-вторых, если i2c_of_match_device(dev->driver->of_match_table, client)совпадение не совпадает, что именно было сопоставлено в первую очередь, что привело к возможности printk(KERN_ERR "%s", dev->driver->driver.name)увидеть и увидеть правильное имя драйвера?

Ответы

1 allsey87 Aug 21 2020 at 12:06

На самом деле это не ответ на вопрос выше, но один способ решения этой проблемы - просто добавить таблицу идентификаторов в драйвер.

static const struct i2c_device_id vl53l0x_id[] = {
    { "vl53l0x", 0 },
    { }
};
MODULE_DEVICE_TABLE(i2c, vl53l0x_id);

static struct i2c_driver vl53l0x_driver = {
    .driver = {
        .name = "vl53l0x-i2c",
        .of_match_table = st_vl53l0x_dt_match,
    },
    .probe_new = vl53l0x_probe,
    .id_table = vl53l0x_id,
};
module_i2c_driver(vl53l0x_driver);

Это приводит к пропуску проверки вопроса. Это не лучшее решение, так как таблица идентификаторов I2C не передается probe_new, однако она работает для этого драйвера, поскольку дальнейшая настройка не требуется.

Однако похоже, что соответствующие устройства i2c, подобные этому, устарели в соответствии с комментариями и исправлениями вокруг введения probe_new.