@@ -707,6 +707,7 @@ static const struct sun8i_mixer_cfg sun8i_a83t_mixer0_cfg = {
.de_type = SUN8I_MIXER_DE2,
.scaler_mask = 0xf,
.scanline_yuv = 2048,
+ .de2_fcc_alpha = 1,
.ui_num = 3,
.vi_num = 1,
};
@@ -716,6 +717,7 @@ static const struct sun8i_mixer_cfg sun8i_a83t_mixer1_cfg = {
.de_type = SUN8I_MIXER_DE2,
.scaler_mask = 0x3,
.scanline_yuv = 2048,
+ .de2_fcc_alpha = 1,
.ui_num = 1,
.vi_num = 1,
};
@@ -726,6 +728,7 @@ static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = {
.mod_rate = 432000000,
.scaler_mask = 0xf,
.scanline_yuv = 2048,
+ .de2_fcc_alpha = 1,
.ui_num = 3,
.vi_num = 1,
};
@@ -736,6 +739,7 @@ static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = {
.mod_rate = 297000000,
.scaler_mask = 0xf,
.scanline_yuv = 2048,
+ .de2_fcc_alpha = 1,
.ui_num = 3,
.vi_num = 1,
};
@@ -746,6 +750,7 @@ static const struct sun8i_mixer_cfg sun8i_r40_mixer1_cfg = {
.mod_rate = 297000000,
.scaler_mask = 0x3,
.scanline_yuv = 2048,
+ .de2_fcc_alpha = 1,
.ui_num = 1,
.vi_num = 1,
};
@@ -766,6 +771,7 @@ static const struct sun8i_mixer_cfg sun20i_d1_mixer0_cfg = {
.mod_rate = 297000000,
.scaler_mask = 0x3,
.scanline_yuv = 2048,
+ .de2_fcc_alpha = 1,
.ui_num = 1,
.vi_num = 1,
};
@@ -776,6 +782,7 @@ static const struct sun8i_mixer_cfg sun20i_d1_mixer1_cfg = {
.mod_rate = 297000000,
.scaler_mask = 0x1,
.scanline_yuv = 1024,
+ .de2_fcc_alpha = 1,
.ui_num = 0,
.vi_num = 1,
};
@@ -786,6 +793,7 @@ static const struct sun8i_mixer_cfg sun50i_a64_mixer0_cfg = {
.mod_rate = 297000000,
.scaler_mask = 0xf,
.scanline_yuv = 4096,
+ .de2_fcc_alpha = 1,
.ui_num = 3,
.vi_num = 1,
};
@@ -796,6 +804,7 @@ static const struct sun8i_mixer_cfg sun50i_a64_mixer1_cfg = {
.mod_rate = 297000000,
.scaler_mask = 0x3,
.scanline_yuv = 2048,
+ .de2_fcc_alpha = 1,
.ui_num = 1,
.vi_num = 1,
};
@@ -176,6 +176,8 @@ enum sun8i_mixer_type {
* a functional block.
* @de_type: sun8i_mixer_type enum representing the display engine generation.
* @scaline_yuv: size of a scanline for VI scaler for YUV formats.
+ * @de2_fcc_alpha: use FCC for missing DE2 VI alpha capability
+ * Most DE2 cores has FCC. If number of VI planes is one, enable this.
* @map: channel map for DE variants processing YUV separately (DE33)
*/
struct sun8i_mixer_cfg {
@@ -186,6 +188,7 @@ struct sun8i_mixer_cfg {
unsigned long mod_rate;
unsigned int de_type;
unsigned int scanline_yuv;
+ unsigned int de2_fcc_alpha : 1;
unsigned int map[6];
};
@@ -48,14 +48,16 @@ static void sun8i_vi_layer_update_attributes(struct sun8i_layer *layer,
val |= (state->alpha == DRM_BLEND_ALPHA_OPAQUE) ?
SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_PIXEL :
SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_COMBINED;
- } else if (mixer->cfg->vi_num == 1) {
+ }
+
+ regmap_write(layer->regs,
+ SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, layer->overlay), val);
+
+ if (mixer->cfg->de2_fcc_alpha) {
regmap_write(layer->regs,
SUN8I_MIXER_FCC_GLOBAL_ALPHA_REG,
SUN8I_MIXER_FCC_GLOBAL_ALPHA(state->alpha >> 8));
}
-
- regmap_write(layer->regs,
- SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, layer->overlay), val);
}
static void sun8i_vi_layer_update_coord(struct sun8i_layer *layer,
@@ -450,7 +452,7 @@ struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
return ERR_PTR(ret);
}
- if (mixer->cfg->vi_num == 1 || mixer->cfg->de_type >= SUN8I_MIXER_DE3) {
+ if (mixer->cfg->de2_fcc_alpha || mixer->cfg->de_type >= SUN8I_MIXER_DE3) {
ret = drm_plane_create_alpha_property(&layer->plane);
if (ret) {
dev_err(drm->dev, "Couldn't add alpha property\n");