drm: omapdrm: Refactor CRTC creation code
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Sun, 11 Jan 2015 14:30:44 +0000 (16:30 +0200)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Fri, 20 Mar 2015 12:30:16 +0000 (14:30 +0200)
Create a omap_modeset_create_crtc() function to avoid duplicating plane
and CRTC creation code.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
drivers/gpu/drm/omapdrm/omap_drv.c
drivers/gpu/drm/omapdrm/omap_plane.c

index 642748cb7a4e500ed6fecce9f39f40fe7ebebe52..021855605a1f8e39e3cc38fe59893229df2f47a0 100644 (file)
@@ -128,6 +128,29 @@ cleanup:
        return r;
 }
 
+static int omap_modeset_create_crtc(struct drm_device *dev, int id,
+                                   enum omap_channel channel)
+{
+       struct omap_drm_private *priv = dev->dev_private;
+       struct drm_plane *plane;
+       struct drm_crtc *crtc;
+
+       plane = omap_plane_init(dev, id, true);
+       if (IS_ERR(plane))
+               return PTR_ERR(plane);
+
+       crtc = omap_crtc_init(dev, plane, channel, id);
+
+       BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs));
+       priv->crtcs[id] = crtc;
+       priv->num_crtcs++;
+
+       priv->planes[id] = plane;
+       priv->num_planes++;
+
+       return 0;
+}
+
 static int omap_modeset_init(struct drm_device *dev)
 {
        struct omap_drm_private *priv = dev->dev_private;
@@ -136,6 +159,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 ret;
 
        drm_mode_config_init(dev);
 
@@ -209,18 +233,13 @@ static int omap_modeset_init(struct drm_device *dev)
                 * allocated crtc, we create a new crtc for it
                 */
                if (!channel_used(dev, channel)) {
-                       struct drm_plane *plane;
-                       struct drm_crtc *crtc;
-
-                       plane = omap_plane_init(dev, id, true);
-                       crtc = omap_crtc_init(dev, plane, channel, id);
-
-                       BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs));
-                       priv->crtcs[id] = crtc;
-                       priv->num_crtcs++;
-
-                       priv->planes[id] = plane;
-                       priv->num_planes++;
+                       ret = omap_modeset_create_crtc(dev, id, channel);
+                       if (ret < 0) {
+                               dev_err(dev->dev,
+                                       "could not create CRTC (channel %u)\n",
+                                       channel);
+                               return ret;
+                       }
 
                        id++;
                }
@@ -234,26 +253,8 @@ static int omap_modeset_init(struct drm_device *dev)
 
                /* find a free manager for this crtc */
                for (i = 0; i < num_mgrs; i++) {
-                       if (!channel_used(dev, i)) {
-                               struct drm_plane *plane;
-                               struct drm_crtc *crtc;
-
-                               plane = omap_plane_init(dev, id, true);
-                               crtc = omap_crtc_init(dev, plane, i, id);
-
-                               BUG_ON(priv->num_crtcs >=
-                                       ARRAY_SIZE(priv->crtcs));
-
-                               priv->crtcs[id] = crtc;
-                               priv->num_crtcs++;
-
-                               priv->planes[id] = plane;
-                               priv->num_planes++;
-
+                       if (!channel_used(dev, i))
                                break;
-                       } else {
-                               continue;
-                       }
                }
 
                if (i == num_mgrs) {
@@ -261,13 +262,24 @@ static int omap_modeset_init(struct drm_device *dev)
                        dev_err(dev->dev, "no managers left for crtc\n");
                        return -ENOMEM;
                }
+
+               ret = omap_modeset_create_crtc(dev, id, i);
+               if (ret < 0) {
+                       dev_err(dev->dev,
+                               "could not create CRTC (channel %u)\n", i);
+                       return ret;
+               }
        }
 
        /*
         * Create normal planes for the remaining overlays:
         */
        for (; id < num_ovls; id++) {
-               struct drm_plane *plane = omap_plane_init(dev, id, false);
+               struct drm_plane *plane;
+
+               plane = omap_plane_init(dev, id, false);
+               if (IS_ERR(plane))
+                       return PTR_ERR(plane);
 
                BUG_ON(priv->num_planes >= ARRAY_SIZE(priv->planes));
                priv->planes[priv->num_planes++] = plane;
index a418fa7e5d0efa796b148f3cab04889959b9f47a..056ded8280f83049930dcf23be9fec458b62d441 100644 (file)
@@ -393,7 +393,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
 
        omap_plane = kzalloc(sizeof(*omap_plane), GFP_KERNEL);
        if (!omap_plane)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        drm_flip_work_init(&omap_plane->unpin_work,
                        "unpin", unpin_worker);