Linux 是否将多个SPI端口(设备)注册到单个SPI平台驱动程序?

Linux 是否将多个SPI端口(设备)注册到单个SPI平台驱动程序?,linux,linux-kernel,linux-device-driver,embedded-linux,spi,Linux,Linux Kernel,Linux Device Driver,Embedded Linux,Spi,我正在开发一个LinuxSPI驱动程序来处理通过spi端口的通信。 我的SoC提供三个spi模块(我理解为端口),称为ecspi1/ecspi2/ecspi3。 我需要使用ecspi1和ecspi2发送两种数据 我已经实现了一个已注册到spi驱动程序的驱动程序,并已通过向dts和驱动程序添加以下内容成功处理了ecspi1: [dts] &ecspi1 { status = "okay"; fpga1: lfe5u12f6bg256i@0 { reg =

我正在开发一个LinuxSPI驱动程序来处理通过spi端口的通信。 我的SoC提供三个spi模块(我理解为端口),称为ecspi1/ecspi2/ecspi3。 我需要使用ecspi1和ecspi2发送两种数据

我已经实现了一个已注册到spi驱动程序的驱动程序,并已通过向dts和驱动程序添加以下内容成功处理了ecspi1:

[dts]

&ecspi1 {
    status = "okay";

    fpga1: lfe5u12f6bg256i@0 {
        reg = <0>;
        compatible = "lattice,lfe5u12f6bg256i";
        spi-max-frequency = <10000000>;
    };
};
 &ecspi1 {
    status = "okay";

    fpga1: lfe5u12f6bg256i@0 {
        reg = <0>;
        compatible = "lattice,lfe5u12f6bg256i";
        spi-max-frequency = <10000000>;
    };
 };

+&ecspi2 {
+   status = "okay";
+
+   fpga0: fpga_fw@0 {
+       reg = <0>;
+       compatible = "fpga_fw,lfe5u12f6bg256i";
+       spi-max-frequency = <10000000>;
+   };
+};
我已经尝试通过以下修改将ecspi2添加到驱动程序中。 然而,驱动程序在引导时探测了两次,在第二次探测期间失败

[dts]

&ecspi1 {
    status = "okay";

    fpga1: lfe5u12f6bg256i@0 {
        reg = <0>;
        compatible = "lattice,lfe5u12f6bg256i";
        spi-max-frequency = <10000000>;
    };
};
 &ecspi1 {
    status = "okay";

    fpga1: lfe5u12f6bg256i@0 {
        reg = <0>;
        compatible = "lattice,lfe5u12f6bg256i";
        spi-max-frequency = <10000000>;
    };
 };

+&ecspi2 {
+   status = "okay";
+
+   fpga0: fpga_fw@0 {
+       reg = <0>;
+       compatible = "fpga_fw,lfe5u12f6bg256i";
+       spi-max-frequency = <10000000>;
+   };
+};

有人知道如何在单个驱动程序中处理多个SPI端口(设备)吗?

要使用同一个驱动程序处理两个相同的SPI设备,驱动程序不需要修改,只需要一个兼容字符串:

数据传输系统:


驱动程序将被实例化两次,每个设备一次,每次它将接收不同的
struct spi_device

能否显示模块初始化函数和探测函数?如果需要多个,则需要在
->init()
回调中注册它们。在这种情况下,驱动程序将是平台(作为SPI从设备的多实例)。我想您可能会在内核中找到示例。@0andriy谢谢您的建议。我意识到应该修改它以适应多实例化。看起来您不需要它。答案中描述了一个标准的枚举机制。你的建议对我很有用,非常感谢。但是,您对DTS的回答有一个错误。标签名称(fpga1:lfe5u12f6bg256i@0)虽然它们具有相同的兼容字符串,但不应相同。这将导致“重复标签”错误。因此,只需修改兼容字符串就足够了。毕竟,谢谢你的帮助。感谢。很高兴知道这是有帮助的,谢谢你报告错误,我刚刚修复了回复。
static const struct of_device_id fpga_spi_of_match[] = {
    { .compatible = "lattice,lfe5u12f6bg256i", },
    {},
};