pritam
pritam

Reputation: 75

Add SPI slave device in linux 4.9 device tree for raspbery pi

I am writing mcp3008 driver without use of iio for learnings. At this stage i want driver's probe to be called.

I have appended my code in DT arch/arm/boot/dts/bcm2708-rpi-b.dts

&spi0 {
    pinctrl-names = "default";
    pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
    cs-gpios = <&gpio 8 1>, <&gpio 7 1>;

    spidev0: spidev@0{
            compatible = "spidev";
            reg = <0>;      /* CE0 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
    };

    spidev1: spidev@1{
            compatible = "spidev";
            reg = <1>;      /* CE1 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
    };

    /* new device for mcp3008 */  
    aartyaa_3008{
            compatible = "aartyaa_mcp3008";
            reg = <0>;
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <1600000>;
    };
};

And my driver code looks like

static int mcp3008_probe(struct spi_device *spi)
{
    int ret = 0;
    struct mcp3008 *mcp = NULL;
    const struct mcp3008_chip_info *chip_info;

    dev_dbg(&spi->dev, "aaartyaa came in probe, master dev = %s\n",
                     dev_name(&spi->master->dev));

    .
    .
    .
    .

}

static const struct of_device_id mcp3008_of_ids[] = {
    {
            .compatible = "aartyaa_mcp3008",
    },

    { },
};

MODULE_DEVICE_TABLE(of, mcp3008_of_ids);

static const struct spi_device_id mcp3008_ids[] = {
    {"aartyaa_mcp3008", MCP3008},
    {},
};

MODULE_DEVICE_TABLE(spi, mcp3008_ids);

static struct spi_driver mcp3008_driver = {
    .driver = {
            .name = "aartyaa_mcp3008",
            .of_match_table = of_match_ptr(mcp3008_of_ids),
    },
    .id_table = mcp3008_ids,
    .probe = mcp3008_probe,
    //.remove = devm_mcp3008_device_release,
};

module_spi_driver(mcp3008_driver);

It is not able to register and create spi device dmesg =>

[  213.352758] spi-bcm2835 20204000.spi: chipselect 0 already in use
[  213.352781] spi_master spi0: spi_device register error /soc/spi@7e204000/aartyaa_3008
[  213.352799] spi_master spi0: Failed to create SPI device for /soc/spi@7e204000/aartyaa_3008

spi_bcm2835 and spi_bcm2835aux are added to system. And as I noticed, module is added in /sys/bus/spi/drivers after inserting it. Probe is not called because matching device is not found.

How driver's probe is called, and how to add spi device in device tree

Any help will be appreciated and thanks.

Upvotes: 1

Views: 3191

Answers (2)

Jignesh
Jignesh

Reputation: 11

1) You need to add CS GPIO in array of following property as shown bellow : cs-gpios = <&gpio 8 1>, <&gpio 7 1> ,

2) And need use reg = <3> in your driver

Upvotes: 1

pritam
pritam

Reputation: 75

I appreciate your inputs. For now i have replaced the spi0 device with new one. Driver probe is getting called

Upvotes: 0

Related Questions