drm/sun4i: Drop hardcoded .possible_crtcs values from layers
authorChen-Yu Tsai <wens@csie.org>
Thu, 23 Feb 2017 08:05:39 +0000 (16:05 +0800)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Tue, 7 Mar 2017 21:18:23 +0000 (22:18 +0100)
To support multiple display pipelines, we would have multiple crtcs,
with one or more planes bound to them. Obviously having hardcoded
values for the drm_plane .possible_crtcs field is not going to work.

For primary and cursor planes, the value is set by
drm_crtc_init_with_planes. We just need to set it for overlay planes.

We also fix the value set for the RGB encoder, by referencing the
crtc set in sun4i_drv.

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_layer.c
drivers/gpu/drm/sun4i/sun4i_rgb.c

index 81dcd5eee003b43548a987e03b63e8f319b10313..9d6fd2f40cf4e43b5d61cc9f2a8f27f7afa55491 100644 (file)
@@ -190,5 +190,14 @@ struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm)
        scrtc->crtc.port = of_graph_get_port_by_id(drv->tcon->dev->of_node,
                                                   1);
 
+       /* Set possible_crtcs to this crtc for overlay planes */
+       for (i = 0; scrtc->layers[i]; i++) {
+               uint32_t possible_crtcs = BIT(drm_crtc_index(&scrtc->crtc));
+               struct sun4i_layer *layer = scrtc->layers[i];
+
+               if (layer->plane.type == DRM_PLANE_TYPE_OVERLAY)
+                       layer->plane.possible_crtcs = possible_crtcs;
+       }
+
        return scrtc;
 }
index 9c0baee25fae28d2c1326e5376aceee68e0818ab..431e13362b62347358277079c68e17b61fa2d48d 100644 (file)
@@ -114,7 +114,8 @@ static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm,
        if (!layer)
                return ERR_PTR(-ENOMEM);
 
-       ret = drm_universal_plane_init(drm, &layer->plane, BIT(0),
+       /* possible crtcs are set later */
+       ret = drm_universal_plane_init(drm, &layer->plane, 0,
                                       &sun4i_backend_layer_funcs,
                                       plane->formats, plane->nformats,
                                       plane->type, NULL);
index 757208f5173115a553653b2f93f4c1de116cca7f..c4865bf1b39263dcf11f316460fb3ac107a5a7e6 100644 (file)
@@ -17,6 +17,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_panel.h>
 
+#include "sun4i_crtc.h"
 #include "sun4i_drv.h"
 #include "sun4i_tcon.h"
 #include "sun4i_rgb.h"
@@ -238,7 +239,7 @@ int sun4i_rgb_init(struct drm_device *drm)
        }
 
        /* The RGB encoder can only work with the TCON channel 0 */
-       rgb->encoder.possible_crtcs = BIT(0);
+       rgb->encoder.possible_crtcs = BIT(drm_crtc_index(&tcon->crtc->crtc));
 
        if (!IS_ERR(tcon->panel)) {
                drm_connector_helper_add(&rgb->connector,