spidev: почему это не должно быть непосредственно в devicetree?
Дерево устройств должно описывать аппаратное обеспечение платы, но spidev
не описывает / идентифицирует какое-либо оборудование.
Марк Браун писал:
Поскольку spidev - это деталь того, как Linux управляет устройством, а не описание аппаратного обеспечения в системе, у нас никогда не должно быть узла, описанного как «spidev» вDT, любое SPI-устройство может быть spidev, так что это просто бесполезное описание.
Обоснование и обходной путь для этого патча ядра - https://patchwork.kernel.org/patch/6113191/
Так как еще следует описать спидев?Каков правильный синтаксис?
Вместо явного использования spidev в вашем источнике дерева устройств, вместо этого вам нужно идентифицировать фактическое устройство, которым вы управляете, например,
mydev@0 {
- compatible = "spidev";
+ compatible = "my_spi_device";
spi-max-frequency = <5000000>;
Затем (как объясняет Geert Uytterhoeven) измените drivers / spi / spidev.c в исходном коде ядра, добавив совместимое значение для вашего устройства в spidev_dt_ids [] array
static const struct of_device_id spidev_dt_ids[] = {
{ .compatible = "rohm,dh2228fv" },
{ .compatible = "lineartechnology,ltc2488" },
{ .compatible = "ge,achc" },
{ .compatible = "semtech,sx1301" },
+ { .compatible = "my_spi_device" },
{},
}
Альтернативное решение, которое включает быстрое и простое изменение только дерева устройств, предлагается этой статьей .
Просто замените строку, совместимую с "spidev", на правильную строку, которая уже существует:
mydev@0 {
- compatible = "spidev";
+ compatible = "rohm,dh2228fv"; /* actually spidev for my_spi_dev */
spi-max-frequency = <5000000>;
Поскольку "rohm, dh2228fv" уже есть в списке spidev_dt_ids [] , редактирование в drivers / spi / spidev.c необходимо.