162306a36Sopenharmony_ci#ifndef _VC4_HDMI_REGS_H_
262306a36Sopenharmony_ci#define _VC4_HDMI_REGS_H_
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/pm_runtime.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "vc4_hdmi.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define VC4_HDMI_PACKET_STRIDE			0x24
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cienum vc4_hdmi_regs {
1162306a36Sopenharmony_ci	VC4_INVALID = 0,
1262306a36Sopenharmony_ci	VC4_HDMI,
1362306a36Sopenharmony_ci	VC4_HD,
1462306a36Sopenharmony_ci	VC5_CEC,
1562306a36Sopenharmony_ci	VC5_CSC,
1662306a36Sopenharmony_ci	VC5_DVP,
1762306a36Sopenharmony_ci	VC5_PHY,
1862306a36Sopenharmony_ci	VC5_RAM,
1962306a36Sopenharmony_ci	VC5_RM,
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cienum vc4_hdmi_field {
2362306a36Sopenharmony_ci	HDMI_AUDIO_PACKET_CONFIG,
2462306a36Sopenharmony_ci	HDMI_CEC_CNTRL_1,
2562306a36Sopenharmony_ci	HDMI_CEC_CNTRL_2,
2662306a36Sopenharmony_ci	HDMI_CEC_CNTRL_3,
2762306a36Sopenharmony_ci	HDMI_CEC_CNTRL_4,
2862306a36Sopenharmony_ci	HDMI_CEC_CNTRL_5,
2962306a36Sopenharmony_ci	HDMI_CEC_CPU_CLEAR,
3062306a36Sopenharmony_ci	HDMI_CEC_CPU_MASK_CLEAR,
3162306a36Sopenharmony_ci	HDMI_CEC_CPU_MASK_SET,
3262306a36Sopenharmony_ci	HDMI_CEC_CPU_MASK_STATUS,
3362306a36Sopenharmony_ci	HDMI_CEC_CPU_STATUS,
3462306a36Sopenharmony_ci	HDMI_CEC_CPU_SET,
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	/*
3762306a36Sopenharmony_ci	 * Transmit data, first byte is low byte of the 32-bit reg.
3862306a36Sopenharmony_ci	 * MSB of each byte transmitted first.
3962306a36Sopenharmony_ci	 */
4062306a36Sopenharmony_ci	HDMI_CEC_RX_DATA_1,
4162306a36Sopenharmony_ci	HDMI_CEC_RX_DATA_2,
4262306a36Sopenharmony_ci	HDMI_CEC_RX_DATA_3,
4362306a36Sopenharmony_ci	HDMI_CEC_RX_DATA_4,
4462306a36Sopenharmony_ci	HDMI_CEC_TX_DATA_1,
4562306a36Sopenharmony_ci	HDMI_CEC_TX_DATA_2,
4662306a36Sopenharmony_ci	HDMI_CEC_TX_DATA_3,
4762306a36Sopenharmony_ci	HDMI_CEC_TX_DATA_4,
4862306a36Sopenharmony_ci	HDMI_CLOCK_STOP,
4962306a36Sopenharmony_ci	HDMI_CORE_REV,
5062306a36Sopenharmony_ci	HDMI_CRP_CFG,
5162306a36Sopenharmony_ci	HDMI_CSC_12_11,
5262306a36Sopenharmony_ci	HDMI_CSC_14_13,
5362306a36Sopenharmony_ci	HDMI_CSC_22_21,
5462306a36Sopenharmony_ci	HDMI_CSC_24_23,
5562306a36Sopenharmony_ci	HDMI_CSC_32_31,
5662306a36Sopenharmony_ci	HDMI_CSC_34_33,
5762306a36Sopenharmony_ci	HDMI_CSC_CHANNEL_CTL,
5862306a36Sopenharmony_ci	HDMI_CSC_CTL,
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	/*
6162306a36Sopenharmony_ci	 * 20-bit fields containing CTS values to be transmitted if
6262306a36Sopenharmony_ci	 * !EXTERNAL_CTS_EN
6362306a36Sopenharmony_ci	 */
6462306a36Sopenharmony_ci	HDMI_CTS_0,
6562306a36Sopenharmony_ci	HDMI_CTS_1,
6662306a36Sopenharmony_ci	HDMI_DEEP_COLOR_CONFIG_1,
6762306a36Sopenharmony_ci	HDMI_DVP_CTL,
6862306a36Sopenharmony_ci	HDMI_FIFO_CTL,
6962306a36Sopenharmony_ci	HDMI_FRAME_COUNT,
7062306a36Sopenharmony_ci	HDMI_GCP_CONFIG,
7162306a36Sopenharmony_ci	HDMI_GCP_WORD_1,
7262306a36Sopenharmony_ci	HDMI_HORZA,
7362306a36Sopenharmony_ci	HDMI_HORZB,
7462306a36Sopenharmony_ci	HDMI_HOTPLUG,
7562306a36Sopenharmony_ci	HDMI_HOTPLUG_INT,
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	/*
7862306a36Sopenharmony_ci	 * 3 bits per field, where each field maps from that
7962306a36Sopenharmony_ci	 * corresponding MAI bus channel to the given HDMI channel.
8062306a36Sopenharmony_ci	 */
8162306a36Sopenharmony_ci	HDMI_MAI_CHANNEL_MAP,
8262306a36Sopenharmony_ci	HDMI_MAI_CONFIG,
8362306a36Sopenharmony_ci	HDMI_MAI_CTL,
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	/*
8662306a36Sopenharmony_ci	 * Register for DMAing in audio data to be transported over
8762306a36Sopenharmony_ci	 * the MAI bus to the Falcon core.
8862306a36Sopenharmony_ci	 */
8962306a36Sopenharmony_ci	HDMI_MAI_DATA,
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	/* Format header to be placed on the MAI data. Unused. */
9262306a36Sopenharmony_ci	HDMI_MAI_FMT,
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	/* Last received format word on the MAI bus. */
9562306a36Sopenharmony_ci	HDMI_MAI_FORMAT,
9662306a36Sopenharmony_ci	HDMI_MAI_SMP,
9762306a36Sopenharmony_ci	HDMI_MAI_THR,
9862306a36Sopenharmony_ci	HDMI_M_CTL,
9962306a36Sopenharmony_ci	HDMI_RAM_PACKET_CONFIG,
10062306a36Sopenharmony_ci	HDMI_RAM_PACKET_START,
10162306a36Sopenharmony_ci	HDMI_RAM_PACKET_STATUS,
10262306a36Sopenharmony_ci	HDMI_RM_CONTROL,
10362306a36Sopenharmony_ci	HDMI_RM_FORMAT,
10462306a36Sopenharmony_ci	HDMI_RM_OFFSET,
10562306a36Sopenharmony_ci	HDMI_SCHEDULER_CONTROL,
10662306a36Sopenharmony_ci	HDMI_SCRAMBLER_CTL,
10762306a36Sopenharmony_ci	HDMI_SW_RESET_CONTROL,
10862306a36Sopenharmony_ci	HDMI_TX_PHY_CHANNEL_SWAP,
10962306a36Sopenharmony_ci	HDMI_TX_PHY_CLK_DIV,
11062306a36Sopenharmony_ci	HDMI_TX_PHY_CTL_0,
11162306a36Sopenharmony_ci	HDMI_TX_PHY_CTL_1,
11262306a36Sopenharmony_ci	HDMI_TX_PHY_CTL_2,
11362306a36Sopenharmony_ci	HDMI_TX_PHY_CTL_3,
11462306a36Sopenharmony_ci	HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1,
11562306a36Sopenharmony_ci	HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2,
11662306a36Sopenharmony_ci	HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4,
11762306a36Sopenharmony_ci	HDMI_TX_PHY_PLL_CFG,
11862306a36Sopenharmony_ci	HDMI_TX_PHY_PLL_CTL_0,
11962306a36Sopenharmony_ci	HDMI_TX_PHY_PLL_CTL_1,
12062306a36Sopenharmony_ci	HDMI_TX_PHY_POWERDOWN_CTL,
12162306a36Sopenharmony_ci	HDMI_TX_PHY_RESET_CTL,
12262306a36Sopenharmony_ci	HDMI_TX_PHY_TMDS_CLK_WORD_SEL,
12362306a36Sopenharmony_ci	HDMI_VEC_INTERFACE_CFG,
12462306a36Sopenharmony_ci	HDMI_VEC_INTERFACE_XBAR,
12562306a36Sopenharmony_ci	HDMI_VERTA0,
12662306a36Sopenharmony_ci	HDMI_VERTA1,
12762306a36Sopenharmony_ci	HDMI_VERTB0,
12862306a36Sopenharmony_ci	HDMI_VERTB1,
12962306a36Sopenharmony_ci	HDMI_VID_CTL,
13062306a36Sopenharmony_ci	HDMI_MISC_CONTROL,
13162306a36Sopenharmony_ci	HDMI_FORMAT_DET_1,
13262306a36Sopenharmony_ci	HDMI_FORMAT_DET_2,
13362306a36Sopenharmony_ci	HDMI_FORMAT_DET_3,
13462306a36Sopenharmony_ci	HDMI_FORMAT_DET_4,
13562306a36Sopenharmony_ci	HDMI_FORMAT_DET_5,
13662306a36Sopenharmony_ci	HDMI_FORMAT_DET_6,
13762306a36Sopenharmony_ci	HDMI_FORMAT_DET_7,
13862306a36Sopenharmony_ci	HDMI_FORMAT_DET_8,
13962306a36Sopenharmony_ci	HDMI_FORMAT_DET_9,
14062306a36Sopenharmony_ci	HDMI_FORMAT_DET_10,
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistruct vc4_hdmi_register {
14462306a36Sopenharmony_ci	char *name;
14562306a36Sopenharmony_ci	enum vc4_hdmi_regs reg;
14662306a36Sopenharmony_ci	unsigned int offset;
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci#define _VC4_REG(_base, _reg, _offset)	\
15062306a36Sopenharmony_ci	[_reg] = {				\
15162306a36Sopenharmony_ci		.name = #_reg,			\
15262306a36Sopenharmony_ci		.reg = _base,			\
15362306a36Sopenharmony_ci		.offset = _offset,		\
15462306a36Sopenharmony_ci	}
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci#define VC4_HD_REG(reg, offset)		_VC4_REG(VC4_HD, reg, offset)
15762306a36Sopenharmony_ci#define VC4_HDMI_REG(reg, offset)	_VC4_REG(VC4_HDMI, reg, offset)
15862306a36Sopenharmony_ci#define VC5_CEC_REG(reg, offset)	_VC4_REG(VC5_CEC, reg, offset)
15962306a36Sopenharmony_ci#define VC5_CSC_REG(reg, offset)	_VC4_REG(VC5_CSC, reg, offset)
16062306a36Sopenharmony_ci#define VC5_DVP_REG(reg, offset)	_VC4_REG(VC5_DVP, reg, offset)
16162306a36Sopenharmony_ci#define VC5_PHY_REG(reg, offset)	_VC4_REG(VC5_PHY, reg, offset)
16262306a36Sopenharmony_ci#define VC5_RAM_REG(reg, offset)	_VC4_REG(VC5_RAM, reg, offset)
16362306a36Sopenharmony_ci#define VC5_RM_REG(reg, offset)		_VC4_REG(VC5_RM, reg, offset)
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistatic const struct vc4_hdmi_register __maybe_unused vc4_hdmi_fields[] = {
16662306a36Sopenharmony_ci	VC4_HD_REG(HDMI_M_CTL, 0x000c),
16762306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_CTL, 0x0014),
16862306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_THR, 0x0018),
16962306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_FMT, 0x001c),
17062306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_DATA, 0x0020),
17162306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_SMP, 0x002c),
17262306a36Sopenharmony_ci	VC4_HD_REG(HDMI_VID_CTL, 0x0038),
17362306a36Sopenharmony_ci	VC4_HD_REG(HDMI_CSC_CTL, 0x0040),
17462306a36Sopenharmony_ci	VC4_HD_REG(HDMI_CSC_12_11, 0x0044),
17562306a36Sopenharmony_ci	VC4_HD_REG(HDMI_CSC_14_13, 0x0048),
17662306a36Sopenharmony_ci	VC4_HD_REG(HDMI_CSC_22_21, 0x004c),
17762306a36Sopenharmony_ci	VC4_HD_REG(HDMI_CSC_24_23, 0x0050),
17862306a36Sopenharmony_ci	VC4_HD_REG(HDMI_CSC_32_31, 0x0054),
17962306a36Sopenharmony_ci	VC4_HD_REG(HDMI_CSC_34_33, 0x0058),
18062306a36Sopenharmony_ci	VC4_HD_REG(HDMI_FRAME_COUNT, 0x0068),
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CORE_REV, 0x0000),
18362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_SW_RESET_CONTROL, 0x0004),
18462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HOTPLUG_INT, 0x0008),
18562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HOTPLUG, 0x000c),
18662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FIFO_CTL, 0x005c),
18762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x0090),
18862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0094),
18962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MAI_FORMAT, 0x0098),
19062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_AUDIO_PACKET_CONFIG, 0x009c),
19162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_RAM_PACKET_CONFIG, 0x00a0),
19262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_RAM_PACKET_STATUS, 0x00a4),
19362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CRP_CFG, 0x00a8),
19462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CTS_0, 0x00ac),
19562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CTS_1, 0x00b0),
19662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_SCHEDULER_CONTROL, 0x00c0),
19762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HORZA, 0x00c4),
19862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HORZB, 0x00c8),
19962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTA0, 0x00cc),
20062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTB0, 0x00d0),
20162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTA1, 0x00d4),
20262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTB1, 0x00d8),
20362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MISC_CONTROL, 0x00e4),
20462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CNTRL_1, 0x00e8),
20562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CNTRL_2, 0x00ec),
20662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CNTRL_3, 0x00f0),
20762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CNTRL_4, 0x00f4),
20862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CNTRL_5, 0x00f8),
20962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_TX_DATA_1, 0x00fc),
21062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_TX_DATA_2, 0x0100),
21162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_TX_DATA_3, 0x0104),
21262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_TX_DATA_4, 0x0108),
21362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_RX_DATA_1, 0x010c),
21462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_RX_DATA_2, 0x0110),
21562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_RX_DATA_3, 0x0114),
21662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_RX_DATA_4, 0x0118),
21762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_TX_PHY_RESET_CTL, 0x02c0),
21862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_TX_PHY_CTL_0, 0x02c4),
21962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CPU_STATUS, 0x0340),
22062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CPU_SET, 0x0344),
22162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CPU_CLEAR, 0x0348),
22262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CPU_MASK_STATUS, 0x034c),
22362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CPU_MASK_SET, 0x0350),
22462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CEC_CPU_MASK_CLEAR, 0x0354),
22562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_RAM_PACKET_START, 0x0400),
22662306a36Sopenharmony_ci};
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_cistatic const struct vc4_hdmi_register __maybe_unused vc5_hdmi_hdmi0_fields[] = {
22962306a36Sopenharmony_ci	VC4_HD_REG(HDMI_DVP_CTL, 0x0000),
23062306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_CTL, 0x0010),
23162306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_THR, 0x0014),
23262306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_FMT, 0x0018),
23362306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_DATA, 0x001c),
23462306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_SMP, 0x0020),
23562306a36Sopenharmony_ci	VC4_HD_REG(HDMI_VID_CTL, 0x0044),
23662306a36Sopenharmony_ci	VC4_HD_REG(HDMI_FRAME_COUNT, 0x0060),
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FIFO_CTL, 0x074),
23962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_AUDIO_PACKET_CONFIG, 0x0b8),
24062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_RAM_PACKET_CONFIG, 0x0bc),
24162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_RAM_PACKET_STATUS, 0x0c4),
24262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CRP_CFG, 0x0c8),
24362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CTS_0, 0x0cc),
24462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CTS_1, 0x0d0),
24562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_SCHEDULER_CONTROL, 0x0e0),
24662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HORZA, 0x0e4),
24762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HORZB, 0x0e8),
24862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTA0, 0x0ec),
24962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTB0, 0x0f0),
25062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTA1, 0x0f4),
25162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTB1, 0x0f8),
25262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MISC_CONTROL, 0x100),
25362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x09c),
25462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0a0),
25562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_1, 0x134),
25662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_2, 0x138),
25762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_3, 0x13c),
25862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_4, 0x140),
25962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_5, 0x144),
26062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_6, 0x148),
26162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_7, 0x14c),
26262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_8, 0x150),
26362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_9, 0x154),
26462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_10, 0x158),
26562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_DEEP_COLOR_CONFIG_1, 0x170),
26662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_GCP_CONFIG, 0x178),
26762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_GCP_WORD_1, 0x17c),
26862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HOTPLUG, 0x1a8),
26962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_SCRAMBLER_CTL, 0x1c4),
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	VC5_DVP_REG(HDMI_CLOCK_STOP, 0x0bc),
27262306a36Sopenharmony_ci	VC5_DVP_REG(HDMI_VEC_INTERFACE_CFG, 0x0ec),
27362306a36Sopenharmony_ci	VC5_DVP_REG(HDMI_VEC_INTERFACE_XBAR, 0x0f0),
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_RESET_CTL, 0x000),
27662306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_POWERDOWN_CTL, 0x004),
27762306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_0, 0x008),
27862306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_1, 0x00c),
27962306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_2, 0x010),
28062306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_3, 0x014),
28162306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_0, 0x01c),
28262306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_1, 0x020),
28362306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CLK_DIV, 0x028),
28462306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CFG, 0x034),
28562306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_TMDS_CLK_WORD_SEL, 0x044),
28662306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CHANNEL_SWAP, 0x04c),
28762306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1, 0x050),
28862306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2, 0x054),
28962306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4, 0x05c),
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	VC5_RM_REG(HDMI_RM_CONTROL, 0x000),
29262306a36Sopenharmony_ci	VC5_RM_REG(HDMI_RM_OFFSET, 0x018),
29362306a36Sopenharmony_ci	VC5_RM_REG(HDMI_RM_FORMAT, 0x01c),
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	VC5_RAM_REG(HDMI_RAM_PACKET_START, 0x000),
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_1, 0x010),
29862306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_2, 0x014),
29962306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_3, 0x018),
30062306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_4, 0x01c),
30162306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_5, 0x020),
30262306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_1, 0x028),
30362306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_2, 0x02c),
30462306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_3, 0x030),
30562306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_4, 0x034),
30662306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_1, 0x038),
30762306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_2, 0x03c),
30862306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_3, 0x040),
30962306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_4, 0x044),
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_CTL, 0x000),
31262306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_12_11, 0x004),
31362306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_14_13, 0x008),
31462306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_22_21, 0x00c),
31562306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_24_23, 0x010),
31662306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_32_31, 0x014),
31762306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_34_33, 0x018),
31862306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_CHANNEL_CTL, 0x02c),
31962306a36Sopenharmony_ci};
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistatic const struct vc4_hdmi_register __maybe_unused vc5_hdmi_hdmi1_fields[] = {
32262306a36Sopenharmony_ci	VC4_HD_REG(HDMI_DVP_CTL, 0x0000),
32362306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_CTL, 0x0030),
32462306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_THR, 0x0034),
32562306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_FMT, 0x0038),
32662306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_DATA, 0x003c),
32762306a36Sopenharmony_ci	VC4_HD_REG(HDMI_MAI_SMP, 0x0040),
32862306a36Sopenharmony_ci	VC4_HD_REG(HDMI_VID_CTL, 0x0048),
32962306a36Sopenharmony_ci	VC4_HD_REG(HDMI_FRAME_COUNT, 0x0064),
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FIFO_CTL, 0x074),
33262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_AUDIO_PACKET_CONFIG, 0x0b8),
33362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_RAM_PACKET_CONFIG, 0x0bc),
33462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_RAM_PACKET_STATUS, 0x0c4),
33562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CRP_CFG, 0x0c8),
33662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CTS_0, 0x0cc),
33762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_CTS_1, 0x0d0),
33862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_SCHEDULER_CONTROL, 0x0e0),
33962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HORZA, 0x0e4),
34062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HORZB, 0x0e8),
34162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTA0, 0x0ec),
34262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTB0, 0x0f0),
34362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTA1, 0x0f4),
34462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_VERTB1, 0x0f8),
34562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MISC_CONTROL, 0x100),
34662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x09c),
34762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0a0),
34862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_1, 0x134),
34962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_2, 0x138),
35062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_3, 0x13c),
35162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_4, 0x140),
35262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_5, 0x144),
35362306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_6, 0x148),
35462306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_7, 0x14c),
35562306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_8, 0x150),
35662306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_9, 0x154),
35762306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_FORMAT_DET_10, 0x158),
35862306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_DEEP_COLOR_CONFIG_1, 0x170),
35962306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_GCP_CONFIG, 0x178),
36062306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_GCP_WORD_1, 0x17c),
36162306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_HOTPLUG, 0x1a8),
36262306a36Sopenharmony_ci	VC4_HDMI_REG(HDMI_SCRAMBLER_CTL, 0x1c4),
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci	VC5_DVP_REG(HDMI_CLOCK_STOP, 0x0bc),
36562306a36Sopenharmony_ci	VC5_DVP_REG(HDMI_VEC_INTERFACE_CFG, 0x0ec),
36662306a36Sopenharmony_ci	VC5_DVP_REG(HDMI_VEC_INTERFACE_XBAR, 0x0f0),
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_RESET_CTL, 0x000),
36962306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_POWERDOWN_CTL, 0x004),
37062306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_0, 0x008),
37162306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_1, 0x00c),
37262306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_2, 0x010),
37362306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CTL_3, 0x014),
37462306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_0, 0x01c),
37562306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_1, 0x020),
37662306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CLK_DIV, 0x028),
37762306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CFG, 0x034),
37862306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_CHANNEL_SWAP, 0x04c),
37962306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_TMDS_CLK_WORD_SEL, 0x044),
38062306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1, 0x050),
38162306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2, 0x054),
38262306a36Sopenharmony_ci	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4, 0x05c),
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci	VC5_RM_REG(HDMI_RM_CONTROL, 0x000),
38562306a36Sopenharmony_ci	VC5_RM_REG(HDMI_RM_OFFSET, 0x018),
38662306a36Sopenharmony_ci	VC5_RM_REG(HDMI_RM_FORMAT, 0x01c),
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci	VC5_RAM_REG(HDMI_RAM_PACKET_START, 0x000),
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_1, 0x010),
39162306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_2, 0x014),
39262306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_3, 0x018),
39362306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_4, 0x01c),
39462306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_CNTRL_5, 0x020),
39562306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_1, 0x028),
39662306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_2, 0x02c),
39762306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_3, 0x030),
39862306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_TX_DATA_4, 0x034),
39962306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_1, 0x038),
40062306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_2, 0x03c),
40162306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_3, 0x040),
40262306a36Sopenharmony_ci	VC5_CEC_REG(HDMI_CEC_RX_DATA_4, 0x044),
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_CTL, 0x000),
40562306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_12_11, 0x004),
40662306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_14_13, 0x008),
40762306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_22_21, 0x00c),
40862306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_24_23, 0x010),
40962306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_32_31, 0x014),
41062306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_34_33, 0x018),
41162306a36Sopenharmony_ci	VC5_CSC_REG(HDMI_CSC_CHANNEL_CTL, 0x02c),
41262306a36Sopenharmony_ci};
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_cistatic inline
41562306a36Sopenharmony_civoid __iomem *__vc4_hdmi_get_field_base(struct vc4_hdmi *hdmi,
41662306a36Sopenharmony_ci					enum vc4_hdmi_regs reg)
41762306a36Sopenharmony_ci{
41862306a36Sopenharmony_ci	switch (reg) {
41962306a36Sopenharmony_ci	case VC4_HD:
42062306a36Sopenharmony_ci		return hdmi->hd_regs;
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci	case VC4_HDMI:
42362306a36Sopenharmony_ci		return hdmi->hdmicore_regs;
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci	case VC5_CSC:
42662306a36Sopenharmony_ci		return hdmi->csc_regs;
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci	case VC5_CEC:
42962306a36Sopenharmony_ci		return hdmi->cec_regs;
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci	case VC5_DVP:
43262306a36Sopenharmony_ci		return hdmi->dvp_regs;
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci	case VC5_PHY:
43562306a36Sopenharmony_ci		return hdmi->phy_regs;
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci	case VC5_RAM:
43862306a36Sopenharmony_ci		return hdmi->ram_regs;
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci	case VC5_RM:
44162306a36Sopenharmony_ci		return hdmi->rm_regs;
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	default:
44462306a36Sopenharmony_ci		return NULL;
44562306a36Sopenharmony_ci	}
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	return NULL;
44862306a36Sopenharmony_ci}
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_cistatic inline u32 vc4_hdmi_read(struct vc4_hdmi *hdmi,
45162306a36Sopenharmony_ci				enum vc4_hdmi_field reg)
45262306a36Sopenharmony_ci{
45362306a36Sopenharmony_ci	const struct vc4_hdmi_register *field;
45462306a36Sopenharmony_ci	const struct vc4_hdmi_variant *variant = hdmi->variant;
45562306a36Sopenharmony_ci	void __iomem *base;
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci	WARN_ON(pm_runtime_status_suspended(&hdmi->pdev->dev));
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci	kunit_fail_current_test("Accessing an HDMI register in a unit test!\n");
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci	if (reg >= variant->num_registers) {
46262306a36Sopenharmony_ci		dev_warn(&hdmi->pdev->dev,
46362306a36Sopenharmony_ci			 "Invalid register ID %u\n", reg);
46462306a36Sopenharmony_ci		return 0;
46562306a36Sopenharmony_ci	}
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	field = &variant->registers[reg];
46862306a36Sopenharmony_ci	base = __vc4_hdmi_get_field_base(hdmi, field->reg);
46962306a36Sopenharmony_ci	if (!base) {
47062306a36Sopenharmony_ci		dev_warn(&hdmi->pdev->dev,
47162306a36Sopenharmony_ci			 "Unknown register ID %u\n", reg);
47262306a36Sopenharmony_ci		return 0;
47362306a36Sopenharmony_ci	}
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	return readl(base + field->offset);
47662306a36Sopenharmony_ci}
47762306a36Sopenharmony_ci#define HDMI_READ(reg)		vc4_hdmi_read(vc4_hdmi, reg)
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_cistatic inline void vc4_hdmi_write(struct vc4_hdmi *hdmi,
48062306a36Sopenharmony_ci				  enum vc4_hdmi_field reg,
48162306a36Sopenharmony_ci				  u32 value)
48262306a36Sopenharmony_ci{
48362306a36Sopenharmony_ci	const struct vc4_hdmi_register *field;
48462306a36Sopenharmony_ci	const struct vc4_hdmi_variant *variant = hdmi->variant;
48562306a36Sopenharmony_ci	void __iomem *base;
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci	lockdep_assert_held(&hdmi->hw_lock);
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	WARN_ON(pm_runtime_status_suspended(&hdmi->pdev->dev));
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci	kunit_fail_current_test("Accessing an HDMI register in a unit test!\n");
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci	if (reg >= variant->num_registers) {
49462306a36Sopenharmony_ci		dev_warn(&hdmi->pdev->dev,
49562306a36Sopenharmony_ci			 "Invalid register ID %u\n", reg);
49662306a36Sopenharmony_ci		return;
49762306a36Sopenharmony_ci	}
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ci	field = &variant->registers[reg];
50062306a36Sopenharmony_ci	base = __vc4_hdmi_get_field_base(hdmi, field->reg);
50162306a36Sopenharmony_ci	if (!base)
50262306a36Sopenharmony_ci		return;
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci	writel(value, base + field->offset);
50562306a36Sopenharmony_ci}
50662306a36Sopenharmony_ci#define HDMI_WRITE(reg, val)	vc4_hdmi_write(vc4_hdmi, reg, val)
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci#endif /* _VC4_HDMI_REGS_H_ */
509