[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