diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-of.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-of.c | 139 | 
1 files changed, 8 insertions, 131 deletions
diff --git a/drivers/media/v4l2-core/v4l2-of.c b/drivers/media/v4l2-core/v4l2-of.c index a6478dca0cd..b4ed9a955fb 100644 --- a/drivers/media/v4l2-core/v4l2-of.c +++ b/drivers/media/v4l2-core/v4l2-of.c @@ -121,21 +121,15 @@ static void v4l2_of_parse_parallel_bus(const struct device_node *node,   * the bus as serial CSI-2 and clock-noncontinuous isn't set, we set the   * V4L2_MBUS_CSI2_CONTINUOUS_CLOCK flag.   * The caller should hold a reference to @node. + * + * Return: 0.   */ -void v4l2_of_parse_endpoint(const struct device_node *node, -			    struct v4l2_of_endpoint *endpoint) +int v4l2_of_parse_endpoint(const struct device_node *node, +			   struct v4l2_of_endpoint *endpoint)  { -	struct device_node *port_node = of_get_parent(node); - -	memset(endpoint, 0, offsetof(struct v4l2_of_endpoint, head)); - -	endpoint->local_node = node; -	/* -	 * It doesn't matter whether the two calls below succeed. -	 * If they don't then the default value 0 is used. -	 */ -	of_property_read_u32(port_node, "reg", &endpoint->port); -	of_property_read_u32(node, "reg", &endpoint->id); +	of_graph_parse_endpoint(node, &endpoint->base); +	endpoint->bus_type = 0; +	memset(&endpoint->bus, 0, sizeof(endpoint->bus));  	v4l2_of_parse_csi_bus(node, endpoint);  	/* @@ -145,123 +139,6 @@ void v4l2_of_parse_endpoint(const struct device_node *node,  	if (endpoint->bus.mipi_csi2.flags == 0)  		v4l2_of_parse_parallel_bus(node, endpoint); -	of_node_put(port_node); +	return 0;  }  EXPORT_SYMBOL(v4l2_of_parse_endpoint); - -/** - * v4l2_of_get_next_endpoint() - get next endpoint node - * @parent: pointer to the parent device node - * @prev: previous endpoint node, or NULL to get first - * - * Return: An 'endpoint' node pointer with refcount incremented. Refcount - * of the passed @prev node is not decremented, the caller have to use - * of_node_put() on it when done. - */ -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; - -	if (!parent) -		return NULL; - -	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"); - -		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", -			       __func__, parent->full_name); -		of_node_put(node); -	} else { -		port = of_get_parent(prev); -		if (!port) -			/* Hm, has someone given us the root node ?... */ -			return NULL; - -		/* Avoid dropping prev node refcount to 0. */ -		of_node_get(prev); -		endpoint = of_get_next_child(port, prev); -		if (endpoint) { -			of_node_put(port); -			return endpoint; -		} - -		/* No more endpoints under this port, try the next one. */ -		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); - -/** - * v4l2_of_get_remote_port_parent() - get remote port's parent node - * @node: pointer to a local endpoint device_node - * - * Return: Remote device node associated with remote endpoint node linked - *	   to @node. Use of_node_put() on it when done. - */ -struct device_node *v4l2_of_get_remote_port_parent( -			       const struct device_node *node) -{ -	struct device_node *np; -	unsigned int depth; - -	/* Get remote endpoint node. */ -	np = of_parse_phandle(node, "remote-endpoint", 0); - -	/* Walk 3 levels up only if there is 'ports' node. */ -	for (depth = 3; depth && np; depth--) { -		np = of_get_next_parent(np); -		if (depth == 2 && of_node_cmp(np->name, "ports")) -			break; -	} -	return np; -} -EXPORT_SYMBOL(v4l2_of_get_remote_port_parent); - -/** - * v4l2_of_get_remote_port() - get remote port node - * @node: pointer to a local endpoint device_node - * - * Return: Remote port node associated with remote endpoint node linked - *	   to @node. Use of_node_put() on it when done. - */ -struct device_node *v4l2_of_get_remote_port(const struct device_node *node) -{ -	struct device_node *np; - -	/* Get remote endpoint node. */ -	np = of_parse_phandle(node, "remote-endpoint", 0); -	if (!np) -		return NULL; -	return of_get_parent(np); -} -EXPORT_SYMBOL(v4l2_of_get_remote_port);  | 
