drm/sun4i: Drop primary layer pointer from sun4i_drv
authorChen-Yu Tsai <wens@csie.org>
Thu, 23 Feb 2017 08:05:38 +0000 (16:05 +0800)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Tue, 7 Mar 2017 21:18:23 +0000 (22:18 +0100)
The current layer init code keeps a pointer to the primary plane layer
in sun4i_drv. When we eventually support multiple display pipelines,
this would force us to keep track of primary planes for all crtcs. And
these pointers only get used at bind time.

Instead, have the crtc init code iterate through the returned layers
to find the primary and cursor layers. And drop the pointer from the
sun4i_drv structure.

Signed-off-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
drivers/gpu/drm/sun4i/sun4i_crtc.c
drivers/gpu/drm/sun4i/sun4i_drv.h
drivers/gpu/drm/sun4i/sun4i_layer.c

index bcc1c9533d6739f3022f2d1120f4b53b265fc9e2..81dcd5eee003b43548a987e03b63e8f319b10313 100644 (file)
@@ -143,7 +143,8 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm)
 {
        struct sun4i_drv *drv = drm->dev_private;
        struct sun4i_crtc *scrtc;
-       int ret;
+       struct drm_plane *primary = NULL, *cursor = NULL;
+       int ret, i;
 
        scrtc = devm_kzalloc(drm->dev, sizeof(*scrtc), GFP_KERNEL);
        if (!scrtc)
@@ -154,12 +155,28 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm)
        scrtc->layers = sun4i_layers_init(drm);
        if (IS_ERR(scrtc->layers)) {
                dev_err(drm->dev, "Couldn't create the planes\n");
-               return ERR_CAST(scrtc->layers);
+               return NULL;
+       }
+
+       /* find primary and cursor planes for drm_crtc_init_with_planes */
+       for (i = 0; scrtc->layers[i]; i++) {
+               struct sun4i_layer *layer = scrtc->layers[i];
+
+               switch (layer->plane.type) {
+               case DRM_PLANE_TYPE_PRIMARY:
+                       primary = &layer->plane;
+                       break;
+               case DRM_PLANE_TYPE_CURSOR:
+                       cursor = &layer->plane;
+                       break;
+               default:
+                       break;
+               }
        }
 
        ret = drm_crtc_init_with_planes(drm, &scrtc->crtc,
-                                       drv->primary,
-                                       NULL,
+                                       primary,
+                                       cursor,
                                        &sun4i_crtc_funcs,
                                        NULL);
        if (ret) {
index 7a3345b7b6d1467def1a99603ef4c009797a51ab..5df50126ff52531be776e79db00f629347efae25 100644 (file)
@@ -20,7 +20,6 @@ struct sun4i_drv {
        struct sun4i_backend    *backend;
        struct sun4i_tcon       *tcon;
 
-       struct drm_plane        *primary;
        struct drm_fbdev_cma    *fbdev;
 };
 
index 0b703fb026569733781e2973fdba4a1e9b8594ff..9c0baee25fae28d2c1326e5376aceee68e0818ab 100644 (file)
@@ -127,9 +127,6 @@ static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm,
                             &sun4i_backend_layer_helper_funcs);
        layer->drv = drv;
 
-       if (plane->type == DRM_PLANE_TYPE_PRIMARY)
-               drv->primary = &layer->plane;
-
        return layer;
 }