diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2018-03-07 00:01:33 +0200 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2018-09-03 16:13:28 +0300 |
commit | e48f9f16a16a6ee1befda6d8e5486234ac3a5162 (patch) | |
tree | 0b8b7959b8e8c9dd884044dcaad2a568a548af66 /drivers/gpu/drm/omapdrm/omap_drv.c | |
parent | 00b30e794ffc3bd8f4c6dc357fe7e881ae6e5373 (diff) |
drm/omap: Store CRTC lookup by channel table in omap_drm_private
The omap_crtcs global array is used to store pointers to omap_crtc
indexed by DISPC channel number, in order to look them up in the dss_mgr
operations. Store the information in the omap_drm_private structure in
the form of an array of omap_drm_pipeline pointers.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index bb9ee2c93eca..f2a69cfb6ebf 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -167,6 +167,8 @@ static void omap_disconnect_pipelines(struct drm_device *ddev) pipe->display = NULL; } + memset(&priv->channels, 0, sizeof(priv->channels)); + priv->num_pipes = 0; } @@ -186,6 +188,7 @@ static int omap_connect_pipelines(struct drm_device *ddev) { struct omap_drm_private *priv = ddev->dev_private; struct omap_dss_device *output = NULL; + unsigned int i; int r; if (!omapdss_stack_is_ready()) @@ -218,6 +221,22 @@ static int omap_connect_pipelines(struct drm_device *ddev) sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]), omap_compare_pipes, NULL); + /* + * Populate the pipeline lookup table by DISPC channel. Only one display + * is allowed per channel. + */ + for (i = 0; i < priv->num_pipes; ++i) { + struct omap_drm_pipeline *pipe = &priv->pipes[i]; + enum omap_channel channel = pipe->output->dispc_channel; + + if (WARN_ON(priv->channels[channel] != NULL)) { + r = -EINVAL; + goto cleanup; + } + + priv->channels[channel] = pipe; + } + return 0; cleanup: |