[openwrt/openwrt] kernel: of: avoid some unnecessary bad cell count warnings

LEDE Commits lede-commits at lists.infradead.org
Thu Nov 27 03:37:57 PST 2025


ansuel pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/b4d7263bc3b6169a7bb3649abfa6cf92decba865

commit b4d7263bc3b6169a7bb3649abfa6cf92decba865
Author: Shiji Yang <yangshiji66 at outlook.com>
AuthorDate: Wed Nov 26 23:06:55 2025 +0800

    kernel: of: avoid some unnecessary bad cell count warnings
    
    This patchset silences some noisy dts false warnings:
    
    [    0.616266] OF: Bad cell count for /spi at 1100d000/flash at 0/partitions
    [    0.622551] OF: Bad cell count for /spi at 1100d000/flash at 0/partitions
    
    Closes: https://github.com/openwrt/openwrt/issues/14701
    Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
    Link: https://github.com/openwrt/openwrt/pull/20942
    Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
 ...ess-Rework-bus-matching-to-avoid-warnings.patch | 61 ++++++++++++++++
 ...Fix-WARN-when-attempting-translating-non-.patch | 85 ++++++++++++++++++++++
 2 files changed, 146 insertions(+)

diff --git a/target/linux/generic/backport-6.12/203-01-v6.13-of-address-Rework-bus-matching-to-avoid-warnings.patch b/target/linux/generic/backport-6.12/203-01-v6.13-of-address-Rework-bus-matching-to-avoid-warnings.patch
new file mode 100644
index 0000000000..d7a6751861
--- /dev/null
+++ b/target/linux/generic/backport-6.12/203-01-v6.13-of-address-Rework-bus-matching-to-avoid-warnings.patch
@@ -0,0 +1,61 @@
+From 64ee3cf096ac590e7da2ceac1c390546bff5e240 Mon Sep 17 00:00:00 2001
+From: "Rob Herring (Arm)" <robh at kernel.org>
+Date: Fri, 8 Nov 2024 13:35:48 -0600
+Subject: [PATCH] of/address: Rework bus matching to avoid warnings
+
+With warnings added for deprecated #address-cells/#size-cells handling,
+the DT address handling code causes warnings when used on nodes with no
+address. This happens frequently with calls to of_platform_populate() as
+it is perfectly acceptable to have devices without a 'reg' property. The
+desired behavior is to just silently return an error when retrieving an
+address.
+
+The warnings can be avoided by checking for "#address-cells" presence
+first and checking for an address property before fetching
+"#address-cells" and "#size-cells".
+
+Reported-by: Marek Szyprowski <m.szyprowski at samsung.com>
+Reported-by: Steven Price <steven.price at arm.com>
+Tested-by: Marek Szyprowski <m.szyprowski at samsung.com>
+Link: https://lore.kernel.org/r/20241108193547.2647986-2-robh@kernel.org
+Signed-off-by: Rob Herring (Arm) <robh at kernel.org>
+---
+ drivers/of/address.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+--- a/drivers/of/address.c
++++ b/drivers/of/address.c
+@@ -331,7 +331,11 @@ static unsigned int of_bus_isa_get_flags
+ 
+ static int of_bus_default_flags_match(struct device_node *np)
+ {
+-	return of_bus_n_addr_cells(np) == 3;
++	/*
++	 * Check for presence first since of_bus_n_addr_cells() will warn when
++	 * walking parent nodes.
++	 */
++	return of_property_present(np, "#address-cells") && (of_bus_n_addr_cells(np) == 3);
+ }
+ 
+ /*
+@@ -700,16 +704,16 @@ const __be32 *__of_get_address(struct de
+ 	if (strcmp(bus->name, "pci") && (bar_no >= 0))
+ 		return NULL;
+ 
+-	bus->count_cells(dev, &na, &ns);
+-	if (!OF_CHECK_ADDR_COUNT(na))
+-		return NULL;
+-
+ 	/* Get "reg" or "assigned-addresses" property */
+ 	prop = of_get_property(dev, bus->addresses, &psize);
+ 	if (prop == NULL)
+ 		return NULL;
+ 	psize /= 4;
+ 
++	bus->count_cells(dev, &na, &ns);
++	if (!OF_CHECK_ADDR_COUNT(na))
++		return NULL;
++
+ 	onesize = na + ns;
+ 	for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++) {
+ 		u32 val = be32_to_cpu(prop[0]);
diff --git a/target/linux/generic/backport-6.12/203-02-v6.13-of-address-Fix-WARN-when-attempting-translating-non-.patch b/target/linux/generic/backport-6.12/203-02-v6.13-of-address-Fix-WARN-when-attempting-translating-non-.patch
new file mode 100644
index 0000000000..2ad67cbde7
--- /dev/null
+++ b/target/linux/generic/backport-6.12/203-02-v6.13-of-address-Fix-WARN-when-attempting-translating-non-.patch
@@ -0,0 +1,85 @@
+From 6e5773d52f4a2d9c80692245f295069260cff6fc Mon Sep 17 00:00:00 2001
+From: "Rob Herring (Arm)" <robh at kernel.org>
+Date: Fri, 10 Jan 2025 15:50:29 -0600
+Subject: [PATCH] of/address: Fix WARN when attempting translating
+ non-translatable addresses
+
+The recently added WARN() for deprecated #address-cells and #size-cells
+triggered a WARN when of_platform_populate() (which calls
+of_address_to_resource()) is used on nodes with non-translatable
+addresses. This case is expected to return an error.
+
+Rework the bus matching to allow no match and make the default require
+an #address-cells property. That should be safe to do as any platform
+missing #address-cells would have a warning already.
+
+Fixes: 045b14ca5c36 ("of: WARN on deprecated #address-cells/#size-cells handling")
+Tested-by: Sean Anderson <sean.anderson at linux.dev>
+Link: https://lore.kernel.org/r/20250110215030.3637845-2-robh@kernel.org
+Signed-off-by: Rob Herring (Arm) <robh at kernel.org>
+---
+ drivers/of/address.c | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+--- a/drivers/of/address.c
++++ b/drivers/of/address.c
+@@ -338,6 +338,15 @@ static int of_bus_default_flags_match(st
+ 	return of_property_present(np, "#address-cells") && (of_bus_n_addr_cells(np) == 3);
+ }
+ 
++static int of_bus_default_match(struct device_node *np)
++{
++	/*
++	 * Check for presence first since of_bus_n_addr_cells() will warn when
++	 * walking parent nodes.
++	 */
++	return of_property_present(np, "#address-cells");
++}
++
+ /*
+  * Array of bus specific translators
+  */
+@@ -382,7 +391,7 @@ static struct of_bus of_busses[] = {
+ 	{
+ 		.name = "default",
+ 		.addresses = "reg",
+-		.match = NULL,
++		.match = of_bus_default_match,
+ 		.count_cells = of_bus_default_count_cells,
+ 		.map = of_bus_default_map,
+ 		.translate = of_bus_default_translate,
+@@ -397,7 +406,6 @@ static struct of_bus *of_match_bus(struc
+ 	for (i = 0; i < ARRAY_SIZE(of_busses); i++)
+ 		if (!of_busses[i].match || of_busses[i].match(np))
+ 			return &of_busses[i];
+-	BUG();
+ 	return NULL;
+ }
+ 
+@@ -519,6 +527,8 @@ static u64 __of_translate_address(struct
+ 	if (parent == NULL)
+ 		return OF_BAD_ADDR;
+ 	bus = of_match_bus(parent);
++	if (!bus)
++		return OF_BAD_ADDR;
+ 
+ 	/* Count address cells & copy address locally */
+ 	bus->count_cells(dev, &na, &ns);
+@@ -562,6 +572,8 @@ static u64 __of_translate_address(struct
+ 
+ 		/* Get new parent bus and counts */
+ 		pbus = of_match_bus(parent);
++		if (!pbus)
++			return OF_BAD_ADDR;
+ 		pbus->count_cells(dev, &pna, &pns);
+ 		if (!OF_CHECK_COUNTS(pna, pns)) {
+ 			pr_err("Bad cell count for %pOF\n", dev);
+@@ -701,7 +713,7 @@ const __be32 *__of_get_address(struct de
+ 
+ 	/* match the parent's bus type */
+ 	bus = of_match_bus(parent);
+-	if (strcmp(bus->name, "pci") && (bar_no >= 0))
++	if (!bus || (strcmp(bus->name, "pci") && (bar_no >= 0)))
+ 		return NULL;
+ 
+ 	/* Get "reg" or "assigned-addresses" property */




More information about the lede-commits mailing list