linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Archit Taneja <archit@ti.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: linux-fbdev@vger.kernel.org, linux-omap@vger.kernel.org
Subject: Re: [PATCH 12/32] OMAPDSS: Implement display (dis)connect support
Date: Fri, 07 Jun 2013 06:58:04 +0000	[thread overview]
Message-ID: <51B181AC.3070400@ti.com> (raw)
In-Reply-To: <1369906493-27538-13-git-send-email-tomi.valkeinen@ti.com>

On Thursday 30 May 2013 03:04 PM, Tomi Valkeinen wrote:
> We currently have two steps in panel initialization and startup: probing
> and enabling. After the panel has been probed, it's ready and can be
> configured and later enabled.
>
> This model is not enough with more complex display pipelines, where we
> may have, for example, two panels, of which only one can be used at a
> time, connected to the same video output.
>
> To support that kind of scenarios, we need to add new step to the
> initialization: connect.
>
> This patch adds support for connecting and disconnecting panels. After
> probe, but before connect, no panel ops should be called. When the
> connect is called, a proper video pipeline is established, and the panel
> is ready for use. If some part in the video pipeline is already
> connected (by some other panel), the connect call fails.
>
> One key difference with the old style setup is that connect() handles
> also connecting to the overlay manager. This means that the omapfb (or
> omapdrm) no longer needs to figure out which overlay manager to use, but
> it can just call connect() on the panel, and the proper overlay manager
> is connected by omapdss.
>
> This also allows us to add back the support for dynamic switching
> between two exclusive panels. However, the current panel device model is
> not changed to support this, as the new device model is implemented in
> the following patches and the old model will be removed. The new device
> model supports dynamic switching.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> ---
>   drivers/gpu/drm/omapdrm/omap_crtc.c      | 24 +++++++++++++++++
>   drivers/gpu/drm/omapdrm/omap_drv.c       | 12 ++++++++-
>   drivers/video/omap2/dss/apply.c          | 14 ++++++++++
>   drivers/video/omap2/dss/core.c           | 44 +++++++++++++++++++++++++++++++
>   drivers/video/omap2/dss/display-sysfs.c  | 28 +++++++++++---------
>   drivers/video/omap2/dss/manager-sysfs.c  | 45 ++++++++++++++++++++------------
>   drivers/video/omap2/dss/output.c         | 14 ++++++++++
>   drivers/video/omap2/omapfb/omapfb-main.c | 25 ++++++++++--------
>   include/video/omapdss.h                  | 23 ++++++++++++++++
>   9 files changed, 188 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 02075bf..b2ab2f5 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -94,6 +94,28 @@ uint32_t pipe2vbl(struct drm_crtc *crtc)
>   static struct omap_crtc *omap_crtcs[8];
>
>   /* we can probably ignore these until we support command-mode panels: */
> +static int omap_crtc_connect(struct omap_overlay_manager *mgr,
> +		struct omap_dss_output *dst)
> +{
> +	if (mgr->output)
> +		return -EINVAL;
> +
> +	if ((mgr->supported_outputs & dst->id) = 0)
> +		return -EINVAL;
> +
> +	dst->manager = mgr;
> +	mgr->output = dst;
> +
> +	return 0;
> +}
> +
> +static void omap_crtc_disconnect(struct omap_overlay_manager *mgr,
> +		struct omap_dss_output *dst)
> +{
> +	mgr->output->manager = NULL;
> +	mgr->output = NULL;
> +}
> +
>   static void omap_crtc_start_update(struct omap_overlay_manager *mgr)
>   {
>   }
> @@ -138,6 +160,8 @@ static void omap_crtc_unregister_framedone_handler(
>   }
>
>   static const struct dss_mgr_ops mgr_ops = {
> +		.connect = omap_crtc_connect,
> +		.disconnect = omap_crtc_disconnect,
>   		.start_update = omap_crtc_start_update,
>   		.enable = omap_crtc_enable,
>   		.disable = omap_crtc_disable,
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index f8947f9..58bd259 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -97,6 +97,7 @@ static int omap_modeset_init(struct drm_device *dev)
>   	int num_mgrs = dss_feat_get_num_mgrs();
>   	int num_crtcs;
>   	int i, id = 0;
> +	int r;
>
>   	omap_crtc_pre_init();
>
> @@ -118,6 +119,7 @@ static int omap_modeset_init(struct drm_device *dev)
>   		struct drm_connector *connector;
>   		struct drm_encoder *encoder;
>   		enum omap_channel channel;
> +		struct omap_overlay_manager *mgr;
>
>   		if (!dssdev->driver) {
>   			dev_warn(dev->dev, "%s has no driver.. skipping it\n",
> @@ -133,6 +135,13 @@ static int omap_modeset_init(struct drm_device *dev)
>   			continue;
>   		}
>
> +		r = dssdev->driver->connect(dssdev);
> +		if (r) {
> +			dev_err(dev->dev, "could not connect display: %s\n",
> +					dssdev->name);
> +			continue;
> +		}
> +
>   		encoder = omap_encoder_init(dev, dssdev);
>
>   		if (!encoder) {
> @@ -174,8 +183,9 @@ static int omap_modeset_init(struct drm_device *dev)
>   		 * other possible channels to which the encoder can connect are
>   		 * not considered.
>   		 */
> -		channel = dssdev->output->dispc_channel;
>
> +		mgr = omapdss_find_mgr_from_display(dssdev);
> +		channel = mgr->id;
>   		/*
>   		 * if this channel hasn't already been taken by a previously
>   		 * allocated crtc, we create a new crtc for it
> diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c
> index c844071..dbd3c2f 100644
> --- a/drivers/video/omap2/dss/apply.c
> +++ b/drivers/video/omap2/dss/apply.c
> @@ -790,6 +790,18 @@ static void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
>   	}
>   }
>
> +static int dss_mgr_connect_compat(struct omap_overlay_manager *mgr,
> +		struct omap_dss_output *dst)
> +{
> +	return mgr->set_output(mgr, dst);
> +}
> +
> +static void dss_mgr_disconnect_compat(struct omap_overlay_manager *mgr,
> +		struct omap_dss_output *dst)
> +{
> +	mgr->unset_output(mgr);
> +}
> +
>   static void dss_mgr_start_update_compat(struct omap_overlay_manager *mgr)
>   {
>   	struct mgr_priv_data *mp = get_mgr_priv(mgr);
> @@ -1552,6 +1564,8 @@ static void dss_mgr_unregister_framedone_handler_compat(struct omap_overlay_mana
>   }
>
>   static const struct dss_mgr_ops apply_mgr_ops = {
> +	.connect = dss_mgr_connect_compat,
> +	.disconnect = dss_mgr_disconnect_compat,
>   	.start_update = dss_mgr_start_update_compat,
>   	.enable = dss_mgr_enable_compat,
>   	.disable = dss_mgr_disable_compat,
> diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
> index 502ec1b..4bd8f79 100644
> --- a/drivers/video/omap2/dss/core.c
> +++ b/drivers/video/omap2/dss/core.c
> @@ -371,6 +371,46 @@ static int dss_driver_remove(struct device *dev)
>   	return 0;
>   }
>
> +static int omapdss_default_connect(struct omap_dss_device *dssdev)
> +{
> +	struct omap_dss_output *out;
> +	struct omap_overlay_manager *mgr;
> +	int r;
> +
> +	out = dssdev->output;
> +
> +	if (out = NULL)
> +		return -ENODEV;
> +
> +	mgr = omap_dss_get_overlay_manager(out->dispc_channel);
> +	if (!mgr)
> +		return -ENODEV;
> +
> +	r = dss_mgr_connect(mgr, out);
> +	if (r)
> +		return r;
> +
> +	return 0;
> +}
> +
> +static void omapdss_default_disconnect(struct omap_dss_device *dssdev)
> +{
> +	struct omap_dss_output *out;
> +	struct omap_overlay_manager *mgr;
> +
> +	out = dssdev->output;
> +
> +	if (out = NULL)
> +		return;
> +
> +	mgr = out->manager;
> +
> +	if (mgr = NULL)
> +		return;
> +
> +	dss_mgr_disconnect(mgr, out);
> +}
> +
>   int omap_dss_register_driver(struct omap_dss_driver *dssdriver)
>   {
>   	dssdriver->driver.bus = &dss_bus_type;
> @@ -384,6 +424,10 @@ int omap_dss_register_driver(struct omap_dss_driver *dssdriver)
>   			omapdss_default_get_recommended_bpp;
>   	if (dssdriver->get_timings = NULL)
>   		dssdriver->get_timings = omapdss_default_get_timings;
> +	if (dssdriver->connect = NULL)
> +		dssdriver->connect = omapdss_default_connect;
> +	if (dssdriver->disconnect = NULL)
> +		dssdriver->disconnect = omapdss_default_disconnect;

I was wondering if these should be apis rather than driver ops. One 
advantage of having them as functions used by omapfb/omapdrm would be 
that a panel driver wouldn't override the default_connect/disconnect ops.

Even though they are named omapdss_default_connect/disconnect, I don't 
think there is another option by which a panel driver may chose to 
connect to omapdss outputs, right?

Archit


  reply	other threads:[~2013-06-07  6:58 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-30  9:34 [PATCH 00/32] OMAPDSS: dss-dev-model "base" (Part 1/2) Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 01/32] OMAPDSS: add pdata->default_display_name Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 02/32] OMAPDSS: only probe pdata if there's one Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 03/32] OMAPDSS: add omap_dss_find_output() Tomi Valkeinen
2013-05-30 11:07   ` Jean-Christophe PLAGNIOL-VILLARD
2013-05-30 11:40     ` Tomi Valkeinen
2013-05-30 15:40       ` Jean-Christophe PLAGNIOL-VILLARD
2013-05-30 16:54         ` Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 04/32] OMAPDSS: add omap_dss_find_output_by_node() Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 05/32] OMAPDSS: fix dss_get_ctx_loss_count for DT Tomi Valkeinen
2013-05-30 11:09   ` Jean-Christophe PLAGNIOL-VILLARD
2013-05-30 11:28     ` Tomi Valkeinen
2013-05-30 15:43       ` Jean-Christophe PLAGNIOL-VILLARD
2013-05-30 16:14         ` Tomi Valkeinen
2013-05-30 16:36   ` Kevin Hilman
2013-05-30 17:21     ` Tomi Valkeinen
2013-05-31 15:17     ` Grygorii Strashko
2013-05-31 19:31       ` Kevin Hilman
2013-05-30  9:34 ` [PATCH 06/32] OMAPDSS: DPI: fix regulators " Tomi Valkeinen
2013-05-30 11:12   ` Jean-Christophe PLAGNIOL-VILLARD
2013-05-30 11:35     ` Tomi Valkeinen
2013-05-30 13:05       ` Arnd Bergmann
2013-05-30 15:54         ` Jean-Christophe PLAGNIOL-VILLARD
2013-06-07  5:57   ` Archit Taneja
2013-05-30  9:34 ` [PATCH 07/32] OMAPDSS: SDI: " Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 08/32] OMAPDSS: clean up dss_[ovl|mgr]_get_device() Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 09/32] OMAPDSS: add helpers to get mgr or output from display Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 10/32] OMAPDSS: split overlay manager creation Tomi Valkeinen
2013-06-07  6:31   ` Archit Taneja
2013-06-07  9:53     ` Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 11/32] OMAPDRM: fix overlay manager handling Tomi Valkeinen
2013-06-07  6:33   ` Archit Taneja
2013-05-30  9:34 ` [PATCH 12/32] OMAPDSS: Implement display (dis)connect support Tomi Valkeinen
2013-06-07  6:58   ` Archit Taneja [this message]
2013-06-07  8:31     ` Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 13/32] OMAPDSS: CORE: use devm_regulator_get Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 14/32] OMAPDSS: DSI: cleanup regulator init Tomi Valkeinen
2013-06-07  6:50   ` Archit Taneja
2013-05-30  9:34 ` [PATCH 15/32] OMAPDSS: DPI: cleanup pll & " Tomi Valkeinen
2013-06-07  6:52   ` Archit Taneja
2013-06-07  8:45     ` Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 16/32] OMAPDSS: HDMI: add hdmi_init_regulator Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 17/32] OMAPDSS: SDI: clean up regulator init Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 18/32] OMAPDSS: VENC: " Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 19/32] OMAPDSS: add videomode conversion support Tomi Valkeinen
2013-06-07  7:18   ` Archit Taneja
2013-06-07  8:35     ` Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 20/32] OMAPDSS: remove dssdev uses in trivial cases Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 21/32] OMAPDSS: add panel list Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 22/32] OMAPDSS: use the panel list in omap_dss_get_next_device Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 23/32] OMAPDSS: don't use dss bus in suspend/resume Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 24/32] OMAPDSS: implement display sysfs without dss bus Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 25/32] OMAPDSS: Add panel dev pointer to dssdev Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 26/32] OMAPDSS: remove omap_dss_start/stop_device() Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 27/32] OMAPDSS: combine omap_dss_output into omap_dss_device Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 28/32] OMAPDSS: omapdss.h: add owner field to omap_dss_device Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 29/32] OMAPDSS: add module_get/put to omap_dss_get/put_device() Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 30/32] OMAPDSS: add THIS_MODULE owner to DSS outputs Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 31/32] OMAPDSS: output: increase refcount in find_output funcs Tomi Valkeinen
2013-05-30  9:34 ` [PATCH 32/32] OMAPFB: use EPROBE_DEFER if default display is not present Tomi Valkeinen

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=51B181AC.3070400@ti.com \
    --to=archit@ti.com \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=tomi.valkeinen@ti.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).