diff --git a/drivers/gpu/drm/imx/dpu/dpu-plane.c b/drivers/gpu/drm/imx/dpu/dpu-plane.c index 6c69ead6847c..3dacc8baed11 100644 --- a/drivers/gpu/drm/imx/dpu/dpu-plane.c +++ b/drivers/gpu/drm/imx/dpu/dpu-plane.c @@ -646,7 +646,7 @@ static void dpu_plane_atomic_update(struct drm_plane *plane, layerblend_pixengcfg_dynamic_prim_sel(lb, dpstate->stage); layerblend_pixengcfg_dynamic_sec_sel(lb, lb_src); layerblend_control(lb, LB_BLEND); - layerblend_blendcontrol(lb); + layerblend_blendcontrol(lb, need_hscaler || need_vscaler); layerblend_pixengcfg_clken(lb, CLKEN__AUTOMATIC); layerblend_position(lb, dpstate->layer_x, dpstate->layer_y); diff --git a/drivers/gpu/imx/dpu/dpu-layerblend.c b/drivers/gpu/imx/dpu/dpu-layerblend.c index 91563bf6dac5..c18420988df7 100644 --- a/drivers/gpu/imx/dpu/dpu-layerblend.c +++ b/drivers/gpu/imx/dpu/dpu-layerblend.c @@ -64,6 +64,7 @@ static const lb_prim_sel_t prim_sels[] = { #define PRIM_A_BLD_FUNC__ONE_MINUS_SEC_ALPHA (0x5 << 8) #define PRIM_A_BLD_FUNC__ZERO (0x0 << 8) #define SEC_A_BLD_FUNC__ONE (0x1 << 12) +#define SEC_A_BLD_FUNC__ZERO (0x0 << 12) #define POSITION 0x14 #define XPOS(x) ((x) & 0x7FFF) #define YPOS(y) (((y) & 0x7FFF) << 16) @@ -236,15 +237,16 @@ void layerblend_control(struct dpu_layerblend *lb, lb_mode_t mode) } EXPORT_SYMBOL_GPL(layerblend_control); -void layerblend_blendcontrol(struct dpu_layerblend *lb) +void layerblend_blendcontrol(struct dpu_layerblend *lb, bool sec_from_scaler) { u32 val; val = ALPHA(0xff) | PRIM_C_BLD_FUNC__PRIM_ALPHA | SEC_C_BLD_FUNC__ONE_MINUS_PRIM_ALPHA | - PRIM_A_BLD_FUNC__ZERO | - SEC_A_BLD_FUNC__ONE; + PRIM_A_BLD_FUNC__ZERO; + + val |= sec_from_scaler ? SEC_A_BLD_FUNC__ZERO : SEC_A_BLD_FUNC__ONE; mutex_lock(&lb->mutex); dpu_lb_write(lb, val, BLENDCONTROL); diff --git a/include/video/dpu.h b/include/video/dpu.h index fd429b8aa05d..60a54bc058df 100644 --- a/include/video/dpu.h +++ b/include/video/dpu.h @@ -631,7 +631,7 @@ void layerblend_shden(struct dpu_layerblend *lb, bool enable); void layerblend_shdtoksel(struct dpu_layerblend *lb, lb_shadow_sel_t sel); void layerblend_shdldsel(struct dpu_layerblend *lb, lb_shadow_sel_t sel); void layerblend_control(struct dpu_layerblend *lb, lb_mode_t mode); -void layerblend_blendcontrol(struct dpu_layerblend *lb); +void layerblend_blendcontrol(struct dpu_layerblend *lb, bool sec_from_scaler); void layerblend_position(struct dpu_layerblend *lb, int x, int y); u32 layerblend_last_control_word(struct dpu_layerblend *lb); void layerblend_pixel_cnt(struct dpu_layerblend *lb, u16 *x, u16 *y);