[PATCH v4 3/7] of: address: Add parent pointer to the __of_translate_address args
Robin Murphy
robin.murphy at arm.com
Wed Mar 27 12:40:25 UTC 2019
On 14/03/2019 20:26, Maxime Ripard wrote:
> The __of_translate_address function is used to translate the device tree
> addresses to physical addresses using the various ranges property to create
> the offset.
>
> However, it's shared between the CPU addresses (based on the ranges
> property) and the DMA addresses (based on dma-ranges). Since we're going to
> add support for a DMA parent node that is not the DT parent node, we need
> to change the logic a bit to have an optional parent node that we should
> use.
Nit: the "optional parent node" is now a callback function for
retrieving the relevant parent node.
> Signed-off-by: Maxime Ripard <maxime.ripard at bootlin.com>
> ---
> drivers/of/address.c | 15 ++++++++++-----
> 1 file changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/of/address.c b/drivers/of/address.c
> index 2270373b30ab..140bd0718067 100644
> --- a/drivers/of/address.c
> +++ b/drivers/of/address.c
> @@ -569,6 +569,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,
> * relative to that node.
> */
> static u64 __of_translate_address(struct device_node *dev,
> + struct device_node *(*get_parent)(const struct device_node *),
> const __be32 *in_addr, const char *rprop,
> struct device_node **host)
> {
> @@ -585,9 +586,10 @@ static u64 __of_translate_address(struct device_node *dev,
>
> *host = NULL;
> /* Get parent & match bus type */
> - parent = of_get_parent(dev);
> + parent = get_parent(dev);
> if (parent == NULL)
> goto bail;
> +
Nit: spurious whitespace.
Otherwise,
Reviewed-by: Robin Murphy <robin.murphy at arm.com>
> bus = of_match_bus(parent);
>
> /* Count address cells & copy address locally */
> @@ -609,7 +611,7 @@ static u64 __of_translate_address(struct device_node *dev,
> /* Switch to parent bus */
> of_node_put(dev);
> dev = parent;
> - parent = of_get_parent(dev);
> + parent = get_parent(dev);
>
> /* If root, we have finished */
> if (parent == NULL) {
> @@ -665,7 +667,8 @@ u64 of_translate_address(struct device_node *dev, const __be32 *in_addr)
> struct device_node *host;
> u64 ret;
>
> - ret = __of_translate_address(dev, in_addr, "ranges", &host);
> + ret = __of_translate_address(dev, of_get_parent,
> + in_addr, "ranges", &host);
> if (host) {
> of_node_put(host);
> return OF_BAD_ADDR;
> @@ -680,7 +683,8 @@ u64 of_translate_dma_address(struct device_node *dev, const __be32 *in_addr)
> struct device_node *host;
> u64 ret;
>
> - ret = __of_translate_address(dev, in_addr, "dma-ranges", &host);
> + ret = __of_translate_address(dev, of_get_parent,
> + in_addr, "dma-ranges", &host);
>
> if (host) {
> of_node_put(host);
> @@ -736,7 +740,8 @@ static u64 of_translate_ioport(struct device_node *dev, const __be32 *in_addr,
> unsigned long port;
> struct device_node *host;
>
> - taddr = __of_translate_address(dev, in_addr, "ranges", &host);
> + taddr = __of_translate_address(dev, of_get_parent,
> + in_addr, "ranges", &host);
> if (host) {
> /* host-specific port access */
> port = logic_pio_trans_hwaddr(&host->fwnode, taddr, size);
>
More information about the dri-devel
mailing list