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

9

我希望定义一个具有用户模式访问权限的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:buggy DT: spidev listed directly in DT

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

2个回答

15

spidev:为什么不能直接放在设备树中?

设备树应该描述板子的硬件,但是spidev并没有描述或标识任何硬件。

Mark Brown写道:

  

由于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>;

接下来(就像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" },
     {},
 }

这篇文章提出了一种替代方案,它只涉及对设备树的快速变更。建议参考此文章。只需将“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


10
我个人不同意内核维护者的论点。在板子上拥有一个未提交的 SPI 端口而不是特定的 SPI 设备是有用的。最好有一个专门的 compatible 字符串来表示这样的端口,而不是不得不“借用”可能会在将来消失的 “rohm,dh2228fv” 字符串。 - Ian Abbott
感谢sawdust的解释。谢谢@Ian Abbott。我会看看能做些什么。最简单的方法就是忽略这个警告... - ddbug
3
@IanAbbott 你可以在这种情况下使用"linux,spidev"(而不仅仅是"spidev")。 - Compholio

5
为避免此问题,只需使用linux,spidev而不是spidev:
&spi0 {
    mydev@0 {
       compatible = "linux,spidev";
    };
};

需要在“drivers/spi/spidev.c”中进行代码补丁,将兼容字符串添加到设备ID表中。 - Ian Abbott
我正在使用 Xilinx 内核树,但该字符串未出现在兼容列表中,但仍然可以工作(准确提交的清单:https://github.com/Xilinx/linux-xlnx/blob/93dc4dbd16d091a25e0200d375120ebd231246cc/drivers/spi/spidev.c#L660)。 - Compholio
有趣。所以它是通过“modalias”值来选择驱动程序的? - Ian Abbott
1
是的,如果你只使用“spidev”,你会在启动日志中看到可怕的警告。我注意到“linux,spidev”的行为不同,因为我按照这些说明设置了设备树:https://www.emcraft.com/stm32f769i-discovery-board/accessing-spi-devices-in-linux,而且我没有收到警告。我以前配置过SPI,所以我期望必须修补内核才能消除它 - 当这不是必要的时候,我追踪了兼容字符串的差异。 - Compholio
1
FYI,这里的情况似乎是spidev对of_device_is_compatible()的调用精确匹配“spidev”,而设备树modalias代码则剥离制造商:https://github.com/Xilinx/linux-xlnx/blob/93dc4dbd16d091a25e0200d375120ebd231246cc/drivers/of/base.c#L1194 - Compholio
我认为自从commit 6840615f85f60之后,compatible = "linux,spidev";在Linux内核5.15及以后的版本中不起作用。至少,在v6.0中我无法让它工作,这似乎是最可能的原因。 - Ian Abbott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接