Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e38c0a1f authored by Thierry Reding's avatar Thierry Reding Committed by Rob Herring
Browse files

of/address: Handle #address-cells > 2 specially

When a bus specifies #address-cells > 2, of_bus_default_map() now
assumes that the mapping isn't for a physical address but rather an
identifier that needs to match exactly.

This is required by bindings that use multiple cells to translate a
resource to the parent bus (device index, type, ...).

See here for the discussion:

	https://lists.ozlabs.org/pipermail/devicetree-discuss/2012-June/016577.html



Originally-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarThierry Reding <thierry.reding@avionic-design.de>
Signed-off-by: default avatarRob Herring <rob.herring@calxeda.com>
parent a4f8bf22
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -69,6 +69,14 @@ static u64 of_bus_default_map(u32 *addr, const __be32 *range,
		 (unsigned long long)cp, (unsigned long long)s,
		 (unsigned long long)cp, (unsigned long long)s,
		 (unsigned long long)da);
		 (unsigned long long)da);


	/*
	 * If the number of address cells is larger than 2 we assume the
	 * mapping doesn't specify a physical address. Rather, the address
	 * specifies an identifier that must match exactly.
	 */
	if (na > 2 && memcmp(range, addr, na * 4) != 0)
		return OF_BAD_ADDR;

	if (da < cp || da >= (cp + s))
	if (da < cp || da >= (cp + s))
		return OF_BAD_ADDR;
		return OF_BAD_ADDR;
	return da - cp;
	return da - cp;