dm: core: Add address translation in fdt_get_resource
Today of_address_to_resource() is called only in
ofnode_read_resource() for livetree support and
fdt_get_resource() is called when livetree is not supported.
The fdt_get_resource() doesn't do the address translation
so when it is required, but the address translation is done
by ofnode_read_resource() caller, for example in
drivers/firmware/scmi/smt.c::scmi_dt_get_smt_buffer() {
...
	ret = ofnode_read_resource(args.node, 0, &resource);
	if (ret)
		return ret;
	faddr = cpu_to_fdt32(resource.start);
	paddr = ofnode_translate_address(args.node, &faddr);
...
The both behavior should be aligned and the address translation
must be called in fdt_get_resource() and removed for each caller.
Fixes: a44810123f ("dm: core: Add dev_read_resource() to read device resources")
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Acked-by: Etienne Carriere <etienne.carriere@linaro.org>
			
			
This commit is contained in:
		
							parent
							
								
									1736575b0c
								
							
						
					
					
						commit
						feb7ac457c
					
				|  | @ -30,8 +30,6 @@ int scmi_dt_get_smt_buffer(struct udevice *dev, struct scmi_smt *smt) | |||
| 	int ret; | ||||
| 	struct ofnode_phandle_args args; | ||||
| 	struct resource resource; | ||||
| 	fdt32_t faddr; | ||||
| 	phys_addr_t paddr; | ||||
| 
 | ||||
| 	ret = dev_read_phandle_with_args(dev, "shmem", NULL, 0, 0, &args); | ||||
| 	if (ret) | ||||
|  | @ -41,21 +39,13 @@ int scmi_dt_get_smt_buffer(struct udevice *dev, struct scmi_smt *smt) | |||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	/* TEMP workaround for ofnode_read_resource translation issue */ | ||||
| 	if (of_live_active()) { | ||||
| 		paddr = resource.start; | ||||
| 	} else { | ||||
| 		faddr = cpu_to_fdt32(resource.start); | ||||
| 		paddr = ofnode_translate_address(args.node, &faddr); | ||||
| 	} | ||||
| 
 | ||||
| 	smt->size = resource_size(&resource); | ||||
| 	if (smt->size < sizeof(struct scmi_smt_header)) { | ||||
| 		dev_err(dev, "Shared memory buffer too small\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	smt->buf = devm_ioremap(dev, paddr, smt->size); | ||||
| 	smt->buf = devm_ioremap(dev, resource.start, smt->size); | ||||
| 	if (!smt->buf) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
|  |  | |||
|  | @ -863,7 +863,6 @@ static int jr2_probe(struct udevice *dev) | |||
| 	int i; | ||||
| 	int ret; | ||||
| 	struct resource res; | ||||
| 	fdt32_t faddr; | ||||
| 	phys_addr_t addr_base; | ||||
| 	unsigned long addr_size; | ||||
| 	ofnode eth_node, node, mdio_node; | ||||
|  | @ -926,9 +925,8 @@ static int jr2_probe(struct udevice *dev) | |||
| 
 | ||||
| 		if (ofnode_read_resource(mdio_node, 0, &res)) | ||||
| 			return -ENOMEM; | ||||
| 		faddr = cpu_to_fdt32(res.start); | ||||
| 
 | ||||
| 		addr_base = ofnode_translate_address(mdio_node, &faddr); | ||||
| 		addr_base = res.start; | ||||
| 		addr_size = res.end - res.start; | ||||
| 
 | ||||
| 		/* If the bus is new then create a new bus */ | ||||
|  |  | |||
|  | @ -530,7 +530,6 @@ static int ocelot_probe(struct udevice *dev) | |||
| 	struct ocelot_private *priv = dev_get_priv(dev); | ||||
| 	int i, ret; | ||||
| 	struct resource res; | ||||
| 	fdt32_t faddr; | ||||
| 	phys_addr_t addr_base; | ||||
| 	unsigned long addr_size; | ||||
| 	ofnode eth_node, node, mdio_node; | ||||
|  | @ -578,9 +577,8 @@ static int ocelot_probe(struct udevice *dev) | |||
| 
 | ||||
| 		if (ofnode_read_resource(mdio_node, 0, &res)) | ||||
| 			return -ENOMEM; | ||||
| 		faddr = cpu_to_fdt32(res.start); | ||||
| 
 | ||||
| 		addr_base = ofnode_translate_address(mdio_node, &faddr); | ||||
| 		addr_base = res.start; | ||||
| 		addr_size = res.end - res.start; | ||||
| 
 | ||||
| 		/* If the bus is new then create a new bus */ | ||||
|  |  | |||
|  | @ -482,7 +482,6 @@ static int serval_probe(struct udevice *dev) | |||
| 	struct serval_private *priv = dev_get_priv(dev); | ||||
| 	int i, ret; | ||||
| 	struct resource res; | ||||
| 	fdt32_t faddr; | ||||
| 	phys_addr_t addr_base; | ||||
| 	unsigned long addr_size; | ||||
| 	ofnode eth_node, node, mdio_node; | ||||
|  | @ -533,9 +532,8 @@ static int serval_probe(struct udevice *dev) | |||
| 
 | ||||
| 		if (ofnode_read_resource(mdio_node, 0, &res)) | ||||
| 			return -ENOMEM; | ||||
| 		faddr = cpu_to_fdt32(res.start); | ||||
| 
 | ||||
| 		addr_base = ofnode_translate_address(mdio_node, &faddr); | ||||
| 		addr_base = res.start; | ||||
| 		addr_size = res.end - res.start; | ||||
| 
 | ||||
| 		/* If the bus is new then create a new bus */ | ||||
|  |  | |||
|  | @ -412,7 +412,6 @@ static int servalt_probe(struct udevice *dev) | |||
| 	struct servalt_private *priv = dev_get_priv(dev); | ||||
| 	int i; | ||||
| 	struct resource res; | ||||
| 	fdt32_t faddr; | ||||
| 	phys_addr_t addr_base; | ||||
| 	unsigned long addr_size; | ||||
| 	ofnode eth_node, node, mdio_node; | ||||
|  | @ -461,9 +460,8 @@ static int servalt_probe(struct udevice *dev) | |||
| 
 | ||||
| 		if (ofnode_read_resource(mdio_node, 0, &res)) | ||||
| 			return -ENOMEM; | ||||
| 		faddr = cpu_to_fdt32(res.start); | ||||
| 
 | ||||
| 		addr_base = ofnode_translate_address(mdio_node, &faddr); | ||||
| 		addr_base = res.start; | ||||
| 		addr_size = res.end - res.start; | ||||
| 
 | ||||
| 		/* If the bus is new then create a new bus */ | ||||
|  |  | |||
|  | @ -942,7 +942,11 @@ int fdt_get_resource(const void *fdt, int node, const char *property, | |||
| 
 | ||||
| 	while (ptr + na + ns <= end) { | ||||
| 		if (i == index) { | ||||
| 			res->start = fdtdec_get_number(ptr, na); | ||||
| 			if (CONFIG_IS_ENABLED(OF_TRANSLATE)) | ||||
| 				res->start = fdt_translate_address(fdt, node, ptr); | ||||
| 			else | ||||
| 				res->start = fdtdec_get_number(ptr, na); | ||||
| 
 | ||||
| 			res->end = res->start; | ||||
| 			res->end += fdtdec_get_number(&ptr[na], ns) - 1; | ||||
| 			return 0; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue