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
next prev parent 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).