Fwd: nvmem-cells regression after adding 'call of_platform_populate() for MTD partitions'

From: Maxim Kiselev
Date: Sat Dec 10 2022 - 04:52:42 EST


Hi, friends.

After applying this commit 'mtd: call of_platform_populate() for MTD
partitions' (bcdf0315),
I faced with a problem that my ethernet device can't be probed because it
wait when 'nvmem-cells' device will be probed first.

But there is no such driver which is compatible with 'nvmem-cells' because
'nvmem-cells' is just a mark used by the 'mtd_nvmem_add' function.

So this leads to appeating of unresolved dependency for the ethernet device.
And that's why the ethernet device can't be added and probed.

Here is a part of kernel log when spi flash probe start:

> device: 'spi0': device_add
> device: 'spi0.0': device_add
> spi-nor spi0.0: mx66l51235f (65536 Kbytes)
> 7 fixed-partitions partitions found on MTD device spi0.0

After 'm25p80' probe 'f1070000.ethernet' linked to 'partition@1' :

> device: 'f1010600.spi:m25p80@0:
partitions:partition@1': device_add
> device: 'platform:f1010600.spi:m25p80@0:partitions:partition@1--platform:f1070000.ethernet': device_add
> devices_kset: Moving f1070000.ethernet to end of list
> platform f1070000.ethernet: Linked as a consumer to f1010600.spi:m25p80@0:partitions:partition@1
> ethernet@70000 Dropping the fwnode link to partition@1

And as a result I got `-EPROBE_DEFER` for `f1070000.ethernet`

> platform f1070000.ethernet: error -EPROBE_DEFER: supplier f1010600.spi:m25p80@0:partitions:partition@1 not ready

Here is a part of my device tree:

enet1: ethernet@70000 {
status = "okay";
nvmem-cells = <&macaddr>;
nvmem-cell-names = "mac-address";
phy-mode = "rgmii";
phy = <&phy0>;
};

spi@10600 {
status = "okay";

m25p80@0 {
compatible = "mx66l51235l";
reg = <0>;
#address-cells = <1>;
#size-cells = <1>;

partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;

partition@0 {
reg = <0x00000000 0x000080000>;
label = "SPI.U_BOOT";
};

partition@1 {
compatible = "nvmem-cells";
reg = <0x000A0000 0x00020000>;
label = "SPI.INV_INFO";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x000A0000 0x00020000>;

macaddr: mac@6 {
reg = <0x6 0x6>;
};
};

};
};
};

In the example above 'ethernet@70000' requires 'macaddr: mac@6' which is
located inside mtd 'partition@1' of 'm25p80@0' spi flash.