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

时间:2020-03-13 09:19:45

标签: linux linux-kernel linux-device-driver embedded-linux spi

我正在开发Linux spi驱动程序,以处理通过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>;
    };
};

[驱动程序]

static const struct of_device_id fpga_spi_of_match[] = {
    { .compatible = "lattice,lfe5u12f6bg256i", },
    {},
};

我尝试通过以下修改将ecspi2添加到驱动程序。 但是,驱动程序在启动时进行了两次探测,并在第二次探测期间失败。

[dts]

 &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>;
+   };
+};

[驱动程序]

 static const struct of_device_id fpga_spi_of_match[] = {
    { .compatible = "fpga_fw,lfe5u12f6bg256i", },
+   { .compatible = "lattice,lfe5u12f6bg256i", },
    {},
 };

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

1 个答案:

答案 0 :(得分:1)

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

DTS:

&ecspi1 {
    status = "okay";

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

&ecspi2 {
    status = "okay";

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

驱动程序:

static const struct of_device_id fpga_spi_of_match[] = {
    { .compatible = "lattice,lfe5u12f6bg256i", },
    {},
};

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