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 #include <linux/module.h>
13*4882a593Smuzhiyun #include "config.h"
14*4882a593Smuzhiyun #include "platform.h"
15*4882a593Smuzhiyun #include "debug.h"
16*4882a593Smuzhiyun #include "it66353_drv.h"
17*4882a593Smuzhiyun #include "it66353_EQ.h"
18*4882a593Smuzhiyun #include "it66353.h"
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun * TX_PN_SWAP
22*4882a593Smuzhiyun * 1: Enable TX side TMDS P/N swap
23*4882a593Smuzhiyun * 0: Disable TX side TMDS P/N swap
24*4882a593Smuzhiyun */
25*4882a593Smuzhiyun #define TX_PN_SWAP 0
26*4882a593Smuzhiyun #ifndef TX_PN_SWAP
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #pragma message("TX_PN_SWAP is defined to 0")
29*4882a593Smuzhiyun #pragma message("IT6635 EVB should be TX_PN_SWAP==1")
30*4882a593Smuzhiyun #error ("Please define TX_PN_SWAP by your PCB layout.")
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun #else
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #if TX_PN_SWAP
35*4882a593Smuzhiyun #ifdef _SHOW_PRAGMA_MSG
36*4882a593Smuzhiyun #pragma message("TX_PN_SWAP is pre-defined to 1")
37*4882a593Smuzhiyun #endif
38*4882a593Smuzhiyun #else
39*4882a593Smuzhiyun #ifdef _SHOW_PRAGMA_MSG
40*4882a593Smuzhiyun #pragma message("TX_PN_SWAP is pre-defined to 0")
41*4882a593Smuzhiyun #endif
42*4882a593Smuzhiyun #endif
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun /*
47*4882a593Smuzhiyun * DEFAULT_RS_IDX
48*4882a593Smuzhiyun * :The default EQ when power on.
49*4882a593Smuzhiyun */
50*4882a593Smuzhiyun #define DEFAULT_RS_IDX 4
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun * DEFAULT_PORT
54*4882a593Smuzhiyun * :The default active port when power on.
55*4882a593Smuzhiyun */
56*4882a593Smuzhiyun #define DEFAULT_PORT 0
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun // constant definition
59*4882a593Smuzhiyun #define HPD_TOGGLE_TIMEOUT_400MS (27)
60*4882a593Smuzhiyun #define HPD_TOGGLE_TIMEOUT_1SEC (100)
61*4882a593Smuzhiyun #define HPD_TOGGLE_TIMEOUT_2SEC (20|(0x80))
62*4882a593Smuzhiyun #define HPD_TOGGLE_TIMEOUT_3SEC (30|(0x80))
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun IT6635_RX_OPTIONS it66353_s_RxOpts = {
67*4882a593Smuzhiyun 0xC3, // u8 tag1;
68*4882a593Smuzhiyun 0, // u8 EnRxDDCBypass;
69*4882a593Smuzhiyun 0, // u8 EnRxPWR5VBypass;
70*4882a593Smuzhiyun 0, // u8 EnRxHPDBypass;
71*4882a593Smuzhiyun 1, // u8 TryFixedEQFirst;
72*4882a593Smuzhiyun 1, // u8 EnableAutoEQ;
73*4882a593Smuzhiyun 1, // u8 NonActivePortReplyHPD;
74*4882a593Smuzhiyun 0, // u8 DisableEdidRam;
75*4882a593Smuzhiyun {DEFAULT_RS_IDX, DEFAULT_RS_IDX, DEFAULT_RS_IDX}, // u8 DefaultEQ[3];
76*4882a593Smuzhiyun 1, // u8 FixIncorrectHdmiEnc;
77*4882a593Smuzhiyun 0, // u8 HPDOutputInverse;
78*4882a593Smuzhiyun HPD_TOGGLE_TIMEOUT_2SEC, // u8 HPDTogglePeriod;
79*4882a593Smuzhiyun 1, // u8 TxOEAlignment;
80*4882a593Smuzhiyun (u8)sizeof(IT6635_RX_OPTIONS), // u8 str_size;
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun IT6635_TX_OPTIONS it66353_s_TxOpts = {
84*4882a593Smuzhiyun 0x3C, // u8 tag1;
85*4882a593Smuzhiyun TX_PN_SWAP, // u8 EnTxPNSwap;
86*4882a593Smuzhiyun TX_PN_SWAP, // u8 EnTxChSwap;
87*4882a593Smuzhiyun 0, // u8 EnTxVCLKInv;
88*4882a593Smuzhiyun 0, // u8 EnTxOutD1t;
89*4882a593Smuzhiyun 1, // u8 CopyEDIDFromSink;
90*4882a593Smuzhiyun 1, // u8 ParsePhysicalAddr;
91*4882a593Smuzhiyun 1, // u8 TurnOffTx5VWhenSwitchPort;
92*4882a593Smuzhiyun (u8)sizeof(IT6635_TX_OPTIONS), // u8 str_size;
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun IT6635_DEV_OPTION it66353_s_DevOpts = {
96*4882a593Smuzhiyun 0x5A, // u8 tag1;
97*4882a593Smuzhiyun SWAddr, // u8 SwAddr;
98*4882a593Smuzhiyun RXAddr, // u8 RxAddr;
99*4882a593Smuzhiyun CECAddr, // u8 CecAddr;
100*4882a593Smuzhiyun RXEDIDAddr, // u8 EdidAddr;
101*4882a593Smuzhiyun // u8 EnCEC;
102*4882a593Smuzhiyun 0, // u8 ForceRxOn;
103*4882a593Smuzhiyun 1, // u8 RxAutoPowerDown;
104*4882a593Smuzhiyun 1, // u8 DoTxPowerDown;
105*4882a593Smuzhiyun 0, // u8 TxPowerDownWhileWaitingClock;
106*4882a593Smuzhiyun (u8)sizeof(IT6635_DEV_OPTION), // u8 str_size;
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun u8 it66353_s_default_edid_port0[] = {
111*4882a593Smuzhiyun 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
112*4882a593Smuzhiyun 0x26, 0x85, 0x35, 0x66, 0x01, 0x01, 0x01, 0x01,
113*4882a593Smuzhiyun 0x00, 0x19, 0x01, 0x03, 0x80, 0x80, 0x48, 0x78,
114*4882a593Smuzhiyun 0x0A, 0xDA, 0xFF, 0xA3, 0x58, 0x4A, 0xA2, 0x29,
115*4882a593Smuzhiyun 0x17, 0x49, 0x4B, 0x20, 0x08, 0x00, 0x31, 0x40,
116*4882a593Smuzhiyun 0x61, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
117*4882a593Smuzhiyun 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0xE8,
118*4882a593Smuzhiyun 0x00, 0x30, 0xF2, 0x70, 0x5A, 0x80, 0xB0, 0x58,
119*4882a593Smuzhiyun 0x8A, 0x00, 0xBA, 0x88, 0x21, 0x00, 0x00, 0x1E,
120*4882a593Smuzhiyun 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40,
121*4882a593Smuzhiyun 0x58, 0x2C, 0x45, 0x00, 0xBA, 0x88, 0x21, 0x00,
122*4882a593Smuzhiyun 0x00, 0x1E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x50,
123*4882a593Smuzhiyun 0x61, 0x6E, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x63,
124*4882a593Smuzhiyun 0x2D, 0x54, 0x56, 0x0A, 0x00, 0x00, 0x00, 0xFD,
125*4882a593Smuzhiyun 0x00, 0x17, 0x3D, 0x0F, 0x88, 0x3C, 0x00, 0x0A,
126*4882a593Smuzhiyun 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0xF0,
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun 0x02, 0x03, 0x43, 0xF0, 0x57, 0x10, 0x1F, 0x05,
129*4882a593Smuzhiyun 0x14, 0x20, 0x21, 0x22, 0x04, 0x13, 0x03, 0x12,
130*4882a593Smuzhiyun 0x07, 0x16, 0x5D, 0x5E, 0x5F, 0x62, 0x63, 0x64,
131*4882a593Smuzhiyun 0x61, 0x60, 0x66, 0x65, 0x23, 0x09, 0x07, 0x01,
132*4882a593Smuzhiyun 0x6E, 0x03, 0x0C, 0x00, 0x10, 0x00, 0x38, 0x3C,
133*4882a593Smuzhiyun 0x2F, 0x00, 0x80, 0x01, 0x02, 0x03, 0x04, 0x67,
134*4882a593Smuzhiyun 0xD8, 0x5D, 0xC4, 0x01, 0x78, 0x80, 0x03, 0xE2,
135*4882a593Smuzhiyun 0x00, 0x4B, 0xE3, 0x05, 0x1F, 0x01, 0xE4, 0x0F,
136*4882a593Smuzhiyun 0x00, 0x00, 0x78, 0x56, 0x5E, 0x00, 0xA0, 0xA0,
137*4882a593Smuzhiyun 0xA0, 0x29, 0x50, 0x30, 0x20, 0x35, 0x00, 0xBA,
138*4882a593Smuzhiyun 0x88, 0x21, 0x00, 0x00, 0x1A, 0x66, 0x21, 0x56,
139*4882a593Smuzhiyun 0xAA, 0x51, 0x00, 0x1E, 0x30, 0x46, 0x8F, 0x33,
140*4882a593Smuzhiyun 0x00, 0xBA, 0x88, 0x21, 0x00, 0x00, 0x1E, 0x00,
141*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143*4882a593Smuzhiyun 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun
it66353_options_init(void)146*4882a593Smuzhiyun void it66353_options_init(void)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun it66353_gdev.opts.rx_opt[0] = &it66353_s_RxOpts;
149*4882a593Smuzhiyun it66353_gdev.opts.rx_opt[1] = &it66353_s_RxOpts;
150*4882a593Smuzhiyun it66353_gdev.opts.rx_opt[2] = &it66353_s_RxOpts;
151*4882a593Smuzhiyun it66353_gdev.opts.rx_opt[3] = &it66353_s_RxOpts;
152*4882a593Smuzhiyun it66353_gdev.opts.active_rx_opt = it66353_gdev.opts.rx_opt[DEFAULT_PORT];
153*4882a593Smuzhiyun it66353_gdev.opts.tx_opt = &it66353_s_TxOpts;
154*4882a593Smuzhiyun it66353_gdev.opts.dev_opt = &it66353_s_DevOpts;
155*4882a593Smuzhiyun it66353_gdev.vars.Rx_active_port = DEFAULT_PORT;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun it66353_vars_init();
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
161