aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.c19
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)
167 pipe->display = NULL; 167 pipe->display = NULL;
168 } 168 }
169 169
170 memset(&priv->channels, 0, sizeof(priv->channels));
171
170 priv->num_pipes = 0; 172 priv->num_pipes = 0;
171} 173}
172 174
@@ -186,6 +188,7 @@ static int omap_connect_pipelines(struct drm_device *ddev)
186{ 188{
187 struct omap_drm_private *priv = ddev->dev_private; 189 struct omap_drm_private *priv = ddev->dev_private;
188 struct omap_dss_device *output = NULL; 190 struct omap_dss_device *output = NULL;
191 unsigned int i;
189 int r; 192 int r;
190 193
191 if (!omapdss_stack_is_ready()) 194 if (!omapdss_stack_is_ready())
@@ -218,6 +221,22 @@ static int omap_connect_pipelines(struct drm_device *ddev)
218 sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]), 221 sort(priv->pipes, priv->num_pipes, sizeof(priv->pipes[0]),
219 omap_compare_pipes, NULL); 222 omap_compare_pipes, NULL);
220 223
224 /*
225 * Populate the pipeline lookup table by DISPC channel. Only one display
226 * is allowed per channel.
227 */
228 for (i = 0; i < priv->num_pipes; ++i) {
229 struct omap_drm_pipeline *pipe = &priv->pipes[i];
230 enum omap_channel channel = pipe->output->dispc_channel;
231
232 if (WARN_ON(priv->channels[channel] != NULL)) {
233 r = -EINVAL;
234 goto cleanup;
235 }
236
237 priv->channels[channel] = pipe;
238 }
239
221 return 0; 240 return 0;
222 241
223cleanup: 242cleanup: