Bug 9541

Summary: Platform drivers autoloading from info in device tree does not work
Product: buildroot Reporter: Artem Synytsyn <a.synytsyn>
Component: OtherAssignee: unassigned
Status: RESOLVED WORKSFORME    
Severity: normal CC: buildroot
Priority: P5    
Version: unspecified   
Target Milestone: ---   
Hardware: All   
OS: Linux   
Host: Target:
Build:

Description Artem Synytsyn 2016-12-30 14:42:34 UTC
Hello everyone! What is going on with autoloading modules for platform devices from device tree? I've build image for raspberry pi, added device tree overlay for enc28j60. I've checked: device tree node with this device exists in /proc/device-tree/soc/spi@7e204000. But lsmod does not shows that enc28j60.ko is not loaded. In contrast of, raspbian distro successfully managed with this - module loaded successfully.
Also, I've read this thread: http://lists.busybox.net/pipermail/buildroot/2016-December/178779.html. As I understand, command

find /sys/ -name modalias -print0 | xargs -0 sort -u -z | xargs -0
modprobe -abq

does not work.

Regards,

Artem Synytsyn
Comment 1 Peter Korsgaard 2016-12-30 20:44:42 UTC
It is hard to know what is going on without more details.

For drivers to load automatically, you need:

- Device tree snippet according to the defined bindings (in your case it sounds like Documentation/devicetree/bindings/net/microchip,enc28j60.txt)

- Driver enabled as a module in the kernel

- A user space kernel module loader, E.G. mdev or (e)udev

If you still have problems, please provide more details about the above.
Comment 2 Artem Synytsyn 2016-12-30 22:26:28 UTC
Hello, Peter,

First of all I'll describe steps, which I've made.
1. Clone buildroot from official repo
2. make raspberrypi_defconfig
3. Add enc28j60.dtbo into overlays directory on boot partition
4. Add dtoverlay=enc28j60 into config.txt

After boot lsmod command output is empty(except ipv6 module, which is marked as "permanent"). 

- I've used device tree overlay from the firmware, which was built by buildroot itself. As for the snippet it is standard also, here is its code: https://github.com/raspberrypi/linux/blob/rpi-4.4.y/arch/arm/boot/dts/overlays/enc28j60-overlay.dts.
Also, as I said, device tree node with this device is exposed in /proc/device-tree, so I think it is ok.
- driver enc28j60.ko is enabled in kernel configuration as loadable, it is present in /lib/modules filesystem. I can load it manually and it is ok too.
- mdev is present in system. And I think it is root of the problem, because Raspbian distro has udev instead mdev and it successfully loads kernel module based on info from device tree.
Comment 3 Peter Korsgaard 2016-12-31 08:55:49 UTC
I take it that you somewhere in that sequence enabled mdev? (E.G. System configuration->/dev management (Dynamic using devtmpfs+mdev)

The module specifies the following aliases:

modinfo target/lib/modules/4.4.36-v7/kernel/drivers/net/ethernet/microchip/enc28j60.ko | grep alias
alias:          spi:enc28j60
alias:          of:N*T*Cmicrochip,enc28j60*

Can you first of all verify that you can load the module with these wildcards?

E.G.

modprobe 'spi:enc28j60'
lsmod | grep enc28j60
rmmod enc28j60.ko

modprobe 'of:N*T*Cmicrochip,enc28j60*'
lsmod | grep enc28j60
rmmod enc28j60.ko

And check what the modalias is for the /sys/bus/spi/* device?
Comment 4 Artem Synytsyn 2017-01-01 13:51:20 UTC
Now it works! Really, problem was in BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y option. Thank you very much!
Comment 5 Peter Korsgaard 2017-01-02 11:03:29 UTC
Great, I'll close the issue then. Perhaps it makes sense to enable mdev for the rpi*_defconfigs to make it easier to use?