xref: /OK3568_Linux_fs/kernel/drivers/media/i2c/it66353/it66353_drv.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * it66353 HDMI 3 in 1 out driver.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Kenneth.Hung@ite.com.tw
8*4882a593Smuzhiyun  * 	   Wangqiang Guo <kay.guo@rock-chips.com>
9*4882a593Smuzhiyun  * Version: IT66353_SAMPLE_1.08
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun #ifndef _IT66353_DRV_H_
13*4882a593Smuzhiyun #define _IT66353_DRV_H_
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include "platform.h"
16*4882a593Smuzhiyun #include "it66353.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define RX_PORT_0	0
19*4882a593Smuzhiyun #define RX_PORT_1	1
20*4882a593Smuzhiyun #define RX_PORT_2	2
21*4882a593Smuzhiyun #define RX_PORT_3	3
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define TRUE		1
24*4882a593Smuzhiyun #define FALSE		0
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define DDCWAITTIME	5
27*4882a593Smuzhiyun #define DDCWAITNUM	10
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define RX_PORT_COUNT	4
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun // for it66353_rx_term_power_down
32*4882a593Smuzhiyun #define CH0_OFF		(0x10)
33*4882a593Smuzhiyun #define CH1_OFF		(0x20)
34*4882a593Smuzhiyun #define CH2_OFF		(0x40)
35*4882a593Smuzhiyun #define CLK_OFF		(0x80)
36*4882a593Smuzhiyun #define ALLCH_OFF	(0xF0)
37*4882a593Smuzhiyun #define ALLCH_ON	(0x00)
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* ===================================================
40*4882a593Smuzhiyun  * config:
41*4882a593Smuzhiyun  * ===================================================
42*4882a593Smuzhiyun  *
43*4882a593Smuzhiyun  * RCLKFreqSel => 0: 20MHz, 1: 10MHz, 2: 5MHz, 3: 2.5MHz
44*4882a593Smuzhiyun  */
45*4882a593Smuzhiyun #define RCLKFreqSel 0
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun typedef enum {
48*4882a593Smuzhiyun 	RX_TOGGLE_HPD,
49*4882a593Smuzhiyun 	RX_PORT_CHANGE,
50*4882a593Smuzhiyun 	TX_OUTPUT,
51*4882a593Smuzhiyun 	TX_OUTPUT_PREPARE,
52*4882a593Smuzhiyun 	RX_CHECK_EQ,
53*4882a593Smuzhiyun 	SETUP_AFE,
54*4882a593Smuzhiyun 	RX_WAIT_CLOCK,
55*4882a593Smuzhiyun 	RX_HPD,
56*4882a593Smuzhiyun 	TX_GOT_HPD,
57*4882a593Smuzhiyun 	TX_WAIT_HPD,
58*4882a593Smuzhiyun 	TX_UNPLUG,
59*4882a593Smuzhiyun 	RX_UNPLUG,
60*4882a593Smuzhiyun 	IDLE,
61*4882a593Smuzhiyun } _SYS_FSM_STATE;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun enum {
64*4882a593Smuzhiyun 	HDMI_MODE_AUTO,
65*4882a593Smuzhiyun 	HDMI_MODE_14,
66*4882a593Smuzhiyun 	HDMI_MODE_20,
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun enum {
70*4882a593Smuzhiyun 	EQ_MODE_H14,
71*4882a593Smuzhiyun 	EQ_MODE_H20,
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun typedef enum {
76*4882a593Smuzhiyun 	DEV_DEVICE_LOOP,
77*4882a593Smuzhiyun 	DEV_DEVICE_INIT,
78*4882a593Smuzhiyun 	DEV_WAIT_DEVICE_READY,
79*4882a593Smuzhiyun 	DEV_FW_VAR_INIT,
80*4882a593Smuzhiyun 	DEV_WAIT_RESET,
81*4882a593Smuzhiyun } _DEV_FSM_STATE;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun typedef enum {
84*4882a593Smuzhiyun 	AEQ_OFF,
85*4882a593Smuzhiyun 	AEQ_START,
86*4882a593Smuzhiyun 	AEQ_CHECK_SAREQ_RESULT,
87*4882a593Smuzhiyun 	AEQ_APPLY_SAREQ,
88*4882a593Smuzhiyun 	AEQ_DONE,
89*4882a593Smuzhiyun 	AEQ_FAIL,
90*4882a593Smuzhiyun 	AEQ_MAX,
91*4882a593Smuzhiyun } _AEQ_FSM_STATE;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun typedef enum {
94*4882a593Smuzhiyun 	EQRES_UNKNOWN,
95*4882a593Smuzhiyun 	EQRES_BUSY,
96*4882a593Smuzhiyun 	EQRES_SAREQ_DONE,
97*4882a593Smuzhiyun 	EQRES_SAREQ_FAIL,
98*4882a593Smuzhiyun 	EQRES_SAREQ_TIMEOUT,
99*4882a593Smuzhiyun 	EQRES_H14EQ_DONE,
100*4882a593Smuzhiyun 	EQRES_H14EQ_FAIL,
101*4882a593Smuzhiyun 	EQRES_H14EQ_TIMEOUT,
102*4882a593Smuzhiyun 	EQRES_DONE,
103*4882a593Smuzhiyun } _EQ_RESULT_TYPE;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun typedef enum {
106*4882a593Smuzhiyun 	SysAEQ_OFF,
107*4882a593Smuzhiyun 	SysAEQ_RUN,
108*4882a593Smuzhiyun 	SysAEQ_DONE,
109*4882a593Smuzhiyun } _SYS_AEQ_TYPE;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun enum {
112*4882a593Smuzhiyun 	EDID_SRC_EXT_SINK,
113*4882a593Smuzhiyun 	EDID_SRC_INTERNAL,
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun enum {
117*4882a593Smuzhiyun 	TERM_LOW,
118*4882a593Smuzhiyun 	TERM_HIGH,
119*4882a593Smuzhiyun 	TERM_FOLLOW_TX,
120*4882a593Smuzhiyun 	TERM_FOLLOW_HPD,
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #define EDID_PORT_0	0x01
124*4882a593Smuzhiyun #define EDID_PORT_1	0x02
125*4882a593Smuzhiyun #define EDID_PORT_2	0x04
126*4882a593Smuzhiyun #define EDID_PORT_3	0x08
127*4882a593Smuzhiyun #define EDID_PORT_ALL (EDID_PORT_0 | EDID_PORT_1 | EDID_PORT_2 | EDID_PORT_3)
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /*
130*4882a593Smuzhiyun  * for it66353_get_port_info0()
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun #define PI_5V		(BIT(0))
133*4882a593Smuzhiyun #define PI_HDMI_MODE	(BIT(1))
134*4882a593Smuzhiyun #define PI_CLK_DET	(BIT(2))
135*4882a593Smuzhiyun #define PI_CLK_VALID	(BIT(3))
136*4882a593Smuzhiyun #define PI_CLK_STABLE	(BIT(4))
137*4882a593Smuzhiyun #define PI_PLL_LOCK	(BIT(5))
138*4882a593Smuzhiyun // #define PI_XX		(BIT(6))
139*4882a593Smuzhiyun #define PI_SYM_LOCK	(BIT(7))
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /*
142*4882a593Smuzhiyun  * for it66353_get_port_info1()
143*4882a593Smuzhiyun  */
144*4882a593Smuzhiyun #define PI_PLL_HS1G	0x01
145*4882a593Smuzhiyun // #define PI_PLL_HS1G (BIT0)
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun typedef struct {
148*4882a593Smuzhiyun 	// TxSwap
149*4882a593Smuzhiyun 	u8 EnTxPNSwap;
150*4882a593Smuzhiyun 	u8 EnTxChSwap;
151*4882a593Smuzhiyun 	u8 EnTxVCLKInv;
152*4882a593Smuzhiyun 	u8 EnTxOutD1t;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	u8 EnRxDDCBypass;
155*4882a593Smuzhiyun 	u8 EnRxPWR5VBypass;
156*4882a593Smuzhiyun 	u8 EnRxHPDBypass;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	u8 EnCEC;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	u8 EnableAutoEQ;
161*4882a593Smuzhiyun 	u8 ParseEDIDFromSink;
162*4882a593Smuzhiyun 	u8 NonActivePortReplyHPD;
163*4882a593Smuzhiyun 	u8 DisableEdidRam;
164*4882a593Smuzhiyun 	u8 TryFixedEQFirst;
165*4882a593Smuzhiyun 	u8 TurnOffTx5VWhenSwitchPort;
166*4882a593Smuzhiyun 	u8 FixIncorrectHdmiEnc;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun } IT6635_DEVICE_OPTION_INT;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun typedef struct {
171*4882a593Smuzhiyun 	u8 tag1;
172*4882a593Smuzhiyun 	u8 EnRxDDCBypass;
173*4882a593Smuzhiyun 	u8 EnRxPWR5VBypass;
174*4882a593Smuzhiyun 	u8 EnRxHPDBypass;
175*4882a593Smuzhiyun 	u8 TryFixedEQFirst;
176*4882a593Smuzhiyun 	u8 EnableAutoEQ;
177*4882a593Smuzhiyun 	u8 NonActivePortReplyHPD;
178*4882a593Smuzhiyun 	u8 DisableEdidRam;
179*4882a593Smuzhiyun 	u8 DefaultEQ[3];
180*4882a593Smuzhiyun 	u8 FixIncorrectHdmiEnc;
181*4882a593Smuzhiyun 	u8 HPDOutputInverse;
182*4882a593Smuzhiyun 	u8 HPDTogglePeriod;
183*4882a593Smuzhiyun 	u8 TxOEAlignment;
184*4882a593Smuzhiyun 	u8 str_size;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun } IT6635_RX_OPTIONS;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun typedef struct {
189*4882a593Smuzhiyun 	u8 tag1;
190*4882a593Smuzhiyun 	// TxSwap
191*4882a593Smuzhiyun 	u8 EnTxPNSwap;
192*4882a593Smuzhiyun 	u8 EnTxChSwap;
193*4882a593Smuzhiyun 	u8 EnTxVCLKInv;
194*4882a593Smuzhiyun 	u8 EnTxOutD1t;
195*4882a593Smuzhiyun 	u8 CopyEDIDFromSink;
196*4882a593Smuzhiyun 	u8 ParsePhysicalAddr;
197*4882a593Smuzhiyun 	u8 TurnOffTx5VWhenSwitchPort;
198*4882a593Smuzhiyun 	u8 str_size;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun } IT6635_TX_OPTIONS;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun typedef struct {
203*4882a593Smuzhiyun 	u8 tag1;
204*4882a593Smuzhiyun 	u8 SwAddr;
205*4882a593Smuzhiyun 	u8 RxAddr;
206*4882a593Smuzhiyun 	u8 CecAddr;
207*4882a593Smuzhiyun 	u8 EdidAddr;
208*4882a593Smuzhiyun 	u8 ForceRxOn;
209*4882a593Smuzhiyun 	u8 RxAutoPowerDown;
210*4882a593Smuzhiyun 	u8 DoTxPowerDown;
211*4882a593Smuzhiyun 	u8 TxPowerDownWhileWaitingClock;
212*4882a593Smuzhiyun 	u8 str_size;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun } IT6635_DEV_OPTION;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun typedef struct {
217*4882a593Smuzhiyun 	IT6635_RX_OPTIONS *active_rx_opt;
218*4882a593Smuzhiyun 	IT6635_RX_OPTIONS *rx_opt[4];
219*4882a593Smuzhiyun 	IT6635_TX_OPTIONS *tx_opt;
220*4882a593Smuzhiyun 	IT6635_DEV_OPTION *dev_opt;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun } IT6635_DEV_OPTION_INTERNAL;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun typedef struct {
225*4882a593Smuzhiyun 	struct {
226*4882a593Smuzhiyun 		u8 Rev;
227*4882a593Smuzhiyun 		u32 RCLK;
228*4882a593Smuzhiyun 		u8 RxHPDFlag[4];
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 		u8 VSDBOffset;  // 0xFF;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 		u8 PhyAdr[4];
233*4882a593Smuzhiyun 		u8 EdidChkSum[2];
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 		_SYS_FSM_STATE state_sys_fsm;
236*4882a593Smuzhiyun 		u8 state_dev_init;
237*4882a593Smuzhiyun 		u8 state_dev;
238*4882a593Smuzhiyun 		u8 fsm_return;
239*4882a593Smuzhiyun 		u8 Rx_active_port;
240*4882a593Smuzhiyun 		u8 Rx_new_port;
241*4882a593Smuzhiyun 		u8 Tx_current_5v;
242*4882a593Smuzhiyun 		u32 vclk;
243*4882a593Smuzhiyun 		u32 vclk_prev;
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 		u16 RxCEDErr[3];
246*4882a593Smuzhiyun 		u8 RxCEDErrValid;
247*4882a593Smuzhiyun 		u16 RxCEDErrRec[3][3];
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 		u8 count_unlock;
250*4882a593Smuzhiyun 		u8 count_symlock;
251*4882a593Smuzhiyun 		u8 count_symlock_lost;
252*4882a593Smuzhiyun 		u8 count_symlock_fail;
253*4882a593Smuzhiyun 		u8 count_symlock_unstable;
254*4882a593Smuzhiyun 		u8 count_fsm_err;
255*4882a593Smuzhiyun 		u8 count_eq_check;
256*4882a593Smuzhiyun 		u8 count_try_force_hdmi_mode;
257*4882a593Smuzhiyun 		u8 count_auto_eq_fail;
258*4882a593Smuzhiyun 		u8 count_wait_clock;
259*4882a593Smuzhiyun 		u8 clock_ratio;
260*4882a593Smuzhiyun 		u8 h2_scramble;
261*4882a593Smuzhiyun 		u8 edid_ready;
262*4882a593Smuzhiyun 		u8 prev_hpd_state;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 		u8 try_fixed_EQ;
265*4882a593Smuzhiyun 		u8 current_hdmi_mode;
266*4882a593Smuzhiyun 		u8 current_txoe;
267*4882a593Smuzhiyun 		u8 check_for_hpd_toggle;
268*4882a593Smuzhiyun 		u8 sdi_stable_count;
269*4882a593Smuzhiyun 		u8 check_for_sdi;
270*4882a593Smuzhiyun 		u8 force_hpd_state;
271*4882a593Smuzhiyun 		// u8 txoe_alignment;
272*4882a593Smuzhiyun 		u8 hpd_toggle_timeout;
273*4882a593Smuzhiyun 		u8 spmon;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 		__tick tick_set_afe;
276*4882a593Smuzhiyun 		__tick tick_hdcp;
277*4882a593Smuzhiyun 		// u8 en_count_hdcp;
278*4882a593Smuzhiyun 		u8 *default_edid[4];
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 		// tx
281*4882a593Smuzhiyun 		u8 hpd_wait_count;
282*4882a593Smuzhiyun 		u8 is_hdmi20_sink;
283*4882a593Smuzhiyun 		u8 rx_deskew_err;
284*4882a593Smuzhiyun 	} vars;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	struct {
287*4882a593Smuzhiyun 		_SYS_AEQ_TYPE sys_aEQ;
288*4882a593Smuzhiyun 		u8 AutoEQ_state;
289*4882a593Smuzhiyun 		u8 AutoEQ_WaitTime;
290*4882a593Smuzhiyun 		u8 AutoEQ_Result;
291*4882a593Smuzhiyun 		u8 DFE_Valid;
292*4882a593Smuzhiyun 		u8 RS_Valid;
293*4882a593Smuzhiyun 		u16 RS_ValidMap[3];
294*4882a593Smuzhiyun 		u8 EqHDMIMode;
295*4882a593Smuzhiyun 		u8 ManuEQ_state;
296*4882a593Smuzhiyun 		u8 DFE[14][3][3]; // [RS_value][channel012][NumABC]  -> 0x34B...0x353
297*4882a593Smuzhiyun 		u8 CalcRS[3];
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 		u8 EQ_flag_14;
300*4882a593Smuzhiyun 		u8 EQ_flag_20;
301*4882a593Smuzhiyun 		u8 txoe_ready14;
302*4882a593Smuzhiyun 		u8 txoe_ready20;
303*4882a593Smuzhiyun 		u8 stored_RS_14[3];
304*4882a593Smuzhiyun 		u8 stored_RS_20[3];
305*4882a593Smuzhiyun 		u8 current_eq_mode;
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 		// u8 FixedRsIndex[4];
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 		u8 meq_cur_idx;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 		u8 meq_adj_idx[3];
312*4882a593Smuzhiyun 		u32 ced_err_avg[3];
313*4882a593Smuzhiyun 		u32 ced_err_avg_prev[3];
314*4882a593Smuzhiyun 		u8  ced_acc_count;
315*4882a593Smuzhiyun 		u8  manu_eq_fine_tune_count[3];
316*4882a593Smuzhiyun 		u8  manu_eq_fine_tune_best_rs[3];
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	} EQ;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	// u8 edid_buf[128];
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	IT6635_DEV_OPTION_INTERNAL opts;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun } IT6635_DEVICE_DATA;
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun extern IT6635_DEVICE_DATA it66353_gdev;
327*4882a593Smuzhiyun extern const u8 it66353_rs_value[];
328*4882a593Smuzhiyun extern IT6635_RX_OPTIONS it66353_s_RxOpts;
329*4882a593Smuzhiyun extern IT6635_TX_OPTIONS it66353_s_TxOpts;
330*4882a593Smuzhiyun extern IT6635_DEV_OPTION it66353_s_DevOpts;
331*4882a593Smuzhiyun extern u8 it66353_s_default_edid_port0[];
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun #ifdef __cplusplus
335*4882a593Smuzhiyun extern "C" {
336*4882a593Smuzhiyun #endif
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun // --------------------------------
339*4882a593Smuzhiyun extern u8 it66353_h2swwr(u8 offset, u8 wdata);
340*4882a593Smuzhiyun extern u8 it66353_h2swrd(u8 offset);
341*4882a593Smuzhiyun extern u8 it66353_h2swset(u8 offset, u8 mask, u8 wdata);
342*4882a593Smuzhiyun extern void it66353_h2swbrd(u8 offset, u8 length, u8 *rddata);
343*4882a593Smuzhiyun extern void it66353_h2swbwr(u8 offset, u8 length, u8 *rddata);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun extern u8 it66353_h2rxwr(u8 offset, u8 wdata);
346*4882a593Smuzhiyun extern u8 it66353_h2rxrd(u8 offset);
347*4882a593Smuzhiyun extern u8 it66353_h2rxset(u8 offset, u8 mask, u8 dwata);
348*4882a593Smuzhiyun extern void it66353_h2rxbrd(u8 offset, u8 length, u8 *rddata);
349*4882a593Smuzhiyun extern void it66353_h2rxbwr(u8 offset, u8 length, u8 *rddata);
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun extern u8 it66353_cecwr(u8 offset, u8 wdata);
352*4882a593Smuzhiyun extern u8 it66353_cecrd(u8 offset);
353*4882a593Smuzhiyun extern u8 it66353_cecset(u8 offset, u8 mask, u8 wdata);
354*4882a593Smuzhiyun extern void it66353_cecbrd(u8 offset, u8 length, u8 *rddata);
355*4882a593Smuzhiyun extern void it66353_cecbwr(u8 offset, u8 length, u8 *rddata);
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun extern u8 it66353_h2rxedidwr(u8 offset, u8 *wrdata, u8 length);
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun extern void it66353_chgrxbank(u8 bankno);
360*4882a593Smuzhiyun extern void it66353_chgswbank(u8 bankno);
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun extern void it66353_rx_update_ced_err_from_hw(void);
363*4882a593Smuzhiyun extern void it66353_rx_get_ced_err(void);
364*4882a593Smuzhiyun extern void it66353_rx_clear_ced_err(void);
365*4882a593Smuzhiyun extern u8 it66353_rx_monitor_ced_err(void);
366*4882a593Smuzhiyun extern void it66353_rx_DFE_enable(u8 enable);
367*4882a593Smuzhiyun extern void it66353_rx_set_rs_3ch(u8 *rs_value);
368*4882a593Smuzhiyun extern void it66353_rx_set_rs(u8 ch, u8 rs_value);
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun extern u8 it66353_rx_is_all_ch_symlock(void);
371*4882a593Smuzhiyun extern u8 it66353_rx_is_ch_symlock(u8 ch);
372*4882a593Smuzhiyun extern u8 it66353_rx_is_clock_stable(void);
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun extern void it66353_rx_ovwr_hdmi_clk(u8 port, u8 ratio);
375*4882a593Smuzhiyun extern void it66353_rx_ovwr_h20_scrb(u8 port, u8 scrb);
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun extern void it66353_rx_auto_power_down_enable(u8 port, u8 enable);
378*4882a593Smuzhiyun extern void it66353_rx_term_power_down(u8 port, u8 channel);
379*4882a593Smuzhiyun extern void it66353_rx_handle_output_err(void);
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun extern void it66353_sw_enable_timer0(void);
382*4882a593Smuzhiyun extern void it66353_sw_disable_timer0(void);
383*4882a593Smuzhiyun extern u8 it66353_sw_get_timer0_interrupt(void);
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun extern void it66353_sw_clear_hdcp_status(void);
386*4882a593Smuzhiyun // --------------------------------
387*4882a593Smuzhiyun extern void it66353_txoe(u8 enable);
388*4882a593Smuzhiyun extern void it66353_auto_detect_hdmi_encoding(void);
389*4882a593Smuzhiyun extern void it66353_fix_incorrect_hdmi_encoding(void);
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun extern u8 it66353_get_port_info1(u8 port, u8 info);
392*4882a593Smuzhiyun extern u8 it66353_get_port_info0(u8 port, u8 info);
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun extern void it66353_init_rclk(void);
395*4882a593Smuzhiyun extern void it66353_enable_tx_port(u8 enable);
396*4882a593Smuzhiyun // --------------
397*4882a593Smuzhiyun extern void it66353_sys_state(u8 new_state);
398*4882a593Smuzhiyun extern void it66353_rx_reset(void);
399*4882a593Smuzhiyun extern void it66353_rx_caof_init(u8 port);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun extern void it66353_eq_save_h20(void);
402*4882a593Smuzhiyun extern void it66353_eq_load_h20(void);
403*4882a593Smuzhiyun extern void it66353_eq_save_h14(void);
404*4882a593Smuzhiyun extern void it66353_eq_load_h14(void);
405*4882a593Smuzhiyun extern void it66353_eq_load_previous(void);
406*4882a593Smuzhiyun extern void it66353_eq_load_default(void);
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun extern void it66353_eq_reset_state(void);
409*4882a593Smuzhiyun extern void it66353_eq_set_state(u8 state);
410*4882a593Smuzhiyun extern u8 it66353_eq_get_state(void);
411*4882a593Smuzhiyun extern void it66353_eq_reset_txoe_ready(void);
412*4882a593Smuzhiyun extern void it66353_eq_set_txoe_ready(u8 ready);
413*4882a593Smuzhiyun extern u8 it66353_eq_get_txoe_ready(void);
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun extern void it66353_aeq_set_DFE2(u8 EQ0, u8 EQ1, u8 EQ2);
416*4882a593Smuzhiyun extern u8 it66353_rx_is_hdmi20(void);
417*4882a593Smuzhiyun extern void it66353_aeq_diable_eq_trigger(void);
418*4882a593Smuzhiyun extern u8 it66353_aeq_check_sareq_result(void);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun #if DEBUG_FSM_CHANGE
421*4882a593Smuzhiyun #define it66353_fsm_chg(new_state)	__it66353_fsm_chg(new_state, __LINE__)
422*4882a593Smuzhiyun #define it66353_fsm_chg_delayed(new_state)	__it66353_fsm_chg2(new_state, __LINE__)
423*4882a593Smuzhiyun #else
424*4882a593Smuzhiyun extern void it66353_fsm_chg(u8 new_state);
425*4882a593Smuzhiyun extern void it66353_fsm_chg_delayed(u8 new_state);
426*4882a593Smuzhiyun #endif
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun extern void __it66353_fsm_chg(u8 new_state, int caller);
429*4882a593Smuzhiyun extern void __it66353_fsm_chg2(u8 new_state, int caller);
430*4882a593Smuzhiyun // void it66353_vars_init(void);
431*4882a593Smuzhiyun extern bool it66353_device_init(void);
432*4882a593Smuzhiyun extern bool it66353_device_init2(void);
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun extern bool it66353_read_edid(u8 block, u8 offset, int length, u8 *edid_buffer);
435*4882a593Smuzhiyun extern bool it66353_write_one_block_edid(u8 block, u8 *edid_buffer);
436*4882a593Smuzhiyun extern bool it66353_setup_edid_ram(u8 flag);
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun extern void it66353_force_hdmi20(void);
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun #ifdef __cplusplus
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun #endif
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun extern void it66353_rx_skew_adj(u8 ch);
445*4882a593Smuzhiyun #define _rx_edid_address_enable(port)\
446*4882a593Smuzhiyun 		{it66353_h2swset(0x55 + port, 0x24, 0x20); }
447*4882a593Smuzhiyun #define _rx_edid_address_disable(port)\
448*4882a593Smuzhiyun 		{it66353_h2swset(0x55 + port, 0x24, 0x04); }
449*4882a593Smuzhiyun #define _rx_edid_ram_enable(port)\
450*4882a593Smuzhiyun 		{if (it66353_gdev.opts.rx_opt[port]->EnRxDDCBypass == 0) { it66353_h2swset(0x55 + port, 0x01, 0x00); }}
451*4882a593Smuzhiyun #define _rx_edid_ram_disable(port)\
452*4882a593Smuzhiyun 		{ it66353_h2swset(0x55 + port, 0x01, 0x01); }
453*4882a593Smuzhiyun #define _rx_edid_set_chksum(port, sum)\
454*4882a593Smuzhiyun 		{ it66353_h2swwr(0xe1 + port * 2, sum);  }
455*4882a593Smuzhiyun #define _rx_edid_set_cec_phyaddr(port, phyAB, phyCD)\
456*4882a593Smuzhiyun 		{ it66353_h2swwr(0xd9 + port*2, phyAB); it66353_h2swwr(0xda + port*2, phyCD);  }
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun #endif