Re: Kernel doesn't call spi driver's _match() and _attach()

"Nikita Donskov" <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <[email protected]>
On Tue Sep 17, 2024 at 12:07 AM MSK, Valery Ushakov wrote:
> On Mon, Sep 16, 2024 at 23:16:18 +0300, Nikita Donskov wrote:
>
> > Spi is configured by default in sys/arch/evbarm/conf/RPI config file nearly
> > the same way, as i2c:
> >         # Broadcom Serial Control (I2C)
> >         bsciic* at fdt?
> >         iic* at i2cbus?
> >         ...
> >
> >         # SPI controller
> >         bcmspi* at fdt?
> >         spi* at spibus?
>
> I don't know much about SPI and FDT (my mental model is that FDT is
> kinda like an externalized OFW device tree :), but the fact that
> bcmspi is not attached might indicate that the FDT blob that you used
> to boot your board doesn't declare that it's there.  You might want to
> cross-check it.
>
> If I'm not mistaken, the sources are in sys/external/gpl2/dts/dist
>
>
> > What I've tried to do is creating /dev/spiu device node manually:
>
> Nodes in /dev are just a way for userland programs to open the devices
> and don't affect the autoconfiguration process in any way.
>
>
> -uwe

Thank you very much, the problem was exactly what you pointed out.  To be
honest, I didn't know anything about FDT before.  Below are the steps I
performed in order to tell kernel about bcmspi existance on evbarm/RPI.
(for those, who are facing the same issue).

* Identify your RPI model. It can be done through dmesg(8):
        $ dmesg | grep Raspberry
        [     1.000000] simplebus0 at armfdt0: Raspberry Pi Model B Rev 2

* Find appropriate FDT blob in /boot/dtb. There are a bunch of blobs for
  different RPI models:
        $ ls /boot/dtb
	bcm2711-rpi-4-b.dtb         bcm2835-rpi-b-rev2.dtb
	bcm2836-rpi-2-b.dtb         bcm2711-rpi-400.dtb
        ...

  Then copy it to some directory in your $HOME in order to safely
manipulate or change this file:
	$ mkdir $HOME/dt
	$ cp /boot/dtb/bcm2835-rpi-b-rev2.dtb $HOME/dt/target.dtb
	$ cd $HOME/dt

* "Decompile" device tree via dtc (doesn't seem to have man page, use `dtc
  -h`):
        $ dtc -I dtb -O dts -o target.dts target.dtb

  dtc will then generate source file target.dts from FDT blob target.dtb.

* Edit source file. In there you'll find mentions of spi, that look like
  this:

        spi@7e2150c0 {
                compatible = "brcm,bcm2835-aux-spi";
                reg = <0x7e2150c0 0x40>;
                interrupts = <0x01 0x1d>;
                clocks = <0x0f 0x02>;
                #address-cells = <0x01>;
                #size-cells = <0x00>;
                status = "disable";
                phandle = <0x4c>;
        };

  Just change `status` from "disable" to "okay" for every spi entry.

* "Recompile" and install new device tree, once you finished editing. Make
  sure to save old FDT blob in case something goes wrong:
        # cp /boot/dtb/bcm2835-rpi-b-rev2.dtb /boot/dtb/bcm2835-rpi-b-rev2.dtb.old
        # dtc -I dts -O dtb -o /boot/dtb/bcm2835-rpi-b-rev2.dtb target.dts
        # echo $?
        0

* Reboot and give it a chance! If everything succeeded, you should now see
  bcmspi is being attached to whatever root bus you have.
        $  dmesg | grep spi
        [     1.000000] bcmspi0 at simplebus1: SPI
        [     1.000000] bcmspi0: interrupting on icu irq 54
        [     1.000000] spi0 at bcmspi0: SPI bus
        [     1.000000] /soc/spi@7e215080 at simplebus1 not configured
        [     1.000000] /soc/spi@7e2150c0 at simplebus1 not configured
        [     1.000000] bcmspi0 at simplebus1: SPI
        [     1.000000] bcmspi0: interrupting on icu irq 54
        [     1.000000] spi0 at bcmspi0: SPI bus
-->     [     1.000000] mydev0 at spi0 slave 0mydev_attach() called.
        [     1.000000] /soc/spi@7e215080 at simplebus1 not configured
        [     1.000000] /soc/spi@7e2150c0 at simplebus1 not configured

And kernel eventually calls mydev_attach()!

-Nikita
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.