mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
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
6 changed files with 10 additions and 24 deletions
|
@ -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 a new issue