Re: [PATCH v2 01/48] v4l: of: Support empty port nodes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Laurent,

On 11/03/14 00:15, Laurent Pinchart wrote:
> Empty port nodes are allowed but currently unsupported as the
> v4l2_of_get_next_endpoint() function assumes that all port nodes have at
> least an endpoint. Fix this.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>

Acked-by: Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx>

> ---
>  drivers/media/v4l2-core/v4l2-of.c | 52 +++++++++++++++++++++------------------
>  1 file changed, 28 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/media/v4l2-core/v4l2-of.c b/drivers/media/v4l2-core/v4l2-of.c
> index 42e3e8a..4c07343 100644
> --- a/drivers/media/v4l2-core/v4l2-of.c
> +++ b/drivers/media/v4l2-core/v4l2-of.c
> @@ -166,43 +166,51 @@ struct device_node *v4l2_of_get_next_endpoint(const struct device_node *parent,
>  					struct device_node *prev)
>  {
>  	struct device_node *endpoint;
> -	struct device_node *port = NULL;
> +	struct device_node *port;
>  
>  	if (!parent)
>  		return NULL;
>  
> +	/*
> +	 * Start by locating the port node. If no previous endpoint is specified
> +	 * search for the first port node, otherwise get the previous endpoint
> +	 * parent port node.
> +	 */
>  	if (!prev) {
>  		struct device_node *node;
> -		/*
> -		 * It's the first call, we have to find a port subnode
> -		 * within this node or within an optional 'ports' node.
> -		 */
> +
>  		node = of_get_child_by_name(parent, "ports");
>  		if (node)
>  			parent = node;
>  
>  		port = of_get_child_by_name(parent, "port");
> +		of_node_put(node);
>  
> -		if (port) {
> -			/* Found a port, get an endpoint. */
> -			endpoint = of_get_next_child(port, NULL);
> -			of_node_put(port);
> -		} else {
> -			endpoint = NULL;
> -		}
> -
> -		if (!endpoint)
> -			pr_err("%s(): no endpoint nodes specified for %s\n",
> +		if (!port) {
> +			pr_err("%s(): no port node found in %s\n",
>  			       __func__, parent->full_name);
> -		of_node_put(node);
> +			return NULL;
> +		}
>  	} else {
>  		port = of_get_parent(prev);
> -		if (!port)
> +		if (!port) {
>  			/* Hm, has someone given us the root node ?... */
>  			return NULL;
> +		}
>  
> -		/* Avoid dropping prev node refcount to 0. */
> +		/*
> +		 * Avoid dropping prev node refcount to 0 when getting the next
> +		 * child below.
> +		 */
>  		of_node_get(prev);
> +	}
> +
> +	while (1) {
> +		/*
> +		 * Now that we have a port node, get the next endpoint by
> +		 * getting the next child. If the previous endpoint is NULL this
> +		 * will return the first child.
> +		 */
>  		endpoint = of_get_next_child(port, prev);
>  		if (endpoint) {
>  			of_node_put(port);
> @@ -210,18 +218,14 @@ struct device_node *v4l2_of_get_next_endpoint(const struct device_node *parent,
>  		}
>  
>  		/* No more endpoints under this port, try the next one. */
> +		prev = NULL;
> +
>  		do {
>  			port = of_get_next_child(parent, port);
>  			if (!port)
>  				return NULL;
>  		} while (of_node_cmp(port->name, "port"));
> -
> -		/* Pick up the first endpoint in this port. */
> -		endpoint = of_get_next_child(port, NULL);
> -		of_node_put(port);
>  	}
> -
> -	return endpoint;
>  }
>  EXPORT_SYMBOL(v4l2_of_get_next_endpoint);
>  

-- 
Regards,
Sylwester
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux