Linux,Spidev:为什么它不应该直接在devicetree中?

ddb*_*bug 3 spi linux-device-driver device-tree

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

在这些示例之后,我在devicetree中添加了this:

&ecspi1 {
     .... other stuff ...
    mydev@0 {
       compatible = "spidev";
       spi-max-frequency = <5000000>;
       reg = <2>; /*chipselect*/
    };
};
Run Code Online (Sandbox Code Playgroud)

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

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

spidev spi0.2:越野车DT:spidev直接列在DT中

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

saw*_*ust 5

spidev:为什么它不应该直接在devicetree中?

设备树应描述主板的硬件,但 spidev不描述/标识任何硬件。

马克·布朗写道:

由于spidev是Linux如何控制设备的详细信息,而不是系统中硬件的描述,因此我们永远不要在DT中将节点描述为“ spidev”,因此任何SPI设备都可能是spidev,因此这不是一个有用的描述。 。

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


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

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

     mydev@0 {
-       compatible = "spidev";
+       compatible = "my_spi_device"; 
        spi-max-frequency = <5000000>;
Run Code Online (Sandbox Code Playgroud)

然后(如Geert Uytterhoeven解释的那样),通过将设备的兼容值添加到spidev_dt_ids []数组,在内核源代码中修改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" },
     {},
 }
Run Code Online (Sandbox Code Playgroud)

另一种解决方案,它涉及一种快速正脏变化到正好的设备树,通过建议本文
只需将“ spidev”兼容字符串替换为已经存在的适当字符串即可:

     mydev@0 {
-       compatible = "spidev";
+       compatible = "rohm,dh2228fv";  /* actually spidev for my_spi_dev */
        spi-max-frequency = <5000000>;
Run Code Online (Sandbox Code Playgroud)

因为“ rohm,dh2228fv”已经在spidev_dt_ids []列表中,所以不需要对driver / spi / spidev.c进行编辑。

  • 我个人不同意内核维护者的理由。有一个用例是在板上有一个未提交的 SPI 端口而不是特定的 SPI 设备。对于这样的端口,最好有一个特定的“兼容”字符串,而不是“借用”可能有一天会消失的“rohm,dh2228fv”字符串。 (8认同)
  • @IanAbbott 对于此用例,您可以使用“linux,spidev”(而不仅仅是“spidev”)。 (3认同)

Com*_*lio 5

为了避免这个问题,只需使用linux,spidev而不是spidev

&spi0 {
    mydev@0 {
       compatible = "linux,spidev";
    };
};
Run Code Online (Sandbox Code Playgroud)