mirror of
https://github.com/torvalds/linux.git
synced 2025-11-02 09:40:27 +02:00
drm: sun4i: de2/de3: add mixer version enum
The Allwinner DE2 and DE3 display engine mixers are currently identified by a simple boolean flag. This will not scale to support additional DE variants. Convert the boolean flag to an enum. Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com> Signed-off-by: Ryan Walklin <ryan@testtoast.com> Reviewed-by: Andre Przywara <andre.przywara@arm.com> Acked-by: Maxime Ripard <mripard@kernel.org> Reviewed-by: Chen-Yu Tsai <wens@csie.org> Link: https://lore.kernel.org/r/20250528092431.28825-2-ryan@testtoast.com Signed-off-by: Maxime Ripard <mripard@kernel.org>
This commit is contained in:
parent
6a509853fe
commit
81cf7c6879
6 changed files with 30 additions and 15 deletions
|
|
@ -212,7 +212,7 @@ void sun8i_csc_set_ccsc_coefficients(struct sun8i_mixer *mixer, int layer,
|
|||
{
|
||||
u32 base;
|
||||
|
||||
if (mixer->cfg->is_de3) {
|
||||
if (mixer->cfg->de_type == SUN8I_MIXER_DE3) {
|
||||
sun8i_de3_ccsc_set_coefficients(mixer->engine.regs, layer,
|
||||
mode, encoding, range);
|
||||
return;
|
||||
|
|
@ -228,7 +228,7 @@ void sun8i_csc_enable_ccsc(struct sun8i_mixer *mixer, int layer, bool enable)
|
|||
{
|
||||
u32 base;
|
||||
|
||||
if (mixer->cfg->is_de3) {
|
||||
if (mixer->cfg->de_type == SUN8I_MIXER_DE3) {
|
||||
sun8i_de3_ccsc_enable(mixer->engine.regs, layer, enable);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -537,7 +537,7 @@ static int sun8i_mixer_bind(struct device *dev, struct device *master,
|
|||
base = sun8i_blender_base(mixer);
|
||||
|
||||
/* Reset registers and disable unused sub-engines */
|
||||
if (mixer->cfg->is_de3) {
|
||||
if (mixer->cfg->de_type == SUN8I_MIXER_DE3) {
|
||||
for (i = 0; i < DE3_MIXER_UNIT_SIZE; i += 4)
|
||||
regmap_write(mixer->engine.regs, i, 0);
|
||||
|
||||
|
|
@ -628,6 +628,7 @@ static void sun8i_mixer_remove(struct platform_device *pdev)
|
|||
|
||||
static const struct sun8i_mixer_cfg sun8i_a83t_mixer0_cfg = {
|
||||
.ccsc = CCSC_MIXER0_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.scaler_mask = 0xf,
|
||||
.scanline_yuv = 2048,
|
||||
.ui_num = 3,
|
||||
|
|
@ -636,6 +637,7 @@ static const struct sun8i_mixer_cfg sun8i_a83t_mixer0_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun8i_a83t_mixer1_cfg = {
|
||||
.ccsc = CCSC_MIXER1_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.scaler_mask = 0x3,
|
||||
.scanline_yuv = 2048,
|
||||
.ui_num = 1,
|
||||
|
|
@ -644,6 +646,7 @@ static const struct sun8i_mixer_cfg sun8i_a83t_mixer1_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = {
|
||||
.ccsc = CCSC_MIXER0_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.mod_rate = 432000000,
|
||||
.scaler_mask = 0xf,
|
||||
.scanline_yuv = 2048,
|
||||
|
|
@ -653,6 +656,7 @@ static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = {
|
||||
.ccsc = CCSC_MIXER0_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.mod_rate = 297000000,
|
||||
.scaler_mask = 0xf,
|
||||
.scanline_yuv = 2048,
|
||||
|
|
@ -662,6 +666,7 @@ static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun8i_r40_mixer1_cfg = {
|
||||
.ccsc = CCSC_MIXER1_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.mod_rate = 297000000,
|
||||
.scaler_mask = 0x3,
|
||||
.scanline_yuv = 2048,
|
||||
|
|
@ -670,6 +675,7 @@ static const struct sun8i_mixer_cfg sun8i_r40_mixer1_cfg = {
|
|||
};
|
||||
|
||||
static const struct sun8i_mixer_cfg sun8i_v3s_mixer_cfg = {
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.vi_num = 2,
|
||||
.ui_num = 1,
|
||||
.scaler_mask = 0x3,
|
||||
|
|
@ -680,6 +686,7 @@ static const struct sun8i_mixer_cfg sun8i_v3s_mixer_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun20i_d1_mixer0_cfg = {
|
||||
.ccsc = CCSC_D1_MIXER0_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.mod_rate = 297000000,
|
||||
.scaler_mask = 0x3,
|
||||
.scanline_yuv = 2048,
|
||||
|
|
@ -689,6 +696,7 @@ static const struct sun8i_mixer_cfg sun20i_d1_mixer0_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun20i_d1_mixer1_cfg = {
|
||||
.ccsc = CCSC_MIXER1_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.mod_rate = 297000000,
|
||||
.scaler_mask = 0x1,
|
||||
.scanline_yuv = 1024,
|
||||
|
|
@ -698,6 +706,7 @@ static const struct sun8i_mixer_cfg sun20i_d1_mixer1_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun50i_a64_mixer0_cfg = {
|
||||
.ccsc = CCSC_MIXER0_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.mod_rate = 297000000,
|
||||
.scaler_mask = 0xf,
|
||||
.scanline_yuv = 4096,
|
||||
|
|
@ -707,6 +716,7 @@ static const struct sun8i_mixer_cfg sun50i_a64_mixer0_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun50i_a64_mixer1_cfg = {
|
||||
.ccsc = CCSC_MIXER1_LAYOUT,
|
||||
.de_type = SUN8I_MIXER_DE2,
|
||||
.mod_rate = 297000000,
|
||||
.scaler_mask = 0x3,
|
||||
.scanline_yuv = 2048,
|
||||
|
|
@ -716,7 +726,7 @@ static const struct sun8i_mixer_cfg sun50i_a64_mixer1_cfg = {
|
|||
|
||||
static const struct sun8i_mixer_cfg sun50i_h6_mixer0_cfg = {
|
||||
.ccsc = CCSC_MIXER0_LAYOUT,
|
||||
.is_de3 = true,
|
||||
.de_type = SUN8I_MIXER_DE3,
|
||||
.mod_rate = 600000000,
|
||||
.scaler_mask = 0xf,
|
||||
.scanline_yuv = 4096,
|
||||
|
|
|
|||
|
|
@ -151,6 +151,11 @@ enum {
|
|||
CCSC_D1_MIXER0_LAYOUT,
|
||||
};
|
||||
|
||||
enum sun8i_mixer_type {
|
||||
SUN8I_MIXER_DE2,
|
||||
SUN8I_MIXER_DE3,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct sun8i_mixer_cfg - mixer HW configuration
|
||||
* @vi_num: number of VI channels
|
||||
|
|
@ -162,7 +167,7 @@ enum {
|
|||
* @ccsc: select set of CCSC base addresses from the enumeration above.
|
||||
* @mod_rate: module clock rate that needs to be set in order to have
|
||||
* a functional block.
|
||||
* @is_de3: true, if this is next gen display engine 3.0, false otherwise.
|
||||
* @de_type: sun8i_mixer_type enum representing the display engine generation.
|
||||
* @scaline_yuv: size of a scanline for VI scaler for YUV formats.
|
||||
*/
|
||||
struct sun8i_mixer_cfg {
|
||||
|
|
@ -171,7 +176,7 @@ struct sun8i_mixer_cfg {
|
|||
int scaler_mask;
|
||||
int ccsc;
|
||||
unsigned long mod_rate;
|
||||
unsigned int is_de3 : 1;
|
||||
unsigned int de_type;
|
||||
unsigned int scanline_yuv;
|
||||
};
|
||||
|
||||
|
|
@ -214,13 +219,13 @@ engine_to_sun8i_mixer(struct sunxi_engine *engine)
|
|||
static inline u32
|
||||
sun8i_blender_base(struct sun8i_mixer *mixer)
|
||||
{
|
||||
return mixer->cfg->is_de3 ? DE3_BLD_BASE : DE2_BLD_BASE;
|
||||
return mixer->cfg->de_type == SUN8I_MIXER_DE3 ? DE3_BLD_BASE : DE2_BLD_BASE;
|
||||
}
|
||||
|
||||
static inline u32
|
||||
sun8i_channel_base(struct sun8i_mixer *mixer, int channel)
|
||||
{
|
||||
if (mixer->cfg->is_de3)
|
||||
if (mixer->cfg->de_type == SUN8I_MIXER_DE3)
|
||||
return DE3_CH_BASE + channel * DE3_CH_SIZE;
|
||||
else
|
||||
return DE2_CH_BASE + channel * DE2_CH_SIZE;
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ static u32 sun8i_ui_scaler_base(struct sun8i_mixer *mixer, int channel)
|
|||
{
|
||||
int vi_num = mixer->cfg->vi_num;
|
||||
|
||||
if (mixer->cfg->is_de3)
|
||||
if (mixer->cfg->de_type == SUN8I_MIXER_DE3)
|
||||
return DE3_VI_SCALER_UNIT_BASE +
|
||||
DE3_VI_SCALER_UNIT_SIZE * vi_num +
|
||||
DE3_UI_SCALER_UNIT_SIZE * (channel - vi_num);
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ static void sun8i_vi_layer_update_alpha(struct sun8i_mixer *mixer, int channel,
|
|||
|
||||
ch_base = sun8i_channel_base(mixer, channel);
|
||||
|
||||
if (mixer->cfg->is_de3) {
|
||||
if (mixer->cfg->de_type >= SUN8I_MIXER_DE3) {
|
||||
mask = SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MASK |
|
||||
SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_MASK;
|
||||
val = SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA
|
||||
|
|
@ -483,7 +483,7 @@ struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
|
|||
if (!layer)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (mixer->cfg->is_de3) {
|
||||
if (mixer->cfg->de_type >= SUN8I_MIXER_DE3) {
|
||||
formats = sun8i_vi_layer_de3_formats;
|
||||
format_count = ARRAY_SIZE(sun8i_vi_layer_de3_formats);
|
||||
} else {
|
||||
|
|
@ -507,7 +507,7 @@ struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
|
|||
|
||||
plane_cnt = mixer->cfg->ui_num + mixer->cfg->vi_num;
|
||||
|
||||
if (mixer->cfg->vi_num == 1 || mixer->cfg->is_de3) {
|
||||
if (mixer->cfg->vi_num == 1 || 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");
|
||||
|
|
@ -524,7 +524,7 @@ struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
|
|||
|
||||
supported_encodings = BIT(DRM_COLOR_YCBCR_BT601) |
|
||||
BIT(DRM_COLOR_YCBCR_BT709);
|
||||
if (mixer->cfg->is_de3)
|
||||
if (mixer->cfg->de_type >= SUN8I_MIXER_DE3)
|
||||
supported_encodings |= BIT(DRM_COLOR_YCBCR_BT2020);
|
||||
|
||||
supported_ranges = BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
|
||||
|
|
|
|||
|
|
@ -835,7 +835,7 @@ static const u32 bicubic4coefftab32[480] = {
|
|||
|
||||
static u32 sun8i_vi_scaler_base(struct sun8i_mixer *mixer, int channel)
|
||||
{
|
||||
if (mixer->cfg->is_de3)
|
||||
if (mixer->cfg->de_type == SUN8I_MIXER_DE3)
|
||||
return DE3_VI_SCALER_UNIT_BASE +
|
||||
DE3_VI_SCALER_UNIT_SIZE * channel;
|
||||
else
|
||||
|
|
@ -956,7 +956,7 @@ void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer,
|
|||
cvphase = vphase;
|
||||
}
|
||||
|
||||
if (mixer->cfg->is_de3) {
|
||||
if (mixer->cfg->de_type >= SUN8I_MIXER_DE3) {
|
||||
u32 val;
|
||||
|
||||
if (format->hsub == 1 && format->vsub == 1)
|
||||
|
|
|
|||
Loading…
Reference in a new issue