Re: [RFC v2 2/5] OMAPDSS: DT: Get source endpoint by matching reg-id

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

 



On 26/05/14 12:28, Archit Taneja wrote:
> In omapdss_of_find_source_for_first_ep, we retrieve a source endpoint's DT node,
> and then see what omapdss output has the matching device_node pointer in
> omap_dss_find_output_by_node.
> 
> For all DPI and SDI outputs, the device_node pointer is set as the parent's DSS
> device_node pointer. If the source is one of these outputs, the above method
> won't work.
> 
> To get the correct output for ports within DSS(and in other cases in the future,
> where multiple ports might be under one device), we require additional
> information which is exclusive to the output port.
> 
> We create a new field in omap_dss_device called 'port_num', this provides port
> number of the output port corresponding to this device. When searching for the
> source endpoint in DT, we extract the 'reg' property from the port corresponding
> to the endpoint source. From the list of registered outputs, we pick out that
> output which has both dev->of_node and port_num matching with the device_node
> pointer and 'reg' of the source endpoint node from DT.
> 
> For encoder blocks(the ones which have both an input and output port), we need
> to set the port_num as the 'reg' property for the output port as defined in the
> DT bindings. We set port_num to 1 in the tfp410 and tpd12s015 encoder drivers.
> 
> Signed-off-by: Archit Taneja <archit@xxxxxx>
> ---
>  .../fbdev/omap2/displays-new/encoder-tfp410.c      |  1 +
>  .../fbdev/omap2/displays-new/encoder-tpd12s015.c   |  1 +
>  drivers/video/fbdev/omap2/dss/dss-of.c             | 51 +++++++++++++++++-----
>  drivers/video/fbdev/omap2/dss/output.c             |  8 ++--
>  include/video/omapdss.h                            |  7 ++-
>  5 files changed, 52 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c b/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c
> index b4e9a42..d927455 100644
> --- a/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c
> +++ b/drivers/video/fbdev/omap2/displays-new/encoder-tfp410.c
> @@ -249,6 +249,7 @@ static int tfp410_probe(struct platform_device *pdev)
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_DVI;
>  	dssdev->owner = THIS_MODULE;
>  	dssdev->phy.dpi.data_lines = ddata->data_lines;
> +	dssdev->port_num = 1;
>  
>  	r = omapdss_register_output(dssdev);
>  	if (r) {
> diff --git a/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c b/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c
> index 7e33686..9e25fe7 100644
> --- a/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c
> +++ b/drivers/video/fbdev/omap2/displays-new/encoder-tpd12s015.c
> @@ -389,6 +389,7 @@ static int tpd_probe(struct platform_device *pdev)
>  	dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
>  	dssdev->owner = THIS_MODULE;
> +	dssdev->port_num = 1;
>  
>  	in = ddata->in;
>  
> diff --git a/drivers/video/fbdev/omap2/dss/dss-of.c b/drivers/video/fbdev/omap2/dss/dss-of.c
> index a4b20aa..8ba43faa 100644
> --- a/drivers/video/fbdev/omap2/dss/dss-of.c
> +++ b/drivers/video/fbdev/omap2/dss/dss-of.c
> @@ -132,28 +132,55 @@ EXPORT_SYMBOL_GPL(omapdss_of_get_first_endpoint);
>  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 *ep, *port_ep;
> +	struct device_node *src_node, *src_port;
>  	struct omap_dss_device *src;
> +	int r;
> +	u32 reg;
>  
>  	ep = omapdss_of_get_first_endpoint(node);
> -	if (!ep)
> -		return ERR_PTR(-EINVAL);
> +	if (!ep) {
> +		r = -EINVAL;
> +		goto err_first_ep;
> +	}
>  
>  	src_node = omapdss_of_get_remote_device_node(ep);
> +	if (!src_node) {
> +		r = -EINVAL;
> +		goto err_src_node;
> +	}
>  
> -	of_node_put(ep);
> -
> -	if (!src_node)
> -		return ERR_PTR(-EINVAL);
> +	port_ep = of_parse_phandle(ep, "remote-endpoint", 0);
> +	if (!port_ep) {
> +		r = -EINVAL;
> +		goto err_port_ep;
> +	}
>  
> -	src = omap_dss_find_output_by_node(src_node);
> +	src_port = of_get_next_parent(port_ep);
> +	if (!src_port) {
> +		r = -EINVAL;
> +		goto err_src_port;
> +	}
>  
> -	of_node_put(src_node);
> +	r = of_property_read_u32(src_port, "reg", &reg);
> +	if (r) {
> +		r = 0;
> +		reg = 0;
> +	}
>  
> +	src = omap_dss_find_output_by_node_and_reg(src_node, reg);
>  	if (!src)
> -		return ERR_PTR(-EPROBE_DEFER);
> +		r = -EPROBE_DEFER;

Hmm, maybe the above function, and the helper functions, should be
changed a bit more, so that this function would do:

ep = omapdss_of_get_first_endpoint(node);
src_port = omapdss_of_get_remote_port(ep);
src = omap_dss_find_output_by_port_node(src_port);

 Tomi


Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux