]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/sun4i: de2/de3: Move plane type determination to mixer
authorJernej Skrabec <jernej.skrabec@gmail.com>
Tue, 4 Nov 2025 18:09:25 +0000 (19:09 +0100)
committerChen-Yu Tsai <wens@kernel.org>
Wed, 12 Nov 2025 09:18:22 +0000 (17:18 +0800)
Plane type determination logic inside layer init functions doesn't allow
index register to be repurposed to plane sequence, which it almost is.

So move out the logic to mixer, which allows further rework for DE33
support.

Reviewed-by: Chen-Yu Tsai <wens@kernel.org>
Tested-by: Ryan Walklin <ryan@testtoast.com>
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Link: https://patch.msgid.link/20251104180942.61538-14-jernej.skrabec@gmail.com
Signed-off-by: Chen-Yu Tsai <wens@kernel.org>
drivers/gpu/drm/sun4i/sun8i_mixer.c
drivers/gpu/drm/sun4i/sun8i_ui_layer.c
drivers/gpu/drm/sun4i/sun8i_ui_layer.h
drivers/gpu/drm/sun4i/sun8i_vi_layer.c
drivers/gpu/drm/sun4i/sun8i_vi_layer.h

index 091ea109713bd542752b6d3aae22ef9a868041f8..cf6202099844c7c1bce9d2851a4dab1a6420cced 100644 (file)
@@ -316,6 +316,7 @@ static struct drm_plane **sun8i_layers_init(struct drm_device *drm,
 {
        struct drm_plane **planes;
        struct sun8i_mixer *mixer = engine_to_sun8i_mixer(engine);
+       enum drm_plane_type type;
        int i;
 
        planes = devm_kcalloc(drm->dev,
@@ -327,7 +328,12 @@ static struct drm_plane **sun8i_layers_init(struct drm_device *drm,
        for (i = 0; i < mixer->cfg->vi_num; i++) {
                struct sun8i_layer *layer;
 
-               layer = sun8i_vi_layer_init_one(drm, mixer, i);
+               if (i == 0 && !mixer->cfg->ui_num)
+                       type = DRM_PLANE_TYPE_PRIMARY;
+               else
+                       type = DRM_PLANE_TYPE_OVERLAY;
+
+               layer = sun8i_vi_layer_init_one(drm, mixer, type, i);
                if (IS_ERR(layer)) {
                        dev_err(drm->dev,
                                "Couldn't initialize overlay plane\n");
@@ -340,7 +346,12 @@ static struct drm_plane **sun8i_layers_init(struct drm_device *drm,
        for (i = 0; i < mixer->cfg->ui_num; i++) {
                struct sun8i_layer *layer;
 
-               layer = sun8i_ui_layer_init_one(drm, mixer, i);
+               if (i == 0)
+                       type = DRM_PLANE_TYPE_PRIMARY;
+               else
+                       type = DRM_PLANE_TYPE_OVERLAY;
+
+               layer = sun8i_ui_layer_init_one(drm, mixer, type, i);
                if (IS_ERR(layer)) {
                        dev_err(drm->dev, "Couldn't initialize %s plane\n",
                                i ? "overlay" : "primary");
index 939a704917a608cfe2982407a520a2423b1c6bd0..c7bbdb37c2d7654c4bd9d3debbafb6753e80c5ef 100644 (file)
@@ -267,9 +267,9 @@ static const uint64_t sun8i_layer_modifiers[] = {
 
 struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
                                            struct sun8i_mixer *mixer,
+                                           enum drm_plane_type type,
                                            int index)
 {
-       enum drm_plane_type type = DRM_PLANE_TYPE_OVERLAY;
        int channel = mixer->cfg->vi_num + index;
        struct sun8i_layer *layer;
        unsigned int plane_cnt;
@@ -284,9 +284,6 @@ struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
        layer->channel = channel;
        layer->overlay = 0;
 
-       if (index == 0)
-               type = DRM_PLANE_TYPE_PRIMARY;
-
        /* possible crtcs are set later */
        ret = drm_universal_plane_init(drm, &layer->plane, 0,
                                       &sun8i_ui_layer_funcs,
index 83892f6ff2112d4c511bcd4fd88f169604d7fc00..7745aec32d76771eeb3b43b0eaa4533893f644b8 100644 (file)
@@ -51,5 +51,6 @@ struct sun8i_layer;
 
 struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
                                            struct sun8i_mixer *mixer,
+                                           enum drm_plane_type type,
                                            int index);
 #endif /* _SUN8I_UI_LAYER_H_ */
index 511a599f31122ab4f5905b688321e19629a8615b..118b7e33bddb0d34f141553ae692c66f2fc95ba3 100644 (file)
@@ -412,9 +412,9 @@ static const uint64_t sun8i_layer_modifiers[] = {
 
 struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
                                            struct sun8i_mixer *mixer,
+                                           enum drm_plane_type type,
                                            int index)
 {
-       enum drm_plane_type type = DRM_PLANE_TYPE_OVERLAY;
        u32 supported_encodings, supported_ranges;
        unsigned int plane_cnt, format_count;
        struct sun8i_layer *layer;
@@ -438,9 +438,6 @@ struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
                format_count = ARRAY_SIZE(sun8i_vi_layer_formats);
        }
 
-       if (!mixer->cfg->ui_num && index == 0)
-               type = DRM_PLANE_TYPE_PRIMARY;
-
        /* possible crtcs are set later */
        ret = drm_universal_plane_init(drm, &layer->plane, 0,
                                       &sun8i_vi_layer_funcs,
index 655440cdc78f6f58c3ad74c72e259b2bc45510ca..fc22b9a6bd8d3f6418f3b59cdd7f09c360d97a9b 100644 (file)
@@ -56,5 +56,6 @@ struct sun8i_layer;
 
 struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
                                            struct sun8i_mixer *mixer,
+                                           enum drm_plane_type type,
                                            int index);
 #endif /* _SUN8I_VI_LAYER_H_ */