aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_plane.c
diff options
context:
space:
mode:
authorJyri Sarha <jsarha@ti.com>2017-03-24 10:47:55 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2017-04-03 05:36:40 -0400
commite8e13b1521678af0df7b07f30745d77e8de1820a (patch)
tree5b43e024c00391db18f83e6285b2b280953df39b /drivers/gpu/drm/omapdrm/omap_plane.c
parent694c99cf6f5a13774bbdbf5becdbf59451b955f0 (diff)
drm/omap: Major omap_modeset_init() cleanup
Cleanup overly complex omap_modeset_init(). The function is trying to support many unusual configuration, that have never been tested and are not supported by other parts of the dirver. After cleanup the init function creates exactly one connector, encoder, crtc, and primary plane per each connected dss-device. Each connector->encoder->crtc chain is expected to be separate and each crtc is connect to a single dss-channel. If the configuration does not match the expectations or exceeds the available resources, the configuration is rejected. Signed-off-by: Jyri Sarha <jsarha@ti.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_plane.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_plane.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c
index 7abb49b7d606..9168154d749e 100644
--- a/drivers/gpu/drm/omapdrm/omap_plane.c
+++ b/drivers/gpu/drm/omapdrm/omap_plane.c
@@ -324,24 +324,37 @@ static const struct drm_plane_funcs omap_plane_funcs = {
324 .atomic_get_property = omap_plane_atomic_get_property, 324 .atomic_get_property = omap_plane_atomic_get_property,
325}; 325};
326 326
327static const char *plane_names[] = { 327static const char *plane_id_to_name[] = {
328 [OMAP_DSS_GFX] = "gfx", 328 [OMAP_DSS_GFX] = "gfx",
329 [OMAP_DSS_VIDEO1] = "vid1", 329 [OMAP_DSS_VIDEO1] = "vid1",
330 [OMAP_DSS_VIDEO2] = "vid2", 330 [OMAP_DSS_VIDEO2] = "vid2",
331 [OMAP_DSS_VIDEO3] = "vid3", 331 [OMAP_DSS_VIDEO3] = "vid3",
332}; 332};
333 333
334static const enum omap_plane_id plane_idx_to_id[] = {
335 OMAP_DSS_GFX,
336 OMAP_DSS_VIDEO1,
337 OMAP_DSS_VIDEO2,
338 OMAP_DSS_VIDEO3,
339};
340
334/* initialize plane */ 341/* initialize plane */
335struct drm_plane *omap_plane_init(struct drm_device *dev, 342struct drm_plane *omap_plane_init(struct drm_device *dev,
336 int id, enum drm_plane_type type, 343 int idx, enum drm_plane_type type,
337 u32 possible_crtcs) 344 u32 possible_crtcs)
338{ 345{
339 struct omap_drm_private *priv = dev->dev_private; 346 struct omap_drm_private *priv = dev->dev_private;
340 struct drm_plane *plane; 347 struct drm_plane *plane;
341 struct omap_plane *omap_plane; 348 struct omap_plane *omap_plane;
349 enum omap_plane_id id;
342 int ret; 350 int ret;
343 351
344 DBG("%s: type=%d", plane_names[id], type); 352 if (WARN_ON(idx >= ARRAY_SIZE(plane_idx_to_id)))
353 return ERR_PTR(-EINVAL);
354
355 id = plane_idx_to_id[idx];
356
357 DBG("%s: type=%d", plane_id_to_name[id], type);
345 358
346 omap_plane = kzalloc(sizeof(*omap_plane), GFP_KERNEL); 359 omap_plane = kzalloc(sizeof(*omap_plane), GFP_KERNEL);
347 if (!omap_plane) 360 if (!omap_plane)
@@ -351,7 +364,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
351 omap_plane->formats, ARRAY_SIZE(omap_plane->formats), 364 omap_plane->formats, ARRAY_SIZE(omap_plane->formats),
352 priv->dispc_ops->ovl_get_color_modes(id)); 365 priv->dispc_ops->ovl_get_color_modes(id));
353 omap_plane->id = id; 366 omap_plane->id = id;
354 omap_plane->name = plane_names[id]; 367 omap_plane->name = plane_id_to_name[id];
355 368
356 plane = &omap_plane->base; 369 plane = &omap_plane->base;
357 370
@@ -368,6 +381,9 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
368 return plane; 381 return plane;
369 382
370error: 383error:
384 dev_err(dev->dev, "%s(): could not create plane: %s\n",
385 __func__, plane_id_to_name[id]);
386
371 kfree(omap_plane); 387 kfree(omap_plane);
372 return NULL; 388 return NULL;
373} 389}