drm/omap: Create all planes before CRTCs
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Mon, 5 Mar 2018 17:11:30 +0000 (19:11 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Mon, 3 Sep 2018 13:13:27 +0000 (16:13 +0300)
Creating all the planes in a single location instead of creating them
per-CRTC with remaining planes then created in a second step simplifies
the logic.

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>
drivers/gpu/drm/omapdrm/omap_drv.c

index 17d17a790c7828622e0a4e17ef85947b3cb367ca..f68948bb2847a5bc1c2eb503db370c6486415a3e 100644 (file)
@@ -271,14 +271,30 @@ static int omap_modeset_init(struct drm_device *dev)
                return -EINVAL;
        }
 
-       /* All planes can be put to any CRTC */
+       /* Create all planes first. They can all be put to any CRTC. */
        plane_crtc_mask = (1 << num_crtcs) - 1;
 
+       for (i = 0; i < num_ovls; i++) {
+               enum drm_plane_type type = i < priv->num_dssdevs
+                                        ? DRM_PLANE_TYPE_PRIMARY
+                                        : DRM_PLANE_TYPE_OVERLAY;
+               struct drm_plane *plane;
+
+               if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
+                       return -EINVAL;
+
+               plane = omap_plane_init(dev, i, type, plane_crtc_mask);
+               if (IS_ERR(plane))
+                       return PTR_ERR(plane);
+
+               priv->planes[priv->num_planes++] = plane;
+       }
+
+       /* Create the CRTCs, encoders and connectors. */
        for (i = 0; i < priv->num_dssdevs; i++) {
                struct omap_dss_device *dssdev = priv->dssdevs[i];
                struct drm_connector *connector;
                struct drm_encoder *encoder;
-               struct drm_plane *plane;
                struct drm_crtc *crtc;
 
                encoder = omap_encoder_init(dev, dssdev);
@@ -290,12 +306,7 @@ static int omap_modeset_init(struct drm_device *dev)
                if (!connector)
                        return -ENOMEM;
 
-               plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_PRIMARY,
-                                       plane_crtc_mask);
-               if (IS_ERR(plane))
-                       return PTR_ERR(plane);
-
-               crtc = omap_crtc_init(dev, plane, dssdev);
+               crtc = omap_crtc_init(dev, priv->planes[i], dssdev);
                if (IS_ERR(crtc))
                        return PTR_ERR(crtc);
 
@@ -303,28 +314,10 @@ static int omap_modeset_init(struct drm_device *dev)
                encoder->possible_crtcs = 1 << i;
 
                priv->crtcs[priv->num_crtcs++] = crtc;
-               priv->planes[priv->num_planes++] = plane;
                priv->encoders[priv->num_encoders++] = encoder;
                priv->connectors[priv->num_connectors++] = connector;
        }
 
-       /*
-        * Create normal planes for the remaining overlays:
-        */
-       for (; i < num_ovls; i++) {
-               struct drm_plane *plane;
-
-               if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
-                       return -EINVAL;
-
-               plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_OVERLAY,
-                       plane_crtc_mask);
-               if (IS_ERR(plane))
-                       return PTR_ERR(plane);
-
-               priv->planes[priv->num_planes++] = plane;
-       }
-
        DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",
                priv->num_planes, priv->num_crtcs, priv->num_encoders,
                priv->num_connectors);