[PATCH 19/48] drm: omapdrm: displays: Get encoder source at connect time

Sebastian Reichel sebastian.reichel at collabora.co.uk
Sat Oct 14 12:58:45 UTC 2017


Hi,

On Fri, Oct 13, 2017 at 05:59:15PM +0300, Laurent Pinchart wrote:
> The encoder drivers need a handle to the source they are connected to in
> order to control the source.
> 
> All drivers get that handle at probe time, resulting in probe deferral
> when the source hasn't been probed yet. However they don't need the
> handle until their connect handler is called.
> 
> Move retrieval of the source handle to the connect handler to avoid
> probe deferrals.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---

Reviewed-by: Sebastian Reichel <sebastian.reichel at collabora.co.uk>

-- Sebastian

>  drivers/gpu/drm/omapdrm/displays/encoder-opa362.c  | 35 ++++++------
>  drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c  | 36 ++++++------
>  .../gpu/drm/omapdrm/displays/encoder-tpd12s015.c   | 66 ++++++++--------------
>  3 files changed, 54 insertions(+), 83 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> index b28ec62267b1..b3bb64b477fa 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
> @@ -36,7 +36,7 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *in;
>  	int r;
>  
>  	dev_dbg(dssdev->dev, "connect\n");
> @@ -44,13 +44,22 @@ static int opa362_connect(struct omap_dss_device *dssdev,
>  	if (omapdss_device_is_connected(dssdev))
>  		return -EBUSY;
>  
> +	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(in)) {
> +		dev_err(dssdev->dev, "failed to find video source\n");
> +		return PTR_ERR(in);
> +	}
> +
>  	r = in->ops.atv->connect(in, dssdev);
> -	if (r)
> +	if (r) {
> +		omap_dss_put_device(in);
>  		return r;
> +	}
>  
>  	dst->src = dssdev;
>  	dssdev->dst = dst;
>  
> +	ddata->in = in;
>  	return 0;
>  }
>  
> @@ -74,6 +83,9 @@ static void opa362_disconnect(struct omap_dss_device *dssdev,
>  	dssdev->dst = NULL;
>  
>  	in->ops.atv->disconnect(in, &ddata->dssdev);
> +
> +	omap_dss_put_device(in);
> +	ddata->in = NULL;
>  }
>  
>  static int opa362_enable(struct omap_dss_device *dssdev)
> @@ -171,9 +183,8 @@ static const struct omapdss_atv_ops opa362_atv_ops = {
>  
>  static int opa362_probe(struct platform_device *pdev)
>  {
> -	struct device_node *node = pdev->dev.of_node;
>  	struct panel_drv_data *ddata;
> -	struct omap_dss_device *dssdev, *in;
> +	struct omap_dss_device *dssdev;
>  	struct gpio_desc *gpio;
>  	int r;
>  
> @@ -191,14 +202,6 @@ static int opa362_probe(struct platform_device *pdev)
>  
>  	ddata->enable_gpio = gpio;
>  
> -	in = omapdss_of_find_source_for_first_ep(node);
> -	if (IS_ERR(in)) {
> -		dev_err(&pdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> -	}
> -
> -	ddata->in = in;
> -
>  	dssdev = &ddata->dssdev;
>  	dssdev->ops.atv = &opa362_atv_ops;
>  	dssdev->dev = &pdev->dev;
> @@ -209,20 +212,16 @@ static int opa362_probe(struct platform_device *pdev)
>  	r = omapdss_register_output(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register output\n");
> -		goto err_reg;
> +		return r;
>  	}
>  
>  	return 0;
> -err_reg:
> -	omap_dss_put_device(ddata->in);
> -	return r;
>  }
>  
>  static int __exit opa362_remove(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
> -	struct omap_dss_device *in = ddata->in;
>  
>  	omapdss_unregister_output(&ddata->dssdev);
>  
> @@ -234,8 +233,6 @@ static int __exit opa362_remove(struct platform_device *pdev)
>  	if (omapdss_device_is_connected(dssdev))
>  		opa362_disconnect(dssdev, dssdev->dst);
>  
> -	omap_dss_put_device(in);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> index 9e0ab4e77366..0d640f8c0689 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
> @@ -32,19 +32,28 @@ static int tfp410_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *in;
>  	int r;
>  
>  	if (omapdss_device_is_connected(dssdev))
>  		return -EBUSY;
>  
> +	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(in)) {
> +		dev_err(dssdev->dev, "failed to find video source\n");
> +		return PTR_ERR(in);
> +	}
> +
>  	r = in->ops.dpi->connect(in, dssdev);
> -	if (r)
> +	if (r) {
> +		omap_dss_put_device(in);
>  		return r;
> +	}
>  
>  	dst->src = dssdev;
>  	dssdev->dst = dst;
>  
> +	ddata->in = in;
>  	return 0;
>  }
>  
> @@ -66,6 +75,9 @@ static void tfp410_disconnect(struct omap_dss_device *dssdev,
>  	dssdev->dst = NULL;
>  
>  	in->ops.dpi->disconnect(in, &ddata->dssdev);
> +
> +	omap_dss_put_device(in);
> +	ddata->in = NULL;
>  }
>  
>  static int tfp410_enable(struct omap_dss_device *dssdev)
> @@ -165,7 +177,6 @@ static int tfp410_probe_of(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct device_node *node = pdev->dev.of_node;
> -	struct omap_dss_device *in;
>  	int gpio;
>  
>  	gpio = of_get_named_gpio(node, "powerdown-gpios", 0);
> @@ -178,14 +189,6 @@ static int tfp410_probe_of(struct platform_device *pdev)
>  		return gpio;
>  	}
>  
> -	in = omapdss_of_find_source_for_first_ep(node);
> -	if (IS_ERR(in)) {
> -		dev_err(&pdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> -	}
> -
> -	ddata->in = in;
> -
>  	return 0;
>  }
>  
> @@ -211,7 +214,7 @@ static int tfp410_probe(struct platform_device *pdev)
>  		if (r) {
>  			dev_err(&pdev->dev, "Failed to request PD GPIO %d\n",
>  					ddata->pd_gpio);
> -			goto err_gpio;
> +			return r;
>  		}
>  	}
>  
> @@ -226,21 +229,16 @@ static int tfp410_probe(struct platform_device *pdev)
>  	r = omapdss_register_output(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register output\n");
> -		goto err_reg;
> +		return r;
>  	}
>  
>  	return 0;
> -err_reg:
> -err_gpio:
> -	omap_dss_put_device(ddata->in);
> -	return r;
>  }
>  
>  static int __exit tfp410_remove(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
> -	struct omap_dss_device *in = ddata->in;
>  
>  	omapdss_unregister_output(&ddata->dssdev);
>  
> @@ -252,8 +250,6 @@ static int __exit tfp410_remove(struct platform_device *pdev)
>  	if (omapdss_device_is_connected(dssdev))
>  		tfp410_disconnect(dssdev, dssdev->dst);
>  
> -	omap_dss_put_device(in);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> index 6c478140a52e..226fad5cdab1 100644
> --- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> +++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
> @@ -40,12 +40,20 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  		struct omap_dss_device *dst)
>  {
>  	struct panel_drv_data *ddata = to_panel_data(dssdev);
> -	struct omap_dss_device *in = ddata->in;
> +	struct omap_dss_device *in;
>  	int r;
>  
> +	in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
> +	if (IS_ERR(in)) {
> +		dev_err(dssdev->dev, "failed to find video source\n");
> +		return PTR_ERR(in);
> +	}
> +
>  	r = in->ops.hdmi->connect(in, dssdev);
> -	if (r)
> +	if (r) {
> +		omap_dss_put_device(in);
>  		return r;
> +	}
>  
>  	dst->src = dssdev;
>  	dssdev->dst = dst;
> @@ -56,6 +64,7 @@ static int tpd_connect(struct omap_dss_device *dssdev,
>  	/* DC-DC converter needs at max 300us to get to 90% of 5V */
>  	udelay(300);
>  
> +	ddata->in = in;
>  	return 0;
>  }
>  
> @@ -77,6 +86,9 @@ static void tpd_disconnect(struct omap_dss_device *dssdev,
>  	dssdev->dst = NULL;
>  
>  	in->ops.hdmi->disconnect(in, &ddata->dssdev);
> +
> +	omap_dss_put_device(in);
> +	ddata->in = NULL;
>  }
>  
>  static int tpd_enable(struct omap_dss_device *dssdev)
> @@ -269,23 +281,6 @@ static irqreturn_t tpd_hpd_isr(int irq, void *data)
>  	return IRQ_HANDLED;
>  }
>  
> -static int tpd_probe_of(struct platform_device *pdev)
> -{
> -	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
> -	struct device_node *node = pdev->dev.of_node;
> -	struct omap_dss_device *in;
> -
> -	in = omapdss_of_find_source_for_first_ep(node);
> -	if (IS_ERR(in)) {
> -		dev_err(&pdev->dev, "failed to find video source\n");
> -		return PTR_ERR(in);
> -	}
> -
> -	ddata->in = in;
> -
> -	return 0;
> -}
> -
>  static int tpd_probe(struct platform_device *pdev)
>  {
>  	struct omap_dss_device *in, *dssdev;
> @@ -299,34 +294,24 @@ static int tpd_probe(struct platform_device *pdev)
>  
>  	platform_set_drvdata(pdev, ddata);
>  
> -	r = tpd_probe_of(pdev);
> -	if (r)
> -		return r;
> -
>  	gpio = devm_gpiod_get_index_optional(&pdev->dev, NULL, 0,
>  		 GPIOD_OUT_LOW);
> -	if (IS_ERR(gpio)) {
> -		r = PTR_ERR(gpio);
> -		goto err_gpio;
> -	}
> +	if (IS_ERR(gpio))
> +		return PTR_ERR(gpio);
>  
>  	ddata->ct_cp_hpd_gpio = gpio;
>  
>  	gpio = devm_gpiod_get_index_optional(&pdev->dev, NULL, 1,
>  		 GPIOD_OUT_LOW);
> -	if (IS_ERR(gpio)) {
> -		r = PTR_ERR(gpio);
> -		goto err_gpio;
> -	}
> +	if (IS_ERR(gpio))
> +		return PTR_ERR(gpio);
>  
>  	ddata->ls_oe_gpio = gpio;
>  
>  	gpio = devm_gpiod_get_index(&pdev->dev, NULL, 2,
>  		GPIOD_IN);
> -	if (IS_ERR(gpio)) {
> -		r = PTR_ERR(gpio);
> -		goto err_gpio;
> -	}
> +	if (IS_ERR(gpio))
> +		return PTR_ERR(gpio);
>  
>  	ddata->hpd_gpio = gpio;
>  
> @@ -337,7 +322,7 @@ static int tpd_probe(struct platform_device *pdev)
>  		IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
>  		"tpd12s015 hpd", ddata);
>  	if (r)
> -		goto err_gpio;
> +		return r;
>  
>  	dssdev = &ddata->dssdev;
>  	dssdev->ops.hdmi = &tpd_hdmi_ops;
> @@ -352,21 +337,16 @@ static int tpd_probe(struct platform_device *pdev)
>  	r = omapdss_register_output(dssdev);
>  	if (r) {
>  		dev_err(&pdev->dev, "Failed to register output\n");
> -		goto err_reg;
> +		return r;
>  	}
>  
>  	return 0;
> -err_reg:
> -err_gpio:
> -	omap_dss_put_device(ddata->in);
> -	return r;
>  }
>  
>  static int __exit tpd_remove(struct platform_device *pdev)
>  {
>  	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
>  	struct omap_dss_device *dssdev = &ddata->dssdev;
> -	struct omap_dss_device *in = ddata->in;
>  
>  	omapdss_unregister_output(&ddata->dssdev);
>  
> @@ -378,8 +358,6 @@ static int __exit tpd_remove(struct platform_device *pdev)
>  	if (omapdss_device_is_connected(dssdev))
>  		tpd_disconnect(dssdev, dssdev->dst);
>  
> -	omap_dss_put_device(in);
> -
>  	return 0;
>  }
>  
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20171014/99b62715/attachment-0001.sig>


More information about the dri-devel mailing list