From: Jernej Skrabec <jernej.skra...@gmail.com>

The DE2 and DE3 engines have a single register range, whereas the DE33
separates these out into top and display groups.

Prepare for this by adding a function to look these up based on the DE
type.

Signed-off-by: Jernej Skrabec <jernej.skra...@gmail.com>
Signed-off-by: Ryan Walklin <r...@testtoast.com>
---
 drivers/gpu/drm/sun4i/sun8i_mixer.h    |  6 ++++++
 drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 17 +++++++++++------
 drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 16 ++++++++++------
 3 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.h 
b/drivers/gpu/drm/sun4i/sun8i_mixer.h
index 19052c594f8c2..ed7370688d52e 100644
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.h
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h
@@ -204,6 +204,12 @@ sun8i_blender_base(struct sun8i_mixer *mixer)
        return mixer->cfg->de_type == sun8i_mixer_de3 ? DE3_BLD_BASE : 
DE2_BLD_BASE;
 }
 
+static inline struct regmap *
+sun8i_blender_regmap(struct sun8i_mixer *mixer)
+{
+       return mixer->engine.regs;
+}
+
 static inline u32
 sun8i_channel_base(struct sun8i_mixer *mixer, int channel)
 {
diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c 
b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
index 91781b5bbbbce..7f4d4dcfdc03d 100644
--- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
@@ -24,14 +24,17 @@
 #include "sun8i_mixer.h"
 #include "sun8i_ui_layer.h"
 #include "sun8i_ui_scaler.h"
+#include "sun8i_vi_scaler.h"
 
 static void sun8i_ui_layer_enable(struct sun8i_mixer *mixer, int channel,
                                  int overlay, bool enable, unsigned int zpos,
                                  unsigned int old_zpos)
 {
        u32 val, bld_base, ch_base;
+       struct regmap *bld_regs;
 
        bld_base = sun8i_blender_base(mixer);
+       bld_regs = sun8i_blender_regmap(mixer);
        ch_base = sun8i_channel_base(mixer, channel);
 
        DRM_DEBUG_DRIVER("%sabling channel %d overlay %d\n",
@@ -47,12 +50,12 @@ static void sun8i_ui_layer_enable(struct sun8i_mixer 
*mixer, int channel,
                           SUN8I_MIXER_CHAN_UI_LAYER_ATTR_EN, val);
 
        if (!enable || zpos != old_zpos) {
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_PIPE_CTL(bld_base),
                                   SUN8I_MIXER_BLEND_PIPE_CTL_EN(old_zpos),
                                   0);
 
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_ROUTE(bld_base),
                                   SUN8I_MIXER_BLEND_ROUTE_PIPE_MSK(old_zpos),
                                   0);
@@ -61,13 +64,13 @@ static void sun8i_ui_layer_enable(struct sun8i_mixer 
*mixer, int channel,
        if (enable) {
                val = SUN8I_MIXER_BLEND_PIPE_CTL_EN(zpos);
 
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_PIPE_CTL(bld_base),
                                   val, val);
 
                val = channel << SUN8I_MIXER_BLEND_ROUTE_PIPE_SHIFT(zpos);
 
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_ROUTE(bld_base),
                                   SUN8I_MIXER_BLEND_ROUTE_PIPE_MSK(zpos),
                                   val);
@@ -101,6 +104,7 @@ static int sun8i_ui_layer_update_coord(struct sun8i_mixer 
*mixer, int channel,
 {
        struct drm_plane_state *state = plane->state;
        u32 src_w, src_h, dst_w, dst_h;
+       struct regmap *bld_regs;
        u32 bld_base, ch_base;
        u32 outsize, insize;
        u32 hphase, vphase;
@@ -109,6 +113,7 @@ static int sun8i_ui_layer_update_coord(struct sun8i_mixer 
*mixer, int channel,
                         channel, overlay);
 
        bld_base = sun8i_blender_base(mixer);
+       bld_regs = sun8i_blender_regmap(mixer);
        ch_base = sun8i_channel_base(mixer, channel);
 
        src_w = drm_rect_width(&state->src) >> 16;
@@ -153,10 +158,10 @@ static int sun8i_ui_layer_update_coord(struct sun8i_mixer 
*mixer, int channel,
        DRM_DEBUG_DRIVER("Layer destination coordinates X: %d Y: %d\n",
                         state->dst.x1, state->dst.y1);
        DRM_DEBUG_DRIVER("Layer destination size W: %d H: %d\n", dst_w, dst_h);
-       regmap_write(mixer->engine.regs,
+       regmap_write(bld_regs,
                     SUN8I_MIXER_BLEND_ATTR_COORD(bld_base, zpos),
                     SUN8I_MIXER_COORD(state->dst.x1, state->dst.y1));
-       regmap_write(mixer->engine.regs,
+       regmap_write(bld_regs,
                     SUN8I_MIXER_BLEND_ATTR_INSIZE(bld_base, zpos),
                     outsize);
 
diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c 
b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
index 3cc387c248619..448a696df5c39 100644
--- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
@@ -23,8 +23,10 @@ static void sun8i_vi_layer_enable(struct sun8i_mixer *mixer, 
int channel,
                                  unsigned int old_zpos)
 {
        u32 val, bld_base, ch_base;
+       struct regmap *bld_regs;
 
        bld_base = sun8i_blender_base(mixer);
+       bld_regs = sun8i_blender_regmap(mixer);
        ch_base = sun8i_channel_base(mixer, channel);
 
        DRM_DEBUG_DRIVER("%sabling VI channel %d overlay %d\n",
@@ -40,12 +42,12 @@ static void sun8i_vi_layer_enable(struct sun8i_mixer 
*mixer, int channel,
                           SUN8I_MIXER_CHAN_VI_LAYER_ATTR_EN, val);
 
        if (!enable || zpos != old_zpos) {
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_PIPE_CTL(bld_base),
                                   SUN8I_MIXER_BLEND_PIPE_CTL_EN(old_zpos),
                                   0);
 
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_ROUTE(bld_base),
                                   SUN8I_MIXER_BLEND_ROUTE_PIPE_MSK(old_zpos),
                                   0);
@@ -54,13 +56,13 @@ static void sun8i_vi_layer_enable(struct sun8i_mixer 
*mixer, int channel,
        if (enable) {
                val = SUN8I_MIXER_BLEND_PIPE_CTL_EN(zpos);
 
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_PIPE_CTL(bld_base),
                                   val, val);
 
                val = channel << SUN8I_MIXER_BLEND_ROUTE_PIPE_SHIFT(zpos);
 
-               regmap_update_bits(mixer->engine.regs,
+               regmap_update_bits(bld_regs,
                                   SUN8I_MIXER_BLEND_ROUTE(bld_base),
                                   SUN8I_MIXER_BLEND_ROUTE_PIPE_MSK(zpos),
                                   val);
@@ -104,6 +106,7 @@ static int sun8i_vi_layer_update_coord(struct sun8i_mixer 
*mixer, int channel,
        struct drm_plane_state *state = plane->state;
        const struct drm_format_info *format = state->fb->format;
        u32 src_w, src_h, dst_w, dst_h;
+       struct regmap *bld_regs;
        u32 bld_base, ch_base;
        u32 outsize, insize;
        u32 hphase, vphase;
@@ -115,6 +118,7 @@ static int sun8i_vi_layer_update_coord(struct sun8i_mixer 
*mixer, int channel,
                         channel, overlay);
 
        bld_base = sun8i_blender_base(mixer);
+       bld_regs = sun8i_blender_regmap(mixer);
        ch_base = sun8i_channel_base(mixer, channel);
 
        src_w = drm_rect_width(&state->src) >> 16;
@@ -231,10 +235,10 @@ static int sun8i_vi_layer_update_coord(struct sun8i_mixer 
*mixer, int channel,
        DRM_DEBUG_DRIVER("Layer destination coordinates X: %d Y: %d\n",
                         state->dst.x1, state->dst.y1);
        DRM_DEBUG_DRIVER("Layer destination size W: %d H: %d\n", dst_w, dst_h);
-       regmap_write(mixer->engine.regs,
+       regmap_write(bld_regs,
                     SUN8I_MIXER_BLEND_ATTR_COORD(bld_base, zpos),
                     SUN8I_MIXER_COORD(state->dst.x1, state->dst.y1));
-       regmap_write(mixer->engine.regs,
+       regmap_write(bld_regs,
                     SUN8I_MIXER_BLEND_ATTR_INSIZE(bld_base, zpos),
                     outsize);
 
-- 
2.45.2

Reply via email to