xref: /OK3568_Linux_fs/kernel/include/media/i2c/adv7842.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * adv7842 - Analog Devices ADV7842 video decoder driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _ADV7842_
9*4882a593Smuzhiyun #define _ADV7842_
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /* Analog input muxing modes (AFE register 0x02, [2:0]) */
12*4882a593Smuzhiyun enum adv7842_ain_sel {
13*4882a593Smuzhiyun 	ADV7842_AIN1_2_3_NC_SYNC_1_2 = 0,
14*4882a593Smuzhiyun 	ADV7842_AIN4_5_6_NC_SYNC_2_1 = 1,
15*4882a593Smuzhiyun 	ADV7842_AIN7_8_9_NC_SYNC_3_1 = 2,
16*4882a593Smuzhiyun 	ADV7842_AIN10_11_12_NC_SYNC_4_1 = 3,
17*4882a593Smuzhiyun 	ADV7842_AIN9_4_5_6_SYNC_2_1 = 4,
18*4882a593Smuzhiyun };
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun  * Bus rotation and reordering. This is used to specify component reordering on
22*4882a593Smuzhiyun  * the board and describes the components order on the bus when the ADV7842
23*4882a593Smuzhiyun  * outputs RGB.
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun enum adv7842_bus_order {
26*4882a593Smuzhiyun 	ADV7842_BUS_ORDER_RGB,		/* No operation	*/
27*4882a593Smuzhiyun 	ADV7842_BUS_ORDER_GRB,		/* Swap 1-2	*/
28*4882a593Smuzhiyun 	ADV7842_BUS_ORDER_RBG,		/* Swap 2-3	*/
29*4882a593Smuzhiyun 	ADV7842_BUS_ORDER_BGR,		/* Swap 1-3	*/
30*4882a593Smuzhiyun 	ADV7842_BUS_ORDER_BRG,		/* Rotate right	*/
31*4882a593Smuzhiyun 	ADV7842_BUS_ORDER_GBR,		/* Rotate left	*/
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* Input Color Space (IO register 0x02, [7:4]) */
35*4882a593Smuzhiyun enum adv7842_inp_color_space {
36*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_LIM_RGB = 0,
37*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_FULL_RGB = 1,
38*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_LIM_YCbCr_601 = 2,
39*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_LIM_YCbCr_709 = 3,
40*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_XVYCC_601 = 4,
41*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_XVYCC_709 = 5,
42*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_FULL_YCbCr_601 = 6,
43*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_FULL_YCbCr_709 = 7,
44*4882a593Smuzhiyun 	ADV7842_INP_COLOR_SPACE_AUTO = 0xf,
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* Select output format (IO register 0x03, [4:2]) */
48*4882a593Smuzhiyun enum adv7842_op_format_mode_sel {
49*4882a593Smuzhiyun 	ADV7842_OP_FORMAT_MODE0 = 0x00,
50*4882a593Smuzhiyun 	ADV7842_OP_FORMAT_MODE1 = 0x04,
51*4882a593Smuzhiyun 	ADV7842_OP_FORMAT_MODE2 = 0x08,
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /* Mode of operation */
55*4882a593Smuzhiyun enum adv7842_mode {
56*4882a593Smuzhiyun 	ADV7842_MODE_SDP,
57*4882a593Smuzhiyun 	ADV7842_MODE_COMP,
58*4882a593Smuzhiyun 	ADV7842_MODE_RGB,
59*4882a593Smuzhiyun 	ADV7842_MODE_HDMI
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /* Video standard select (IO register 0x00, [5:0]) */
63*4882a593Smuzhiyun enum adv7842_vid_std_select {
64*4882a593Smuzhiyun 	/* SDP */
65*4882a593Smuzhiyun 	ADV7842_SDP_VID_STD_CVBS_SD_4x1 = 0x01,
66*4882a593Smuzhiyun 	ADV7842_SDP_VID_STD_YC_SD4_x1 = 0x09,
67*4882a593Smuzhiyun 	/* RGB */
68*4882a593Smuzhiyun 	ADV7842_RGB_VID_STD_AUTO_GRAPH_MODE = 0x07,
69*4882a593Smuzhiyun 	/* HDMI GR */
70*4882a593Smuzhiyun 	ADV7842_HDMI_GR_VID_STD_AUTO_GRAPH_MODE = 0x02,
71*4882a593Smuzhiyun 	/* HDMI COMP */
72*4882a593Smuzhiyun 	ADV7842_HDMI_COMP_VID_STD_HD_1250P = 0x1e,
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun enum adv7842_select_input {
76*4882a593Smuzhiyun 	ADV7842_SELECT_HDMI_PORT_A,
77*4882a593Smuzhiyun 	ADV7842_SELECT_HDMI_PORT_B,
78*4882a593Smuzhiyun 	ADV7842_SELECT_VGA_RGB,
79*4882a593Smuzhiyun 	ADV7842_SELECT_VGA_COMP,
80*4882a593Smuzhiyun 	ADV7842_SELECT_SDP_CVBS,
81*4882a593Smuzhiyun 	ADV7842_SELECT_SDP_YC,
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun enum adv7842_drive_strength {
85*4882a593Smuzhiyun 	ADV7842_DR_STR_LOW = 0,
86*4882a593Smuzhiyun 	ADV7842_DR_STR_MEDIUM_LOW = 1,
87*4882a593Smuzhiyun 	ADV7842_DR_STR_MEDIUM_HIGH = 2,
88*4882a593Smuzhiyun 	ADV7842_DR_STR_HIGH = 3,
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun struct adv7842_sdp_csc_coeff {
92*4882a593Smuzhiyun 	bool manual;
93*4882a593Smuzhiyun 	u16 scaling;
94*4882a593Smuzhiyun 	u16 A1;
95*4882a593Smuzhiyun 	u16 A2;
96*4882a593Smuzhiyun 	u16 A3;
97*4882a593Smuzhiyun 	u16 A4;
98*4882a593Smuzhiyun 	u16 B1;
99*4882a593Smuzhiyun 	u16 B2;
100*4882a593Smuzhiyun 	u16 B3;
101*4882a593Smuzhiyun 	u16 B4;
102*4882a593Smuzhiyun 	u16 C1;
103*4882a593Smuzhiyun 	u16 C2;
104*4882a593Smuzhiyun 	u16 C3;
105*4882a593Smuzhiyun 	u16 C4;
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun struct adv7842_sdp_io_sync_adjustment {
109*4882a593Smuzhiyun 	bool adjust;
110*4882a593Smuzhiyun 	u16 hs_beg;
111*4882a593Smuzhiyun 	u16 hs_width;
112*4882a593Smuzhiyun 	u16 de_beg;
113*4882a593Smuzhiyun 	u16 de_end;
114*4882a593Smuzhiyun 	u8 vs_beg_o;
115*4882a593Smuzhiyun 	u8 vs_beg_e;
116*4882a593Smuzhiyun 	u8 vs_end_o;
117*4882a593Smuzhiyun 	u8 vs_end_e;
118*4882a593Smuzhiyun 	u8 de_v_beg_o;
119*4882a593Smuzhiyun 	u8 de_v_beg_e;
120*4882a593Smuzhiyun 	u8 de_v_end_o;
121*4882a593Smuzhiyun 	u8 de_v_end_e;
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /* Platform dependent definition */
125*4882a593Smuzhiyun struct adv7842_platform_data {
126*4882a593Smuzhiyun 	/* chip reset during probe */
127*4882a593Smuzhiyun 	unsigned chip_reset:1;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	/* DIS_PWRDNB: 1 if the PWRDNB pin is unused and unconnected */
130*4882a593Smuzhiyun 	unsigned disable_pwrdnb:1;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	/* DIS_CABLE_DET_RST: 1 if the 5V pins are unused and unconnected */
133*4882a593Smuzhiyun 	unsigned disable_cable_det_rst:1;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	/* Analog input muxing mode */
136*4882a593Smuzhiyun 	enum adv7842_ain_sel ain_sel;
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	/* Bus rotation and reordering */
139*4882a593Smuzhiyun 	enum adv7842_bus_order bus_order;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	/* Select output format mode */
142*4882a593Smuzhiyun 	enum adv7842_op_format_mode_sel op_format_mode_sel;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	/* Default mode */
145*4882a593Smuzhiyun 	enum adv7842_mode mode;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	/* Default input */
148*4882a593Smuzhiyun 	unsigned input;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	/* Video standard */
151*4882a593Smuzhiyun 	enum adv7842_vid_std_select vid_std_select;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	/* IO register 0x02 */
154*4882a593Smuzhiyun 	unsigned alt_gamma:1;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	/* IO register 0x05 */
157*4882a593Smuzhiyun 	unsigned blank_data:1;
158*4882a593Smuzhiyun 	unsigned insert_av_codes:1;
159*4882a593Smuzhiyun 	unsigned replicate_av_codes:1;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	/* IO register 0x30 */
162*4882a593Smuzhiyun 	unsigned output_bus_lsb_to_msb:1;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	/* IO register 0x14 */
165*4882a593Smuzhiyun 	enum adv7842_drive_strength dr_str_data;
166*4882a593Smuzhiyun 	enum adv7842_drive_strength dr_str_clk;
167*4882a593Smuzhiyun 	enum adv7842_drive_strength dr_str_sync;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	/*
170*4882a593Smuzhiyun 	 * IO register 0x19: Adjustment to the LLC DLL phase in
171*4882a593Smuzhiyun 	 * increments of 1/32 of a clock period.
172*4882a593Smuzhiyun 	 */
173*4882a593Smuzhiyun 	unsigned llc_dll_phase:5;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	/* External RAM for 3-D comb or frame synchronizer */
176*4882a593Smuzhiyun 	unsigned sd_ram_size; /* ram size in MB */
177*4882a593Smuzhiyun 	unsigned sd_ram_ddr:1; /* ddr or sdr sdram */
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	/* HDMI free run, CP-reg 0xBA */
180*4882a593Smuzhiyun 	unsigned hdmi_free_run_enable:1;
181*4882a593Smuzhiyun 	/* 0 = Mode 0: run when there is no TMDS clock
182*4882a593Smuzhiyun 	   1 = Mode 1: run when there is no TMDS clock or the
183*4882a593Smuzhiyun 	       video resolution does not match programmed one. */
184*4882a593Smuzhiyun 	unsigned hdmi_free_run_mode:1;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	/* SDP free run, CP-reg 0xDD */
187*4882a593Smuzhiyun 	unsigned sdp_free_run_auto:1;
188*4882a593Smuzhiyun 	unsigned sdp_free_run_man_col_en:1;
189*4882a593Smuzhiyun 	unsigned sdp_free_run_cbar_en:1;
190*4882a593Smuzhiyun 	unsigned sdp_free_run_force:1;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	/* HPA manual (0) or auto (1), affects HDMI register 0x69 */
193*4882a593Smuzhiyun 	unsigned hpa_auto:1;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	struct adv7842_sdp_csc_coeff sdp_csc_coeff;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	struct adv7842_sdp_io_sync_adjustment sdp_io_sync_625;
198*4882a593Smuzhiyun 	struct adv7842_sdp_io_sync_adjustment sdp_io_sync_525;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	/* i2c addresses */
201*4882a593Smuzhiyun 	u8 i2c_sdp_io;
202*4882a593Smuzhiyun 	u8 i2c_sdp;
203*4882a593Smuzhiyun 	u8 i2c_cp;
204*4882a593Smuzhiyun 	u8 i2c_vdp;
205*4882a593Smuzhiyun 	u8 i2c_afe;
206*4882a593Smuzhiyun 	u8 i2c_hdmi;
207*4882a593Smuzhiyun 	u8 i2c_repeater;
208*4882a593Smuzhiyun 	u8 i2c_edid;
209*4882a593Smuzhiyun 	u8 i2c_infoframe;
210*4882a593Smuzhiyun 	u8 i2c_cec;
211*4882a593Smuzhiyun 	u8 i2c_avlink;
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define V4L2_CID_ADV_RX_ANALOG_SAMPLING_PHASE	(V4L2_CID_DV_CLASS_BASE + 0x1000)
215*4882a593Smuzhiyun #define V4L2_CID_ADV_RX_FREE_RUN_COLOR_MANUAL	(V4L2_CID_DV_CLASS_BASE + 0x1001)
216*4882a593Smuzhiyun #define V4L2_CID_ADV_RX_FREE_RUN_COLOR		(V4L2_CID_DV_CLASS_BASE + 0x1002)
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /* custom ioctl, used to test the external RAM that's used by the
219*4882a593Smuzhiyun  * deinterlacer. */
220*4882a593Smuzhiyun #define ADV7842_CMD_RAM_TEST _IO('V', BASE_VIDIOC_PRIVATE)
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun #define ADV7842_EDID_PORT_A   0
223*4882a593Smuzhiyun #define ADV7842_EDID_PORT_B   1
224*4882a593Smuzhiyun #define ADV7842_EDID_PORT_VGA 2
225*4882a593Smuzhiyun #define ADV7842_PAD_SOURCE    3
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun #endif
228