Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7e82a67 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen
Browse files

drm/omap: dss: Rework output lookup by port node



The omap_dss_find_output_by_port_node() function defined in output.c
looks up an output from its port node. To do so it needs to call helper
functions from dss-of.c to lookup the port parent and the port number.
As omap_dss_find_output_by_port_node() is only called by
omapdss_of_find_source_for_first_ep() from dss-of.c this goes back and
forth between the to source files and isn't very clear.

Simplify the code by passing both the parent and the port number to
omap_dss_find_output_by_port_node() instead of the port node, and rename
the function to omap_dss_find_output_by_port().

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 9184f8d9
Loading
Loading
Loading
Loading
+18 −21
Original line number Diff line number Diff line
@@ -21,7 +21,8 @@

#include "omapdss.h"

struct device_node *dss_of_port_get_parent_device(struct device_node *port)
static struct device_node *
dss_of_port_get_parent_device(struct device_node *port)
{
	struct device_node *np;
	int i;
@@ -45,40 +46,36 @@ struct device_node *dss_of_port_get_parent_device(struct device_node *port)
	return NULL;
}

u32 dss_of_port_get_port_number(struct device_node *port)
{
	int r;
	u32 reg;

	r = of_property_read_u32(port, "reg", &reg);
	if (r)
		reg = 0;

	return reg;
}

struct omap_dss_device *
omapdss_of_find_source_for_first_ep(struct device_node *node)
{
	struct device_node *ep;
	struct device_node *src_node;
	struct device_node *src_port;
	struct device_node *ep;
	struct omap_dss_device *src;
	u32 port_number = 0;

	/* Get the endpoint... */
	ep = of_graph_get_endpoint_by_regs(node, 0, 0);
	if (!ep)
		return ERR_PTR(-EINVAL);

	/* ... and its remote port... */
	src_port = of_graph_get_remote_port(ep);
	if (!src_port) {
	of_node_put(ep);
	if (!src_port)
		return ERR_PTR(-EINVAL);
	}

	of_node_put(ep);

	src = omap_dss_find_output_by_port_node(src_port);

	/* ... and the remote port's number and parent... */
	of_property_read_u32(src_port, "reg", &port_number);
	src_node = dss_of_port_get_parent_device(src_port);
	of_node_put(src_port);
	if (!src_node)
		return NULL;

	/* ... and finally the source. */
	src = omap_dss_find_output_by_port(src_node, port_number);
	of_node_put(src_node);

	return src ? src : ERR_PTR(-EPROBE_DEFER);
}
+2 −4
Original line number Diff line number Diff line
@@ -576,7 +576,8 @@ int omap_dss_get_num_overlays(void);
int omapdss_register_output(struct omap_dss_device *output);
void omapdss_unregister_output(struct omap_dss_device *output);
struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id);
struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port);
struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
						     unsigned int port);
int omapdss_output_set_device(struct omap_dss_device *out,
		struct omap_dss_device *dssdev);
int omapdss_output_unset_device(struct omap_dss_device *out);
@@ -603,9 +604,6 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
struct omap_dss_device *
omapdss_of_find_source_for_first_ep(struct device_node *node);

struct device_node *dss_of_port_get_parent_device(struct device_node *port);
u32 dss_of_port_get_port_number(struct device_node *port);

enum dss_writeback_channel {
	DSS_WB_LCD1_MGR =	0,
	DSS_WB_LCD2_MGR =	1,
+3 −14
Original line number Diff line number Diff line
@@ -122,26 +122,15 @@ struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id)
}
EXPORT_SYMBOL(omap_dss_get_output);

struct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port)
struct omap_dss_device *omap_dss_find_output_by_port(struct device_node *src,
						     unsigned int port)
{
	struct device_node *src_node;
	struct omap_dss_device *out;
	u32 reg;

	src_node = dss_of_port_get_parent_device(port);
	if (!src_node)
		return NULL;

	reg = dss_of_port_get_port_number(port);

	list_for_each_entry(out, &output_list, output_list) {
		if (out->dev->of_node == src_node && out->port_num == reg) {
			of_node_put(src_node);
		if (out->dev->of_node == src && out->port_num == port)
			return omap_dss_get_device(out);
	}
	}

	of_node_put(src_node);

	return NULL;
}