@@ -178,6 +178,18 @@ static inline bool is_alpha_format(const struct mixer_context* ctx, unsigned int
}
}
+static inline unsigned int layer_bitmask(const struct mixer_context* ctx)
+{
+ unsigned int i, mask = 0;
+
+ for (i = 0; i < MIXER_WIN_NR; ++i) {
+ if (ctx->planes[i].enabled)
+ mask |= (1 << i);
+ }
+
+ return mask;
+}
+
static inline u32 vp_reg_read(struct mixer_resources *res, u32 reg_id)
{
return readl(res->vp_regs + reg_id);
@@ -490,6 +502,7 @@ static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height)
static void mixer_cfg_layer(struct mixer_context *ctx, int win, bool enable)
{
struct mixer_resources *res = &ctx->mixer_res;
+ unsigned int enable_state;
u32 val = enable ? ~0 : 0;
switch (win) {
@@ -507,6 +520,16 @@ static void mixer_cfg_layer(struct mixer_context *ctx, int win, bool enable)
}
break;
}
+
+ /* Determine the current enabled/disabled state of the layers. */
+ enable_state = layer_bitmask(ctx);
+ if (enable)
+ enable_state |= (1 << win);
+ else
+ enable_state &= ~(1 << win);
+
+ /* Layer configuration has changed, update blending setup. */
+ mixer_layer_blending(ctx, enable_state);
}
static void mixer_run(struct mixer_context *ctx)
This updates the blending setup when the layer configuration changes (triggered by mixer_win_{commit,disable}). Extra care has to be taken for the layer that is currently being enabled/disabled. Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de> --- drivers/gpu/drm/exynos/exynos_mixer.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)