All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Sam Ravnborg <sam@ravnborg.org>
Cc: Jernej Skrabec <jernej.skrabec@siol.net>,
	Peter Senna Tschudin <peter.senna@gmail.com>,
	kbuild test robot <lkp@intel.com>,
	Jonas Karlman <jonas@kwiboo.se>,
	Neil Armstrong <narmstrong@baylibre.com>,
	dri-devel@lists.freedesktop.org,
	Martyn Welch <martyn.welch@collabora.co.uk>,
	Andrzej Hajda <a.hajda@samsung.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Martin Donnelly <martin.donnelly@ge.com>
Subject: Re: [PATCH v4 08/15] drm/bridge: parade-ps8622: add drm_panel_bridge support
Date: Mon, 27 Jul 2020 00:54:08 +0300	[thread overview]
Message-ID: <20200726215408.GD28704@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20200726203324.3722593-9-sam@ravnborg.org>

Hi Sam,

Thank you for the patch.

On Sun, Jul 26, 2020 at 10:33:17PM +0200, Sam Ravnborg wrote:
> Prepare the bridge driver for use in a chained setup by
> replacing direct use of drm_panel with drm_panel_bridge support.
> 
> The connecter is now either created by the panel bridge or the display
> driver. So all code for connector creation in this driver is no longer
> relevant and thus dropped.
> 
> The connector code had some special polling handling:
>     connector.polled = DRM_CONNECTOR_POLL_HPD;
>     drm_helper_hpd_irq_event(ps8622->bridge.dev);
> 
> This code was most likely added to speed up detection of the connector.
> If really needed then this functionality belongs somewhere else.
> 
> Note: the bridge panel will use the connector type from the panel.
> 
> v2:
>   - Fix to avoid creating connector twice (Laurent)
>   - Drop all connector code - defer to bridge panel
>   - Use panel_bridge for local variable to align with other drivers
>   - Set bridge.type to DRM_MODE_CONNECTOR_LVDS;
> 
> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
> Cc: Andrzej Hajda <a.hajda@samsung.com>
> Cc: Neil Armstrong <narmstrong@baylibre.com>
> Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
> Cc: Jonas Karlman <jonas@kwiboo.se>
> Cc: Jernej Skrabec <jernej.skrabec@siol.net>
> ---
>  drivers/gpu/drm/bridge/parade-ps8622.c | 100 ++++---------------------
>  1 file changed, 13 insertions(+), 87 deletions(-)
> 
> diff --git a/drivers/gpu/drm/bridge/parade-ps8622.c b/drivers/gpu/drm/bridge/parade-ps8622.c
> index d789ea2a7fb9..614b19f0f1b7 100644
> --- a/drivers/gpu/drm/bridge/parade-ps8622.c
> +++ b/drivers/gpu/drm/bridge/parade-ps8622.c
> @@ -42,10 +42,9 @@
>  #endif
>  
>  struct ps8622_bridge {
> -	struct drm_connector connector;
>  	struct i2c_client *client;
>  	struct drm_bridge bridge;
> -	struct drm_panel *panel;
> +	struct drm_bridge *panel_bridge;
>  	struct regulator *v12;
>  	struct backlight_device *bl;
>  
> @@ -64,12 +63,6 @@ static inline struct ps8622_bridge *
>  	return container_of(bridge, struct ps8622_bridge, bridge);
>  }
>  
> -static inline struct ps8622_bridge *
> -		connector_to_ps8622(struct drm_connector *connector)
> -{
> -	return container_of(connector, struct ps8622_bridge, connector);
> -}
> -
>  static int ps8622_set(struct i2c_client *client, u8 page, u8 reg, u8 val)
>  {
>  	int ret;
> @@ -365,11 +358,6 @@ static void ps8622_pre_enable(struct drm_bridge *bridge)
>  			DRM_ERROR("fails to enable ps8622->v12");
>  	}
>  
> -	if (drm_panel_prepare(ps8622->panel)) {
> -		DRM_ERROR("failed to prepare panel\n");
> -		return;
> -	}
> -
>  	gpiod_set_value(ps8622->gpio_slp, 1);
>  
>  	/*
> @@ -399,24 +387,9 @@ static void ps8622_pre_enable(struct drm_bridge *bridge)
>  	ps8622->enabled = true;
>  }
>  
> -static void ps8622_enable(struct drm_bridge *bridge)
> -{
> -	struct ps8622_bridge *ps8622 = bridge_to_ps8622(bridge);
> -
> -	if (drm_panel_enable(ps8622->panel)) {
> -		DRM_ERROR("failed to enable panel\n");
> -		return;
> -	}
> -}
> -
>  static void ps8622_disable(struct drm_bridge *bridge)
>  {
> -	struct ps8622_bridge *ps8622 = bridge_to_ps8622(bridge);
> -
> -	if (drm_panel_disable(ps8622->panel)) {
> -		DRM_ERROR("failed to disable panel\n");
> -		return;
> -	}
> +	/* Delay after panel is disabled */
>  	msleep(PS8622_PWMO_END_T12_MS);

I really don't understand why a delay would be needed here.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  }
>  
> @@ -436,11 +409,6 @@ static void ps8622_post_disable(struct drm_bridge *bridge)
>  	 */
>  	gpiod_set_value(ps8622->gpio_slp, 0);
>  
> -	if (drm_panel_unprepare(ps8622->panel)) {
> -		DRM_ERROR("failed to unprepare panel\n");
> -		return;
> -	}
> -
>  	if (ps8622->v12)
>  		regulator_disable(ps8622->v12);
>  
> @@ -455,67 +423,17 @@ static void ps8622_post_disable(struct drm_bridge *bridge)
>  	msleep(PS8622_POWER_OFF_T17_MS);
>  }
>  
> -static int ps8622_get_modes(struct drm_connector *connector)
> -{
> -	struct ps8622_bridge *ps8622;
> -
> -	ps8622 = connector_to_ps8622(connector);
> -
> -	return drm_panel_get_modes(ps8622->panel, connector);
> -}
> -
> -static const struct drm_connector_helper_funcs ps8622_connector_helper_funcs = {
> -	.get_modes = ps8622_get_modes,
> -};
> -
> -static const struct drm_connector_funcs ps8622_connector_funcs = {
> -	.fill_modes = drm_helper_probe_single_connector_modes,
> -	.destroy = drm_connector_cleanup,
> -	.reset = drm_atomic_helper_connector_reset,
> -	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
> -	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> -};
> -
>  static int ps8622_attach(struct drm_bridge *bridge,
>  			 enum drm_bridge_attach_flags flags)
>  {
>  	struct ps8622_bridge *ps8622 = bridge_to_ps8622(bridge);
> -	int ret;
> -
> -	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
> -		DRM_ERROR("Fix bridge driver to make connector optional!");
> -		return -EINVAL;
> -	}
>  
> -	if (!bridge->encoder) {
> -		DRM_ERROR("Parent encoder object not found");
> -		return -ENODEV;
> -	}
> -
> -	ps8622->connector.polled = DRM_CONNECTOR_POLL_HPD;
> -	ret = drm_connector_init(bridge->dev, &ps8622->connector,
> -			&ps8622_connector_funcs, DRM_MODE_CONNECTOR_LVDS);
> -	if (ret) {
> -		DRM_ERROR("Failed to initialize connector with drm\n");
> -		return ret;
> -	}
> -	drm_connector_helper_add(&ps8622->connector,
> -					&ps8622_connector_helper_funcs);
> -	drm_connector_register(&ps8622->connector);
> -	drm_connector_attach_encoder(&ps8622->connector,
> -							bridge->encoder);
> -
> -	if (ps8622->panel)
> -		drm_panel_attach(ps8622->panel, &ps8622->connector);
> -
> -	drm_helper_hpd_irq_event(ps8622->connector.dev);
> -
> -	return ret;
> +	return drm_bridge_attach(ps8622->bridge.encoder, ps8622->panel_bridge,
> +				 &ps8622->bridge, flags);
>  }
>  
>  static const struct drm_bridge_funcs ps8622_bridge_funcs = {
>  	.pre_enable = ps8622_pre_enable,
> -	.enable = ps8622_enable,
>  	.disable = ps8622_disable,
>  	.post_disable = ps8622_post_disable,
>  	.attach = ps8622_attach,
> @@ -533,16 +451,23 @@ static int ps8622_probe(struct i2c_client *client,
>  {
>  	struct device *dev = &client->dev;
>  	struct ps8622_bridge *ps8622;
> +	struct drm_bridge *panel_bridge;
> +	struct drm_panel *panel;
>  	int ret;
>  
>  	ps8622 = devm_kzalloc(dev, sizeof(*ps8622), GFP_KERNEL);
>  	if (!ps8622)
>  		return -ENOMEM;
>  
> -	ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &ps8622->panel, NULL);
> +	ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &panel, NULL);
>  	if (ret)
>  		return ret;
>  
> +	panel_bridge = devm_drm_panel_bridge_add(dev, panel);
> +	if (IS_ERR(panel_bridge))
> +		return PTR_ERR(panel_bridge);
> +
> +	ps8622->panel_bridge = panel_bridge;
>  	ps8622->client = client;
>  
>  	ps8622->v12 = devm_regulator_get(dev, "vdd12");
> @@ -595,6 +520,7 @@ static int ps8622_probe(struct i2c_client *client,
>  	}
>  
>  	ps8622->bridge.funcs = &ps8622_bridge_funcs;
> +	ps8622->bridge.type = DRM_MODE_CONNECTOR_LVDS;
>  	ps8622->bridge.of_node = dev->of_node;
>  	drm_bridge_add(&ps8622->bridge);
>  

-- 
Regards,

Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2020-07-26 21:54 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-26 20:33 [PATCH v4 0/15] drm/bridge: support chained bridges + panel updates Sam Ravnborg
2020-07-26 20:33 ` [PATCH v4 01/15] drm/panel: panel-simple: validate panel description Sam Ravnborg
2020-07-26 21:24   ` Laurent Pinchart
2020-07-26 20:33 ` [PATCH v4 02/15] drm/panel: panel-simple: add default connector_type Sam Ravnborg
2020-07-26 21:26   ` Laurent Pinchart
2020-07-26 20:33 ` [PATCH v4 03/15] drm/bridge: tc358764: drop drm_connector_(un)register Sam Ravnborg
2020-09-02 16:48   ` Andrzej Hajda
2020-07-26 20:33 ` [PATCH v4 04/15] drm/bridge: tc358764: add drm_panel_bridge support Sam Ravnborg
2020-07-26 21:37   ` Laurent Pinchart
2020-08-27 11:39   ` [v4,04/15] " Marek Szyprowski
2020-08-30 20:42     ` Sam Ravnborg
2020-09-03  6:20       ` Andrzej Hajda
2020-09-03  9:40   ` [PATCH v4 04/15] " Andrzej Hajda
2020-09-03  9:59     ` Laurent Pinchart
2020-09-03 15:10       ` Andrzej Hajda
2020-07-26 20:33 ` [PATCH v4 05/15] drm/bridge: tc358767: add detect bridge operation Sam Ravnborg
2020-07-26 21:27   ` Laurent Pinchart
2020-07-26 20:33 ` [PATCH v4 06/15] drm/bridge: tc358767: add get_edid " Sam Ravnborg
2020-07-26 21:40   ` Laurent Pinchart
2020-07-26 20:33 ` [PATCH v4 07/15] drm/bridge: tc358767: add drm_panel_bridge support Sam Ravnborg
2020-07-26 21:48   ` Laurent Pinchart
2020-07-27  7:22     ` Sam Ravnborg
2020-07-26 20:33 ` [PATCH v4 08/15] drm/bridge: parade-ps8622: " Sam Ravnborg
2020-07-26 21:54   ` Laurent Pinchart [this message]
2020-07-27 15:23     ` Sam Ravnborg
2020-07-26 20:33 ` [PATCH v4 09/15] drm/bridge: megachips: add helper to create connector Sam Ravnborg
2020-07-26 20:33 ` [PATCH v4 10/15] drm/bridge: megachips: get drm_device from bridge Sam Ravnborg
2020-07-26 20:33 ` [PATCH v4 11/15] drm/bridge: megachips: enable detect bridge operation Sam Ravnborg
2020-07-26 20:33 ` [PATCH v4 12/15] drm/bridge: megachips: add get_edid " Sam Ravnborg
2020-07-26 21:57   ` Laurent Pinchart
2020-07-26 20:33 ` [PATCH v4 13/15] drm/bridge: megachips: make connector creation optional Sam Ravnborg
2020-07-26 21:59   ` Laurent Pinchart
2020-07-26 20:33 ` [PATCH v4 14/15] drm/bridge: nxp-ptn3460: add get_edid bridge operation Sam Ravnborg
2020-07-26 22:00   ` Laurent Pinchart
2020-07-26 20:33 ` [PATCH v4 15/15] drm/bridge: nxp-ptn3460: add drm_panel_bridge support Sam Ravnborg
2020-07-26 22:05   ` Laurent Pinchart
2020-07-27 16:56 ` [PATCH v4 0/15] drm/bridge: support chained bridges + panel updates Sam Ravnborg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200726215408.GD28704@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=a.hajda@samsung.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jernej.skrabec@siol.net \
    --cc=jonas@kwiboo.se \
    --cc=lkp@intel.com \
    --cc=martin.donnelly@ge.com \
    --cc=martyn.welch@collabora.co.uk \
    --cc=narmstrong@baylibre.com \
    --cc=peter.senna@gmail.com \
    --cc=sam@ravnborg.org \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.