162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2016 BayLibre, SAS
462306a36Sopenharmony_ci * Author: Neil Armstrong <narmstrong@baylibre.com>
562306a36Sopenharmony_ci * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/bitfield.h>
962306a36Sopenharmony_ci#include <linux/export.h>
1062306a36Sopenharmony_ci#include <linux/iopoll.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <drm/drm_modes.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "meson_drv.h"
1562306a36Sopenharmony_ci#include "meson_registers.h"
1662306a36Sopenharmony_ci#include "meson_venc.h"
1762306a36Sopenharmony_ci#include "meson_vpp.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/**
2062306a36Sopenharmony_ci * DOC: Video Encoder
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * VENC Handle the pixels encoding to the output formats.
2362306a36Sopenharmony_ci * We handle the following encodings :
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * - CVBS Encoding via the ENCI encoder and VDAC digital to analog converter
2662306a36Sopenharmony_ci * - TMDS/HDMI Encoding via ENCI_DIV and ENCP
2762306a36Sopenharmony_ci * - Setup of more clock rates for HDMI modes
2862306a36Sopenharmony_ci *
2962306a36Sopenharmony_ci * What is missing :
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * - LCD Panel encoding via ENCL
3262306a36Sopenharmony_ci * - TV Panel encoding via ENCT
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci * VENC paths :
3562306a36Sopenharmony_ci *
3662306a36Sopenharmony_ci * .. code::
3762306a36Sopenharmony_ci *
3862306a36Sopenharmony_ci *          _____   _____   ____________________
3962306a36Sopenharmony_ci *   vd1---|     |-|     | | VENC     /---------|----VDAC
4062306a36Sopenharmony_ci *   vd2---| VIU |-| VPP |-|-----ENCI/-ENCI_DVI-|-|
4162306a36Sopenharmony_ci *   osd1--|     |-|     | | \                  | X--HDMI-TX
4262306a36Sopenharmony_ci *   osd2--|_____|-|_____| |  |\-ENCP--ENCP_DVI-|-|
4362306a36Sopenharmony_ci *                         |  |                 |
4462306a36Sopenharmony_ci *                         |  \--ENCL-----------|----LVDS
4562306a36Sopenharmony_ci *                         |____________________|
4662306a36Sopenharmony_ci *
4762306a36Sopenharmony_ci * The ENCI is designed for PAl or NTSC encoding and can go through the VDAC
4862306a36Sopenharmony_ci * directly for CVBS encoding or through the ENCI_DVI encoder for HDMI.
4962306a36Sopenharmony_ci * The ENCP is designed for Progressive encoding but can also generate
5062306a36Sopenharmony_ci * 1080i interlaced pixels, and was initially designed to encode pixels for
5162306a36Sopenharmony_ci * VDAC to output RGB ou YUV analog outputs.
5262306a36Sopenharmony_ci * It's output is only used through the ENCP_DVI encoder for HDMI.
5362306a36Sopenharmony_ci * The ENCL LVDS encoder is not implemented.
5462306a36Sopenharmony_ci *
5562306a36Sopenharmony_ci * The ENCI and ENCP encoders needs specially defined parameters for each
5662306a36Sopenharmony_ci * supported mode and thus cannot be determined from standard video timings.
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci * The ENCI end ENCP DVI encoders are more generic and can generate any timings
5962306a36Sopenharmony_ci * from the pixel data generated by ENCI or ENCP, so can use the standard video
6062306a36Sopenharmony_ci * timings are source for HW parameters.
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* HHI Registers */
6462306a36Sopenharmony_ci#define HHI_GCLK_MPEG2		0x148 /* 0x52 offset in data sheet */
6562306a36Sopenharmony_ci#define HHI_VDAC_CNTL0		0x2F4 /* 0xbd offset in data sheet */
6662306a36Sopenharmony_ci#define HHI_VDAC_CNTL0_G12A	0x2EC /* 0xbb offset in data sheet */
6762306a36Sopenharmony_ci#define HHI_VDAC_CNTL1		0x2F8 /* 0xbe offset in data sheet */
6862306a36Sopenharmony_ci#define HHI_VDAC_CNTL1_G12A	0x2F0 /* 0xbc offset in data sheet */
6962306a36Sopenharmony_ci#define HHI_HDMI_PHY_CNTL0	0x3a0 /* 0xe8 offset in data sheet */
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct meson_cvbs_enci_mode meson_cvbs_enci_pal = {
7262306a36Sopenharmony_ci	.mode_tag = MESON_VENC_MODE_CVBS_PAL,
7362306a36Sopenharmony_ci	.hso_begin = 3,
7462306a36Sopenharmony_ci	.hso_end = 129,
7562306a36Sopenharmony_ci	.vso_even = 3,
7662306a36Sopenharmony_ci	.vso_odd = 260,
7762306a36Sopenharmony_ci	.macv_max_amp = 7,
7862306a36Sopenharmony_ci	.video_prog_mode = 0xff,
7962306a36Sopenharmony_ci	.video_mode = 0x13,
8062306a36Sopenharmony_ci	.sch_adjust = 0x28,
8162306a36Sopenharmony_ci	.yc_delay = 0x343,
8262306a36Sopenharmony_ci	.pixel_start = 251,
8362306a36Sopenharmony_ci	.pixel_end = 1691,
8462306a36Sopenharmony_ci	.top_field_line_start = 22,
8562306a36Sopenharmony_ci	.top_field_line_end = 310,
8662306a36Sopenharmony_ci	.bottom_field_line_start = 23,
8762306a36Sopenharmony_ci	.bottom_field_line_end = 311,
8862306a36Sopenharmony_ci	.video_saturation = 9,
8962306a36Sopenharmony_ci	.video_contrast = 0,
9062306a36Sopenharmony_ci	.video_brightness = 0,
9162306a36Sopenharmony_ci	.video_hue = 0,
9262306a36Sopenharmony_ci	.analog_sync_adj = 0x8080,
9362306a36Sopenharmony_ci};
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistruct meson_cvbs_enci_mode meson_cvbs_enci_ntsc = {
9662306a36Sopenharmony_ci	.mode_tag = MESON_VENC_MODE_CVBS_NTSC,
9762306a36Sopenharmony_ci	.hso_begin = 5,
9862306a36Sopenharmony_ci	.hso_end = 129,
9962306a36Sopenharmony_ci	.vso_even = 3,
10062306a36Sopenharmony_ci	.vso_odd = 260,
10162306a36Sopenharmony_ci	.macv_max_amp = 0xb,
10262306a36Sopenharmony_ci	.video_prog_mode = 0xf0,
10362306a36Sopenharmony_ci	.video_mode = 0x8,
10462306a36Sopenharmony_ci	.sch_adjust = 0x20,
10562306a36Sopenharmony_ci	.yc_delay = 0x333,
10662306a36Sopenharmony_ci	.pixel_start = 227,
10762306a36Sopenharmony_ci	.pixel_end = 1667,
10862306a36Sopenharmony_ci	.top_field_line_start = 18,
10962306a36Sopenharmony_ci	.top_field_line_end = 258,
11062306a36Sopenharmony_ci	.bottom_field_line_start = 19,
11162306a36Sopenharmony_ci	.bottom_field_line_end = 259,
11262306a36Sopenharmony_ci	.video_saturation = 18,
11362306a36Sopenharmony_ci	.video_contrast = 3,
11462306a36Sopenharmony_ci	.video_brightness = 0,
11562306a36Sopenharmony_ci	.video_hue = 0,
11662306a36Sopenharmony_ci	.analog_sync_adj = 0x9c00,
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciunion meson_hdmi_venc_mode {
12062306a36Sopenharmony_ci	struct {
12162306a36Sopenharmony_ci		unsigned int mode_tag;
12262306a36Sopenharmony_ci		unsigned int hso_begin;
12362306a36Sopenharmony_ci		unsigned int hso_end;
12462306a36Sopenharmony_ci		unsigned int vso_even;
12562306a36Sopenharmony_ci		unsigned int vso_odd;
12662306a36Sopenharmony_ci		unsigned int macv_max_amp;
12762306a36Sopenharmony_ci		unsigned int video_prog_mode;
12862306a36Sopenharmony_ci		unsigned int video_mode;
12962306a36Sopenharmony_ci		unsigned int sch_adjust;
13062306a36Sopenharmony_ci		unsigned int yc_delay;
13162306a36Sopenharmony_ci		unsigned int pixel_start;
13262306a36Sopenharmony_ci		unsigned int pixel_end;
13362306a36Sopenharmony_ci		unsigned int top_field_line_start;
13462306a36Sopenharmony_ci		unsigned int top_field_line_end;
13562306a36Sopenharmony_ci		unsigned int bottom_field_line_start;
13662306a36Sopenharmony_ci		unsigned int bottom_field_line_end;
13762306a36Sopenharmony_ci	} enci;
13862306a36Sopenharmony_ci	struct {
13962306a36Sopenharmony_ci		unsigned int dvi_settings;
14062306a36Sopenharmony_ci		unsigned int video_mode;
14162306a36Sopenharmony_ci		unsigned int video_mode_adv;
14262306a36Sopenharmony_ci		unsigned int video_prog_mode;
14362306a36Sopenharmony_ci		bool video_prog_mode_present;
14462306a36Sopenharmony_ci		unsigned int video_sync_mode;
14562306a36Sopenharmony_ci		bool video_sync_mode_present;
14662306a36Sopenharmony_ci		unsigned int video_yc_dly;
14762306a36Sopenharmony_ci		bool video_yc_dly_present;
14862306a36Sopenharmony_ci		unsigned int video_rgb_ctrl;
14962306a36Sopenharmony_ci		bool video_rgb_ctrl_present;
15062306a36Sopenharmony_ci		unsigned int video_filt_ctrl;
15162306a36Sopenharmony_ci		bool video_filt_ctrl_present;
15262306a36Sopenharmony_ci		unsigned int video_ofld_voav_ofst;
15362306a36Sopenharmony_ci		bool video_ofld_voav_ofst_present;
15462306a36Sopenharmony_ci		unsigned int yfp1_htime;
15562306a36Sopenharmony_ci		unsigned int yfp2_htime;
15662306a36Sopenharmony_ci		unsigned int max_pxcnt;
15762306a36Sopenharmony_ci		unsigned int hspuls_begin;
15862306a36Sopenharmony_ci		unsigned int hspuls_end;
15962306a36Sopenharmony_ci		unsigned int hspuls_switch;
16062306a36Sopenharmony_ci		unsigned int vspuls_begin;
16162306a36Sopenharmony_ci		unsigned int vspuls_end;
16262306a36Sopenharmony_ci		unsigned int vspuls_bline;
16362306a36Sopenharmony_ci		unsigned int vspuls_eline;
16462306a36Sopenharmony_ci		unsigned int eqpuls_begin;
16562306a36Sopenharmony_ci		bool eqpuls_begin_present;
16662306a36Sopenharmony_ci		unsigned int eqpuls_end;
16762306a36Sopenharmony_ci		bool eqpuls_end_present;
16862306a36Sopenharmony_ci		unsigned int eqpuls_bline;
16962306a36Sopenharmony_ci		bool eqpuls_bline_present;
17062306a36Sopenharmony_ci		unsigned int eqpuls_eline;
17162306a36Sopenharmony_ci		bool eqpuls_eline_present;
17262306a36Sopenharmony_ci		unsigned int havon_begin;
17362306a36Sopenharmony_ci		unsigned int havon_end;
17462306a36Sopenharmony_ci		unsigned int vavon_bline;
17562306a36Sopenharmony_ci		unsigned int vavon_eline;
17662306a36Sopenharmony_ci		unsigned int hso_begin;
17762306a36Sopenharmony_ci		unsigned int hso_end;
17862306a36Sopenharmony_ci		unsigned int vso_begin;
17962306a36Sopenharmony_ci		unsigned int vso_end;
18062306a36Sopenharmony_ci		unsigned int vso_bline;
18162306a36Sopenharmony_ci		unsigned int vso_eline;
18262306a36Sopenharmony_ci		bool vso_eline_present;
18362306a36Sopenharmony_ci		unsigned int sy_val;
18462306a36Sopenharmony_ci		bool sy_val_present;
18562306a36Sopenharmony_ci		unsigned int sy2_val;
18662306a36Sopenharmony_ci		bool sy2_val_present;
18762306a36Sopenharmony_ci		unsigned int max_lncnt;
18862306a36Sopenharmony_ci	} encp;
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_enci_mode_480i = {
19262306a36Sopenharmony_ci	.enci = {
19362306a36Sopenharmony_ci		.hso_begin = 5,
19462306a36Sopenharmony_ci		.hso_end = 129,
19562306a36Sopenharmony_ci		.vso_even = 3,
19662306a36Sopenharmony_ci		.vso_odd = 260,
19762306a36Sopenharmony_ci		.macv_max_amp = 0xb,
19862306a36Sopenharmony_ci		.video_prog_mode = 0xf0,
19962306a36Sopenharmony_ci		.video_mode = 0x8,
20062306a36Sopenharmony_ci		.sch_adjust = 0x20,
20162306a36Sopenharmony_ci		.yc_delay = 0,
20262306a36Sopenharmony_ci		.pixel_start = 227,
20362306a36Sopenharmony_ci		.pixel_end = 1667,
20462306a36Sopenharmony_ci		.top_field_line_start = 18,
20562306a36Sopenharmony_ci		.top_field_line_end = 258,
20662306a36Sopenharmony_ci		.bottom_field_line_start = 19,
20762306a36Sopenharmony_ci		.bottom_field_line_end = 259,
20862306a36Sopenharmony_ci	},
20962306a36Sopenharmony_ci};
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_enci_mode_576i = {
21262306a36Sopenharmony_ci	.enci = {
21362306a36Sopenharmony_ci		.hso_begin = 3,
21462306a36Sopenharmony_ci		.hso_end = 129,
21562306a36Sopenharmony_ci		.vso_even = 3,
21662306a36Sopenharmony_ci		.vso_odd = 260,
21762306a36Sopenharmony_ci		.macv_max_amp = 0x7,
21862306a36Sopenharmony_ci		.video_prog_mode = 0xff,
21962306a36Sopenharmony_ci		.video_mode = 0x13,
22062306a36Sopenharmony_ci		.sch_adjust = 0x28,
22162306a36Sopenharmony_ci		.yc_delay = 0x333,
22262306a36Sopenharmony_ci		.pixel_start = 251,
22362306a36Sopenharmony_ci		.pixel_end = 1691,
22462306a36Sopenharmony_ci		.top_field_line_start = 22,
22562306a36Sopenharmony_ci		.top_field_line_end = 310,
22662306a36Sopenharmony_ci		.bottom_field_line_start = 23,
22762306a36Sopenharmony_ci		.bottom_field_line_end = 311,
22862306a36Sopenharmony_ci	},
22962306a36Sopenharmony_ci};
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_480p = {
23262306a36Sopenharmony_ci	.encp = {
23362306a36Sopenharmony_ci		.dvi_settings = 0x21,
23462306a36Sopenharmony_ci		.video_mode = 0x4000,
23562306a36Sopenharmony_ci		.video_mode_adv = 0x9,
23662306a36Sopenharmony_ci		.video_prog_mode = 0,
23762306a36Sopenharmony_ci		.video_prog_mode_present = true,
23862306a36Sopenharmony_ci		.video_sync_mode = 7,
23962306a36Sopenharmony_ci		.video_sync_mode_present = true,
24062306a36Sopenharmony_ci		/* video_yc_dly */
24162306a36Sopenharmony_ci		/* video_rgb_ctrl */
24262306a36Sopenharmony_ci		.video_filt_ctrl = 0x2052,
24362306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
24462306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
24562306a36Sopenharmony_ci		.yfp1_htime = 244,
24662306a36Sopenharmony_ci		.yfp2_htime = 1630,
24762306a36Sopenharmony_ci		.max_pxcnt = 1715,
24862306a36Sopenharmony_ci		.hspuls_begin = 0x22,
24962306a36Sopenharmony_ci		.hspuls_end = 0xa0,
25062306a36Sopenharmony_ci		.hspuls_switch = 88,
25162306a36Sopenharmony_ci		.vspuls_begin = 0,
25262306a36Sopenharmony_ci		.vspuls_end = 1589,
25362306a36Sopenharmony_ci		.vspuls_bline = 0,
25462306a36Sopenharmony_ci		.vspuls_eline = 5,
25562306a36Sopenharmony_ci		.havon_begin = 249,
25662306a36Sopenharmony_ci		.havon_end = 1689,
25762306a36Sopenharmony_ci		.vavon_bline = 42,
25862306a36Sopenharmony_ci		.vavon_eline = 521,
25962306a36Sopenharmony_ci		/* eqpuls_begin */
26062306a36Sopenharmony_ci		/* eqpuls_end */
26162306a36Sopenharmony_ci		/* eqpuls_bline */
26262306a36Sopenharmony_ci		/* eqpuls_eline */
26362306a36Sopenharmony_ci		.hso_begin = 3,
26462306a36Sopenharmony_ci		.hso_end = 5,
26562306a36Sopenharmony_ci		.vso_begin = 3,
26662306a36Sopenharmony_ci		.vso_end = 5,
26762306a36Sopenharmony_ci		.vso_bline = 0,
26862306a36Sopenharmony_ci		/* vso_eline */
26962306a36Sopenharmony_ci		.sy_val	= 8,
27062306a36Sopenharmony_ci		.sy_val_present = true,
27162306a36Sopenharmony_ci		.sy2_val = 0x1d8,
27262306a36Sopenharmony_ci		.sy2_val_present = true,
27362306a36Sopenharmony_ci		.max_lncnt = 524,
27462306a36Sopenharmony_ci	},
27562306a36Sopenharmony_ci};
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_576p = {
27862306a36Sopenharmony_ci	.encp = {
27962306a36Sopenharmony_ci		.dvi_settings = 0x21,
28062306a36Sopenharmony_ci		.video_mode = 0x4000,
28162306a36Sopenharmony_ci		.video_mode_adv = 0x9,
28262306a36Sopenharmony_ci		.video_prog_mode = 0,
28362306a36Sopenharmony_ci		.video_prog_mode_present = true,
28462306a36Sopenharmony_ci		.video_sync_mode = 7,
28562306a36Sopenharmony_ci		.video_sync_mode_present = true,
28662306a36Sopenharmony_ci		/* video_yc_dly */
28762306a36Sopenharmony_ci		/* video_rgb_ctrl */
28862306a36Sopenharmony_ci		.video_filt_ctrl = 0x52,
28962306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
29062306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
29162306a36Sopenharmony_ci		.yfp1_htime = 235,
29262306a36Sopenharmony_ci		.yfp2_htime = 1674,
29362306a36Sopenharmony_ci		.max_pxcnt = 1727,
29462306a36Sopenharmony_ci		.hspuls_begin = 0,
29562306a36Sopenharmony_ci		.hspuls_end = 0x80,
29662306a36Sopenharmony_ci		.hspuls_switch = 88,
29762306a36Sopenharmony_ci		.vspuls_begin = 0,
29862306a36Sopenharmony_ci		.vspuls_end = 1599,
29962306a36Sopenharmony_ci		.vspuls_bline = 0,
30062306a36Sopenharmony_ci		.vspuls_eline = 4,
30162306a36Sopenharmony_ci		.havon_begin = 235,
30262306a36Sopenharmony_ci		.havon_end = 1674,
30362306a36Sopenharmony_ci		.vavon_bline = 44,
30462306a36Sopenharmony_ci		.vavon_eline = 619,
30562306a36Sopenharmony_ci		/* eqpuls_begin */
30662306a36Sopenharmony_ci		/* eqpuls_end */
30762306a36Sopenharmony_ci		/* eqpuls_bline */
30862306a36Sopenharmony_ci		/* eqpuls_eline */
30962306a36Sopenharmony_ci		.hso_begin = 0x80,
31062306a36Sopenharmony_ci		.hso_end = 0,
31162306a36Sopenharmony_ci		.vso_begin = 0,
31262306a36Sopenharmony_ci		.vso_end = 5,
31362306a36Sopenharmony_ci		.vso_bline = 0,
31462306a36Sopenharmony_ci		/* vso_eline */
31562306a36Sopenharmony_ci		.sy_val	= 8,
31662306a36Sopenharmony_ci		.sy_val_present = true,
31762306a36Sopenharmony_ci		.sy2_val = 0x1d8,
31862306a36Sopenharmony_ci		.sy2_val_present = true,
31962306a36Sopenharmony_ci		.max_lncnt = 624,
32062306a36Sopenharmony_ci	},
32162306a36Sopenharmony_ci};
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_720p60 = {
32462306a36Sopenharmony_ci	.encp = {
32562306a36Sopenharmony_ci		.dvi_settings = 0x2029,
32662306a36Sopenharmony_ci		.video_mode = 0x4040,
32762306a36Sopenharmony_ci		.video_mode_adv = 0x19,
32862306a36Sopenharmony_ci		/* video_prog_mode */
32962306a36Sopenharmony_ci		/* video_sync_mode */
33062306a36Sopenharmony_ci		/* video_yc_dly */
33162306a36Sopenharmony_ci		/* video_rgb_ctrl */
33262306a36Sopenharmony_ci		/* video_filt_ctrl */
33362306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
33462306a36Sopenharmony_ci		.yfp1_htime = 648,
33562306a36Sopenharmony_ci		.yfp2_htime = 3207,
33662306a36Sopenharmony_ci		.max_pxcnt = 3299,
33762306a36Sopenharmony_ci		.hspuls_begin = 80,
33862306a36Sopenharmony_ci		.hspuls_end = 240,
33962306a36Sopenharmony_ci		.hspuls_switch = 80,
34062306a36Sopenharmony_ci		.vspuls_begin = 688,
34162306a36Sopenharmony_ci		.vspuls_end = 3248,
34262306a36Sopenharmony_ci		.vspuls_bline = 4,
34362306a36Sopenharmony_ci		.vspuls_eline = 8,
34462306a36Sopenharmony_ci		.havon_begin = 648,
34562306a36Sopenharmony_ci		.havon_end = 3207,
34662306a36Sopenharmony_ci		.vavon_bline = 29,
34762306a36Sopenharmony_ci		.vavon_eline = 748,
34862306a36Sopenharmony_ci		/* eqpuls_begin */
34962306a36Sopenharmony_ci		/* eqpuls_end */
35062306a36Sopenharmony_ci		/* eqpuls_bline */
35162306a36Sopenharmony_ci		/* eqpuls_eline */
35262306a36Sopenharmony_ci		.hso_begin = 256,
35362306a36Sopenharmony_ci		.hso_end = 168,
35462306a36Sopenharmony_ci		.vso_begin = 168,
35562306a36Sopenharmony_ci		.vso_end = 256,
35662306a36Sopenharmony_ci		.vso_bline = 0,
35762306a36Sopenharmony_ci		.vso_eline = 5,
35862306a36Sopenharmony_ci		.vso_eline_present = true,
35962306a36Sopenharmony_ci		/* sy_val */
36062306a36Sopenharmony_ci		/* sy2_val */
36162306a36Sopenharmony_ci		.max_lncnt = 749,
36262306a36Sopenharmony_ci	},
36362306a36Sopenharmony_ci};
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_720p50 = {
36662306a36Sopenharmony_ci	.encp = {
36762306a36Sopenharmony_ci		.dvi_settings = 0x202d,
36862306a36Sopenharmony_ci		.video_mode = 0x4040,
36962306a36Sopenharmony_ci		.video_mode_adv = 0x19,
37062306a36Sopenharmony_ci		.video_prog_mode = 0x100,
37162306a36Sopenharmony_ci		.video_prog_mode_present = true,
37262306a36Sopenharmony_ci		.video_sync_mode = 0x407,
37362306a36Sopenharmony_ci		.video_sync_mode_present = true,
37462306a36Sopenharmony_ci		.video_yc_dly = 0,
37562306a36Sopenharmony_ci		.video_yc_dly_present = true,
37662306a36Sopenharmony_ci		/* video_rgb_ctrl */
37762306a36Sopenharmony_ci		/* video_filt_ctrl */
37862306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
37962306a36Sopenharmony_ci		.yfp1_htime = 648,
38062306a36Sopenharmony_ci		.yfp2_htime = 3207,
38162306a36Sopenharmony_ci		.max_pxcnt = 3959,
38262306a36Sopenharmony_ci		.hspuls_begin = 80,
38362306a36Sopenharmony_ci		.hspuls_end = 240,
38462306a36Sopenharmony_ci		.hspuls_switch = 80,
38562306a36Sopenharmony_ci		.vspuls_begin = 688,
38662306a36Sopenharmony_ci		.vspuls_end = 3248,
38762306a36Sopenharmony_ci		.vspuls_bline = 4,
38862306a36Sopenharmony_ci		.vspuls_eline = 8,
38962306a36Sopenharmony_ci		.havon_begin = 648,
39062306a36Sopenharmony_ci		.havon_end = 3207,
39162306a36Sopenharmony_ci		.vavon_bline = 29,
39262306a36Sopenharmony_ci		.vavon_eline = 748,
39362306a36Sopenharmony_ci		/* eqpuls_begin */
39462306a36Sopenharmony_ci		/* eqpuls_end */
39562306a36Sopenharmony_ci		/* eqpuls_bline */
39662306a36Sopenharmony_ci		/* eqpuls_eline */
39762306a36Sopenharmony_ci		.hso_begin = 128,
39862306a36Sopenharmony_ci		.hso_end = 208,
39962306a36Sopenharmony_ci		.vso_begin = 128,
40062306a36Sopenharmony_ci		.vso_end = 128,
40162306a36Sopenharmony_ci		.vso_bline = 0,
40262306a36Sopenharmony_ci		.vso_eline = 5,
40362306a36Sopenharmony_ci		.vso_eline_present = true,
40462306a36Sopenharmony_ci		/* sy_val */
40562306a36Sopenharmony_ci		/* sy2_val */
40662306a36Sopenharmony_ci		.max_lncnt = 749,
40762306a36Sopenharmony_ci	},
40862306a36Sopenharmony_ci};
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_1080i60 = {
41162306a36Sopenharmony_ci	.encp = {
41262306a36Sopenharmony_ci		.dvi_settings = 0x2029,
41362306a36Sopenharmony_ci		.video_mode = 0x5ffc,
41462306a36Sopenharmony_ci		.video_mode_adv = 0x19,
41562306a36Sopenharmony_ci		.video_prog_mode = 0x100,
41662306a36Sopenharmony_ci		.video_prog_mode_present = true,
41762306a36Sopenharmony_ci		.video_sync_mode = 0x207,
41862306a36Sopenharmony_ci		.video_sync_mode_present = true,
41962306a36Sopenharmony_ci		/* video_yc_dly */
42062306a36Sopenharmony_ci		/* video_rgb_ctrl */
42162306a36Sopenharmony_ci		/* video_filt_ctrl */
42262306a36Sopenharmony_ci		.video_ofld_voav_ofst = 0x11,
42362306a36Sopenharmony_ci		.video_ofld_voav_ofst_present = true,
42462306a36Sopenharmony_ci		.yfp1_htime = 516,
42562306a36Sopenharmony_ci		.yfp2_htime = 4355,
42662306a36Sopenharmony_ci		.max_pxcnt = 4399,
42762306a36Sopenharmony_ci		.hspuls_begin = 88,
42862306a36Sopenharmony_ci		.hspuls_end = 264,
42962306a36Sopenharmony_ci		.hspuls_switch = 88,
43062306a36Sopenharmony_ci		.vspuls_begin = 440,
43162306a36Sopenharmony_ci		.vspuls_end = 2200,
43262306a36Sopenharmony_ci		.vspuls_bline = 0,
43362306a36Sopenharmony_ci		.vspuls_eline = 4,
43462306a36Sopenharmony_ci		.havon_begin = 516,
43562306a36Sopenharmony_ci		.havon_end = 4355,
43662306a36Sopenharmony_ci		.vavon_bline = 20,
43762306a36Sopenharmony_ci		.vavon_eline = 559,
43862306a36Sopenharmony_ci		.eqpuls_begin = 2288,
43962306a36Sopenharmony_ci		.eqpuls_begin_present = true,
44062306a36Sopenharmony_ci		.eqpuls_end = 2464,
44162306a36Sopenharmony_ci		.eqpuls_end_present = true,
44262306a36Sopenharmony_ci		.eqpuls_bline = 0,
44362306a36Sopenharmony_ci		.eqpuls_bline_present = true,
44462306a36Sopenharmony_ci		.eqpuls_eline = 4,
44562306a36Sopenharmony_ci		.eqpuls_eline_present = true,
44662306a36Sopenharmony_ci		.hso_begin = 264,
44762306a36Sopenharmony_ci		.hso_end = 176,
44862306a36Sopenharmony_ci		.vso_begin = 88,
44962306a36Sopenharmony_ci		.vso_end = 88,
45062306a36Sopenharmony_ci		.vso_bline = 0,
45162306a36Sopenharmony_ci		.vso_eline = 5,
45262306a36Sopenharmony_ci		.vso_eline_present = true,
45362306a36Sopenharmony_ci		/* sy_val */
45462306a36Sopenharmony_ci		/* sy2_val */
45562306a36Sopenharmony_ci		.max_lncnt = 1124,
45662306a36Sopenharmony_ci	},
45762306a36Sopenharmony_ci};
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_1080i50 = {
46062306a36Sopenharmony_ci	.encp = {
46162306a36Sopenharmony_ci		.dvi_settings = 0x202d,
46262306a36Sopenharmony_ci		.video_mode = 0x5ffc,
46362306a36Sopenharmony_ci		.video_mode_adv = 0x19,
46462306a36Sopenharmony_ci		.video_prog_mode = 0x100,
46562306a36Sopenharmony_ci		.video_prog_mode_present = true,
46662306a36Sopenharmony_ci		.video_sync_mode = 0x7,
46762306a36Sopenharmony_ci		.video_sync_mode_present = true,
46862306a36Sopenharmony_ci		/* video_yc_dly */
46962306a36Sopenharmony_ci		/* video_rgb_ctrl */
47062306a36Sopenharmony_ci		/* video_filt_ctrl */
47162306a36Sopenharmony_ci		.video_ofld_voav_ofst = 0x11,
47262306a36Sopenharmony_ci		.video_ofld_voav_ofst_present = true,
47362306a36Sopenharmony_ci		.yfp1_htime = 526,
47462306a36Sopenharmony_ci		.yfp2_htime = 4365,
47562306a36Sopenharmony_ci		.max_pxcnt = 5279,
47662306a36Sopenharmony_ci		.hspuls_begin = 88,
47762306a36Sopenharmony_ci		.hspuls_end = 264,
47862306a36Sopenharmony_ci		.hspuls_switch = 88,
47962306a36Sopenharmony_ci		.vspuls_begin = 440,
48062306a36Sopenharmony_ci		.vspuls_end = 2200,
48162306a36Sopenharmony_ci		.vspuls_bline = 0,
48262306a36Sopenharmony_ci		.vspuls_eline = 4,
48362306a36Sopenharmony_ci		.havon_begin = 526,
48462306a36Sopenharmony_ci		.havon_end = 4365,
48562306a36Sopenharmony_ci		.vavon_bline = 20,
48662306a36Sopenharmony_ci		.vavon_eline = 559,
48762306a36Sopenharmony_ci		.eqpuls_begin = 2288,
48862306a36Sopenharmony_ci		.eqpuls_begin_present = true,
48962306a36Sopenharmony_ci		.eqpuls_end = 2464,
49062306a36Sopenharmony_ci		.eqpuls_end_present = true,
49162306a36Sopenharmony_ci		.eqpuls_bline = 0,
49262306a36Sopenharmony_ci		.eqpuls_bline_present = true,
49362306a36Sopenharmony_ci		.eqpuls_eline = 4,
49462306a36Sopenharmony_ci		.eqpuls_eline_present = true,
49562306a36Sopenharmony_ci		.hso_begin = 142,
49662306a36Sopenharmony_ci		.hso_end = 230,
49762306a36Sopenharmony_ci		.vso_begin = 142,
49862306a36Sopenharmony_ci		.vso_end = 142,
49962306a36Sopenharmony_ci		.vso_bline = 0,
50062306a36Sopenharmony_ci		.vso_eline = 5,
50162306a36Sopenharmony_ci		.vso_eline_present = true,
50262306a36Sopenharmony_ci		/* sy_val */
50362306a36Sopenharmony_ci		/* sy2_val */
50462306a36Sopenharmony_ci		.max_lncnt = 1124,
50562306a36Sopenharmony_ci	},
50662306a36Sopenharmony_ci};
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_1080p24 = {
50962306a36Sopenharmony_ci	.encp = {
51062306a36Sopenharmony_ci		.dvi_settings = 0xd,
51162306a36Sopenharmony_ci		.video_mode = 0x4040,
51262306a36Sopenharmony_ci		.video_mode_adv = 0x18,
51362306a36Sopenharmony_ci		.video_prog_mode = 0x100,
51462306a36Sopenharmony_ci		.video_prog_mode_present = true,
51562306a36Sopenharmony_ci		.video_sync_mode = 0x7,
51662306a36Sopenharmony_ci		.video_sync_mode_present = true,
51762306a36Sopenharmony_ci		.video_yc_dly = 0,
51862306a36Sopenharmony_ci		.video_yc_dly_present = true,
51962306a36Sopenharmony_ci		.video_rgb_ctrl = 2,
52062306a36Sopenharmony_ci		.video_rgb_ctrl_present = true,
52162306a36Sopenharmony_ci		.video_filt_ctrl = 0x1052,
52262306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
52362306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
52462306a36Sopenharmony_ci		.yfp1_htime = 271,
52562306a36Sopenharmony_ci		.yfp2_htime = 2190,
52662306a36Sopenharmony_ci		.max_pxcnt = 2749,
52762306a36Sopenharmony_ci		.hspuls_begin = 44,
52862306a36Sopenharmony_ci		.hspuls_end = 132,
52962306a36Sopenharmony_ci		.hspuls_switch = 44,
53062306a36Sopenharmony_ci		.vspuls_begin = 220,
53162306a36Sopenharmony_ci		.vspuls_end = 2140,
53262306a36Sopenharmony_ci		.vspuls_bline = 0,
53362306a36Sopenharmony_ci		.vspuls_eline = 4,
53462306a36Sopenharmony_ci		.havon_begin = 271,
53562306a36Sopenharmony_ci		.havon_end = 2190,
53662306a36Sopenharmony_ci		.vavon_bline = 41,
53762306a36Sopenharmony_ci		.vavon_eline = 1120,
53862306a36Sopenharmony_ci		/* eqpuls_begin */
53962306a36Sopenharmony_ci		/* eqpuls_end */
54062306a36Sopenharmony_ci		.eqpuls_bline = 0,
54162306a36Sopenharmony_ci		.eqpuls_bline_present = true,
54262306a36Sopenharmony_ci		.eqpuls_eline = 4,
54362306a36Sopenharmony_ci		.eqpuls_eline_present = true,
54462306a36Sopenharmony_ci		.hso_begin = 79,
54562306a36Sopenharmony_ci		.hso_end = 123,
54662306a36Sopenharmony_ci		.vso_begin = 79,
54762306a36Sopenharmony_ci		.vso_end = 79,
54862306a36Sopenharmony_ci		.vso_bline = 0,
54962306a36Sopenharmony_ci		.vso_eline = 5,
55062306a36Sopenharmony_ci		.vso_eline_present = true,
55162306a36Sopenharmony_ci		/* sy_val */
55262306a36Sopenharmony_ci		/* sy2_val */
55362306a36Sopenharmony_ci		.max_lncnt = 1124,
55462306a36Sopenharmony_ci	},
55562306a36Sopenharmony_ci};
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_1080p30 = {
55862306a36Sopenharmony_ci	.encp = {
55962306a36Sopenharmony_ci		.dvi_settings = 0x1,
56062306a36Sopenharmony_ci		.video_mode = 0x4040,
56162306a36Sopenharmony_ci		.video_mode_adv = 0x18,
56262306a36Sopenharmony_ci		.video_prog_mode = 0x100,
56362306a36Sopenharmony_ci		.video_prog_mode_present = true,
56462306a36Sopenharmony_ci		/* video_sync_mode */
56562306a36Sopenharmony_ci		/* video_yc_dly */
56662306a36Sopenharmony_ci		/* video_rgb_ctrl */
56762306a36Sopenharmony_ci		.video_filt_ctrl = 0x1052,
56862306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
56962306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
57062306a36Sopenharmony_ci		.yfp1_htime = 140,
57162306a36Sopenharmony_ci		.yfp2_htime = 2060,
57262306a36Sopenharmony_ci		.max_pxcnt = 2199,
57362306a36Sopenharmony_ci		.hspuls_begin = 2156,
57462306a36Sopenharmony_ci		.hspuls_end = 44,
57562306a36Sopenharmony_ci		.hspuls_switch = 44,
57662306a36Sopenharmony_ci		.vspuls_begin = 140,
57762306a36Sopenharmony_ci		.vspuls_end = 2059,
57862306a36Sopenharmony_ci		.vspuls_bline = 0,
57962306a36Sopenharmony_ci		.vspuls_eline = 4,
58062306a36Sopenharmony_ci		.havon_begin = 148,
58162306a36Sopenharmony_ci		.havon_end = 2067,
58262306a36Sopenharmony_ci		.vavon_bline = 41,
58362306a36Sopenharmony_ci		.vavon_eline = 1120,
58462306a36Sopenharmony_ci		/* eqpuls_begin */
58562306a36Sopenharmony_ci		/* eqpuls_end */
58662306a36Sopenharmony_ci		/* eqpuls_bline */
58762306a36Sopenharmony_ci		/* eqpuls_eline */
58862306a36Sopenharmony_ci		.hso_begin = 44,
58962306a36Sopenharmony_ci		.hso_end = 2156,
59062306a36Sopenharmony_ci		.vso_begin = 2100,
59162306a36Sopenharmony_ci		.vso_end = 2164,
59262306a36Sopenharmony_ci		.vso_bline = 0,
59362306a36Sopenharmony_ci		.vso_eline = 5,
59462306a36Sopenharmony_ci		.vso_eline_present = true,
59562306a36Sopenharmony_ci		/* sy_val */
59662306a36Sopenharmony_ci		/* sy2_val */
59762306a36Sopenharmony_ci		.max_lncnt = 1124,
59862306a36Sopenharmony_ci	},
59962306a36Sopenharmony_ci};
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_1080p50 = {
60262306a36Sopenharmony_ci	.encp = {
60362306a36Sopenharmony_ci		.dvi_settings = 0xd,
60462306a36Sopenharmony_ci		.video_mode = 0x4040,
60562306a36Sopenharmony_ci		.video_mode_adv = 0x18,
60662306a36Sopenharmony_ci		.video_prog_mode = 0x100,
60762306a36Sopenharmony_ci		.video_prog_mode_present = true,
60862306a36Sopenharmony_ci		.video_sync_mode = 0x7,
60962306a36Sopenharmony_ci		.video_sync_mode_present = true,
61062306a36Sopenharmony_ci		.video_yc_dly = 0,
61162306a36Sopenharmony_ci		.video_yc_dly_present = true,
61262306a36Sopenharmony_ci		.video_rgb_ctrl = 2,
61362306a36Sopenharmony_ci		.video_rgb_ctrl_present = true,
61462306a36Sopenharmony_ci		/* video_filt_ctrl */
61562306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
61662306a36Sopenharmony_ci		.yfp1_htime = 271,
61762306a36Sopenharmony_ci		.yfp2_htime = 2190,
61862306a36Sopenharmony_ci		.max_pxcnt = 2639,
61962306a36Sopenharmony_ci		.hspuls_begin = 44,
62062306a36Sopenharmony_ci		.hspuls_end = 132,
62162306a36Sopenharmony_ci		.hspuls_switch = 44,
62262306a36Sopenharmony_ci		.vspuls_begin = 220,
62362306a36Sopenharmony_ci		.vspuls_end = 2140,
62462306a36Sopenharmony_ci		.vspuls_bline = 0,
62562306a36Sopenharmony_ci		.vspuls_eline = 4,
62662306a36Sopenharmony_ci		.havon_begin = 271,
62762306a36Sopenharmony_ci		.havon_end = 2190,
62862306a36Sopenharmony_ci		.vavon_bline = 41,
62962306a36Sopenharmony_ci		.vavon_eline = 1120,
63062306a36Sopenharmony_ci		/* eqpuls_begin */
63162306a36Sopenharmony_ci		/* eqpuls_end */
63262306a36Sopenharmony_ci		.eqpuls_bline = 0,
63362306a36Sopenharmony_ci		.eqpuls_bline_present = true,
63462306a36Sopenharmony_ci		.eqpuls_eline = 4,
63562306a36Sopenharmony_ci		.eqpuls_eline_present = true,
63662306a36Sopenharmony_ci		.hso_begin = 79,
63762306a36Sopenharmony_ci		.hso_end = 123,
63862306a36Sopenharmony_ci		.vso_begin = 79,
63962306a36Sopenharmony_ci		.vso_end = 79,
64062306a36Sopenharmony_ci		.vso_bline = 0,
64162306a36Sopenharmony_ci		.vso_eline = 5,
64262306a36Sopenharmony_ci		.vso_eline_present = true,
64362306a36Sopenharmony_ci		/* sy_val */
64462306a36Sopenharmony_ci		/* sy2_val */
64562306a36Sopenharmony_ci		.max_lncnt = 1124,
64662306a36Sopenharmony_ci	},
64762306a36Sopenharmony_ci};
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_1080p60 = {
65062306a36Sopenharmony_ci	.encp = {
65162306a36Sopenharmony_ci		.dvi_settings = 0x1,
65262306a36Sopenharmony_ci		.video_mode = 0x4040,
65362306a36Sopenharmony_ci		.video_mode_adv = 0x18,
65462306a36Sopenharmony_ci		.video_prog_mode = 0x100,
65562306a36Sopenharmony_ci		.video_prog_mode_present = true,
65662306a36Sopenharmony_ci		/* video_sync_mode */
65762306a36Sopenharmony_ci		/* video_yc_dly */
65862306a36Sopenharmony_ci		/* video_rgb_ctrl */
65962306a36Sopenharmony_ci		.video_filt_ctrl = 0x1052,
66062306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
66162306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
66262306a36Sopenharmony_ci		.yfp1_htime = 140,
66362306a36Sopenharmony_ci		.yfp2_htime = 2060,
66462306a36Sopenharmony_ci		.max_pxcnt = 2199,
66562306a36Sopenharmony_ci		.hspuls_begin = 2156,
66662306a36Sopenharmony_ci		.hspuls_end = 44,
66762306a36Sopenharmony_ci		.hspuls_switch = 44,
66862306a36Sopenharmony_ci		.vspuls_begin = 140,
66962306a36Sopenharmony_ci		.vspuls_end = 2059,
67062306a36Sopenharmony_ci		.vspuls_bline = 0,
67162306a36Sopenharmony_ci		.vspuls_eline = 4,
67262306a36Sopenharmony_ci		.havon_begin = 148,
67362306a36Sopenharmony_ci		.havon_end = 2067,
67462306a36Sopenharmony_ci		.vavon_bline = 41,
67562306a36Sopenharmony_ci		.vavon_eline = 1120,
67662306a36Sopenharmony_ci		/* eqpuls_begin */
67762306a36Sopenharmony_ci		/* eqpuls_end */
67862306a36Sopenharmony_ci		/* eqpuls_bline */
67962306a36Sopenharmony_ci		/* eqpuls_eline */
68062306a36Sopenharmony_ci		.hso_begin = 44,
68162306a36Sopenharmony_ci		.hso_end = 2156,
68262306a36Sopenharmony_ci		.vso_begin = 2100,
68362306a36Sopenharmony_ci		.vso_end = 2164,
68462306a36Sopenharmony_ci		.vso_bline = 0,
68562306a36Sopenharmony_ci		.vso_eline = 5,
68662306a36Sopenharmony_ci		.vso_eline_present = true,
68762306a36Sopenharmony_ci		/* sy_val */
68862306a36Sopenharmony_ci		/* sy2_val */
68962306a36Sopenharmony_ci		.max_lncnt = 1124,
69062306a36Sopenharmony_ci	},
69162306a36Sopenharmony_ci};
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_2160p24 = {
69462306a36Sopenharmony_ci	.encp = {
69562306a36Sopenharmony_ci		.dvi_settings = 0x1,
69662306a36Sopenharmony_ci		.video_mode = 0x4040,
69762306a36Sopenharmony_ci		.video_mode_adv = 0x8,
69862306a36Sopenharmony_ci		/* video_sync_mode */
69962306a36Sopenharmony_ci		/* video_yc_dly */
70062306a36Sopenharmony_ci		/* video_rgb_ctrl */
70162306a36Sopenharmony_ci		.video_filt_ctrl = 0x1000,
70262306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
70362306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
70462306a36Sopenharmony_ci		.yfp1_htime = 140,
70562306a36Sopenharmony_ci		.yfp2_htime = 140+3840,
70662306a36Sopenharmony_ci		.max_pxcnt = 3840+1660-1,
70762306a36Sopenharmony_ci		.hspuls_begin = 2156+1920,
70862306a36Sopenharmony_ci		.hspuls_end = 44,
70962306a36Sopenharmony_ci		.hspuls_switch = 44,
71062306a36Sopenharmony_ci		.vspuls_begin = 140,
71162306a36Sopenharmony_ci		.vspuls_end = 2059+1920,
71262306a36Sopenharmony_ci		.vspuls_bline = 0,
71362306a36Sopenharmony_ci		.vspuls_eline = 4,
71462306a36Sopenharmony_ci		.havon_begin = 148,
71562306a36Sopenharmony_ci		.havon_end = 3987,
71662306a36Sopenharmony_ci		.vavon_bline = 89,
71762306a36Sopenharmony_ci		.vavon_eline = 2248,
71862306a36Sopenharmony_ci		/* eqpuls_begin */
71962306a36Sopenharmony_ci		/* eqpuls_end */
72062306a36Sopenharmony_ci		/* eqpuls_bline */
72162306a36Sopenharmony_ci		/* eqpuls_eline */
72262306a36Sopenharmony_ci		.hso_begin = 44,
72362306a36Sopenharmony_ci		.hso_end = 2156+1920,
72462306a36Sopenharmony_ci		.vso_begin = 2100+1920,
72562306a36Sopenharmony_ci		.vso_end = 2164+1920,
72662306a36Sopenharmony_ci		.vso_bline = 51,
72762306a36Sopenharmony_ci		.vso_eline = 53,
72862306a36Sopenharmony_ci		.vso_eline_present = true,
72962306a36Sopenharmony_ci		/* sy_val */
73062306a36Sopenharmony_ci		/* sy2_val */
73162306a36Sopenharmony_ci		.max_lncnt = 2249,
73262306a36Sopenharmony_ci	},
73362306a36Sopenharmony_ci};
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_2160p25 = {
73662306a36Sopenharmony_ci	.encp = {
73762306a36Sopenharmony_ci		.dvi_settings = 0x1,
73862306a36Sopenharmony_ci		.video_mode = 0x4040,
73962306a36Sopenharmony_ci		.video_mode_adv = 0x8,
74062306a36Sopenharmony_ci		/* video_sync_mode */
74162306a36Sopenharmony_ci		/* video_yc_dly */
74262306a36Sopenharmony_ci		/* video_rgb_ctrl */
74362306a36Sopenharmony_ci		.video_filt_ctrl = 0x1000,
74462306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
74562306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
74662306a36Sopenharmony_ci		.yfp1_htime = 140,
74762306a36Sopenharmony_ci		.yfp2_htime = 140+3840,
74862306a36Sopenharmony_ci		.max_pxcnt = 3840+1440-1,
74962306a36Sopenharmony_ci		.hspuls_begin = 2156+1920,
75062306a36Sopenharmony_ci		.hspuls_end = 44,
75162306a36Sopenharmony_ci		.hspuls_switch = 44,
75262306a36Sopenharmony_ci		.vspuls_begin = 140,
75362306a36Sopenharmony_ci		.vspuls_end = 2059+1920,
75462306a36Sopenharmony_ci		.vspuls_bline = 0,
75562306a36Sopenharmony_ci		.vspuls_eline = 4,
75662306a36Sopenharmony_ci		.havon_begin = 148,
75762306a36Sopenharmony_ci		.havon_end = 3987,
75862306a36Sopenharmony_ci		.vavon_bline = 89,
75962306a36Sopenharmony_ci		.vavon_eline = 2248,
76062306a36Sopenharmony_ci		/* eqpuls_begin */
76162306a36Sopenharmony_ci		/* eqpuls_end */
76262306a36Sopenharmony_ci		/* eqpuls_bline */
76362306a36Sopenharmony_ci		/* eqpuls_eline */
76462306a36Sopenharmony_ci		.hso_begin = 44,
76562306a36Sopenharmony_ci		.hso_end = 2156+1920,
76662306a36Sopenharmony_ci		.vso_begin = 2100+1920,
76762306a36Sopenharmony_ci		.vso_end = 2164+1920,
76862306a36Sopenharmony_ci		.vso_bline = 51,
76962306a36Sopenharmony_ci		.vso_eline = 53,
77062306a36Sopenharmony_ci		.vso_eline_present = true,
77162306a36Sopenharmony_ci		/* sy_val */
77262306a36Sopenharmony_ci		/* sy2_val */
77362306a36Sopenharmony_ci		.max_lncnt = 2249,
77462306a36Sopenharmony_ci	},
77562306a36Sopenharmony_ci};
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_cistatic union meson_hdmi_venc_mode meson_hdmi_encp_mode_2160p30 = {
77862306a36Sopenharmony_ci	.encp = {
77962306a36Sopenharmony_ci		.dvi_settings = 0x1,
78062306a36Sopenharmony_ci		.video_mode = 0x4040,
78162306a36Sopenharmony_ci		.video_mode_adv = 0x8,
78262306a36Sopenharmony_ci		/* video_sync_mode */
78362306a36Sopenharmony_ci		/* video_yc_dly */
78462306a36Sopenharmony_ci		/* video_rgb_ctrl */
78562306a36Sopenharmony_ci		.video_filt_ctrl = 0x1000,
78662306a36Sopenharmony_ci		.video_filt_ctrl_present = true,
78762306a36Sopenharmony_ci		/* video_ofld_voav_ofst */
78862306a36Sopenharmony_ci		.yfp1_htime = 140,
78962306a36Sopenharmony_ci		.yfp2_htime = 140+3840,
79062306a36Sopenharmony_ci		.max_pxcnt = 3840+560-1,
79162306a36Sopenharmony_ci		.hspuls_begin = 2156+1920,
79262306a36Sopenharmony_ci		.hspuls_end = 44,
79362306a36Sopenharmony_ci		.hspuls_switch = 44,
79462306a36Sopenharmony_ci		.vspuls_begin = 140,
79562306a36Sopenharmony_ci		.vspuls_end = 2059+1920,
79662306a36Sopenharmony_ci		.vspuls_bline = 0,
79762306a36Sopenharmony_ci		.vspuls_eline = 4,
79862306a36Sopenharmony_ci		.havon_begin = 148,
79962306a36Sopenharmony_ci		.havon_end = 3987,
80062306a36Sopenharmony_ci		.vavon_bline = 89,
80162306a36Sopenharmony_ci		.vavon_eline = 2248,
80262306a36Sopenharmony_ci		/* eqpuls_begin */
80362306a36Sopenharmony_ci		/* eqpuls_end */
80462306a36Sopenharmony_ci		/* eqpuls_bline */
80562306a36Sopenharmony_ci		/* eqpuls_eline */
80662306a36Sopenharmony_ci		.hso_begin = 44,
80762306a36Sopenharmony_ci		.hso_end = 2156+1920,
80862306a36Sopenharmony_ci		.vso_begin = 2100+1920,
80962306a36Sopenharmony_ci		.vso_end = 2164+1920,
81062306a36Sopenharmony_ci		.vso_bline = 51,
81162306a36Sopenharmony_ci		.vso_eline = 53,
81262306a36Sopenharmony_ci		.vso_eline_present = true,
81362306a36Sopenharmony_ci		/* sy_val */
81462306a36Sopenharmony_ci		/* sy2_val */
81562306a36Sopenharmony_ci		.max_lncnt = 2249,
81662306a36Sopenharmony_ci	},
81762306a36Sopenharmony_ci};
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_cistatic struct meson_hdmi_venc_vic_mode {
82062306a36Sopenharmony_ci	unsigned int vic;
82162306a36Sopenharmony_ci	union meson_hdmi_venc_mode *mode;
82262306a36Sopenharmony_ci} meson_hdmi_venc_vic_modes[] = {
82362306a36Sopenharmony_ci	{ 6, &meson_hdmi_enci_mode_480i },
82462306a36Sopenharmony_ci	{ 7, &meson_hdmi_enci_mode_480i },
82562306a36Sopenharmony_ci	{ 21, &meson_hdmi_enci_mode_576i },
82662306a36Sopenharmony_ci	{ 22, &meson_hdmi_enci_mode_576i },
82762306a36Sopenharmony_ci	{ 2, &meson_hdmi_encp_mode_480p },
82862306a36Sopenharmony_ci	{ 3, &meson_hdmi_encp_mode_480p },
82962306a36Sopenharmony_ci	{ 17, &meson_hdmi_encp_mode_576p },
83062306a36Sopenharmony_ci	{ 18, &meson_hdmi_encp_mode_576p },
83162306a36Sopenharmony_ci	{ 4, &meson_hdmi_encp_mode_720p60 },
83262306a36Sopenharmony_ci	{ 19, &meson_hdmi_encp_mode_720p50 },
83362306a36Sopenharmony_ci	{ 5, &meson_hdmi_encp_mode_1080i60 },
83462306a36Sopenharmony_ci	{ 20, &meson_hdmi_encp_mode_1080i50 },
83562306a36Sopenharmony_ci	{ 32, &meson_hdmi_encp_mode_1080p24 },
83662306a36Sopenharmony_ci	{ 33, &meson_hdmi_encp_mode_1080p50 },
83762306a36Sopenharmony_ci	{ 34, &meson_hdmi_encp_mode_1080p30 },
83862306a36Sopenharmony_ci	{ 31, &meson_hdmi_encp_mode_1080p50 },
83962306a36Sopenharmony_ci	{ 16, &meson_hdmi_encp_mode_1080p60 },
84062306a36Sopenharmony_ci	{ 93, &meson_hdmi_encp_mode_2160p24 },
84162306a36Sopenharmony_ci	{ 94, &meson_hdmi_encp_mode_2160p25 },
84262306a36Sopenharmony_ci	{ 95, &meson_hdmi_encp_mode_2160p30 },
84362306a36Sopenharmony_ci	{ 96, &meson_hdmi_encp_mode_2160p25 },
84462306a36Sopenharmony_ci	{ 97, &meson_hdmi_encp_mode_2160p30 },
84562306a36Sopenharmony_ci	{ 0, NULL}, /* sentinel */
84662306a36Sopenharmony_ci};
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_cistatic signed int to_signed(unsigned int a)
84962306a36Sopenharmony_ci{
85062306a36Sopenharmony_ci	if (a <= 7)
85162306a36Sopenharmony_ci		return a;
85262306a36Sopenharmony_ci	else
85362306a36Sopenharmony_ci		return a - 16;
85462306a36Sopenharmony_ci}
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_cistatic unsigned long modulo(unsigned long a, unsigned long b)
85762306a36Sopenharmony_ci{
85862306a36Sopenharmony_ci	if (a >= b)
85962306a36Sopenharmony_ci		return a - b;
86062306a36Sopenharmony_ci	else
86162306a36Sopenharmony_ci		return a;
86262306a36Sopenharmony_ci}
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_cienum drm_mode_status
86562306a36Sopenharmony_cimeson_venc_hdmi_supported_mode(const struct drm_display_mode *mode)
86662306a36Sopenharmony_ci{
86762306a36Sopenharmony_ci	if (mode->flags & ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC |
86862306a36Sopenharmony_ci			    DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC))
86962306a36Sopenharmony_ci		return MODE_BAD;
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_ci	if (mode->hdisplay < 400 || mode->hdisplay > 1920)
87262306a36Sopenharmony_ci		return MODE_BAD_HVALUE;
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci	if (mode->vdisplay < 480 || mode->vdisplay > 1920)
87562306a36Sopenharmony_ci		return MODE_BAD_VVALUE;
87662306a36Sopenharmony_ci
87762306a36Sopenharmony_ci	return MODE_OK;
87862306a36Sopenharmony_ci}
87962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(meson_venc_hdmi_supported_mode);
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_cibool meson_venc_hdmi_supported_vic(int vic)
88262306a36Sopenharmony_ci{
88362306a36Sopenharmony_ci	struct meson_hdmi_venc_vic_mode *vmode = meson_hdmi_venc_vic_modes;
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci	while (vmode->vic && vmode->mode) {
88662306a36Sopenharmony_ci		if (vmode->vic == vic)
88762306a36Sopenharmony_ci			return true;
88862306a36Sopenharmony_ci		vmode++;
88962306a36Sopenharmony_ci	}
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_ci	return false;
89262306a36Sopenharmony_ci}
89362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(meson_venc_hdmi_supported_vic);
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_cistatic void meson_venc_hdmi_get_dmt_vmode(const struct drm_display_mode *mode,
89662306a36Sopenharmony_ci					  union meson_hdmi_venc_mode *dmt_mode)
89762306a36Sopenharmony_ci{
89862306a36Sopenharmony_ci	memset(dmt_mode, 0, sizeof(*dmt_mode));
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_ci	dmt_mode->encp.dvi_settings = 0x21;
90162306a36Sopenharmony_ci	dmt_mode->encp.video_mode = 0x4040;
90262306a36Sopenharmony_ci	dmt_mode->encp.video_mode_adv = 0x18;
90362306a36Sopenharmony_ci	dmt_mode->encp.max_pxcnt = mode->htotal - 1;
90462306a36Sopenharmony_ci	dmt_mode->encp.havon_begin = mode->htotal - mode->hsync_start;
90562306a36Sopenharmony_ci	dmt_mode->encp.havon_end = dmt_mode->encp.havon_begin +
90662306a36Sopenharmony_ci				   mode->hdisplay - 1;
90762306a36Sopenharmony_ci	dmt_mode->encp.vavon_bline = mode->vtotal - mode->vsync_start;
90862306a36Sopenharmony_ci	dmt_mode->encp.vavon_eline = dmt_mode->encp.vavon_bline +
90962306a36Sopenharmony_ci				     mode->vdisplay - 1;
91062306a36Sopenharmony_ci	dmt_mode->encp.hso_begin = 0;
91162306a36Sopenharmony_ci	dmt_mode->encp.hso_end = mode->hsync_end - mode->hsync_start;
91262306a36Sopenharmony_ci	dmt_mode->encp.vso_begin = 30;
91362306a36Sopenharmony_ci	dmt_mode->encp.vso_end = 50;
91462306a36Sopenharmony_ci	dmt_mode->encp.vso_bline = 0;
91562306a36Sopenharmony_ci	dmt_mode->encp.vso_eline = mode->vsync_end - mode->vsync_start;
91662306a36Sopenharmony_ci	dmt_mode->encp.vso_eline_present = true;
91762306a36Sopenharmony_ci	dmt_mode->encp.max_lncnt = mode->vtotal - 1;
91862306a36Sopenharmony_ci}
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_cistatic union meson_hdmi_venc_mode *meson_venc_hdmi_get_vic_vmode(int vic)
92162306a36Sopenharmony_ci{
92262306a36Sopenharmony_ci	struct meson_hdmi_venc_vic_mode *vmode = meson_hdmi_venc_vic_modes;
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_ci	while (vmode->vic && vmode->mode) {
92562306a36Sopenharmony_ci		if (vmode->vic == vic)
92662306a36Sopenharmony_ci			return vmode->mode;
92762306a36Sopenharmony_ci		vmode++;
92862306a36Sopenharmony_ci	}
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_ci	return NULL;
93162306a36Sopenharmony_ci}
93262306a36Sopenharmony_ci
93362306a36Sopenharmony_cibool meson_venc_hdmi_venc_repeat(int vic)
93462306a36Sopenharmony_ci{
93562306a36Sopenharmony_ci	/* Repeat VENC pixels for 480/576i/p, 720p50/60 and 1080p50/60 */
93662306a36Sopenharmony_ci	if (vic == 6 || vic == 7 || /* 480i */
93762306a36Sopenharmony_ci	    vic == 21 || vic == 22 || /* 576i */
93862306a36Sopenharmony_ci	    vic == 17 || vic == 18 || /* 576p */
93962306a36Sopenharmony_ci	    vic == 2 || vic == 3 || /* 480p */
94062306a36Sopenharmony_ci	    vic == 4 || /* 720p60 */
94162306a36Sopenharmony_ci	    vic == 19 || /* 720p50 */
94262306a36Sopenharmony_ci	    vic == 5 || /* 1080i60 */
94362306a36Sopenharmony_ci	    vic == 20)	/* 1080i50 */
94462306a36Sopenharmony_ci		return true;
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_ci	return false;
94762306a36Sopenharmony_ci}
94862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(meson_venc_hdmi_venc_repeat);
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_civoid meson_venc_hdmi_mode_set(struct meson_drm *priv, int vic,
95162306a36Sopenharmony_ci			      unsigned int ycrcb_map,
95262306a36Sopenharmony_ci			      bool yuv420_mode,
95362306a36Sopenharmony_ci			      const struct drm_display_mode *mode)
95462306a36Sopenharmony_ci{
95562306a36Sopenharmony_ci	union meson_hdmi_venc_mode *vmode = NULL;
95662306a36Sopenharmony_ci	union meson_hdmi_venc_mode vmode_dmt;
95762306a36Sopenharmony_ci	bool use_enci = false;
95862306a36Sopenharmony_ci	bool venc_repeat = false;
95962306a36Sopenharmony_ci	bool hdmi_repeat = false;
96062306a36Sopenharmony_ci	unsigned int venc_hdmi_latency = 2;
96162306a36Sopenharmony_ci	unsigned long total_pixels_venc = 0;
96262306a36Sopenharmony_ci	unsigned long active_pixels_venc = 0;
96362306a36Sopenharmony_ci	unsigned long front_porch_venc = 0;
96462306a36Sopenharmony_ci	unsigned long hsync_pixels_venc = 0;
96562306a36Sopenharmony_ci	unsigned long de_h_begin = 0;
96662306a36Sopenharmony_ci	unsigned long de_h_end = 0;
96762306a36Sopenharmony_ci	unsigned long de_v_begin_even = 0;
96862306a36Sopenharmony_ci	unsigned long de_v_end_even = 0;
96962306a36Sopenharmony_ci	unsigned long de_v_begin_odd = 0;
97062306a36Sopenharmony_ci	unsigned long de_v_end_odd = 0;
97162306a36Sopenharmony_ci	unsigned long hs_begin = 0;
97262306a36Sopenharmony_ci	unsigned long hs_end = 0;
97362306a36Sopenharmony_ci	unsigned long vs_adjust = 0;
97462306a36Sopenharmony_ci	unsigned long vs_bline_evn = 0;
97562306a36Sopenharmony_ci	unsigned long vs_eline_evn = 0;
97662306a36Sopenharmony_ci	unsigned long vs_bline_odd = 0;
97762306a36Sopenharmony_ci	unsigned long vs_eline_odd = 0;
97862306a36Sopenharmony_ci	unsigned long vso_begin_evn = 0;
97962306a36Sopenharmony_ci	unsigned long vso_begin_odd = 0;
98062306a36Sopenharmony_ci	unsigned int eof_lines;
98162306a36Sopenharmony_ci	unsigned int sof_lines;
98262306a36Sopenharmony_ci	unsigned int vsync_lines;
98362306a36Sopenharmony_ci	u32 reg;
98462306a36Sopenharmony_ci
98562306a36Sopenharmony_ci	/* Use VENCI for 480i and 576i and double HDMI pixels */
98662306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
98762306a36Sopenharmony_ci		hdmi_repeat = true;
98862306a36Sopenharmony_ci		use_enci = true;
98962306a36Sopenharmony_ci		venc_hdmi_latency = 1;
99062306a36Sopenharmony_ci	}
99162306a36Sopenharmony_ci
99262306a36Sopenharmony_ci	if (meson_venc_hdmi_supported_vic(vic)) {
99362306a36Sopenharmony_ci		vmode = meson_venc_hdmi_get_vic_vmode(vic);
99462306a36Sopenharmony_ci		if (!vmode) {
99562306a36Sopenharmony_ci			dev_err(priv->dev, "%s: Fatal Error, unsupported mode "
99662306a36Sopenharmony_ci				DRM_MODE_FMT "\n", __func__,
99762306a36Sopenharmony_ci				DRM_MODE_ARG(mode));
99862306a36Sopenharmony_ci			return;
99962306a36Sopenharmony_ci		}
100062306a36Sopenharmony_ci	} else {
100162306a36Sopenharmony_ci		meson_venc_hdmi_get_dmt_vmode(mode, &vmode_dmt);
100262306a36Sopenharmony_ci		vmode = &vmode_dmt;
100362306a36Sopenharmony_ci		use_enci = false;
100462306a36Sopenharmony_ci	}
100562306a36Sopenharmony_ci
100662306a36Sopenharmony_ci	/* Repeat VENC pixels for 480/576i/p, 720p50/60 and 1080p50/60 */
100762306a36Sopenharmony_ci	if (meson_venc_hdmi_venc_repeat(vic))
100862306a36Sopenharmony_ci		venc_repeat = true;
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_ci	eof_lines = mode->vsync_start - mode->vdisplay;
101162306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
101262306a36Sopenharmony_ci		eof_lines /= 2;
101362306a36Sopenharmony_ci	sof_lines = mode->vtotal - mode->vsync_end;
101462306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
101562306a36Sopenharmony_ci		sof_lines /= 2;
101662306a36Sopenharmony_ci	vsync_lines = mode->vsync_end - mode->vsync_start;
101762306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
101862306a36Sopenharmony_ci		vsync_lines /= 2;
101962306a36Sopenharmony_ci
102062306a36Sopenharmony_ci	total_pixels_venc = mode->htotal;
102162306a36Sopenharmony_ci	if (hdmi_repeat)
102262306a36Sopenharmony_ci		total_pixels_venc /= 2;
102362306a36Sopenharmony_ci	if (venc_repeat)
102462306a36Sopenharmony_ci		total_pixels_venc *= 2;
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	active_pixels_venc = mode->hdisplay;
102762306a36Sopenharmony_ci	if (hdmi_repeat)
102862306a36Sopenharmony_ci		active_pixels_venc /= 2;
102962306a36Sopenharmony_ci	if (venc_repeat)
103062306a36Sopenharmony_ci		active_pixels_venc *= 2;
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci	front_porch_venc = (mode->hsync_start - mode->hdisplay);
103362306a36Sopenharmony_ci	if (hdmi_repeat)
103462306a36Sopenharmony_ci		front_porch_venc /= 2;
103562306a36Sopenharmony_ci	if (venc_repeat)
103662306a36Sopenharmony_ci		front_porch_venc *= 2;
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_ci	hsync_pixels_venc = (mode->hsync_end - mode->hsync_start);
103962306a36Sopenharmony_ci	if (hdmi_repeat)
104062306a36Sopenharmony_ci		hsync_pixels_venc /= 2;
104162306a36Sopenharmony_ci	if (venc_repeat)
104262306a36Sopenharmony_ci		hsync_pixels_venc *= 2;
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_ci	/* Disable VDACs */
104562306a36Sopenharmony_ci	writel_bits_relaxed(0xff, 0xff,
104662306a36Sopenharmony_ci			priv->io_base + _REG(VENC_VDAC_SETTING));
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCI_VIDEO_EN));
104962306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCP_VIDEO_EN));
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ci	if (use_enci) {
105262306a36Sopenharmony_ci		unsigned int lines_f0;
105362306a36Sopenharmony_ci		unsigned int lines_f1;
105462306a36Sopenharmony_ci
105562306a36Sopenharmony_ci		/* CVBS Filter settings */
105662306a36Sopenharmony_ci		writel_relaxed(ENCI_CFILT_CMPT_SEL_HIGH | 0x10,
105762306a36Sopenharmony_ci			       priv->io_base + _REG(ENCI_CFILT_CTRL));
105862306a36Sopenharmony_ci		writel_relaxed(ENCI_CFILT_CMPT_CR_DLY(2) |
105962306a36Sopenharmony_ci			       ENCI_CFILT_CMPT_CB_DLY(1),
106062306a36Sopenharmony_ci			       priv->io_base + _REG(ENCI_CFILT_CTRL2));
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci		/* Digital Video Select : Interlace, clk27 clk, external */
106362306a36Sopenharmony_ci		writel_relaxed(0, priv->io_base + _REG(VENC_DVI_SETTING));
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci		/* Reset Video Mode */
106662306a36Sopenharmony_ci		writel_relaxed(0, priv->io_base + _REG(ENCI_VIDEO_MODE));
106762306a36Sopenharmony_ci		writel_relaxed(0, priv->io_base + _REG(ENCI_VIDEO_MODE_ADV));
106862306a36Sopenharmony_ci
106962306a36Sopenharmony_ci		/* Horizontal sync signal output */
107062306a36Sopenharmony_ci		writel_relaxed(vmode->enci.hso_begin,
107162306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_SYNC_HSO_BEGIN));
107262306a36Sopenharmony_ci		writel_relaxed(vmode->enci.hso_end,
107362306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_SYNC_HSO_END));
107462306a36Sopenharmony_ci
107562306a36Sopenharmony_ci		/* Vertical Sync lines */
107662306a36Sopenharmony_ci		writel_relaxed(vmode->enci.vso_even,
107762306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_SYNC_VSO_EVNLN));
107862306a36Sopenharmony_ci		writel_relaxed(vmode->enci.vso_odd,
107962306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_SYNC_VSO_ODDLN));
108062306a36Sopenharmony_ci
108162306a36Sopenharmony_ci		/* Macrovision max amplitude change */
108262306a36Sopenharmony_ci		writel_relaxed(ENCI_MACV_MAX_AMP_ENABLE_CHANGE |
108362306a36Sopenharmony_ci			       ENCI_MACV_MAX_AMP_VAL(vmode->enci.macv_max_amp),
108462306a36Sopenharmony_ci			       priv->io_base + _REG(ENCI_MACV_MAX_AMP));
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_ci		/* Video mode */
108762306a36Sopenharmony_ci		writel_relaxed(vmode->enci.video_prog_mode,
108862306a36Sopenharmony_ci				priv->io_base + _REG(VENC_VIDEO_PROG_MODE));
108962306a36Sopenharmony_ci		writel_relaxed(vmode->enci.video_mode,
109062306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_VIDEO_MODE));
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci		/*
109362306a36Sopenharmony_ci		 * Advanced Video Mode :
109462306a36Sopenharmony_ci		 * Demux shifting 0x2
109562306a36Sopenharmony_ci		 * Blank line end at line17/22
109662306a36Sopenharmony_ci		 * High bandwidth Luma Filter
109762306a36Sopenharmony_ci		 * Low bandwidth Chroma Filter
109862306a36Sopenharmony_ci		 * Bypass luma low pass filter
109962306a36Sopenharmony_ci		 * No macrovision on CSYNC
110062306a36Sopenharmony_ci		 */
110162306a36Sopenharmony_ci		writel_relaxed(ENCI_VIDEO_MODE_ADV_DMXMD(2) |
110262306a36Sopenharmony_ci			       ENCI_VIDEO_MODE_ADV_VBICTL_LINE_17_22 |
110362306a36Sopenharmony_ci			       ENCI_VIDEO_MODE_ADV_YBW_HIGH,
110462306a36Sopenharmony_ci			       priv->io_base + _REG(ENCI_VIDEO_MODE_ADV));
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci		writel(vmode->enci.sch_adjust,
110762306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_VIDEO_SCH));
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci		/* Sync mode : MASTER Master mode, free run, send HSO/VSO out */
111062306a36Sopenharmony_ci		writel_relaxed(0x07, priv->io_base + _REG(ENCI_SYNC_MODE));
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_ci		if (vmode->enci.yc_delay)
111362306a36Sopenharmony_ci			writel_relaxed(vmode->enci.yc_delay,
111462306a36Sopenharmony_ci					priv->io_base + _REG(ENCI_YC_DELAY));
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_ci		/* UNreset Interlaced TV Encoder */
111862306a36Sopenharmony_ci		writel_relaxed(0, priv->io_base + _REG(ENCI_DBG_PX_RST));
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci		/*
112162306a36Sopenharmony_ci		 * Enable Vfifo2vd and set Y_Cb_Y_Cr:
112262306a36Sopenharmony_ci		 * Corresponding value:
112362306a36Sopenharmony_ci		 * Y  => 00 or 10
112462306a36Sopenharmony_ci		 * Cb => 01
112562306a36Sopenharmony_ci		 * Cr => 11
112662306a36Sopenharmony_ci		 * Ex: 0x4e => 01001110 would mean Cb/Y/Cr/Y
112762306a36Sopenharmony_ci		 */
112862306a36Sopenharmony_ci		writel_relaxed(ENCI_VFIFO2VD_CTL_ENABLE |
112962306a36Sopenharmony_ci			       ENCI_VFIFO2VD_CTL_VD_SEL(0x4e),
113062306a36Sopenharmony_ci			       priv->io_base + _REG(ENCI_VFIFO2VD_CTL));
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci		/* Timings */
113362306a36Sopenharmony_ci		writel_relaxed(vmode->enci.pixel_start,
113462306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_PIXEL_START));
113562306a36Sopenharmony_ci		writel_relaxed(vmode->enci.pixel_end,
113662306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_PIXEL_END));
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_ci		writel_relaxed(vmode->enci.top_field_line_start,
113962306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_TOP_START));
114062306a36Sopenharmony_ci		writel_relaxed(vmode->enci.top_field_line_end,
114162306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_TOP_END));
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci		writel_relaxed(vmode->enci.bottom_field_line_start,
114462306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_BOT_START));
114562306a36Sopenharmony_ci		writel_relaxed(vmode->enci.bottom_field_line_end,
114662306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_BOT_END));
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_ci		/* Select ENCI for VIU */
114962306a36Sopenharmony_ci		meson_vpp_setup_mux(priv, MESON_VIU_VPP_MUX_ENCI);
115062306a36Sopenharmony_ci
115162306a36Sopenharmony_ci		/* Interlace video enable */
115262306a36Sopenharmony_ci		writel_relaxed(ENCI_VIDEO_EN_ENABLE,
115362306a36Sopenharmony_ci			       priv->io_base + _REG(ENCI_VIDEO_EN));
115462306a36Sopenharmony_ci
115562306a36Sopenharmony_ci		lines_f0 = mode->vtotal >> 1;
115662306a36Sopenharmony_ci		lines_f1 = lines_f0 + 1;
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci		de_h_begin = modulo(readl_relaxed(priv->io_base +
115962306a36Sopenharmony_ci					_REG(ENCI_VFIFO2VD_PIXEL_START))
116062306a36Sopenharmony_ci					+ venc_hdmi_latency,
116162306a36Sopenharmony_ci				    total_pixels_venc);
116262306a36Sopenharmony_ci		de_h_end  = modulo(de_h_begin + active_pixels_venc,
116362306a36Sopenharmony_ci				   total_pixels_venc);
116462306a36Sopenharmony_ci
116562306a36Sopenharmony_ci		writel_relaxed(de_h_begin,
116662306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DE_H_BEGIN));
116762306a36Sopenharmony_ci		writel_relaxed(de_h_end,
116862306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DE_H_END));
116962306a36Sopenharmony_ci
117062306a36Sopenharmony_ci		de_v_begin_even = readl_relaxed(priv->io_base +
117162306a36Sopenharmony_ci					_REG(ENCI_VFIFO2VD_LINE_TOP_START));
117262306a36Sopenharmony_ci		de_v_end_even  = de_v_begin_even + mode->vdisplay;
117362306a36Sopenharmony_ci		de_v_begin_odd = readl_relaxed(priv->io_base +
117462306a36Sopenharmony_ci					_REG(ENCI_VFIFO2VD_LINE_BOT_START));
117562306a36Sopenharmony_ci		de_v_end_odd = de_v_begin_odd + mode->vdisplay;
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ci		writel_relaxed(de_v_begin_even,
117862306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DE_V_BEGIN_EVEN));
117962306a36Sopenharmony_ci		writel_relaxed(de_v_end_even,
118062306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DE_V_END_EVEN));
118162306a36Sopenharmony_ci		writel_relaxed(de_v_begin_odd,
118262306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DE_V_BEGIN_ODD));
118362306a36Sopenharmony_ci		writel_relaxed(de_v_end_odd,
118462306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DE_V_END_ODD));
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_ci		/* Program Hsync timing */
118762306a36Sopenharmony_ci		hs_begin = de_h_end + front_porch_venc;
118862306a36Sopenharmony_ci		if (de_h_end + front_porch_venc >= total_pixels_venc) {
118962306a36Sopenharmony_ci			hs_begin -= total_pixels_venc;
119062306a36Sopenharmony_ci			vs_adjust  = 1;
119162306a36Sopenharmony_ci		} else {
119262306a36Sopenharmony_ci			hs_begin = de_h_end + front_porch_venc;
119362306a36Sopenharmony_ci			vs_adjust  = 0;
119462306a36Sopenharmony_ci		}
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci		hs_end = modulo(hs_begin + hsync_pixels_venc,
119762306a36Sopenharmony_ci				total_pixels_venc);
119862306a36Sopenharmony_ci		writel_relaxed(hs_begin,
119962306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_HSO_BEGIN));
120062306a36Sopenharmony_ci		writel_relaxed(hs_end,
120162306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_HSO_END));
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci		/* Program Vsync timing for even field */
120462306a36Sopenharmony_ci		if (((de_v_end_odd - 1) + eof_lines + vs_adjust) >= lines_f1) {
120562306a36Sopenharmony_ci			vs_bline_evn = (de_v_end_odd - 1)
120662306a36Sopenharmony_ci					+ eof_lines
120762306a36Sopenharmony_ci					+ vs_adjust
120862306a36Sopenharmony_ci					- lines_f1;
120962306a36Sopenharmony_ci			vs_eline_evn = vs_bline_evn + vsync_lines;
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci			writel_relaxed(vs_bline_evn,
121262306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_BLINE_EVN));
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_ci			writel_relaxed(vs_eline_evn,
121562306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_ELINE_EVN));
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_ci			writel_relaxed(hs_begin,
121862306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_BEGIN_EVN));
121962306a36Sopenharmony_ci			writel_relaxed(hs_begin,
122062306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_END_EVN));
122162306a36Sopenharmony_ci		} else {
122262306a36Sopenharmony_ci			vs_bline_odd = (de_v_end_odd - 1)
122362306a36Sopenharmony_ci					+ eof_lines
122462306a36Sopenharmony_ci					+ vs_adjust;
122562306a36Sopenharmony_ci
122662306a36Sopenharmony_ci			writel_relaxed(vs_bline_odd,
122762306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_BLINE_ODD));
122862306a36Sopenharmony_ci
122962306a36Sopenharmony_ci			writel_relaxed(hs_begin,
123062306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_BEGIN_ODD));
123162306a36Sopenharmony_ci
123262306a36Sopenharmony_ci			if ((vs_bline_odd + vsync_lines) >= lines_f1) {
123362306a36Sopenharmony_ci				vs_eline_evn = vs_bline_odd
123462306a36Sopenharmony_ci						+ vsync_lines
123562306a36Sopenharmony_ci						- lines_f1;
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci				writel_relaxed(vs_eline_evn, priv->io_base
123862306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_ELINE_EVN));
123962306a36Sopenharmony_ci
124062306a36Sopenharmony_ci				writel_relaxed(hs_begin, priv->io_base
124162306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_END_EVN));
124262306a36Sopenharmony_ci			} else {
124362306a36Sopenharmony_ci				vs_eline_odd = vs_bline_odd
124462306a36Sopenharmony_ci						+ vsync_lines;
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci				writel_relaxed(vs_eline_odd, priv->io_base
124762306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_ELINE_ODD));
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci				writel_relaxed(hs_begin, priv->io_base
125062306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_END_ODD));
125162306a36Sopenharmony_ci			}
125262306a36Sopenharmony_ci		}
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_ci		/* Program Vsync timing for odd field */
125562306a36Sopenharmony_ci		if (((de_v_end_even - 1) + (eof_lines + 1)) >= lines_f0) {
125662306a36Sopenharmony_ci			vs_bline_odd = (de_v_end_even - 1)
125762306a36Sopenharmony_ci					+ (eof_lines + 1)
125862306a36Sopenharmony_ci					- lines_f0;
125962306a36Sopenharmony_ci			vs_eline_odd = vs_bline_odd + vsync_lines;
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_ci			writel_relaxed(vs_bline_odd,
126262306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_BLINE_ODD));
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_ci			writel_relaxed(vs_eline_odd,
126562306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_ELINE_ODD));
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_ci			vso_begin_odd  = modulo(hs_begin
126862306a36Sopenharmony_ci						+ (total_pixels_venc >> 1),
126962306a36Sopenharmony_ci						total_pixels_venc);
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci			writel_relaxed(vso_begin_odd,
127262306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_BEGIN_ODD));
127362306a36Sopenharmony_ci			writel_relaxed(vso_begin_odd,
127462306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_END_ODD));
127562306a36Sopenharmony_ci		} else {
127662306a36Sopenharmony_ci			vs_bline_evn = (de_v_end_even - 1)
127762306a36Sopenharmony_ci					+ (eof_lines + 1);
127862306a36Sopenharmony_ci
127962306a36Sopenharmony_ci			writel_relaxed(vs_bline_evn,
128062306a36Sopenharmony_ci				priv->io_base + _REG(ENCI_DVI_VSO_BLINE_EVN));
128162306a36Sopenharmony_ci
128262306a36Sopenharmony_ci			vso_begin_evn  = modulo(hs_begin
128362306a36Sopenharmony_ci						+ (total_pixels_venc >> 1),
128462306a36Sopenharmony_ci						total_pixels_venc);
128562306a36Sopenharmony_ci
128662306a36Sopenharmony_ci			writel_relaxed(vso_begin_evn, priv->io_base
128762306a36Sopenharmony_ci					+ _REG(ENCI_DVI_VSO_BEGIN_EVN));
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ci			if (vs_bline_evn + vsync_lines >= lines_f0) {
129062306a36Sopenharmony_ci				vs_eline_odd = vs_bline_evn
129162306a36Sopenharmony_ci						+ vsync_lines
129262306a36Sopenharmony_ci						- lines_f0;
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_ci				writel_relaxed(vs_eline_odd, priv->io_base
129562306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_ELINE_ODD));
129662306a36Sopenharmony_ci
129762306a36Sopenharmony_ci				writel_relaxed(vso_begin_evn, priv->io_base
129862306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_END_ODD));
129962306a36Sopenharmony_ci			} else {
130062306a36Sopenharmony_ci				vs_eline_evn = vs_bline_evn + vsync_lines;
130162306a36Sopenharmony_ci
130262306a36Sopenharmony_ci				writel_relaxed(vs_eline_evn, priv->io_base
130362306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_ELINE_EVN));
130462306a36Sopenharmony_ci
130562306a36Sopenharmony_ci				writel_relaxed(vso_begin_evn, priv->io_base
130662306a36Sopenharmony_ci						+ _REG(ENCI_DVI_VSO_END_EVN));
130762306a36Sopenharmony_ci			}
130862306a36Sopenharmony_ci		}
130962306a36Sopenharmony_ci	} else {
131062306a36Sopenharmony_ci		writel_relaxed(vmode->encp.dvi_settings,
131162306a36Sopenharmony_ci				priv->io_base + _REG(VENC_DVI_SETTING));
131262306a36Sopenharmony_ci		writel_relaxed(vmode->encp.video_mode,
131362306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_MODE));
131462306a36Sopenharmony_ci		writel_relaxed(vmode->encp.video_mode_adv,
131562306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_MODE_ADV));
131662306a36Sopenharmony_ci		if (vmode->encp.video_prog_mode_present)
131762306a36Sopenharmony_ci			writel_relaxed(vmode->encp.video_prog_mode,
131862306a36Sopenharmony_ci				priv->io_base + _REG(VENC_VIDEO_PROG_MODE));
131962306a36Sopenharmony_ci		if (vmode->encp.video_sync_mode_present)
132062306a36Sopenharmony_ci			writel_relaxed(vmode->encp.video_sync_mode,
132162306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_SYNC_MODE));
132262306a36Sopenharmony_ci		if (vmode->encp.video_yc_dly_present)
132362306a36Sopenharmony_ci			writel_relaxed(vmode->encp.video_yc_dly,
132462306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_YC_DLY));
132562306a36Sopenharmony_ci		if (vmode->encp.video_rgb_ctrl_present)
132662306a36Sopenharmony_ci			writel_relaxed(vmode->encp.video_rgb_ctrl,
132762306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_RGB_CTRL));
132862306a36Sopenharmony_ci		if (vmode->encp.video_filt_ctrl_present)
132962306a36Sopenharmony_ci			writel_relaxed(vmode->encp.video_filt_ctrl,
133062306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_FILT_CTRL));
133162306a36Sopenharmony_ci		if (vmode->encp.video_ofld_voav_ofst_present)
133262306a36Sopenharmony_ci			writel_relaxed(vmode->encp.video_ofld_voav_ofst,
133362306a36Sopenharmony_ci				priv->io_base
133462306a36Sopenharmony_ci				+ _REG(ENCP_VIDEO_OFLD_VOAV_OFST));
133562306a36Sopenharmony_ci		writel_relaxed(vmode->encp.yfp1_htime,
133662306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_YFP1_HTIME));
133762306a36Sopenharmony_ci		writel_relaxed(vmode->encp.yfp2_htime,
133862306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_YFP2_HTIME));
133962306a36Sopenharmony_ci		writel_relaxed(vmode->encp.max_pxcnt,
134062306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_MAX_PXCNT));
134162306a36Sopenharmony_ci		writel_relaxed(vmode->encp.hspuls_begin,
134262306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_HSPULS_BEGIN));
134362306a36Sopenharmony_ci		writel_relaxed(vmode->encp.hspuls_end,
134462306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_HSPULS_END));
134562306a36Sopenharmony_ci		writel_relaxed(vmode->encp.hspuls_switch,
134662306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_HSPULS_SWITCH));
134762306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vspuls_begin,
134862306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSPULS_BEGIN));
134962306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vspuls_end,
135062306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSPULS_END));
135162306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vspuls_bline,
135262306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSPULS_BLINE));
135362306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vspuls_eline,
135462306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSPULS_ELINE));
135562306a36Sopenharmony_ci		if (vmode->encp.eqpuls_begin_present)
135662306a36Sopenharmony_ci			writel_relaxed(vmode->encp.eqpuls_begin,
135762306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_EQPULS_BEGIN));
135862306a36Sopenharmony_ci		if (vmode->encp.eqpuls_end_present)
135962306a36Sopenharmony_ci			writel_relaxed(vmode->encp.eqpuls_end,
136062306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_EQPULS_END));
136162306a36Sopenharmony_ci		if (vmode->encp.eqpuls_bline_present)
136262306a36Sopenharmony_ci			writel_relaxed(vmode->encp.eqpuls_bline,
136362306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_EQPULS_BLINE));
136462306a36Sopenharmony_ci		if (vmode->encp.eqpuls_eline_present)
136562306a36Sopenharmony_ci			writel_relaxed(vmode->encp.eqpuls_eline,
136662306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_EQPULS_ELINE));
136762306a36Sopenharmony_ci		writel_relaxed(vmode->encp.havon_begin,
136862306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_HAVON_BEGIN));
136962306a36Sopenharmony_ci		writel_relaxed(vmode->encp.havon_end,
137062306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_HAVON_END));
137162306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vavon_bline,
137262306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VAVON_BLINE));
137362306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vavon_eline,
137462306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VAVON_ELINE));
137562306a36Sopenharmony_ci		writel_relaxed(vmode->encp.hso_begin,
137662306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_HSO_BEGIN));
137762306a36Sopenharmony_ci		writel_relaxed(vmode->encp.hso_end,
137862306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_HSO_END));
137962306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vso_begin,
138062306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSO_BEGIN));
138162306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vso_end,
138262306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSO_END));
138362306a36Sopenharmony_ci		writel_relaxed(vmode->encp.vso_bline,
138462306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSO_BLINE));
138562306a36Sopenharmony_ci		if (vmode->encp.vso_eline_present)
138662306a36Sopenharmony_ci			writel_relaxed(vmode->encp.vso_eline,
138762306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_VSO_ELINE));
138862306a36Sopenharmony_ci		if (vmode->encp.sy_val_present)
138962306a36Sopenharmony_ci			writel_relaxed(vmode->encp.sy_val,
139062306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_SY_VAL));
139162306a36Sopenharmony_ci		if (vmode->encp.sy2_val_present)
139262306a36Sopenharmony_ci			writel_relaxed(vmode->encp.sy2_val,
139362306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_SY2_VAL));
139462306a36Sopenharmony_ci		writel_relaxed(vmode->encp.max_lncnt,
139562306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_VIDEO_MAX_LNCNT));
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_ci		writel_relaxed(1, priv->io_base + _REG(ENCP_VIDEO_EN));
139862306a36Sopenharmony_ci
139962306a36Sopenharmony_ci		/* Set DE signal’s polarity is active high */
140062306a36Sopenharmony_ci		writel_bits_relaxed(ENCP_VIDEO_MODE_DE_V_HIGH,
140162306a36Sopenharmony_ci				    ENCP_VIDEO_MODE_DE_V_HIGH,
140262306a36Sopenharmony_ci				    priv->io_base + _REG(ENCP_VIDEO_MODE));
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci		/* Program DE timing */
140562306a36Sopenharmony_ci		de_h_begin = modulo(readl_relaxed(priv->io_base +
140662306a36Sopenharmony_ci					_REG(ENCP_VIDEO_HAVON_BEGIN))
140762306a36Sopenharmony_ci					+ venc_hdmi_latency,
140862306a36Sopenharmony_ci				    total_pixels_venc);
140962306a36Sopenharmony_ci		de_h_end = modulo(de_h_begin + active_pixels_venc,
141062306a36Sopenharmony_ci				  total_pixels_venc);
141162306a36Sopenharmony_ci
141262306a36Sopenharmony_ci		writel_relaxed(de_h_begin,
141362306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DE_H_BEGIN));
141462306a36Sopenharmony_ci		writel_relaxed(de_h_end,
141562306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DE_H_END));
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_ci		/* Program DE timing for even field */
141862306a36Sopenharmony_ci		de_v_begin_even = readl_relaxed(priv->io_base
141962306a36Sopenharmony_ci						+ _REG(ENCP_VIDEO_VAVON_BLINE));
142062306a36Sopenharmony_ci		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
142162306a36Sopenharmony_ci			de_v_end_even = de_v_begin_even +
142262306a36Sopenharmony_ci					(mode->vdisplay / 2);
142362306a36Sopenharmony_ci		else
142462306a36Sopenharmony_ci			de_v_end_even = de_v_begin_even + mode->vdisplay;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci		writel_relaxed(de_v_begin_even,
142762306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DE_V_BEGIN_EVEN));
142862306a36Sopenharmony_ci		writel_relaxed(de_v_end_even,
142962306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DE_V_END_EVEN));
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci		/* Program DE timing for odd field if needed */
143262306a36Sopenharmony_ci		if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
143362306a36Sopenharmony_ci			unsigned int ofld_voav_ofst =
143462306a36Sopenharmony_ci				readl_relaxed(priv->io_base +
143562306a36Sopenharmony_ci					_REG(ENCP_VIDEO_OFLD_VOAV_OFST));
143662306a36Sopenharmony_ci			de_v_begin_odd = to_signed((ofld_voav_ofst & 0xf0) >> 4)
143762306a36Sopenharmony_ci						+ de_v_begin_even
143862306a36Sopenharmony_ci						+ ((mode->vtotal - 1) / 2);
143962306a36Sopenharmony_ci			de_v_end_odd = de_v_begin_odd + (mode->vdisplay / 2);
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_ci			writel_relaxed(de_v_begin_odd,
144262306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DE_V_BEGIN_ODD));
144362306a36Sopenharmony_ci			writel_relaxed(de_v_end_odd,
144462306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DE_V_END_ODD));
144562306a36Sopenharmony_ci		}
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_ci		/* Program Hsync timing */
144862306a36Sopenharmony_ci		if ((de_h_end + front_porch_venc) >= total_pixels_venc) {
144962306a36Sopenharmony_ci			hs_begin = de_h_end
145062306a36Sopenharmony_ci				   + front_porch_venc
145162306a36Sopenharmony_ci				   - total_pixels_venc;
145262306a36Sopenharmony_ci			vs_adjust  = 1;
145362306a36Sopenharmony_ci		} else {
145462306a36Sopenharmony_ci			hs_begin = de_h_end
145562306a36Sopenharmony_ci				   + front_porch_venc;
145662306a36Sopenharmony_ci			vs_adjust  = 0;
145762306a36Sopenharmony_ci		}
145862306a36Sopenharmony_ci
145962306a36Sopenharmony_ci		hs_end = modulo(hs_begin + hsync_pixels_venc,
146062306a36Sopenharmony_ci				total_pixels_venc);
146162306a36Sopenharmony_ci
146262306a36Sopenharmony_ci		writel_relaxed(hs_begin,
146362306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_HSO_BEGIN));
146462306a36Sopenharmony_ci		writel_relaxed(hs_end,
146562306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_HSO_END));
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci		/* Program Vsync timing for even field */
146862306a36Sopenharmony_ci		if (de_v_begin_even >=
146962306a36Sopenharmony_ci				(sof_lines + vsync_lines + (1 - vs_adjust)))
147062306a36Sopenharmony_ci			vs_bline_evn = de_v_begin_even
147162306a36Sopenharmony_ci					- sof_lines
147262306a36Sopenharmony_ci					- vsync_lines
147362306a36Sopenharmony_ci					- (1 - vs_adjust);
147462306a36Sopenharmony_ci		else
147562306a36Sopenharmony_ci			vs_bline_evn = mode->vtotal
147662306a36Sopenharmony_ci					+ de_v_begin_even
147762306a36Sopenharmony_ci					- sof_lines
147862306a36Sopenharmony_ci					- vsync_lines
147962306a36Sopenharmony_ci					- (1 - vs_adjust);
148062306a36Sopenharmony_ci
148162306a36Sopenharmony_ci		vs_eline_evn = modulo(vs_bline_evn + vsync_lines,
148262306a36Sopenharmony_ci					mode->vtotal);
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_ci		writel_relaxed(vs_bline_evn,
148562306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_BLINE_EVN));
148662306a36Sopenharmony_ci		writel_relaxed(vs_eline_evn,
148762306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_ELINE_EVN));
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci		vso_begin_evn = hs_begin;
149062306a36Sopenharmony_ci		writel_relaxed(vso_begin_evn,
149162306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_BEGIN_EVN));
149262306a36Sopenharmony_ci		writel_relaxed(vso_begin_evn,
149362306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_END_EVN));
149462306a36Sopenharmony_ci
149562306a36Sopenharmony_ci		/* Program Vsync timing for odd field if needed */
149662306a36Sopenharmony_ci		if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
149762306a36Sopenharmony_ci			vs_bline_odd = (de_v_begin_odd - 1)
149862306a36Sopenharmony_ci					- sof_lines
149962306a36Sopenharmony_ci					- vsync_lines;
150062306a36Sopenharmony_ci			vs_eline_odd = (de_v_begin_odd - 1)
150162306a36Sopenharmony_ci					- vsync_lines;
150262306a36Sopenharmony_ci			vso_begin_odd  = modulo(hs_begin
150362306a36Sopenharmony_ci						+ (total_pixels_venc >> 1),
150462306a36Sopenharmony_ci						total_pixels_venc);
150562306a36Sopenharmony_ci
150662306a36Sopenharmony_ci			writel_relaxed(vs_bline_odd,
150762306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_BLINE_ODD));
150862306a36Sopenharmony_ci			writel_relaxed(vs_eline_odd,
150962306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_ELINE_ODD));
151062306a36Sopenharmony_ci			writel_relaxed(vso_begin_odd,
151162306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_BEGIN_ODD));
151262306a36Sopenharmony_ci			writel_relaxed(vso_begin_odd,
151362306a36Sopenharmony_ci				priv->io_base + _REG(ENCP_DVI_VSO_END_ODD));
151462306a36Sopenharmony_ci		}
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_ci		/* Select ENCP for VIU */
151762306a36Sopenharmony_ci		meson_vpp_setup_mux(priv, MESON_VIU_VPP_MUX_ENCP);
151862306a36Sopenharmony_ci	}
151962306a36Sopenharmony_ci
152062306a36Sopenharmony_ci	/* Set VPU HDMI setting */
152162306a36Sopenharmony_ci	/* Select ENCP or ENCI data to HDMI */
152262306a36Sopenharmony_ci	if (use_enci)
152362306a36Sopenharmony_ci		reg = VPU_HDMI_ENCI_DATA_TO_HDMI;
152462306a36Sopenharmony_ci	else
152562306a36Sopenharmony_ci		reg = VPU_HDMI_ENCP_DATA_TO_HDMI;
152662306a36Sopenharmony_ci
152762306a36Sopenharmony_ci	/* Invert polarity of HSYNC from VENC */
152862306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_PHSYNC)
152962306a36Sopenharmony_ci		reg |= VPU_HDMI_INV_HSYNC;
153062306a36Sopenharmony_ci
153162306a36Sopenharmony_ci	/* Invert polarity of VSYNC from VENC */
153262306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_PVSYNC)
153362306a36Sopenharmony_ci		reg |= VPU_HDMI_INV_VSYNC;
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_ci	/* Output data format */
153662306a36Sopenharmony_ci	reg |= ycrcb_map;
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci	/*
153962306a36Sopenharmony_ci	 * Write rate to the async FIFO between VENC and HDMI.
154062306a36Sopenharmony_ci	 * One write every 2 wr_clk.
154162306a36Sopenharmony_ci	 */
154262306a36Sopenharmony_ci	if (venc_repeat || yuv420_mode)
154362306a36Sopenharmony_ci		reg |= VPU_HDMI_WR_RATE(2);
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_ci	/*
154662306a36Sopenharmony_ci	 * Read rate to the async FIFO between VENC and HDMI.
154762306a36Sopenharmony_ci	 * One read every 2 wr_clk.
154862306a36Sopenharmony_ci	 */
154962306a36Sopenharmony_ci	if (hdmi_repeat)
155062306a36Sopenharmony_ci		reg |= VPU_HDMI_RD_RATE(2);
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci	writel_relaxed(reg, priv->io_base + _REG(VPU_HDMI_SETTING));
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	priv->venc.hdmi_repeat = hdmi_repeat;
155562306a36Sopenharmony_ci	priv->venc.venc_repeat = venc_repeat;
155662306a36Sopenharmony_ci	priv->venc.hdmi_use_enci = use_enci;
155762306a36Sopenharmony_ci
155862306a36Sopenharmony_ci	priv->venc.current_mode = MESON_VENC_MODE_HDMI;
155962306a36Sopenharmony_ci}
156062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(meson_venc_hdmi_mode_set);
156162306a36Sopenharmony_ci
156262306a36Sopenharmony_cistatic unsigned short meson_encl_gamma_table[256] = {
156362306a36Sopenharmony_ci	0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
156462306a36Sopenharmony_ci	64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124,
156562306a36Sopenharmony_ci	128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188,
156662306a36Sopenharmony_ci	192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252,
156762306a36Sopenharmony_ci	256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 304, 308, 312, 316,
156862306a36Sopenharmony_ci	320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380,
156962306a36Sopenharmony_ci	384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444,
157062306a36Sopenharmony_ci	448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, 500, 504, 508,
157162306a36Sopenharmony_ci	512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572,
157262306a36Sopenharmony_ci	576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 624, 628, 632, 636,
157362306a36Sopenharmony_ci	640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700,
157462306a36Sopenharmony_ci	704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764,
157562306a36Sopenharmony_ci	768, 772, 776, 780, 784, 788, 792, 796, 800, 804, 808, 812, 816, 820, 824, 828,
157662306a36Sopenharmony_ci	832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892,
157762306a36Sopenharmony_ci	896, 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956,
157862306a36Sopenharmony_ci	960, 964, 968, 972, 976, 980, 984, 988, 992, 996, 1000, 1004, 1008, 1012, 1016, 1020,
157962306a36Sopenharmony_ci};
158062306a36Sopenharmony_ci
158162306a36Sopenharmony_cistatic void meson_encl_set_gamma_table(struct meson_drm *priv, u16 *data,
158262306a36Sopenharmony_ci				       u32 rgb_mask)
158362306a36Sopenharmony_ci{
158462306a36Sopenharmony_ci	int i, ret;
158562306a36Sopenharmony_ci	u32 reg;
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	writel_bits_relaxed(L_GAMMA_CNTL_PORT_EN, 0,
158862306a36Sopenharmony_ci			    priv->io_base + _REG(L_GAMMA_CNTL_PORT));
158962306a36Sopenharmony_ci
159062306a36Sopenharmony_ci	ret = readl_relaxed_poll_timeout(priv->io_base + _REG(L_GAMMA_CNTL_PORT),
159162306a36Sopenharmony_ci					 reg, reg & L_GAMMA_CNTL_PORT_ADR_RDY, 10, 10000);
159262306a36Sopenharmony_ci	if (ret)
159362306a36Sopenharmony_ci		pr_warn("%s: GAMMA ADR_RDY timeout\n", __func__);
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_ci	writel_relaxed(L_GAMMA_ADDR_PORT_AUTO_INC | rgb_mask |
159662306a36Sopenharmony_ci		       FIELD_PREP(L_GAMMA_ADDR_PORT_ADDR, 0),
159762306a36Sopenharmony_ci		       priv->io_base + _REG(L_GAMMA_ADDR_PORT));
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci	for (i = 0; i < 256; i++) {
160062306a36Sopenharmony_ci		ret = readl_relaxed_poll_timeout(priv->io_base + _REG(L_GAMMA_CNTL_PORT),
160162306a36Sopenharmony_ci						 reg, reg & L_GAMMA_CNTL_PORT_WR_RDY,
160262306a36Sopenharmony_ci						 10, 10000);
160362306a36Sopenharmony_ci		if (ret)
160462306a36Sopenharmony_ci			pr_warn_once("%s: GAMMA WR_RDY timeout\n", __func__);
160562306a36Sopenharmony_ci
160662306a36Sopenharmony_ci		writel_relaxed(data[i], priv->io_base + _REG(L_GAMMA_DATA_PORT));
160762306a36Sopenharmony_ci	}
160862306a36Sopenharmony_ci
160962306a36Sopenharmony_ci	ret = readl_relaxed_poll_timeout(priv->io_base + _REG(L_GAMMA_CNTL_PORT),
161062306a36Sopenharmony_ci					 reg, reg & L_GAMMA_CNTL_PORT_ADR_RDY, 10, 10000);
161162306a36Sopenharmony_ci	if (ret)
161262306a36Sopenharmony_ci		pr_warn("%s: GAMMA ADR_RDY timeout\n", __func__);
161362306a36Sopenharmony_ci
161462306a36Sopenharmony_ci	writel_relaxed(L_GAMMA_ADDR_PORT_AUTO_INC | rgb_mask |
161562306a36Sopenharmony_ci		       FIELD_PREP(L_GAMMA_ADDR_PORT_ADDR, 0x23),
161662306a36Sopenharmony_ci		       priv->io_base + _REG(L_GAMMA_ADDR_PORT));
161762306a36Sopenharmony_ci}
161862306a36Sopenharmony_ci
161962306a36Sopenharmony_civoid meson_encl_load_gamma(struct meson_drm *priv)
162062306a36Sopenharmony_ci{
162162306a36Sopenharmony_ci	meson_encl_set_gamma_table(priv, meson_encl_gamma_table, L_GAMMA_ADDR_PORT_SEL_R);
162262306a36Sopenharmony_ci	meson_encl_set_gamma_table(priv, meson_encl_gamma_table, L_GAMMA_ADDR_PORT_SEL_G);
162362306a36Sopenharmony_ci	meson_encl_set_gamma_table(priv, meson_encl_gamma_table, L_GAMMA_ADDR_PORT_SEL_B);
162462306a36Sopenharmony_ci
162562306a36Sopenharmony_ci	writel_bits_relaxed(L_GAMMA_CNTL_PORT_EN, L_GAMMA_CNTL_PORT_EN,
162662306a36Sopenharmony_ci			    priv->io_base + _REG(L_GAMMA_CNTL_PORT));
162762306a36Sopenharmony_ci}
162862306a36Sopenharmony_ci
162962306a36Sopenharmony_civoid meson_venc_mipi_dsi_mode_set(struct meson_drm *priv,
163062306a36Sopenharmony_ci				  const struct drm_display_mode *mode)
163162306a36Sopenharmony_ci{
163262306a36Sopenharmony_ci	unsigned int max_pxcnt;
163362306a36Sopenharmony_ci	unsigned int max_lncnt;
163462306a36Sopenharmony_ci	unsigned int havon_begin;
163562306a36Sopenharmony_ci	unsigned int havon_end;
163662306a36Sopenharmony_ci	unsigned int vavon_bline;
163762306a36Sopenharmony_ci	unsigned int vavon_eline;
163862306a36Sopenharmony_ci	unsigned int hso_begin;
163962306a36Sopenharmony_ci	unsigned int hso_end;
164062306a36Sopenharmony_ci	unsigned int vso_begin;
164162306a36Sopenharmony_ci	unsigned int vso_end;
164262306a36Sopenharmony_ci	unsigned int vso_bline;
164362306a36Sopenharmony_ci	unsigned int vso_eline;
164462306a36Sopenharmony_ci
164562306a36Sopenharmony_ci	max_pxcnt = mode->htotal - 1;
164662306a36Sopenharmony_ci	max_lncnt = mode->vtotal - 1;
164762306a36Sopenharmony_ci	havon_begin = mode->htotal - mode->hsync_start;
164862306a36Sopenharmony_ci	havon_end = havon_begin + mode->hdisplay - 1;
164962306a36Sopenharmony_ci	vavon_bline = mode->vtotal - mode->vsync_start;
165062306a36Sopenharmony_ci	vavon_eline = vavon_bline + mode->vdisplay - 1;
165162306a36Sopenharmony_ci	hso_begin = 0;
165262306a36Sopenharmony_ci	hso_end = mode->hsync_end - mode->hsync_start;
165362306a36Sopenharmony_ci	vso_begin = 0;
165462306a36Sopenharmony_ci	vso_end = 0;
165562306a36Sopenharmony_ci	vso_bline = 0;
165662306a36Sopenharmony_ci	vso_eline = mode->vsync_end - mode->vsync_start;
165762306a36Sopenharmony_ci
165862306a36Sopenharmony_ci	meson_vpp_setup_mux(priv, MESON_VIU_VPP_MUX_ENCL);
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCL_VIDEO_EN));
166162306a36Sopenharmony_ci
166262306a36Sopenharmony_ci	writel_relaxed(ENCL_PX_LN_CNT_SHADOW_EN, priv->io_base + _REG(ENCL_VIDEO_MODE));
166362306a36Sopenharmony_ci	writel_relaxed(ENCL_VIDEO_MODE_ADV_VFIFO_EN |
166462306a36Sopenharmony_ci		       ENCL_VIDEO_MODE_ADV_GAIN_HDTV |
166562306a36Sopenharmony_ci		       ENCL_SEL_GAMMA_RGB_IN, priv->io_base + _REG(ENCL_VIDEO_MODE_ADV));
166662306a36Sopenharmony_ci
166762306a36Sopenharmony_ci	writel_relaxed(ENCL_VIDEO_FILT_CTRL_BYPASS_FILTER,
166862306a36Sopenharmony_ci		       priv->io_base + _REG(ENCL_VIDEO_FILT_CTRL));
166962306a36Sopenharmony_ci	writel_relaxed(max_pxcnt, priv->io_base + _REG(ENCL_VIDEO_MAX_PXCNT));
167062306a36Sopenharmony_ci	writel_relaxed(max_lncnt, priv->io_base + _REG(ENCL_VIDEO_MAX_LNCNT));
167162306a36Sopenharmony_ci	writel_relaxed(havon_begin, priv->io_base + _REG(ENCL_VIDEO_HAVON_BEGIN));
167262306a36Sopenharmony_ci	writel_relaxed(havon_end, priv->io_base + _REG(ENCL_VIDEO_HAVON_END));
167362306a36Sopenharmony_ci	writel_relaxed(vavon_bline, priv->io_base + _REG(ENCL_VIDEO_VAVON_BLINE));
167462306a36Sopenharmony_ci	writel_relaxed(vavon_eline, priv->io_base + _REG(ENCL_VIDEO_VAVON_ELINE));
167562306a36Sopenharmony_ci
167662306a36Sopenharmony_ci	writel_relaxed(hso_begin, priv->io_base + _REG(ENCL_VIDEO_HSO_BEGIN));
167762306a36Sopenharmony_ci	writel_relaxed(hso_end, priv->io_base + _REG(ENCL_VIDEO_HSO_END));
167862306a36Sopenharmony_ci	writel_relaxed(vso_begin, priv->io_base + _REG(ENCL_VIDEO_VSO_BEGIN));
167962306a36Sopenharmony_ci	writel_relaxed(vso_end, priv->io_base + _REG(ENCL_VIDEO_VSO_END));
168062306a36Sopenharmony_ci	writel_relaxed(vso_bline, priv->io_base + _REG(ENCL_VIDEO_VSO_BLINE));
168162306a36Sopenharmony_ci	writel_relaxed(vso_eline, priv->io_base + _REG(ENCL_VIDEO_VSO_ELINE));
168262306a36Sopenharmony_ci	writel_relaxed(ENCL_VIDEO_RGBIN_RGB | ENCL_VIDEO_RGBIN_ZBLK,
168362306a36Sopenharmony_ci		       priv->io_base + _REG(ENCL_VIDEO_RGBIN_CTRL));
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	/* default black pattern */
168662306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCL_TST_MDSEL));
168762306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCL_TST_Y));
168862306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCL_TST_CB));
168962306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCL_TST_CR));
169062306a36Sopenharmony_ci	writel_relaxed(1, priv->io_base + _REG(ENCL_TST_EN));
169162306a36Sopenharmony_ci	writel_bits_relaxed(ENCL_VIDEO_MODE_ADV_VFIFO_EN, 0,
169262306a36Sopenharmony_ci			    priv->io_base + _REG(ENCL_VIDEO_MODE_ADV));
169362306a36Sopenharmony_ci
169462306a36Sopenharmony_ci	writel_relaxed(1, priv->io_base + _REG(ENCL_VIDEO_EN));
169562306a36Sopenharmony_ci
169662306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(L_RGB_BASE_ADDR));
169762306a36Sopenharmony_ci	writel_relaxed(0x400, priv->io_base + _REG(L_RGB_COEFF_ADDR)); /* Magic value */
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci	writel_relaxed(L_DITH_CNTL_DITH10_EN, priv->io_base + _REG(L_DITH_CNTL_ADDR));
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_ci	/* DE signal for TTL */
170262306a36Sopenharmony_ci	writel_relaxed(havon_begin, priv->io_base + _REG(L_OEH_HS_ADDR));
170362306a36Sopenharmony_ci	writel_relaxed(havon_end + 1, priv->io_base + _REG(L_OEH_HE_ADDR));
170462306a36Sopenharmony_ci	writel_relaxed(vavon_bline, priv->io_base + _REG(L_OEH_VS_ADDR));
170562306a36Sopenharmony_ci	writel_relaxed(vavon_eline, priv->io_base + _REG(L_OEH_VE_ADDR));
170662306a36Sopenharmony_ci
170762306a36Sopenharmony_ci	/* DE signal for TTL */
170862306a36Sopenharmony_ci	writel_relaxed(havon_begin, priv->io_base + _REG(L_OEV1_HS_ADDR));
170962306a36Sopenharmony_ci	writel_relaxed(havon_end + 1, priv->io_base + _REG(L_OEV1_HE_ADDR));
171062306a36Sopenharmony_ci	writel_relaxed(vavon_bline, priv->io_base + _REG(L_OEV1_VS_ADDR));
171162306a36Sopenharmony_ci	writel_relaxed(vavon_eline, priv->io_base + _REG(L_OEV1_VE_ADDR));
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci	/* Hsync signal for TTL */
171462306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_PHSYNC) {
171562306a36Sopenharmony_ci		writel_relaxed(hso_begin, priv->io_base + _REG(L_STH1_HS_ADDR));
171662306a36Sopenharmony_ci		writel_relaxed(hso_end, priv->io_base + _REG(L_STH1_HE_ADDR));
171762306a36Sopenharmony_ci	} else {
171862306a36Sopenharmony_ci		writel_relaxed(hso_end, priv->io_base + _REG(L_STH1_HS_ADDR));
171962306a36Sopenharmony_ci		writel_relaxed(hso_begin, priv->io_base + _REG(L_STH1_HE_ADDR));
172062306a36Sopenharmony_ci	}
172162306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(L_STH1_VS_ADDR));
172262306a36Sopenharmony_ci	writel_relaxed(max_lncnt, priv->io_base + _REG(L_STH1_VE_ADDR));
172362306a36Sopenharmony_ci
172462306a36Sopenharmony_ci	/* Vsync signal for TTL */
172562306a36Sopenharmony_ci	writel_relaxed(vso_begin, priv->io_base + _REG(L_STV1_HS_ADDR));
172662306a36Sopenharmony_ci	writel_relaxed(vso_end, priv->io_base + _REG(L_STV1_HE_ADDR));
172762306a36Sopenharmony_ci	if (mode->flags & DRM_MODE_FLAG_PVSYNC) {
172862306a36Sopenharmony_ci		writel_relaxed(vso_bline, priv->io_base + _REG(L_STV1_VS_ADDR));
172962306a36Sopenharmony_ci		writel_relaxed(vso_eline, priv->io_base + _REG(L_STV1_VE_ADDR));
173062306a36Sopenharmony_ci	} else {
173162306a36Sopenharmony_ci		writel_relaxed(vso_eline, priv->io_base + _REG(L_STV1_VS_ADDR));
173262306a36Sopenharmony_ci		writel_relaxed(vso_bline, priv->io_base + _REG(L_STV1_VE_ADDR));
173362306a36Sopenharmony_ci	}
173462306a36Sopenharmony_ci
173562306a36Sopenharmony_ci	/* DE signal */
173662306a36Sopenharmony_ci	writel_relaxed(havon_begin, priv->io_base + _REG(L_DE_HS_ADDR));
173762306a36Sopenharmony_ci	writel_relaxed(havon_end + 1, priv->io_base + _REG(L_DE_HE_ADDR));
173862306a36Sopenharmony_ci	writel_relaxed(vavon_bline, priv->io_base + _REG(L_DE_VS_ADDR));
173962306a36Sopenharmony_ci	writel_relaxed(vavon_eline, priv->io_base + _REG(L_DE_VE_ADDR));
174062306a36Sopenharmony_ci
174162306a36Sopenharmony_ci	/* Hsync signal */
174262306a36Sopenharmony_ci	writel_relaxed(hso_begin, priv->io_base + _REG(L_HSYNC_HS_ADDR));
174362306a36Sopenharmony_ci	writel_relaxed(hso_end, priv->io_base + _REG(L_HSYNC_HE_ADDR));
174462306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(L_HSYNC_VS_ADDR));
174562306a36Sopenharmony_ci	writel_relaxed(max_lncnt, priv->io_base + _REG(L_HSYNC_VE_ADDR));
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_ci	/* Vsync signal */
174862306a36Sopenharmony_ci	writel_relaxed(vso_begin, priv->io_base + _REG(L_VSYNC_HS_ADDR));
174962306a36Sopenharmony_ci	writel_relaxed(vso_end, priv->io_base + _REG(L_VSYNC_HE_ADDR));
175062306a36Sopenharmony_ci	writel_relaxed(vso_bline, priv->io_base + _REG(L_VSYNC_VS_ADDR));
175162306a36Sopenharmony_ci	writel_relaxed(vso_eline, priv->io_base + _REG(L_VSYNC_VE_ADDR));
175262306a36Sopenharmony_ci
175362306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(L_INV_CNT_ADDR));
175462306a36Sopenharmony_ci	writel_relaxed(L_TCON_MISC_SEL_STV1 | L_TCON_MISC_SEL_STV2,
175562306a36Sopenharmony_ci		       priv->io_base + _REG(L_TCON_MISC_SEL_ADDR));
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci	priv->venc.current_mode = MESON_VENC_MODE_MIPI_DSI;
175862306a36Sopenharmony_ci}
175962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(meson_venc_mipi_dsi_mode_set);
176062306a36Sopenharmony_ci
176162306a36Sopenharmony_civoid meson_venci_cvbs_mode_set(struct meson_drm *priv,
176262306a36Sopenharmony_ci			       struct meson_cvbs_enci_mode *mode)
176362306a36Sopenharmony_ci{
176462306a36Sopenharmony_ci	u32 reg;
176562306a36Sopenharmony_ci
176662306a36Sopenharmony_ci	if (mode->mode_tag == priv->venc.current_mode)
176762306a36Sopenharmony_ci		return;
176862306a36Sopenharmony_ci
176962306a36Sopenharmony_ci	/* CVBS Filter settings */
177062306a36Sopenharmony_ci	writel_relaxed(ENCI_CFILT_CMPT_SEL_HIGH | 0x10,
177162306a36Sopenharmony_ci		       priv->io_base + _REG(ENCI_CFILT_CTRL));
177262306a36Sopenharmony_ci	writel_relaxed(ENCI_CFILT_CMPT_CR_DLY(2) |
177362306a36Sopenharmony_ci		       ENCI_CFILT_CMPT_CB_DLY(1),
177462306a36Sopenharmony_ci		       priv->io_base + _REG(ENCI_CFILT_CTRL2));
177562306a36Sopenharmony_ci
177662306a36Sopenharmony_ci	/* Digital Video Select : Interlace, clk27 clk, external */
177762306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_DVI_SETTING));
177862306a36Sopenharmony_ci
177962306a36Sopenharmony_ci	/* Reset Video Mode */
178062306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCI_VIDEO_MODE));
178162306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCI_VIDEO_MODE_ADV));
178262306a36Sopenharmony_ci
178362306a36Sopenharmony_ci	/* Horizontal sync signal output */
178462306a36Sopenharmony_ci	writel_relaxed(mode->hso_begin,
178562306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_SYNC_HSO_BEGIN));
178662306a36Sopenharmony_ci	writel_relaxed(mode->hso_end,
178762306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_SYNC_HSO_END));
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci	/* Vertical Sync lines */
179062306a36Sopenharmony_ci	writel_relaxed(mode->vso_even,
179162306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_SYNC_VSO_EVNLN));
179262306a36Sopenharmony_ci	writel_relaxed(mode->vso_odd,
179362306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_SYNC_VSO_ODDLN));
179462306a36Sopenharmony_ci
179562306a36Sopenharmony_ci	/* Macrovision max amplitude change */
179662306a36Sopenharmony_ci	writel_relaxed(ENCI_MACV_MAX_AMP_ENABLE_CHANGE |
179762306a36Sopenharmony_ci		       ENCI_MACV_MAX_AMP_VAL(mode->macv_max_amp),
179862306a36Sopenharmony_ci		       priv->io_base + _REG(ENCI_MACV_MAX_AMP));
179962306a36Sopenharmony_ci
180062306a36Sopenharmony_ci	/* Video mode */
180162306a36Sopenharmony_ci	writel_relaxed(mode->video_prog_mode,
180262306a36Sopenharmony_ci			priv->io_base + _REG(VENC_VIDEO_PROG_MODE));
180362306a36Sopenharmony_ci	writel_relaxed(mode->video_mode,
180462306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VIDEO_MODE));
180562306a36Sopenharmony_ci
180662306a36Sopenharmony_ci	/*
180762306a36Sopenharmony_ci	 * Advanced Video Mode :
180862306a36Sopenharmony_ci	 * Demux shifting 0x2
180962306a36Sopenharmony_ci	 * Blank line end at line17/22
181062306a36Sopenharmony_ci	 * High bandwidth Luma Filter
181162306a36Sopenharmony_ci	 * Low bandwidth Chroma Filter
181262306a36Sopenharmony_ci	 * Bypass luma low pass filter
181362306a36Sopenharmony_ci	 * No macrovision on CSYNC
181462306a36Sopenharmony_ci	 */
181562306a36Sopenharmony_ci	writel_relaxed(ENCI_VIDEO_MODE_ADV_DMXMD(2) |
181662306a36Sopenharmony_ci		       ENCI_VIDEO_MODE_ADV_VBICTL_LINE_17_22 |
181762306a36Sopenharmony_ci		       ENCI_VIDEO_MODE_ADV_YBW_HIGH,
181862306a36Sopenharmony_ci		       priv->io_base + _REG(ENCI_VIDEO_MODE_ADV));
181962306a36Sopenharmony_ci
182062306a36Sopenharmony_ci	writel(mode->sch_adjust, priv->io_base + _REG(ENCI_VIDEO_SCH));
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	/* Sync mode : MASTER Master mode, free run, send HSO/VSO out */
182362306a36Sopenharmony_ci	writel_relaxed(0x07, priv->io_base + _REG(ENCI_SYNC_MODE));
182462306a36Sopenharmony_ci
182562306a36Sopenharmony_ci	/* 0x3 Y, C, and Component Y delay */
182662306a36Sopenharmony_ci	writel_relaxed(mode->yc_delay, priv->io_base + _REG(ENCI_YC_DELAY));
182762306a36Sopenharmony_ci
182862306a36Sopenharmony_ci	/* Timings */
182962306a36Sopenharmony_ci	writel_relaxed(mode->pixel_start,
183062306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_PIXEL_START));
183162306a36Sopenharmony_ci	writel_relaxed(mode->pixel_end,
183262306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_PIXEL_END));
183362306a36Sopenharmony_ci
183462306a36Sopenharmony_ci	writel_relaxed(mode->top_field_line_start,
183562306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_TOP_START));
183662306a36Sopenharmony_ci	writel_relaxed(mode->top_field_line_end,
183762306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_TOP_END));
183862306a36Sopenharmony_ci
183962306a36Sopenharmony_ci	writel_relaxed(mode->bottom_field_line_start,
184062306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_BOT_START));
184162306a36Sopenharmony_ci	writel_relaxed(mode->bottom_field_line_end,
184262306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VFIFO2VD_LINE_BOT_END));
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_ci	/* Internal Venc, Internal VIU Sync, Internal Vencoder */
184562306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_SYNC_ROUTE));
184662306a36Sopenharmony_ci
184762306a36Sopenharmony_ci	/* UNreset Interlaced TV Encoder */
184862306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCI_DBG_PX_RST));
184962306a36Sopenharmony_ci
185062306a36Sopenharmony_ci	/*
185162306a36Sopenharmony_ci	 * Enable Vfifo2vd and set Y_Cb_Y_Cr:
185262306a36Sopenharmony_ci	 * Corresponding value:
185362306a36Sopenharmony_ci	 * Y  => 00 or 10
185462306a36Sopenharmony_ci	 * Cb => 01
185562306a36Sopenharmony_ci	 * Cr => 11
185662306a36Sopenharmony_ci	 * Ex: 0x4e => 01001110 would mean Cb/Y/Cr/Y
185762306a36Sopenharmony_ci	 */
185862306a36Sopenharmony_ci	writel_relaxed(ENCI_VFIFO2VD_CTL_ENABLE |
185962306a36Sopenharmony_ci		       ENCI_VFIFO2VD_CTL_VD_SEL(0x4e),
186062306a36Sopenharmony_ci		       priv->io_base + _REG(ENCI_VFIFO2VD_CTL));
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_ci	/* Power UP Dacs */
186362306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_VDAC_SETTING));
186462306a36Sopenharmony_ci
186562306a36Sopenharmony_ci	/* Video Upsampling */
186662306a36Sopenharmony_ci	/*
186762306a36Sopenharmony_ci	 * CTRL0, CTRL1 and CTRL2:
186862306a36Sopenharmony_ci	 * Filter0: input data sample every 2 cloks
186962306a36Sopenharmony_ci	 * Filter1: filtering and upsample enable
187062306a36Sopenharmony_ci	 */
187162306a36Sopenharmony_ci	reg = VENC_UPSAMPLE_CTRL_F0_2_CLK_RATIO | VENC_UPSAMPLE_CTRL_F1_EN |
187262306a36Sopenharmony_ci		VENC_UPSAMPLE_CTRL_F1_UPSAMPLE_EN;
187362306a36Sopenharmony_ci
187462306a36Sopenharmony_ci	/*
187562306a36Sopenharmony_ci	 * Upsample CTRL0:
187662306a36Sopenharmony_ci	 * Interlace High Bandwidth Luma
187762306a36Sopenharmony_ci	 */
187862306a36Sopenharmony_ci	writel_relaxed(VENC_UPSAMPLE_CTRL_INTERLACE_HIGH_LUMA | reg,
187962306a36Sopenharmony_ci		       priv->io_base + _REG(VENC_UPSAMPLE_CTRL0));
188062306a36Sopenharmony_ci
188162306a36Sopenharmony_ci	/*
188262306a36Sopenharmony_ci	 * Upsample CTRL1:
188362306a36Sopenharmony_ci	 * Interlace Pb
188462306a36Sopenharmony_ci	 */
188562306a36Sopenharmony_ci	writel_relaxed(VENC_UPSAMPLE_CTRL_INTERLACE_PB | reg,
188662306a36Sopenharmony_ci		       priv->io_base + _REG(VENC_UPSAMPLE_CTRL1));
188762306a36Sopenharmony_ci
188862306a36Sopenharmony_ci	/*
188962306a36Sopenharmony_ci	 * Upsample CTRL2:
189062306a36Sopenharmony_ci	 * Interlace R
189162306a36Sopenharmony_ci	 */
189262306a36Sopenharmony_ci	writel_relaxed(VENC_UPSAMPLE_CTRL_INTERLACE_PR | reg,
189362306a36Sopenharmony_ci		       priv->io_base + _REG(VENC_UPSAMPLE_CTRL2));
189462306a36Sopenharmony_ci
189562306a36Sopenharmony_ci	/* Select Interlace Y DACs */
189662306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_VDAC_DACSEL0));
189762306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_VDAC_DACSEL1));
189862306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_VDAC_DACSEL2));
189962306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_VDAC_DACSEL3));
190062306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_VDAC_DACSEL4));
190162306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_VDAC_DACSEL5));
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci	/* Select ENCI for VIU */
190462306a36Sopenharmony_ci	meson_vpp_setup_mux(priv, MESON_VIU_VPP_MUX_ENCI);
190562306a36Sopenharmony_ci
190662306a36Sopenharmony_ci	/* Enable ENCI FIFO */
190762306a36Sopenharmony_ci	writel_relaxed(VENC_VDAC_FIFO_EN_ENCI_ENABLE,
190862306a36Sopenharmony_ci		       priv->io_base + _REG(VENC_VDAC_FIFO_CTRL));
190962306a36Sopenharmony_ci
191062306a36Sopenharmony_ci	/* Select ENCI DACs 0, 1, 4, and 5 */
191162306a36Sopenharmony_ci	writel_relaxed(0x11, priv->io_base + _REG(ENCI_DACSEL_0));
191262306a36Sopenharmony_ci	writel_relaxed(0x11, priv->io_base + _REG(ENCI_DACSEL_1));
191362306a36Sopenharmony_ci
191462306a36Sopenharmony_ci	/* Interlace video enable */
191562306a36Sopenharmony_ci	writel_relaxed(ENCI_VIDEO_EN_ENABLE,
191662306a36Sopenharmony_ci		       priv->io_base + _REG(ENCI_VIDEO_EN));
191762306a36Sopenharmony_ci
191862306a36Sopenharmony_ci	/* Configure Video Saturation / Contrast / Brightness / Hue */
191962306a36Sopenharmony_ci	writel_relaxed(mode->video_saturation,
192062306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VIDEO_SAT));
192162306a36Sopenharmony_ci	writel_relaxed(mode->video_contrast,
192262306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VIDEO_CONT));
192362306a36Sopenharmony_ci	writel_relaxed(mode->video_brightness,
192462306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VIDEO_BRIGHT));
192562306a36Sopenharmony_ci	writel_relaxed(mode->video_hue,
192662306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_VIDEO_HUE));
192762306a36Sopenharmony_ci
192862306a36Sopenharmony_ci	/* Enable DAC0 Filter */
192962306a36Sopenharmony_ci	writel_relaxed(VENC_VDAC_DAC0_FILT_CTRL0_EN,
193062306a36Sopenharmony_ci		       priv->io_base + _REG(VENC_VDAC_DAC0_FILT_CTRL0));
193162306a36Sopenharmony_ci	writel_relaxed(0xfc48, priv->io_base + _REG(VENC_VDAC_DAC0_FILT_CTRL1));
193262306a36Sopenharmony_ci
193362306a36Sopenharmony_ci	/* 0 in Macrovision register 0 */
193462306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCI_MACV_N0));
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci	/* Analog Synchronization and color burst value adjust */
193762306a36Sopenharmony_ci	writel_relaxed(mode->analog_sync_adj,
193862306a36Sopenharmony_ci			priv->io_base + _REG(ENCI_SYNC_ADJ));
193962306a36Sopenharmony_ci
194062306a36Sopenharmony_ci	priv->venc.current_mode = mode->mode_tag;
194162306a36Sopenharmony_ci}
194262306a36Sopenharmony_ci
194362306a36Sopenharmony_ci/* Returns the current ENCI field polarity */
194462306a36Sopenharmony_ciunsigned int meson_venci_get_field(struct meson_drm *priv)
194562306a36Sopenharmony_ci{
194662306a36Sopenharmony_ci	return readl_relaxed(priv->io_base + _REG(ENCI_INFO_READ)) & BIT(29);
194762306a36Sopenharmony_ci}
194862306a36Sopenharmony_ci
194962306a36Sopenharmony_civoid meson_venc_enable_vsync(struct meson_drm *priv)
195062306a36Sopenharmony_ci{
195162306a36Sopenharmony_ci	switch (priv->venc.current_mode) {
195262306a36Sopenharmony_ci	case MESON_VENC_MODE_MIPI_DSI:
195362306a36Sopenharmony_ci		writel_relaxed(VENC_INTCTRL_ENCP_LNRST_INT_EN,
195462306a36Sopenharmony_ci			       priv->io_base + _REG(VENC_INTCTRL));
195562306a36Sopenharmony_ci		break;
195662306a36Sopenharmony_ci	default:
195762306a36Sopenharmony_ci		writel_relaxed(VENC_INTCTRL_ENCI_LNRST_INT_EN,
195862306a36Sopenharmony_ci			       priv->io_base + _REG(VENC_INTCTRL));
195962306a36Sopenharmony_ci	}
196062306a36Sopenharmony_ci	regmap_update_bits(priv->hhi, HHI_GCLK_MPEG2, BIT(25), BIT(25));
196162306a36Sopenharmony_ci}
196262306a36Sopenharmony_ci
196362306a36Sopenharmony_civoid meson_venc_disable_vsync(struct meson_drm *priv)
196462306a36Sopenharmony_ci{
196562306a36Sopenharmony_ci	regmap_update_bits(priv->hhi, HHI_GCLK_MPEG2, BIT(25), 0);
196662306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(VENC_INTCTRL));
196762306a36Sopenharmony_ci}
196862306a36Sopenharmony_ci
196962306a36Sopenharmony_civoid meson_venc_init(struct meson_drm *priv)
197062306a36Sopenharmony_ci{
197162306a36Sopenharmony_ci	/* Disable CVBS VDAC */
197262306a36Sopenharmony_ci	if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) {
197362306a36Sopenharmony_ci		regmap_write(priv->hhi, HHI_VDAC_CNTL0_G12A, 0);
197462306a36Sopenharmony_ci		regmap_write(priv->hhi, HHI_VDAC_CNTL1_G12A, 8);
197562306a36Sopenharmony_ci	} else {
197662306a36Sopenharmony_ci		regmap_write(priv->hhi, HHI_VDAC_CNTL0, 0);
197762306a36Sopenharmony_ci		regmap_write(priv->hhi, HHI_VDAC_CNTL1, 8);
197862306a36Sopenharmony_ci	}
197962306a36Sopenharmony_ci
198062306a36Sopenharmony_ci	/* Power Down Dacs */
198162306a36Sopenharmony_ci	writel_relaxed(0xff, priv->io_base + _REG(VENC_VDAC_SETTING));
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_ci	/* Disable HDMI PHY */
198462306a36Sopenharmony_ci	regmap_write(priv->hhi, HHI_HDMI_PHY_CNTL0, 0);
198562306a36Sopenharmony_ci
198662306a36Sopenharmony_ci	/* Disable HDMI */
198762306a36Sopenharmony_ci	writel_bits_relaxed(VPU_HDMI_ENCI_DATA_TO_HDMI |
198862306a36Sopenharmony_ci			    VPU_HDMI_ENCP_DATA_TO_HDMI, 0,
198962306a36Sopenharmony_ci			    priv->io_base + _REG(VPU_HDMI_SETTING));
199062306a36Sopenharmony_ci
199162306a36Sopenharmony_ci	/* Disable all encoders */
199262306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCI_VIDEO_EN));
199362306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCP_VIDEO_EN));
199462306a36Sopenharmony_ci	writel_relaxed(0, priv->io_base + _REG(ENCL_VIDEO_EN));
199562306a36Sopenharmony_ci
199662306a36Sopenharmony_ci	/* Disable VSync IRQ */
199762306a36Sopenharmony_ci	meson_venc_disable_vsync(priv);
199862306a36Sopenharmony_ci
199962306a36Sopenharmony_ci	priv->venc.current_mode = MESON_VENC_MODE_NONE;
200062306a36Sopenharmony_ci}
2001