162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * adv7842 - Analog Devices ADV7842 video decoder driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _ADV7842_
962306a36Sopenharmony_ci#define _ADV7842_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/* Analog input muxing modes (AFE register 0x02, [2:0]) */
1262306a36Sopenharmony_cienum adv7842_ain_sel {
1362306a36Sopenharmony_ci	ADV7842_AIN1_2_3_NC_SYNC_1_2 = 0,
1462306a36Sopenharmony_ci	ADV7842_AIN4_5_6_NC_SYNC_2_1 = 1,
1562306a36Sopenharmony_ci	ADV7842_AIN7_8_9_NC_SYNC_3_1 = 2,
1662306a36Sopenharmony_ci	ADV7842_AIN10_11_12_NC_SYNC_4_1 = 3,
1762306a36Sopenharmony_ci	ADV7842_AIN9_4_5_6_SYNC_2_1 = 4,
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/*
2162306a36Sopenharmony_ci * Bus rotation and reordering. This is used to specify component reordering on
2262306a36Sopenharmony_ci * the board and describes the components order on the bus when the ADV7842
2362306a36Sopenharmony_ci * outputs RGB.
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_cienum adv7842_bus_order {
2662306a36Sopenharmony_ci	ADV7842_BUS_ORDER_RGB,		/* No operation	*/
2762306a36Sopenharmony_ci	ADV7842_BUS_ORDER_GRB,		/* Swap 1-2	*/
2862306a36Sopenharmony_ci	ADV7842_BUS_ORDER_RBG,		/* Swap 2-3	*/
2962306a36Sopenharmony_ci	ADV7842_BUS_ORDER_BGR,		/* Swap 1-3	*/
3062306a36Sopenharmony_ci	ADV7842_BUS_ORDER_BRG,		/* Rotate right	*/
3162306a36Sopenharmony_ci	ADV7842_BUS_ORDER_GBR,		/* Rotate left	*/
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* Input Color Space (IO register 0x02, [7:4]) */
3562306a36Sopenharmony_cienum adv7842_inp_color_space {
3662306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_LIM_RGB = 0,
3762306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_FULL_RGB = 1,
3862306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_LIM_YCbCr_601 = 2,
3962306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_LIM_YCbCr_709 = 3,
4062306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_XVYCC_601 = 4,
4162306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_XVYCC_709 = 5,
4262306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_FULL_YCbCr_601 = 6,
4362306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_FULL_YCbCr_709 = 7,
4462306a36Sopenharmony_ci	ADV7842_INP_COLOR_SPACE_AUTO = 0xf,
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* Select output format (IO register 0x03, [4:2]) */
4862306a36Sopenharmony_cienum adv7842_op_format_mode_sel {
4962306a36Sopenharmony_ci	ADV7842_OP_FORMAT_MODE0 = 0x00,
5062306a36Sopenharmony_ci	ADV7842_OP_FORMAT_MODE1 = 0x04,
5162306a36Sopenharmony_ci	ADV7842_OP_FORMAT_MODE2 = 0x08,
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/* Mode of operation */
5562306a36Sopenharmony_cienum adv7842_mode {
5662306a36Sopenharmony_ci	ADV7842_MODE_SDP,
5762306a36Sopenharmony_ci	ADV7842_MODE_COMP,
5862306a36Sopenharmony_ci	ADV7842_MODE_RGB,
5962306a36Sopenharmony_ci	ADV7842_MODE_HDMI
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* Video standard select (IO register 0x00, [5:0]) */
6362306a36Sopenharmony_cienum adv7842_vid_std_select {
6462306a36Sopenharmony_ci	/* SDP */
6562306a36Sopenharmony_ci	ADV7842_SDP_VID_STD_CVBS_SD_4x1 = 0x01,
6662306a36Sopenharmony_ci	ADV7842_SDP_VID_STD_YC_SD4_x1 = 0x09,
6762306a36Sopenharmony_ci	/* RGB */
6862306a36Sopenharmony_ci	ADV7842_RGB_VID_STD_AUTO_GRAPH_MODE = 0x07,
6962306a36Sopenharmony_ci	/* HDMI GR */
7062306a36Sopenharmony_ci	ADV7842_HDMI_GR_VID_STD_AUTO_GRAPH_MODE = 0x02,
7162306a36Sopenharmony_ci	/* HDMI COMP */
7262306a36Sopenharmony_ci	ADV7842_HDMI_COMP_VID_STD_HD_1250P = 0x1e,
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cienum adv7842_select_input {
7662306a36Sopenharmony_ci	ADV7842_SELECT_HDMI_PORT_A,
7762306a36Sopenharmony_ci	ADV7842_SELECT_HDMI_PORT_B,
7862306a36Sopenharmony_ci	ADV7842_SELECT_VGA_RGB,
7962306a36Sopenharmony_ci	ADV7842_SELECT_VGA_COMP,
8062306a36Sopenharmony_ci	ADV7842_SELECT_SDP_CVBS,
8162306a36Sopenharmony_ci	ADV7842_SELECT_SDP_YC,
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cienum adv7842_drive_strength {
8562306a36Sopenharmony_ci	ADV7842_DR_STR_LOW = 0,
8662306a36Sopenharmony_ci	ADV7842_DR_STR_MEDIUM_LOW = 1,
8762306a36Sopenharmony_ci	ADV7842_DR_STR_MEDIUM_HIGH = 2,
8862306a36Sopenharmony_ci	ADV7842_DR_STR_HIGH = 3,
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistruct adv7842_sdp_csc_coeff {
9262306a36Sopenharmony_ci	bool manual;
9362306a36Sopenharmony_ci	u16 scaling;
9462306a36Sopenharmony_ci	u16 A1;
9562306a36Sopenharmony_ci	u16 A2;
9662306a36Sopenharmony_ci	u16 A3;
9762306a36Sopenharmony_ci	u16 A4;
9862306a36Sopenharmony_ci	u16 B1;
9962306a36Sopenharmony_ci	u16 B2;
10062306a36Sopenharmony_ci	u16 B3;
10162306a36Sopenharmony_ci	u16 B4;
10262306a36Sopenharmony_ci	u16 C1;
10362306a36Sopenharmony_ci	u16 C2;
10462306a36Sopenharmony_ci	u16 C3;
10562306a36Sopenharmony_ci	u16 C4;
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistruct adv7842_sdp_io_sync_adjustment {
10962306a36Sopenharmony_ci	bool adjust;
11062306a36Sopenharmony_ci	u16 hs_beg;
11162306a36Sopenharmony_ci	u16 hs_width;
11262306a36Sopenharmony_ci	u16 de_beg;
11362306a36Sopenharmony_ci	u16 de_end;
11462306a36Sopenharmony_ci	u8 vs_beg_o;
11562306a36Sopenharmony_ci	u8 vs_beg_e;
11662306a36Sopenharmony_ci	u8 vs_end_o;
11762306a36Sopenharmony_ci	u8 vs_end_e;
11862306a36Sopenharmony_ci	u8 de_v_beg_o;
11962306a36Sopenharmony_ci	u8 de_v_beg_e;
12062306a36Sopenharmony_ci	u8 de_v_end_o;
12162306a36Sopenharmony_ci	u8 de_v_end_e;
12262306a36Sopenharmony_ci};
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci/* Platform dependent definition */
12562306a36Sopenharmony_cistruct adv7842_platform_data {
12662306a36Sopenharmony_ci	/* chip reset during probe */
12762306a36Sopenharmony_ci	unsigned chip_reset:1;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	/* DIS_PWRDNB: 1 if the PWRDNB pin is unused and unconnected */
13062306a36Sopenharmony_ci	unsigned disable_pwrdnb:1;
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	/* DIS_CABLE_DET_RST: 1 if the 5V pins are unused and unconnected */
13362306a36Sopenharmony_ci	unsigned disable_cable_det_rst:1;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	/* Analog input muxing mode */
13662306a36Sopenharmony_ci	enum adv7842_ain_sel ain_sel;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	/* Bus rotation and reordering */
13962306a36Sopenharmony_ci	enum adv7842_bus_order bus_order;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	/* Select output format mode */
14262306a36Sopenharmony_ci	enum adv7842_op_format_mode_sel op_format_mode_sel;
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	/* Default mode */
14562306a36Sopenharmony_ci	enum adv7842_mode mode;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	/* Default input */
14862306a36Sopenharmony_ci	unsigned input;
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	/* Video standard */
15162306a36Sopenharmony_ci	enum adv7842_vid_std_select vid_std_select;
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	/* IO register 0x02 */
15462306a36Sopenharmony_ci	unsigned alt_gamma:1;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	/* IO register 0x05 */
15762306a36Sopenharmony_ci	unsigned blank_data:1;
15862306a36Sopenharmony_ci	unsigned insert_av_codes:1;
15962306a36Sopenharmony_ci	unsigned replicate_av_codes:1;
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	/* IO register 0x30 */
16262306a36Sopenharmony_ci	unsigned output_bus_lsb_to_msb:1;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	/* IO register 0x14 */
16562306a36Sopenharmony_ci	enum adv7842_drive_strength dr_str_data;
16662306a36Sopenharmony_ci	enum adv7842_drive_strength dr_str_clk;
16762306a36Sopenharmony_ci	enum adv7842_drive_strength dr_str_sync;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	/*
17062306a36Sopenharmony_ci	 * IO register 0x19: Adjustment to the LLC DLL phase in
17162306a36Sopenharmony_ci	 * increments of 1/32 of a clock period.
17262306a36Sopenharmony_ci	 */
17362306a36Sopenharmony_ci	unsigned llc_dll_phase:5;
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci	/* External RAM for 3-D comb or frame synchronizer */
17662306a36Sopenharmony_ci	unsigned sd_ram_size; /* ram size in MB */
17762306a36Sopenharmony_ci	unsigned sd_ram_ddr:1; /* ddr or sdr sdram */
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	/* HDMI free run, CP-reg 0xBA */
18062306a36Sopenharmony_ci	unsigned hdmi_free_run_enable:1;
18162306a36Sopenharmony_ci	/* 0 = Mode 0: run when there is no TMDS clock
18262306a36Sopenharmony_ci	   1 = Mode 1: run when there is no TMDS clock or the
18362306a36Sopenharmony_ci	       video resolution does not match programmed one. */
18462306a36Sopenharmony_ci	unsigned hdmi_free_run_mode:1;
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	/* SDP free run, CP-reg 0xDD */
18762306a36Sopenharmony_ci	unsigned sdp_free_run_auto:1;
18862306a36Sopenharmony_ci	unsigned sdp_free_run_man_col_en:1;
18962306a36Sopenharmony_ci	unsigned sdp_free_run_cbar_en:1;
19062306a36Sopenharmony_ci	unsigned sdp_free_run_force:1;
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	/* HPA manual (0) or auto (1), affects HDMI register 0x69 */
19362306a36Sopenharmony_ci	unsigned hpa_auto:1;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	struct adv7842_sdp_csc_coeff sdp_csc_coeff;
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	struct adv7842_sdp_io_sync_adjustment sdp_io_sync_625;
19862306a36Sopenharmony_ci	struct adv7842_sdp_io_sync_adjustment sdp_io_sync_525;
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	/* i2c addresses */
20162306a36Sopenharmony_ci	u8 i2c_sdp_io;
20262306a36Sopenharmony_ci	u8 i2c_sdp;
20362306a36Sopenharmony_ci	u8 i2c_cp;
20462306a36Sopenharmony_ci	u8 i2c_vdp;
20562306a36Sopenharmony_ci	u8 i2c_afe;
20662306a36Sopenharmony_ci	u8 i2c_hdmi;
20762306a36Sopenharmony_ci	u8 i2c_repeater;
20862306a36Sopenharmony_ci	u8 i2c_edid;
20962306a36Sopenharmony_ci	u8 i2c_infoframe;
21062306a36Sopenharmony_ci	u8 i2c_cec;
21162306a36Sopenharmony_ci	u8 i2c_avlink;
21262306a36Sopenharmony_ci};
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci#define V4L2_CID_ADV_RX_ANALOG_SAMPLING_PHASE	(V4L2_CID_DV_CLASS_BASE + 0x1000)
21562306a36Sopenharmony_ci#define V4L2_CID_ADV_RX_FREE_RUN_COLOR_MANUAL	(V4L2_CID_DV_CLASS_BASE + 0x1001)
21662306a36Sopenharmony_ci#define V4L2_CID_ADV_RX_FREE_RUN_COLOR		(V4L2_CID_DV_CLASS_BASE + 0x1002)
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci/* custom ioctl, used to test the external RAM that's used by the
21962306a36Sopenharmony_ci * deinterlacer. */
22062306a36Sopenharmony_ci#define ADV7842_CMD_RAM_TEST _IO('V', BASE_VIDIOC_PRIVATE)
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci#define ADV7842_EDID_PORT_A   0
22362306a36Sopenharmony_ci#define ADV7842_EDID_PORT_B   1
22462306a36Sopenharmony_ci#define ADV7842_EDID_PORT_VGA 2
22562306a36Sopenharmony_ci#define ADV7842_PAD_SOURCE    3
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci#endif
228