Linux, spidev: 为什么它不应该直接在设备树中?

Linux, spidev: why it shouldn't be directly in devicetree?

我想定义一个具有用户模式访问权限的 SPI 设备,如 http://linux-sunxi.org/SPIdev

中的示例所述

按照这些示例,我在设备树中添加了这个:

&ecspi1 {
     .... other stuff ...
    mydev@0 {
       compatible = "spidev";
       spi-max-frequency = <5000000>;
       reg = <2>; /*chipselect*/
    };
};

平台是 i.MX6。 ecspi1 似乎是他们的 SPI 控制器。 然后我确实得到 /dev/spi0.2 和 /sys/class/spidev/spidev0.2

但是在内核跟踪中有一个警告这样说:

spidev spi0.2: 错误的 DT: spidev 直接列在 DT

那么还应该如何描述 spidev?什么是正确的语法?

spidev: why it shouldn't be directly in devicetree?

设备树应该描述开发板的硬件,但是 spidev 没有 describe/identify 任何硬件。

马克·布朗写道:

Since spidev is a detail of how Linux controls a device rather than a description of the hardware in the system we should never have a node described as "spidev" in DT, any SPI device could be a spidev so this is just not a useful description.

此内核补丁的基本原理和解决方法是 https://patchwork.kernel.org/patch/6113191/


So how else the spidev should be described? What is the right syntax?

您无需在设备树源代码中明确使用 spidev,而是需要识别您正在控制的实际设备,例如

     mydev@0 {
-       compatible = "spidev";
+       compatible = "my_spi_device"; 
        spi-max-frequency = <5000000>;

然后(正如 Geert Uytterhoeven 解释的那样),通过将设备的兼容值添加到 spidev_dt_ids[][=40= 来修改内核源代码中的 drivers/spi/spidev.c ]数组

 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" },
     {},
 }

this article 提出了另一种解决方案,其中涉及对设备树进行快速的脏更改。
只需将 "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 是必需的。

要避免此问题,只需使用 linux,spidev 而不是 spidev:

&spi0 {
    mydev@0 {
       compatible = "linux,spidev";
    };
};