Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6) #ifdef __linux__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) //#include <linux/bits.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <linux/of_graph.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/extcon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #include <linux/regulator/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #include <linux/wait.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #include <drm/drm_mipi_dsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) #include <crypto/hash.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #include <crypto/sha.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #include <drm/drm_atomic_helper.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #include <drm/drm_bridge.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #include <drm/drm_crtc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #include <drm/drm_crtc_helper.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #include <drm/drm_dp_helper.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #include <drm/drm_edid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #include <drm/drm_print.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #include <drm/drm_mipi_dsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #include <drm/drm_probe_helper.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #include <sound/hdmi-codec.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #include "platform.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) #define IT6161_PRINT(fmt, ...)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 	_DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) static int ite_debug = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #define it6161_debug(fmt, ...) do {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 		if (ite_debug)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 			_DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) /* Vendor option */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) #define AUDIO_SELECT I2S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) #define AUDIO_TYPE LPCM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) #define AUDIO_SAMPLE_RATE SAMPLE_RATE_48K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #define AUDIO_CHANNEL_COUNT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64)  * 0: Standard I2S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65)  * 1: 32bit I2S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) #define I2S_INPUT_FORMAT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70)  * 0: Left-justified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71)  * 1: Right-justified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #define I2S_JUSTIFIED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76)  * 0: Data delay 1T correspond to WS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77)  * 1: No data delay correspond to WS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) #define I2S_DATA_DELAY 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82)  * 0: Left channel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83)  * 1: Right channel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) #define I2S_WS_CHANNEL 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88)  * 0: MSB shift first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89)  * 1: LSB shift first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) #define I2S_DATA_SEQUENCE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) #define AUX_WAIT_TIMEOUT_MS 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) #define PIXEL_CLK_DELAY 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) #define PIXEL_CLK_INVERSE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) #define ADJUST_PHASE_THRESHOLD 80000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #define MAX_PIXEL_CLK 95000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) #define DEFAULT_DRV_HOLD 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #define DEFAULT_PWR_ON 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) enum hdmi_tx_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	HDMI_TX_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	HDMI_TX_BY_PASS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	HDMI_TX_ENABLE_DE_ONLY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	HDMI_TX_ENABLE_PATTERN_GENERATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) enum it6161_audio_select {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	I2S = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 	SPDIF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111)     TDM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) enum it6161_audio_sample_rate {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 	SAMPLE_RATE_24K = 0x6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 	SAMPLE_RATE_32K = 0x3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	SAMPLE_RATE_48K = 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 	SAMPLE_RATE_96K = 0xA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	SAMPLE_RATE_192K = 0xE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 	SAMPLE_RATE_44_1K = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 	SAMPLE_RATE_88_2K = 0x8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	SAMPLE_RATE_176_4K = 0xC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) enum it6161_audio_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 	LPCM = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	NLPCM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	DSS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) enum it6161_audio_u32_length {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	u32_LENGTH_16BIT = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	u32_LENGTH_18BIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	u32_LENGTH_20BIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	u32_LENGTH_24BIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139)  * Audio Sample u32 Length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140)  * u32_LENGTH_16BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141)  * u32_LENGTH_18BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142)  * u32_LENGTH_20BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143)  * u32_LENGTH_24BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) #define AUDIO_u32_LENGTH u32_LENGTH_24BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) enum it6161_active_level {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148)     LOW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149)     HIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) enum dsi_data_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 	RGB_24b = 0x3E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	RGB_30b = 0x0D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	RGB_36b = 0x1D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	RGB_18b = 0x1E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	RGB_18b_L = 0x2E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	YCbCr_16b = 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	YCbCr_20b = 0x0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	YCbCr_24b = 0x1C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) #include "ite_it6161_hdmi_tx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) #include "ite_it6161_mipi_rx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) // for sample clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) #define AUDFS_22p05KHz  4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) #define AUDFS_44p1KHz 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) #define AUDFS_88p2KHz 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) #define AUDFS_176p4KHz    12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) #define AUDFS_24KHz  6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) #define AUDFS_48KHz  2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) #define AUDFS_96KHz  10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) #define AUDFS_192KHz 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) #define AUDFS_768KHz 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) #define AUDFS_32KHz  3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) #define AUDFS_OTHER    1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) ////////////////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) // HDMI VTable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) ////////////////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) static HDMI_VTiming const s_VMTable[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186)     { 1,0,640,480,800,525,25175000L,0x89,16,96,48,10,2,33,PROG,Vneg,Hneg},//640x480@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187)     { 2,0,720,480,858,525,27000000L,0x80,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188)     { 3,0,720,480,858,525,27000000L,0x80,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189)     { 4,0,1280,720,1650,750,74250000L,0x2E,110,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190)     { 5,0,1920,540,2200,562,74250000L,0x2E,88,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191)     { 6,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192)     { 7,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193)     { 8,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194)     { 9,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195)     {10,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196)     {11,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197)     {12,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198)     {13,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199)     {14,1,1440,480,1716,525,54000000L,0x40,32,124,120,9,6,30,PROG,Vneg,Hneg},//1440x480@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200)     {15,1,1440,480,1716,525,54000000L,0x40,32,124,120,9,6,30,PROG,Vneg,Hneg},//1440x480@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201)     {16,0,1920,1080,2200,1125,148500000L,0x17,88,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202)     {17,0,720,576,864,625,27000000L,0x80,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203)     {18,0,720,576,864,625,27000000L,0x80,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204)     {19,0,1280,720,1980,750,74250000L,0x2E,440,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205)     {20,0,1920,540,2640,562,74250000L,0x2E,528,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206)     {21,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207)     {22,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208)     {23,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209)     {24,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210)     {25,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211)     {26,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212)     {27,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213)     {28,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214)     {29,1,1440,576,1728,625,54000000L,0x40,24,128,136,5,5,39,PROG,Vpos,Hneg},//1440x576@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215)     {30,1,1440,576,1728,625,54000000L,0x40,24,128,136,5,5,39,PROG,Vpos,Hneg},//1440x576@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216)     {31,0,1920,1080,2640,1125,148500000L,0x17,528,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217)     {32,0,1920,1080,2750,1125,74250000L,0x2E,638,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@24Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218)     {33,0,1920,1080,2640,1125,74250000L,0x2E,528,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@25Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219)     {34,0,1920,1080,2200,1125,74250000L,0x2E,88,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@30Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220)     {35,2,2880,480,1716*2,525,108000000L,0x20,32*2,124*2,120*2,9,6,30,PROG,Vneg,Hneg},//2880x480@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221)     {36,2,2880,480,1716*2,525,108000000L,0x20,32*2,124*2,120*2,9,6,30,PROG,Vneg,Hneg},//2880x480@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222)     {37,1,2880,576,3456,625,108000000L,0x20,24*2,128*2,136*2,5,5,39,PROG,Vneg,Hneg},//2880x576@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223)     {38,2,2880,576,3456,625,108000000L,0x20,24*2,128*2,136*2,5,5,39,PROG,Vneg,Hneg},//2880x576@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224)     {39,0,1920,540,2304,625,72000000L,0x17,32,168,184,23,5,57,INTERLACE,Vneg,Hpos},//1920x1080@50Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225)     // 100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226)     {40,0,1920,540,2640,562,148500000L,0x17,528,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227)     {41,0,1280,720,1980,750,148500000L,0x17,440,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228)     {42,0,720,576,864,625,   54000000L,0x40,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229)     {43,0,720,576,864,625,   54000000L,0x40,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230)     {44,1,720,288,864,312,   27000000L,0x80,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231)     {45,1,720,288,864,312,   27000000L,0x80,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232)     // 120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233)     {46,0,1920,540,2200,562,148500000L,0x17,88,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234)     {47,0,1280,720,1650,750,148500000L,0x17,110,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235)     {48,0, 720,480, 858,525, 54000000L,0x40,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236)     {49,0, 720,480, 858,525, 54000000L,0x40,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237)     {50,1, 720,240, 858,262, 27000000L,0x80,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238)     {51,1, 720,240, 858,262, 27000000L,0x80,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240)     // 200Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241)     {52,0,720,576,864,625,108000000L,0x20,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@200Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242)     {53,0,720,576,864,625,108000000L,0x20,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@200Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243)     {54,1,720,288,864,312, 54000000L,0x40,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@200Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244)     {55,1,720,288,864,312, 54000000L,0x40,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@200Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245)     // 240Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246)     {56,0,720,480,858,525,108000000L,0x20,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247)     {57,0,720,480,858,525,108000000L,0x20,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248)     {58,1,720,240,858,262, 54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249)     {59,1,720,240,858,262, 54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250)     // 720p low resolution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251)     {60,0,1280, 720,3300, 750, 59400000L,0x3A,1760,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@24Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252)     {61,0,1280, 720,3960, 750, 74250000L,0x2E,2420,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@25Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253)     {62,0,1280, 720,3300, 750, 74250000L,0x2E,1760,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@30Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254)     // 1080p high refresh rate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255)     {63,0,1920,1080,2200,1125,297000000L,0x0B, 88,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@120Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256)     {64,0,1920,1080,2640,1125,297000000L,0x0B,528,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@100Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257)     // VESA mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258)     {0,0,640,350,832,445,31500000L,0x6D,32,64,96,32,3,60,PROG,Vneg,Hpos},// 640x350@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259)     {0,0,640,400,832,445,31500000L,0x6D,32,64,96,1,3,41,PROG,Vneg,Hneg},// 640x400@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260)     {0,0,832,624,1152,667,57283000L,0x3C,32,64,224,1,3,39,PROG,Vneg,Hneg},// 832x624@75Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261)     {0,0,720,350,900,449,28322000L,0x7A,18,108,54,59,2,38,PROG,Vneg,Hneg},// 720x350@70Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262)     {0,0,720,400,900,449,28322000L,0x7A,18,108,54,13,2,34,PROG,Vpos,Hneg},// 720x400@70Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263)     {0,0,720,400,936,446,35500000L,0x61,36,72,108,1,3,42,PROG,Vpos,Hneg},// 720x400@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264)     {0,0,640,480,800,525,25175000L,0x89,16,96,48,10,2,33,PROG,Vneg,Hneg},// 640x480@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265)     {0,0,640,480,832,520,31500000L,0x6D,24,40,128,9,3,28,PROG,Vneg,Hneg},// 640x480@72
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266)     {0,0,640,480,840,500,31500000L,0x6D,16,64,120,1,3,16,PROG,Vneg,Hneg},// 640x480@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267)     {0,0,640,480,832,509,36000000L,0x60,56,56,80,1,3,25,PROG,Vneg,Hneg},// 640x480@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268)     {0,0,800,600,1024,625,36000000L,0x60,24,72,128,1,2,22,PROG,Vpos,Hpos},// 800x600@56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269)     {0,0,800,600,1056,628,40000000L,0x56,40,128,88,1,4,23,PROG,Vpos,Hpos},// 800x600@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270)     {0,0,800,600,1040,666,50000000L,0x45,56,120,64,37,6,23,PROG,Vpos,Hpos},// 800x600@72
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271)     {0,0,800,600,1056,625,49500000L,0x45,16,80,160,1,3,21,PROG,Vpos,Hpos},// 800x600@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272)     {0,0,800,600,1048,631,56250000L,0x3D,32,64,152,1,3,27,PROG,Vpos,Hpos},// 800X600@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273)     {0,0,848,480,1088,517,33750000L,0x66,16,112,112,6,8,23,PROG,Vpos,Hpos},// 840X480@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274)     {0,0,1024,384,1264,408,44900000L,0x4C,8,176,56,0,4,20,INTERLACE,Vpos,Hpos},//1024x768(I)@87Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275)     {0,0,1024,768,1344,806,65000000L,0x35,24,136,160,3,6,29,PROG,Vneg,Hneg},// 1024x768@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276)     {0,0,1024,768,1328,806,75000000L,0x2E,24,136,144,3,6,29,PROG,Vneg,Hneg},// 1024x768@70
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277)     {0,0,1024,768,1312,800,78750000L,0x2B,16,96,176,1,3,28,PROG,Vpos,Hpos},// 1024x768@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278)     {0,0,1024,768,1376,808,94500000L,0x24,48,96,208,1,3,36,PROG,Vpos,Hpos},// 1024x768@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279)     {0,0,1152,864,1600,900,108000000L,0x20,64,128,256,1,3,32,PROG,Vpos,Hpos},// 1152x864@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280)     {0,0,1280,768,1440,790,68250000L,0x32,48,32,80,3,7,12,PROG,Vneg,Hpos},// 1280x768@60-R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281)     {0,0,1280,768,1664,798,79500000L,0x2B,64,128,192,3,7,20,PROG,Vpos,Hneg},// 1280x768@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282)     {0,0,1280,768,1696,805,102250000L,0x21,80,128,208,3,7,27,PROG,Vpos,Hneg},// 1280x768@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283)     {0,0,1280,768,1712,809,117500000L,0x1D,80,136,216,3,7,31,PROG,Vpos,Hneg},// 1280x768@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284)     {0,0,1280,800,1440, 823, 71000000L,0x31, 48, 32, 80,3,6,14,PROG,Vpos,Hneg},// 1280x800@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285)     {0,0,1280,800,1680, 831, 83500000L,0x29, 72,128,200,3,6,22,PROG,Vpos,Hneg},// 1280x800@60Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286)     {0,0,1280,800,1696, 838,106500000L,0x20, 80,128,208,3,6,29,PROG,Vpos,Hneg},// 1280x800@75Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287)     {0,0,1280,800,1712, 843,122500000L,0x1C, 80,136,216,3,6,34,PROG,Vpos,Hneg},// 1280x800@85Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	{0,0,1280,960,1800,1000,108000000L,0x20,96,112,312,1,3,36,PROG,Vpos,Hpos},// 1280x960@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289)     {0,0,1280,960,1728,1011,148500000L,0x17,64,160,224,1,3,47,PROG,Vpos,Hpos},// 1280x960@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290)     {0,0,1280,1024,1688,1066,108000000L,0x20,48,112,248,1,3,38,PROG,Vpos,Hpos},// 1280x1024@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291)     {0,0,1280,1024,1688,1066,135000000L,0x19,16,144,248,1,3,38,PROG,Vpos,Hpos},// 1280x1024@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292)     {0,0,1280,1024,1728,1072,157500000L,0x15,64,160,224,1,3,44,PROG,Vpos,Hpos},// 1280X1024@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293)     {0,0,1360,768,1792,795,85500000L,0x28,64,112,256,3,6,18,PROG,Vpos,Hpos},// 1360X768@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294)     {0,0,1366,768,1792,798,85500000L,0x28, 70,143,213,3,3,24,PROG,Vpos,Hpos},// 1366X768@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295)     {0,0,1366,768,1500,800,72000000L,0x30, 14, 56, 64,1,3,28,PROG,Vpos,Hpos},// 1360X768@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296)     {0,0,1400,1050,1560,1080,101000000L,0x22,48,32,80,3,4,23,PROG,Vneg,Hpos},// 1400x768@60-R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297)     {0,0,1400,1050,1864,1089,121750000L,0x1C,88,144,232,3,4,32,PROG,Vpos,Hneg},// 1400x768@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298)     {0,0,1400,1050,1896,1099,156000000L,0x16,104,144,248,3,4,42,PROG,Vpos,Hneg},// 1400x1050@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299)     {0,0,1400,1050,1912,1105,179500000L,0x13,104,152,256,3,4,48,PROG,Vpos,Hneg},// 1400x1050@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300)     {0,0,1440,900,1600,926,88750000L,0x26,48,32,80,3,6,17,PROG,Vneg,Hpos},// 1440x900@60-R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301)     {0,0,1440,900,1904,934,106500000L,0x20,80,152,232,3,6,25,PROG,Vpos,Hneg},// 1440x900@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302)     {0,0,1440,900,1936,942,136750000L,0x19,96,152,248,3,6,33,PROG,Vpos,Hneg},// 1440x900@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303)     {0,0,1440,900,1952,948,157000000L,0x16,104,152,256,3,6,39,PROG,Vpos,Hneg},// 1440x900@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304)     {0,0,1600,1200,2160,1250,162000000L,0x15,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305)     {0,0,1600,1200,2160,1250,175500000L,0x13,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@65
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306)     {0,0,1600,1200,2160,1250,189000000L,0x12,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@70
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307)     {0,0,1600,1200,2160,1250,202500000L,0x11,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308)     {0,0,1600,1200,2160,1250,229500000L,0x0F,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309)     {0,0,1680,1050,1840,1080,119000000L,0x1D,48,32,80,3,6,21,PROG,Vneg,Hpos},// 1680x1050@60-R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310)     {0,0,1680,1050,2240,1089,146250000L,0x17,104,176,280,3,6,30,PROG,Vpos,Hneg},// 1680x1050@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311)     {0,0,1680,1050,2272,1099,187000000L,0x12,120,176,296,3,6,40,PROG,Vpos,Hneg},// 1680x1050@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312)     {0,0,1680,1050,2288,1105,214750000L,0x10,128,176,304,3,6,46,PROG,Vpos,Hneg},// 1680x1050@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313)     {0,0,1792,1344,2448,1394,204750000L,0x10,128,200,328,1,3,46,PROG,Vpos,Hneg},// 1792x1344@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314)     {0,0,1792,1344,2456,1417,261000000L,0x0D,96,216,352,1,3,69,PROG,Vpos,Hneg},// 1792x1344@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315)     {0,0,1856,1392,2528,1439,218250000L,0x0F,96,224,352,1,3,43,PROG,Vpos,Hneg},// 1856x1392@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316)     {0,0,1856,1392,2560,1500,288000000L,0x0C,128,224,352,1,3,104,PROG,Vpos,Hneg},// 1856x1392@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317)     {0,0,1920,1200,2080,1235,154000000L,0x16,48,32,80,3,6,26,PROG,Vneg,Hpos},// 1920x1200@60-R
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318)     {0,0,1920,1200,2592,1245,193250000L,0x11,136,200,336,3,6,36,PROG,Vpos,Hneg},// 1920x1200@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319)     {0,0,1920,1200,2608,1255,245250000L,0x0E,136,208,344,3,6,46,PROG,Vpos,Hneg},// 1920x1200@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320)     {0,0,1920,1200,2624,1262,281250000L,0x0C,144,208,352,3,6,53,PROG,Vpos,Hneg},// 1920x1200@85
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321)     {0,0,1920,1440,2600,1500,234000000L,0x0E,128,208,344,1,3,56,PROG,Vpos,Hneg},// 1920x1440@60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322)     {0,0,1920,1440,2640,1500,297000000L,0x0B,144,224,352,1,3,56,PROG,Vpos,Hneg},// 1920x1440@75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) #define DIFF(a,b) (((a)>(b))?((a)-(b)):((b)-(a)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) static bool bChangeMode = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) static unsigned char CommunBuff[128] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) static const u8 CA[] = { 0,0,0, 02, 0x3, 0x7, 0xB, 0xF, 0x1F } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) static u32 VideoPixelClock ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) static u8 pixelrep ; // no pixelrepeating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) // static HDMI_Aspec aspec ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) // static HDMI_Colorimetry Colorimetry ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) static u32 ulAudioSampleFS = INPUT_SAMPLE_FREQ_HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) // u8 bAudioSampleFreq = INPUT_SAMPLE_FREQ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) static u8 bOutputAudioChannel = OUTPUT_CHANNEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) static u8 bOutputAudioType=CNOFIG_INPUT_AUDIO_TYPE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) #define MSCOUNT 1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) #define LOADING_UPDATE_TIMEOUT (3000/32)    // 3sec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) static HDMITXDEV hdmiTxDev[HDMITX_MAX_DEV_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) /* configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) //#define ENABLE_HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) #define ENABLE_MIPI_RX_EXTERNAL_CLOCK false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) #define MPLaneSwap FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) #define MPPNSwap FALSE /* TRUE: MTK , FALSE: Solomon */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) #define MIPI_RX_LANE_COUNT 4 /* 1~4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) #define OUTPUT_COLOR_MODE F_MODE_RGB444 /* F_MODE_YUV444, F_MODE_YUV422, F_MODE_RGB444 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) #define HDMI_TX_MODE HDMI_TX_ENABLE_DE_ONLY /* HDMI_TX_NONE, HDMI_TX_BY_PASS, HDMI_TX_ENABLE_DE_ONLY, HDMI_TX_ENABLE_PATTERN_GENERATOR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) #define HDMI_TX_PATTERN_GENERATOR_FORMAT 16 /* support format 2, 4, 16*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) #define HDMI_TX_PATTERN_COLLOR_R 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) #define HDMI_TX_PATTERN_COLLOR_G 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) #define HDMI_TX_PATTERN_COLLOR_B 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) /* vendor option */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) #define EOTPSel 0 /* LM option 0~15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) #define EnDeSkew TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) #define PPIDbgSel 12/* 0~15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) #define RegIgnrNull 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) #define RegIgnrBlk 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) #define RegEnDummyECC 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) #define LMDbgSel 0 /* 0~7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) #define EnContCK TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) #define HSSetNum 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) #define EnMBPM FALSE /* enable MIPI Bypass Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) #if (EnMBPM == TRUE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) #define PREC_Update TRUE//int PREC_Update = FALSE;  // enable P-timing update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) #define MREC_Update TRUE//int MREC_Update = FALSE;  // enable M-timing update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) #define EnTBPM TRUE /* enable HDMITX Bypass Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) #define PREC_Update FALSE//int PREC_Update = FALSE; // enable P-timing update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) #define MREC_Update FALSE//int MREC_Update = FALSE; // enable M-timing update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) #define EnTBPM FALSE /* enable HDMITX Bypass Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) #define REGSELDEF FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) #define MPForceStb FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) #define EnHReSync FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) #define EnVReSync FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) #define EnFReSync FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) #define EnVREnh FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) #define EnVREnhSel 1 /* 0:Div2, 1:Div4, 2:Div8, 3:Div16, 4:Div32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) #define EnMAvg TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) #if (IC_VERSION == 0xC0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) #define SkipStg 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) #define SkipStg 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) #if (IC_VERSION == 0xC0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) #define PDREFCLK FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) #define PDREFCLK TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) #define PDREFCNT 0 /* when PDREFCLK=TRUE, 0:div2, 1:div4, 2:div8, 3:divg16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) #define EnIntWakeU3 FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) #define EnIOIDDQ FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) #define EnStb2Rst FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) #define EnExtStdby FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) #define EnStandby FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) #if (IC_VERSION == 0xC0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) #define MShift 4//int MShift = 5; // default: 0 //fmt2 fmt4 :4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) #define PPSFFRdStg 0x04//int PPSFFRdStg = 0x10; //PPSFFRdStg(2:0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) #define RegAutoSync TRUE//int RegAutoSync = TRUE;//add sync falling //pet:D0 20200211
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) #define MShift 5//int MShift = 5; // default: 0 //fmt2 fmt4 :4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) #define PPSFFRdStg 0x10//int PPSFFRdStg = 0x10; //PPSFFRdStg(2:0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) #endif //#if (IC_VERSION == 0xC0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) #define PShift 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) #define EnFFAutoRst TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) #define RegEnSyncErr FALSE//int RegEnSyncErr = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) #define EnTxCRC TRUE//int EnTxCRC = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) #define TxCRCnum (0x20) //D0 20200211//(0x00)//TxCRCnum(6:0)//int TxCRCnum = 0x00; //TxCRCnum(6:0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) #if (IC_VERSION == 0xC0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) #define InvMCLK TRUE //FALSE for solomon, if NonUFO, MCLK max = 140MHz with InvMCLK=TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) #define InvMCLK FALSE //FALSE for solomon, if NonUFO, MCLK max = 140MHz with InvMCLK=TRUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) #define InvPCLK FALSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) #ifndef INV_INPUT_PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) #define PCLKINV 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) #define PCLKINV B_TX_VDO_LATCH_EDGE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) #ifndef INV_INPUT_ACLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442)     #define InvAudCLK 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444)     #define InvAudCLK B_TX_AUDFMT_FALL_EDGE_SAMPLE_WS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) // #define INIT_CLK_LOW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) #define TxChSwap 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) #define TxPNSwap 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) #define NRTXRCLK 1//int NRTXRCLK = true;//it6161b0 option true:set TRCLK by self
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) #define RCLKFreqSel 1// int RCLKFreqSel = true; // false:  10MHz(div1),  true  : 20 MHz(OSSDIV2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) // #ifdef REDUCE_HDMITX_SRC_JITTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	// #define ForceTxCLKStb true// int ForceTxCLKStb = false;  //true:define _hdmitx_jitter_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) // #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	#define ForceTxCLKStb true //20200220 C code set true-> false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) // #endif //#ifdef REDUCE_HDMITX_SRC_JITTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) static const RegSetEntry HDMITX_Init_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460)     {0x0F, 0x40, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 	//PLL Reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462)     {0x62, 0x08, 0x00}, // XP_RESETB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463)     {0x64, 0x04, 0x00}, // IP_RESETB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464)     {0x0F, 0x01, 0x00}, // bank 0 ;3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465)     #ifdef INIT_CLK_LOW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466)         {0x62, 0x90, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467)         {0x64, 0x89, 0x09},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468)         {0x68, 0x10, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473)     // {0xD1, 0x0E, 0x0C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474)     // {0x65, 0x03, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475)     // #ifdef NON_SEQUENTIAL_YCBCR422 // for ITE HDMIRX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476)         // {0x71, 0xFC, 0x1C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477)     // #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478)         // {0x71, 0xFC, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479)     // #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481)     {0x8D, 0xFF, CEC_I2C_SLAVE_ADDR},//EnCEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482)     //{0x0F, 0x08, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	{0xA9, 0x80, (EnTBPM<<7)},// hdmitxset(0xa9, 0xc0, (EnTBPM<<7) + (EnTxPatMux<<6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	{0xBF, 0x80, (NRTXRCLK<<7)},//from c code hdmitxset(0xbf, 0x80, (NRTXRCLK<<7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	// Initial Value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487)     {0xF8,0xFF,0xC3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488)     {0xF8,0xFF,0xA5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	//{0x05,0x1E,0x0C},//hdmitxset(0x05, 0x1E, (ForceRxOn<<4)+(RCLKPDSel<<2)+(RCLKPDEn<<1));ForceRxOn:F,RCLKPDSel=3,RCLKPDSel=false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	{0xF4,0x0C,0x00},//hdmitxset(0xF4, 0x0C, DDCSpeed<<2);//DDC75K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	{0xF3,0x02,0x00},//hdmitxset(0xF3, 0x02, ForceVOut<<1);//ForceVOut:false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492)     // {0x20, 0x80, 0x80},//TODO: check need or not?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493)     // {0x37, 0x01, 0x00},//TODO: check need or not?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494)     // {0x20, 0x80, 0x00},//TODO: check need or not?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495)     {0xF8,0xFF,0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	{0x5A,0x0C,0x0C},//hdmitxset(0x5A, 0x0C, 0x0C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	{0xD1,0x0A,((ForceTxCLKStb)<<3)+0x02},//hdmitxset(0xD1, 0x0A, (ForceTxCLKStb<<3)+0x02);   // High Sensitivity , modified by junjie force "CLK_stable"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	{0x5D,0x04,((RCLKFreqSel)<<2)},//hdmitxset(0x5D, 0x04, (RCLKFreqSel<<2));//int RCLKFreqSel = true; // false:  10MHz(div1),  true  : 20 MHz(OSSDIV2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	{0x65,0x03,0x00},//hdmitxset(0x65, 0x03, RINGOSC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	{0x71,0xF9,((0<<6)+(0<<5)+(1<<4)+(1<<3)+0)},//hdmitxset(0x71, 0xF9, (XPStableTime<<6)+(EnXPLockChk<<5)+(EnPLLBufRst<<4)+(EnFFAutoRst<<3)+ EnFFManualRst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	{0xCF,0xFF,(0<<7)+(0<<6)+(0<<4)+(0<<2)+0},//hdmitxset(0xCF, 0xFF, (EnPktLimitGB<<7)+(EnPktBlankGB<<6)+(KeepOutGBSel<<4)+(PktLimitGBSel<<2)+PktBlankGBSel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	{0xd1,0x02,0x00},//hdmitxset(0xd1, 0x02, 0x00);//VidStbSen = false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504)     // 2014/01/07 HW Request for ROSC stable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506)     // {0x5D,0x03,0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507)     //~2014/01/07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) // #ifdef USE_IT66120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509)     // {0x5A, 0x02, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510)     // {0xE2, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) // #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513)     {0x59, 0xD0, (((2-1)<<6)+(0<<4))},//hdmitxset(0x59, 0xD0, ((ManuallPR-1)<<6)+(DisLockPR<<4));ManuallPR=2, DisLockPR = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	// {0x59, 0xD8, 0x40|PCLKINV},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	#if((TxChSwap == 1) || (TxPNSwap == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	{0x6b,0xC0,((TxChSwap<<7)+ (TxPNSwap<<6))},// hdmitxset(0x6b, 0xC0,(TxChSwap<<7)+ (TxPNSwap<<6));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	{0x61,0x40,0x40},// hdmitxset(0x61, 0x40,0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	#endif //#if((TxChSwap ==true) || (TxPNSwap ==true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	{0xE1, 0x20, InvAudCLK},// Inverse Audio Latch Edge of IACLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	{0xF5, 0x40, 0x00},//hdmitxset(0xF5,0x40,ForceTMDSStable<<6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524)     {0x05, 0xC0, 0x40},// Setup INT Pin: Active Low & Open-Drain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526)     // {REG_TX_INT_MASK1, 0xFF, ~(B_TX_RXSEN_MASK|B_TX_HPD_MASK)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527)     // {REG_TX_INT_MASK2, 0xFF, ~(B_TX_KSVLISTCHK_MASK|B_TX_AUTH_DONE_MASK|B_TX_AUTH_FAIL_MASK)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528)     // {REG_TX_INT_MASK3, 0xFF, ~(B_TX_VIDSTABLE_MASK)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529)     {0x0C, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530)     {0x0D, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531)     {0x0E, 0x03, 0x03},// Clear all Interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533)     {0x0C, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534)     {0x0D, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535)     {0x0E, 0x02, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536)     //{0x09, 0x03, 0x00}, // Enable HPD and RxSen Interrupt//remove for interrupt mode allen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537)     {0x20,0x01,0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) static const RegSetEntry HDMITX_DefaultVideo_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543)     // Config default output format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545)     {0x72, 0xff, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546)     {0x70, 0xff, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) #ifndef DEFAULT_INPUT_YCBCR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) // GenCSC\RGB2YUV_ITU709_16_235.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549)     {0x72, 0xFF, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550)     {0x73, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551)     {0x74, 0xFF, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552)     {0x75, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553)     {0x76, 0xFF, 0xB8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554)     {0x77, 0xFF, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555)     {0x78, 0xFF, 0xB4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556)     {0x79, 0xFF, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557)     {0x7A, 0xFF, 0x93},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558)     {0x7B, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559)     {0x7C, 0xFF, 0x49},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560)     {0x7D, 0xFF, 0x3C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561)     {0x7E, 0xFF, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562)     {0x7F, 0xFF, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563)     {0x80, 0xFF, 0x9F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564)     {0x81, 0xFF, 0x3F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565)     {0x82, 0xFF, 0xD9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566)     {0x83, 0xFF, 0x3C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567)     {0x84, 0xFF, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568)     {0x85, 0xFF, 0x3F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569)     {0x86, 0xFF, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570)     {0x87, 0xFF, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) // GenCSC\YUV2RGB_ITU709_16_235.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573)     {0x0F, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574)     {0x72, 0xFF, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575)     {0x73, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576)     {0x74, 0xFF, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577)     {0x75, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578)     {0x76, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579)     {0x77, 0xFF, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580)     {0x78, 0xFF, 0x53},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581)     {0x79, 0xFF, 0x3C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582)     {0x7A, 0xFF, 0x89},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583)     {0x7B, 0xFF, 0x3E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584)     {0x7C, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585)     {0x7D, 0xFF, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586)     {0x7E, 0xFF, 0x51},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587)     {0x7F, 0xFF, 0x0C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588)     {0x80, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589)     {0x81, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590)     {0x82, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591)     {0x83, 0xFF, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592)     {0x84, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593)     {0x85, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594)     {0x86, 0xFF, 0x87},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595)     {0x87, 0xFF, 0x0E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597)     // 2012/12/20 added by Keming's suggestion test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598)     {0x88, 0xF0, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) static const RegSetEntry HDMITX_SetHDMI_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603)     // Config default HDMI Mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605)     {0xC0, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606)     {0xC1, 0x03, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607)     {0xC6, 0x03, 0x03}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) static const RegSetEntry HDMITX_SetDVI_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613)     // Config default HDMI Mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615)     {0x0F, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616)     {0x58, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617)     {0x0F, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618)     {0xC0, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619)     {0xC1, 0x03, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620)     {0xC6, 0x03, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) static const RegSetEntry HDMITX_DefaultAVIInfo_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626)     // Config default avi infoframe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628)     {0x0F, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629)     {0x58, 0xFF, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630)     {0x59, 0xFF, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631)     {0x5A, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)     {0x5B, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)     {0x5C, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634)     {0x5D, 0xFF, 0x57},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635)     {0x5E, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636)     {0x5F, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637)     {0x60, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638)     {0x61, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639)     {0x62, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640)     {0x63, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641)     {0x64, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642)     {0x65, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643)     {0x0F, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644)     {0xCD, 0x03, 0x03}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) static const RegSetEntry HDMITX_DeaultAudioInfo_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649)     // Config default audio infoframe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651)     {0x0F, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652)     {0x68, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653)     {0x69, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654)     {0x6A, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655)     {0x6B, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656)     {0x6C, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657)     {0x6D, 0xFF, 0x71},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658)     {0x0F, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659)     {0xCE, 0x03, 0x03}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) static const RegSetEntry HDMITX_Aud_CHStatus_LPCM_20bit_48Khz[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664)     {0x0F, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665)     {0x33, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666)     {0x34, 0xFF, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667)     {0x35, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668)     {0x91, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669)     {0x92, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670)     {0x93, 0xFF, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671)     {0x94, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672)     {0x98, 0xFF, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673)     {0x99, 0xFF, 0xDA},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674)     {0x0F, 0x01, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) static const RegSetEntry HDMITX_AUD_SPDIF_2ch_24bit[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679)     {0x0F, 0x11, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680)     {0x04, 0x14, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681)     {0xE0, 0xFF, 0xD1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682)     {0xE1, 0xFF, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683)     {0xE2, 0xFF, 0xE4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684)     {0xE3, 0xFF, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685)     {0xE4, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686)     {0xE5, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687)     {0x04, 0x14, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) static const RegSetEntry HDMITX_AUD_I2S_2ch_24bit[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692)     {0x0F, 0x11, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693)     {0x04, 0x14, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694)     {0xE0, 0xFF, 0xC1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695)     {0xE1, 0xFF, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) #ifdef USE_IT66120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697)     {0x5A, 0x02, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698)     {0xE2, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700)     {0xE2, 0xFF, 0xE4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702)     {0xE3, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703)     {0xE4, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704)     {0xE5, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705)     {0x04, 0x14, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) static const RegSetEntry HDMITX_DefaultAudio_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711)     // Config default audio output format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712)     ////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713)     {0x0F, 0x21, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714)     {0x04, 0x14, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715)     {0xE0, 0xFF, 0xC1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716)     {0xE1, 0xFF, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) #ifdef USE_IT66120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718)     {0xE2, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720)     {0xE2, 0xFF, 0xE4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722)     {0xE3, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)     {0xE4, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724)     {0xE5, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725)     {0x0F, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726)     {0x33, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727)     {0x34, 0xFF, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728)     {0x35, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729)     {0x91, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730)     {0x92, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731)     {0x93, 0xFF, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732)     {0x94, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733)     {0x98, 0xFF, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734)     {0x99, 0xFF, 0xDB},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735)     {0x0F, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736)     {0x04, 0x14, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) static const RegSetEntry HDMITX_PwrDown_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	{0x05, 0x60, 0x60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 	 {0xf8, 0xc3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742)      {0xf8, 0xa5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743)      {0xe8, 0x60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 	 {0xE0, 0x0F, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	 // Enable GRCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	 // #if (IC_VERSION == 0xC0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747)      // {0x0F, 0x40, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	 // #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	 // {0x0F, 0x70, 0x70},// PwrDown RCLK , IACLK ,TXCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 	 // #endif //#if (IC_VERSION == 0xC0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751)      // PLL Reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752)      {0x61, 0x10, 0x10},   // DRV_RST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753)      {0x62, 0x08, 0x00},   // XP_RESETB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754)      {0x64, 0x04, 0x00},   // IP_RESETB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755)      {0x01, 0x00, 0x00}, // idle(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 	 {0x61, 0x60, 0x60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	 {0x70, 0xFF, 0x00},//hdmitxwr(0x70, 0x00);      // Select TXCLK power-down path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)      // PLL PwrDn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761)      // {0x61, 0x20, 0x20},   // PwrDn DRV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762)      // {0x62, 0x44, 0x44},   // PwrDn XPLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763)      // {0x64, 0x40, 0x40},   // PwrDn IPLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765)      // HDMITX PwrDn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766)      // {0x05, 0x01, 0x01},   // PwrDn PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767)      // {0xE0, 0x0F, 0x00},// hdmitxset(0xE0, 0x0F, 0x00);   // PwrDn GIACLK, IACLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768)      // {0x72, 0x03, 0x00},// hdmitxset(0x72, 0x03, 0x00);   // PwrDn GTxCLK (QCLK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769)      // {0x0F, 0x78, 0x78},   // PwrDn GRCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	 {0x0F, 0x70, 0x70}//Gate RCLK IACLK TXCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) static const RegSetEntry HDMITX_PwrOn_Table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774)     {0x0F, 0x70, 0x00},   // // PwrOn RCLK , IACLK ,TXCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 	// {0x0F, 0x78, 0x38},   // PwrOn GRCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776)     // {0x05, 0x01, 0x00},   // PwrOn PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778)     // PLL PwrOn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779)     {0x61, 0x20, 0x00},   // PwrOn DRV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780)     {0x62, 0x44, 0x00},   // PwrOn XPLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781)     {0x64, 0x40, 0x00},   // PwrOn IPLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783)     // PLL Reset OFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784)     {0x61, 0x10, 0x00},   // DRV_RST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785)     {0x62, 0x08, 0x08},   // XP_RESETB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786)     {0x64, 0x04, 0x04}   // IP_RESETB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787)     // {0x0F, 0x78, 0x08},   // PwrOn IACLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) static const RegSetEntry hdmi_tx_pg_1080p60_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) // 1920x1080@60.00Hz VIC = 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 	{0x0F, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 	{0x90, 0xFF, 0x76},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 	{0x91, 0xFF, 0x89},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 	{0x92, 0xFF, 0xC0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 	{0x93, 0xFF, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 	{0x94, 0xFF, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 	{0x95, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 	{0x96, 0xFF, 0x2C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	{0x97, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 	{0x98, 0xFF, 0x64},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	{0x99, 0xFF, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	{0x9A, 0xFF, 0x28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	{0x9B, 0xFF, 0x60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	{0x9C, 0xFF, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 	{0x9D, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	{0x9E, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 	{0x9F, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	{0xA0, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	{0xA1, 0xFF, 0x50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	{0xA2, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	{0xA3, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	{0xA4, 0xFF, 0x4C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	{0xA5, 0xFF, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	{0xA6, 0xFF, 0xF0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	{0xB1, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	{0xB2, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	{0xA9, 0xFF, 0x70},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	{0xAA, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 	{0xAB, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 	{0xAC, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 	{0xAF, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	{0xB0, 0xFF, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) static const RegSetEntry hdmi_tx_pg_720p60_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) // PatGen\fmt4_PatGen.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) // 1280x720@60.00Hz VIC = 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829)     {0x0F, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830)     {0x90, 0xFF, 0x16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831)     {0x91, 0xFF, 0x67},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832)     {0x92, 0xFF, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833)     {0x93, 0xFF, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834)     {0x94, 0xFF, 0x61},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835)     {0x95, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836)     {0x96, 0xFF, 0x28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837)     {0x97, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838)     {0x98, 0xFF, 0xED},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839)     {0x99, 0xFF, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840)     {0x9A, 0xFF, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841)     {0x9B, 0xFF, 0xE8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842)     {0x9C, 0xFF, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843)     {0x9D, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844)     {0x9E, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845)     {0x9F, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846)     {0xA0, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847)     {0xA1, 0xFF, 0x50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848)     {0xA2, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849)     {0xA3, 0xFF, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850)     {0xA4, 0xFF, 0x39},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851)     {0xA5, 0xFF, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852)     {0xA6, 0xFF, 0xF0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853)     {0xB1, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854)     {0xB2, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	{0xA9, 0xFF, 0x70},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 	{0xAA, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 	{0xAB, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	{0xAC, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	{0xAF, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	{0xB0, 0xFF, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) static const RegSetEntry hdmi_tx_pg_480p60_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) // PatGen\fmt2_PatGen.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) // 720x480@59.94Hz VIC = 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865)     {0x0F, 0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866)     {0x90, 0xFF, 0x90},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867)     {0x91, 0xFF, 0x35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868)     {0x92, 0xFF, 0x7A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869)     {0x93, 0xFF, 0x4A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870)     {0x94, 0xFF, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871)     {0x95, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872)     {0x96, 0xFF, 0x3E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873)     {0x97, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874)     {0x98, 0xFF, 0x0C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875)     {0x99, 0xFF, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876)     {0x9A, 0xFF, 0x23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877)     {0x9B, 0xFF, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878)     {0x9C, 0xFF, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879)     {0x9D, 0xFF, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880)     {0x9E, 0xFF, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881)     {0x9F, 0xFF, 0x42},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882)     {0xA0, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883)     {0xA1, 0xFF, 0x60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884)     {0xA2, 0xFF, 0x0D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885)     {0xA3, 0xFF, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886)     {0xA4, 0xFF, 0xAC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887)     {0xA5, 0xFF, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888)     {0xA6, 0xFF, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889)     {0xB1, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890)     {0xB2, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891)     // {0xA9, 0xFF, 0x7F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	{0xA9, 0xFF, 0x70},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 	{0xAA, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	{0xAB, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	{0xAC, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	{0xAF, 0xFF, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	{0xB0, 0xFF, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) #ifdef DETECT_VSYNC_CHG_IN_SAV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) static bool EnSavVSync = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) /* Period of hdcp checks (to ensure we're still authenticated) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) #define DRM_HDCP_CHECK_PERIOD_MS		(128 * 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) #define DRM_HDCP2_CHECK_PERIOD_MS		500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) /* Shared lengths/masks between HDMI/DVI/DisplayPort */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) #define DRM_HDCP_AN_LEN				8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) #define DRM_HDCP_BSTATUS_LEN			2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) #define DRM_HDCP_KSV_LEN			5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) #define DRM_HDCP_RI_LEN				2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) #define DRM_HDCP_V_PRIME_PART_LEN		4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) #define DRM_HDCP_V_PRIME_NUM_PARTS		5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) #define DRM_HDCP_NUM_DOWNSTREAM(x)		(x & 0x7f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) #define DRM_HDCP_MAX_CASCADE_EXCEEDED(x)	(x & BIT(3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) #define DRM_HDCP_MAX_DEVICE_EXCEEDED(x)		(x & BIT(7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) /* Slave address for the HDCP registers in the receiver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) #define DRM_HDCP_DDC_ADDR			0x3A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) /* Value to use at the end of the SHA-1 bytestream used for repeaters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) #define DRM_HDCP_SHA1_TERMINATOR		0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) /* HDCP register offsets for HDMI/DVI devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) #define DRM_HDCP_DDC_BKSV			0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) #define DRM_HDCP_DDC_RI_PRIME			0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) #define DRM_HDCP_DDC_AKSV			0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) #define DRM_HDCP_DDC_AN				0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) #define DRM_HDCP_DDC_V_PRIME(h)			(0x20 + h * 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) #define DRM_HDCP_DDC_BCAPS			0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) #define DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT	BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) #define DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY	BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) #define DRM_HDCP_DDC_BSTATUS			0x41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) #define DRM_HDCP_DDC_KSV_FIFO			0x43
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) #define MAX_HDCP_DOWN_STREAM_COUNT 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) #define HDCP_SHA1_FIFO_LEN (MAX_HDCP_DOWN_STREAM_COUNT * 5 + 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) #define HDMI_TX_HDCP_RETRY 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) #define HDMI_TX_PCLK_DIV2 false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) #ifndef __linux__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) extern const struct drm_display_mode edid_cea_modes[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) struct it6161 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	struct drm_bridge bridge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	struct i2c_client *i2c_mipi_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	struct i2c_client *i2c_hdmi_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 	struct i2c_client *i2c_cec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	struct edid *edid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 	struct drm_connector connector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 	struct mutex mode_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	struct regmap *regmap_mipi_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	struct regmap *regmap_hdmi_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 	struct regmap *regmap_cec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	u32 it6161_addr_hdmi_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	u32 it6161_addr_cec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	struct device_node *host_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	struct mipi_dsi_device *dsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	struct completion wait_hdcp_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	struct completion wait_edid_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	struct delayed_work hdcp_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	struct work_struct wait_hdcp_ksv_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	u8 hdmi_tx_hdcp_retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	/* kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	u32 hdmi_tx_rclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	/* kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	u32 hdmi_tx_pclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	/* kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	u32 mipi_rx_mclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	/* kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	u32 mipi_rx_rclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 	/* kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	u32 mipi_rx_pclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	struct drm_display_mode mipi_rx_p_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	struct drm_display_mode hdmi_tx_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	struct drm_display_mode source_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	struct hdmi_avi_infoframe source_avi_infoframe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	u32 vic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984)     u8 mipi_rx_lane_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 	bool is_repeater;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	u8 hdcp_downstream_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	u8 bksv[DRM_HDCP_KSV_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	u8 sha1_transform_input[HDCP_SHA1_FIFO_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	u16 bstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	bool enable_drv_hold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 	u8 hdmi_tx_output_color_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	u8 hdmi_tx_input_color_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	u8 hdmi_tx_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994)     u8 support_audio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996)     u8 bOutputAudioMode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997)     u8 bAudioChannelSwap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998)     u8 bAudioChannelEnable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999)     u8 bAudFs ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)     u32 TMDSClock ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)     u32 RCLK ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)     #ifdef _SUPPORT_HDCP_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)         HDMITX_HDCP_State TxHDCP_State ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)         u16 usHDCPTimeOut ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)         u16 Tx_BStatus ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)     u8 bAuthenticated:1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)     bool hdmi_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)     u8 bAudInterface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 	struct gpio_desc *reset_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	struct gpio_desc *enable_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 	struct gpio_desc *test_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	struct timer_list timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	struct delayed_work	restart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) static struct it6161 *it6161;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) //static struct it6161 *it6161_dump;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) static struct drm_bridge *it6161_bridge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) static const struct regmap_range it6161_mipi_rx_bridge_volatile_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 	{ .range_min = 0, .range_max = 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) static const struct regmap_access_table it6161_mipi_rx_bridge_volatile_table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	.yes_ranges = it6161_mipi_rx_bridge_volatile_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	.n_yes_ranges = ARRAY_SIZE(it6161_mipi_rx_bridge_volatile_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) static const struct regmap_config it6161_mipi_rx_bridge_regmap_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	.reg_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	.val_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	.volatile_table = &it6161_mipi_rx_bridge_volatile_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	.cache_type = REGCACHE_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) static const struct regmap_range it6161_hdmi_tx_bridge_volatile_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	{ .range_min = 0, .range_max = 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) static const struct regmap_access_table it6161_hdmi_tx_bridge_volatile_table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	.yes_ranges = it6161_hdmi_tx_bridge_volatile_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	.n_yes_ranges = ARRAY_SIZE(it6161_hdmi_tx_bridge_volatile_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) static const struct regmap_config it6161_hdmi_tx_bridge_regmap_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	.reg_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	.val_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	.volatile_table = &it6161_hdmi_tx_bridge_volatile_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	.cache_type = REGCACHE_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) static const struct regmap_range it6161_cec_bridge_volatile_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)     { .range_min = 0, .range_max = 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) static const struct regmap_access_table it6161_cec_bridge_volatile_table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)     .yes_ranges = it6161_cec_bridge_volatile_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)     .n_yes_ranges = ARRAY_SIZE(it6161_cec_bridge_volatile_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) static const struct regmap_config it6161_cec_bridge_regmap_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)     .reg_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)     .val_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)     .volatile_table = &it6161_cec_bridge_volatile_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)     .cache_type = REGCACHE_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) static int it6161_mipi_rx_read(struct it6161 *it6161, unsigned int reg_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 	unsigned int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	err = regmap_read(it6161->regmap_mipi_rx, reg_addr, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 		DRM_DEV_ERROR(dev, "mipi rx read failed reg[0x%x] err: %d", reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 			      err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	return value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) static int mipi_rx_read_word(struct it6161 *it6161, unsigned int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	int val_0, val_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	val_0 = it6161_mipi_rx_read(it6161, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	if (val_0 < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 		return val_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	val_1 = it6161_mipi_rx_read(it6161, reg + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	if (val_1 < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 		return val_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	return (val_1 << 8) | val_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) static int it6161_mipi_rx_write(struct it6161 *it6161, unsigned int reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 		      unsigned int reg_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	err = regmap_write(it6161->regmap_mipi_rx, reg_addr, reg_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 		DRM_DEV_ERROR(dev, "mipi rx write failed reg[0x%x] = 0x%x err = %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 			      reg_addr, reg_val, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) static int it6161_mipi_rx_set_bits(struct it6161 *it6161, unsigned int reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 			 unsigned int mask, unsigned int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	err = regmap_update_bits(it6161->regmap_mipi_rx, reg, mask, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 		DRM_DEV_ERROR(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 			dev, "mipi rx set reg[0x%x] = 0x%x mask = 0x%x failed err %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 			reg, value, mask, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) static void it6161_mipi_rx_dump(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	unsigned int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	u8 regs[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	//struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	it6161_debug("mipi rx dump:");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	for (i = 0; i <= 0xff; i += 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 		for (j = 0; j < 16; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 			regs[j] = it6161_mipi_rx_read(it6161, i + j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 		it6161_debug("[0x%02x] = %16ph", i, regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) static int it6161_hdmi_tx_read(struct it6161 *it6161, unsigned int reg_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 	unsigned int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 	err = regmap_read(it6161->regmap_hdmi_tx, reg_addr, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 		DRM_DEV_ERROR(dev, "hdmi tx read failed reg[0x%x] err: %d", reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 			      err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	return value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) static int hdmi_tx_read_word(struct it6161 *it6161, unsigned int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	int val_0, val_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	val_0 = it6161_hdmi_tx_read(it6161, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 	if (val_0 < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 		return val_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	val_1 = it6161_hdmi_tx_read(it6161, reg + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	if (val_1 < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 		return val_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	return (val_1 << 8) | val_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) #ifdef HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) static int it6161_hdmi_tx_burst_read(struct it6161 *it6161, unsigned int reg_addr, void *buffer, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	ret = regmap_bulk_read(it6161->regmap_hdmi_tx, reg_addr, buffer, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 		DRM_DEV_ERROR(dev, "hdmi tx burst read failed reg[0x%x] ret: %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 			      reg_addr, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) static int it6161_hdmi_tx_write(struct it6161 *it6161, unsigned int reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 				unsigned int reg_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	err = regmap_write(it6161->regmap_hdmi_tx, reg_addr, reg_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 		DRM_DEV_ERROR(dev, "hdmi tx write failed reg[0x%x] = 0x%x err = %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 			      reg_addr, reg_val, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) static int hdmi_tx_burst_write(struct it6161 *it6161, unsigned int reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 			       void *buffer, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 	struct device *dev = &it6161->i2c_hdmi_tx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	ret = regmap_bulk_write(it6161->regmap_hdmi_tx, reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 				(u8 *)buffer, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 		DRM_DEV_ERROR(dev, "hdmi tx burst write failed reg[0x%x] ret = %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 			      reg_addr, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) static int it6161_hdmi_tx_set_bits(struct it6161 *it6161, unsigned int reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 			 unsigned int mask, unsigned int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	err = regmap_update_bits(it6161->regmap_hdmi_tx, reg, mask, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 		DRM_DEV_ERROR(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 			dev, "hdmi tx set reg[0x%x] = 0x%x mask = 0x%x failed err %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 			reg, value, mask, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) static int inline it6161_hdmi_tx_change_bank(struct it6161 *it6161, int x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	return it6161_hdmi_tx_set_bits(it6161, 0x0F, 0x03, x & 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) static void it6161_hdmi_tx_dump(struct it6161 *it6161, unsigned int bank)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	unsigned int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	u8 regs[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	//struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	it6161_debug("hdmi tx dump bank: %d", bank);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	it6161_hdmi_tx_change_bank(it6161, bank);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	for (i = 0; i <= 0xff; i += 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 		for (j = 0; j < 16; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 			regs[j] = it6161_hdmi_tx_read(it6161, i + j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 		it6161_debug("[0x%02x] = %16ph", i, regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) static int it6161_cec_read(struct it6161 *it6161, unsigned int reg_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)     unsigned int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)     int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)     struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)     err = regmap_read(it6161->regmap_cec, reg_addr, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)     if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)         DRM_DEV_ERROR(dev, "cec read failed reg[0x%x] err: %d", reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)                   err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)         return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)     return value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) static int it6161_cec_write(struct it6161 *it6161, unsigned int reg_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)               unsigned int reg_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)     int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)     struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)     err = regmap_write(it6161->regmap_cec, reg_addr, reg_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)     if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)         DRM_DEV_ERROR(dev, "cec write failed reg[0x%x] = 0x%x err = %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)                   reg_addr, reg_val, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)         return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)     return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) static int it6161_cec_set_bits(struct it6161 *it6161, unsigned int reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)              unsigned int mask, unsigned int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)     int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)     struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)     err = regmap_update_bits(it6161->regmap_cec, reg, mask, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)     if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)         DRM_DEV_ERROR(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)             dev, "cec set reg[0x%x] = 0x%x mask = 0x%x failed err %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)             reg, value, mask, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)         return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)     return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) static inline struct it6161 *connector_to_it6161(struct drm_connector *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 	return container_of(c, struct it6161, connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) static inline struct it6161 *bridge_to_it6161(struct drm_bridge *bridge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 	return container_of(bridge, struct it6161, bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) static void mipi_rx_logic_reset(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)     it6161_mipi_rx_set_bits(it6161, 0x05, 0x08, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) static void mipi_rx_logic_reset_release(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)     it6161_mipi_rx_set_bits(it6161, 0x05, 0x08, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) static void hdmi_tx_logic_reset(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)     it6161_hdmi_tx_set_bits(it6161, 0x04, 0x20, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) static void it6161_mipi_rx_int_mask_disable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)     it6161_mipi_rx_set_bits(it6161, 0x0F, 0x03, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)     it6161_mipi_rx_write(it6161, 0x09, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)     it6161_mipi_rx_write(it6161, 0x0A, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)     it6161_mipi_rx_write(it6161, 0x0B, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) static void it6161_mipi_rx_int_mask_enable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)     it6161_hdmi_tx_set_bits(it6161, 0x0F, 0x03, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)     it6161_mipi_rx_write(it6161, 0x09, EnMBPM ? 0x11 : 0xBF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)     it6161_mipi_rx_write(it6161, 0x0A, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)     it6161_mipi_rx_write(it6161, 0x0B, 0x3F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) static void hdmi_tx_hdcp_int_mask_disable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 	it6161_hdmi_tx_set_bits(it6161, 0x0F, 0x03, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_INT_MASK2, B_TX_AUTH_FAIL_MASK | B_TX_AUTH_DONE_MASK | B_TX_KSVLISTCHK_MASK, B_TX_AUTH_FAIL_MASK | B_TX_AUTH_DONE_MASK | B_TX_KSVLISTCHK_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) #ifdef HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) static void hdmi_tx_hdcp_int_mask_enable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	it6161_hdmi_tx_set_bits(it6161, 0x0F, 0x03, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_INT_MASK2, B_TX_AUTH_FAIL_MASK | B_TX_AUTH_DONE_MASK | B_TX_KSVLISTCHK_MASK, ~(B_TX_AUTH_FAIL_MASK | B_TX_AUTH_DONE_MASK | B_TX_KSVLISTCHK_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) static void it6161_hdmi_tx_int_mask_disable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)     it6161_mipi_rx_set_bits(it6161, 0x0F, 0x03, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)     it6161_hdmi_tx_write(it6161, REG_TX_INT_MASK1, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)     it6161_hdmi_tx_write(it6161, REG_TX_INT_MASK2, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392)     it6161_hdmi_tx_write(it6161, REG_TX_INT_MASK3, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) static void it6161_hdmi_tx_int_mask_enable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)     it6161_hdmi_tx_set_bits(it6161, 0x0F, 0x03, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)     it6161_hdmi_tx_write(it6161, REG_TX_INT_MASK1, ~(B_TX_AUDIO_OVFLW_MASK | B_TX_DDC_FIFO_ERR_MASK | B_TX_DDC_BUS_HANG_MASK | B_TX_HPD_MASK | B_TX_RXSEN_MASK));//0x7C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)     it6161_hdmi_tx_write(it6161, REG_TX_INT_MASK2, ~(B_TX_AUTH_FAIL_MASK | B_TX_AUTH_DONE_MASK | B_TX_KSVLISTCHK_MASK | B_TX_PKT_VID_UNSTABLE_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)     it6161_hdmi_tx_write(it6161, REG_TX_INT_MASK3, ~B_TX_VIDSTABLE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) static void it6161_hdmi_tx_write_table(struct it6161 *it6161, const RegSetEntry table[], int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 	int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 	for (i = 0; i < size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 		if (table[i].mask == 0 && table[i].value == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 			msleep(table[i].offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 		} else if (table[i].mask == 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 			it6161_hdmi_tx_write(it6161, table[i].offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 								 table[i].value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 			it6161_hdmi_tx_set_bits(it6161, table[i].offset, table[i].mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 									table[i].value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) static inline void hdmi_tx_enable_pattern_generator(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 	it6161_debug("enable pattern generator");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	it6161_hdmi_tx_set_bits(it6161, 0xA8, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) static inline void hdmi_tx_disable_pattern_generator(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 	it6161_hdmi_tx_set_bits(it6161, 0xA8, 0x01, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) static inline void hdmi_tx_pattern_generator_setup_color(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 	it6161_hdmi_tx_set_bits(it6161, 0xA9, 0x3F, (HDMI_TX_PATTERN_COLLOR_B << 4) | (HDMI_TX_PATTERN_COLLOR_G << 2) | HDMI_TX_PATTERN_COLLOR_R);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) static void hdmi_tx_setup_pattern_generator(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438)     switch (HDMI_TX_PATTERN_GENERATOR_FORMAT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 		case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 		it6161_hdmi_tx_write_table(it6161, hdmi_tx_pg_480p60_table, sizeof(hdmi_tx_pg_480p60_table) / sizeof(RegSetEntry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 		DRM_INFO("use 480p60 pattern");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 		case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 		it6161_hdmi_tx_write_table(it6161, hdmi_tx_pg_720p60_table, sizeof(hdmi_tx_pg_720p60_table) / sizeof(RegSetEntry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 		DRM_INFO("use 720p60 pattern");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 		case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 		it6161_hdmi_tx_write_table(it6161, hdmi_tx_pg_1080p60_table, sizeof(hdmi_tx_pg_1080p60_table) / sizeof(RegSetEntry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 		DRM_INFO("use 1080p60 pattern");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 		it6161_hdmi_tx_write_table(it6161, hdmi_tx_pg_1080p60_table, sizeof(hdmi_tx_pg_1080p60_table) / sizeof(RegSetEntry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 		DRM_INFO("other format, will use 1080p60 pattern");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)     hdmi_tx_pattern_generator_setup_color(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	hdmi_tx_enable_pattern_generator(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) static void show_display_mode(struct it6161 *it6161, struct drm_display_mode *display_mode, u8 select)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 	char *name[3] = { "source output", "it6161 hdmi tx receive", "mipi rx p receive" };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 	DRM_INFO("%s timing:", name[select]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	DRM_INFO("timing name:%s", display_mode->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 	DRM_INFO("clock = %dkHz", display_mode->clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 	DRM_INFO("htotal = %d", display_mode->htotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 	DRM_INFO("hactive = %d", display_mode->hdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	DRM_INFO("hfront_porch = %d", display_mode->hsync_start - display_mode->hdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	DRM_INFO("hsyncw = %d", display_mode->hsync_end - display_mode->hsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	DRM_INFO("hback_porch = %d", display_mode->htotal - display_mode->hsync_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 	DRM_INFO("vtotal = %d", display_mode->vtotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 	DRM_INFO("vactive = %d", display_mode->vdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	DRM_INFO("vfront_porch = %d", display_mode->vsync_start - display_mode->vdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 	DRM_INFO("vsyncw = %d", display_mode->vsync_end - display_mode->vsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 	DRM_INFO("vback_porch = %d", display_mode->vtotal - display_mode->vsync_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	DRM_INFO("drm_display_mode flags = 0x%04x", display_mode->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) static void inline it6161_set_interrupts_active_level(enum it6161_active_level level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 	it6161_mipi_rx_set_bits(it6161, 0x0D, 0x02, level == HIGH ? 0x02 : 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	it6161_hdmi_tx_set_bits(it6161, 0x05, 0xC0, level == HIGH ? 0x80 : 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) static void hdmi_tx_init(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)     it6161_debug("init hdmi tx");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)     it6161_hdmi_tx_write_table(it6161, HDMITX_Init_Table, ARRAY_SIZE(HDMITX_Init_Table));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496)     it6161_hdmi_tx_write_table(it6161, HDMITX_PwrOn_Table, ARRAY_SIZE(HDMITX_PwrOn_Table));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)     it6161_hdmi_tx_write_table(it6161, HDMITX_DefaultVideo_Table, ARRAY_SIZE(HDMITX_DefaultVideo_Table));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498)     it6161_hdmi_tx_write_table(it6161, HDMITX_SetHDMI_Table, ARRAY_SIZE(HDMITX_SetHDMI_Table));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)     it6161_hdmi_tx_write_table(it6161, HDMITX_DefaultAVIInfo_Table, ARRAY_SIZE(HDMITX_DefaultAVIInfo_Table));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)     it6161_hdmi_tx_write_table(it6161, HDMITX_DeaultAudioInfo_Table, ARRAY_SIZE(HDMITX_DeaultAudioInfo_Table));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)     it6161_hdmi_tx_write_table(it6161, HDMITX_Aud_CHStatus_LPCM_20bit_48Khz, ARRAY_SIZE(HDMITX_Aud_CHStatus_LPCM_20bit_48Khz));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)     it6161_hdmi_tx_write_table(it6161, HDMITX_AUD_SPDIF_2ch_24bit, ARRAY_SIZE(HDMITX_AUD_SPDIF_2ch_24bit));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) #ifdef SUPPORT_CEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506)     it6161_hdmi_tx_set_bits(it6161, 0x8D, 0x01, 0x01);//it6161_hdmi_tx_write(it6161,  0xf, 0 ); //pet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)     Initial_Ext_Int1();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509)     HDMITX_CEC_Init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) #endif // SUPPORT_CEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) static bool mipi_rx_get_m_video_stable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 	return !!(it6161_mipi_rx_read(it6161, 0x0D) & 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) static bool mipi_rx_get_p_video_stable(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 	return !!(it6161_mipi_rx_read(it6161, 0x0D) & 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) static void mipi_rx_setup_polarity(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 	struct drm_display_mode *display_mode = &it6161->source_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 	u8 polarity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 	polarity = ((display_mode->flags & DRM_MODE_FLAG_PHSYNC) == DRM_MODE_FLAG_PHSYNC) ? 0x01 : 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 	polarity |= ((display_mode->flags & DRM_MODE_FLAG_PVSYNC) == DRM_MODE_FLAG_PVSYNC) ? 0x02 : 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 	it6161_mipi_rx_set_bits(it6161, 0x4E, 0x03, polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) static void mipi_rx_afe_configuration(struct it6161 *it6161, u8 data_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)     //struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)     u8 MPLaneNum = (it6161->mipi_rx_lane_count - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539)     it6161_debug("afe configuration data_id:0x%02x", data_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)     if (data_id == RGB_18b) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)         if( MPLaneNum==3 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543)             // if( EnMPx1PCLK )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)                 it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x02); // MPPCLKSel = 1; // 4-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)             // else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)             // {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)                 // it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x02); // MPPCLKSel = 1; // 4-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)                 DRM_INFO("Solomon is impossible TXPLL= 9/2 PCLK !!! \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)                 DRM_INFO("MCLK=3/4PCLK Change to MCLK=PCLK ...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)             // }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)         } else if( MPLaneNum==1 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552)             // if( EnMPx1PCLK )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553)                 it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x05); // MPPCLKSel = 6; // 2-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)             // else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)             // {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)                 // it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x05); // MPPCLKSel = 6; // 2-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557)                 DRM_INFO("IT6121 is impossible RXPLL= 2/9 PCLK !!! \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558)                 DRM_INFO("MCLK=3/4PCLK Change to MCLK=PCLK ...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)             // }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560)         } else if( MPLaneNum==0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)             // if( EnMPx1PCLK )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)                 // it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x0b);// MPPCLKSel = 7; // 1-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)             // else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)                 it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x08); // MPPCLKSel = 8; // 1-lane : MCLK = 3/4 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)     } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)         if( MPLaneNum==3 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)         // if( EnMPx1PCLK )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)             // it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x03);// MPPCLKSel = 0; // 4-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)         // else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)             it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x02);// MPPCLKSel = 1; // 4-lane : MCLK = 3/4 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)         } else if( MPLaneNum==1 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)             // if( EnMPx1PCLK )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574)                 // it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x07); // MPPCLKSel = 2; // 2-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)             // else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)                 it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x05); // MPPCLKSel = 3; // 2-lane : MCLK = 3/4 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)         } else if( MPLaneNum==0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)             // if( EnMPx1PCLK )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)                 // it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x0f);// MPPCLKSel = 4; // 1-lane : MCLK = 1/1 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580)             // else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)                 it6161_mipi_rx_set_bits(it6161, 0x80, 0x1F, 0x0b); // MPPCLKSel = 5; // 1-lane : MCLK = 3/4 PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) static void mipi_rx_configuration(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)     //struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)     u8 mipi_lane_config = (it6161->mipi_rx_lane_count - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 	//20200211 D0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	it6161_mipi_rx_set_bits(it6161, 0x10, 0x0F, 0x0F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	msleep(1);//idle(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 	it6161_mipi_rx_set_bits(it6161, 0x10, 0x0F, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	// MPRX Software Reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	// it6161_mipi_rx_set_bits(it6161, 0x05, 0x07, 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 	// msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	// it6161_mipi_rx_set_bits(it6161, 0x05, 0x08, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 	mipi_rx_logic_reset(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 	msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 	mipi_rx_logic_reset_release(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 	it6161_mipi_rx_int_mask_disable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 	/* setup INT pin: active low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 	it6161_mipi_rx_set_bits(it6161, 0x0d, 0x02, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 	it6161_mipi_rx_set_bits(it6161, 0x0C, 0x0F, (MPLaneSwap<<3) + (MPPNSwap<<2) + mipi_lane_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 	it6161_mipi_rx_set_bits(it6161, 0x11, 0x3F, (EnIOIDDQ<<5)+(EnStb2Rst<<4)+(EnExtStdby<<3)+(EnStandby<<2)+(InvPCLK<<1)+InvMCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 	it6161_mipi_rx_set_bits(it6161, 0x12, 0x03, (PDREFCNT<<1)+PDREFCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 	it6161_mipi_rx_set_bits(it6161, 0x18, 0xf7, (RegEnSyncErr<<7)+(SkipStg<<4)+HSSetNum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 	it6161_mipi_rx_set_bits(it6161, 0x19, 0xf3, (PPIDbgSel<<4)+(EnContCK<<1)+EnDeSkew);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	it6161_mipi_rx_set_bits(it6161, 0x20, 0xf7, (EOTPSel<<4)+(RegEnDummyECC<<2)+(RegIgnrBlk<<1)+RegIgnrNull);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 	it6161_mipi_rx_set_bits(it6161, 0x21, 0x07, LMDbgSel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 	// it6161_mipi_rx_set_bits(it6161, 0x44, 0x38, (MREC_Update<<5)+(PREC_Update<<4)+(REGSELDEF<<3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 	it6161_mipi_rx_set_bits(it6161, 0x44, 0x3a, (MREC_Update<<5)+(PREC_Update<<4)+(REGSELDEF<<3)+(RegAutoSync<<1));//D0 20200211
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 	it6161_mipi_rx_set_bits(it6161, 0x4B, 0x1f, (EnFReSync<<4)+(EnVREnh<<3)+EnVREnhSel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 	it6161_mipi_rx_write(it6161, 0x4C, PPSFFRdStg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 	it6161_mipi_rx_set_bits(it6161, 0x4D, 0x01, (PPSFFRdStg>>8)&0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 	it6161_mipi_rx_set_bits(it6161, 0x4E, 0x0C, (EnVReSync<<3)+(EnHReSync<<2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 	it6161_mipi_rx_set_bits(it6161, 0x4F, 0x03, EnFFAutoRst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 	//it6161_mipi_rx_write(it6161, 0x27, MPVidType);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 	it6161_mipi_rx_set_bits(it6161, 0x70, 0x01, EnMAvg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 	it6161_mipi_rx_write(it6161, 0x72, MShift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 	it6161_mipi_rx_write(it6161, 0x73, PShift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 	it6161_mipi_rx_set_bits(it6161, 0x80, 0x20, ENABLE_MIPI_RX_EXTERNAL_CLOCK << 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 	it6161_mipi_rx_write(it6161, 0x21, 0x00); //debug sel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 	//	 it6161_mipi_rx_set_bits(it6161, 0x84, 0x70, 0x70);	// max swing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 	// 	 it6161_mipi_rx_set_bits(it6161, 0x84, 0x70, 0x40);	// def swing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 	it6161_mipi_rx_set_bits(it6161, 0x84, 0x70, 0x00);	// min swing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 	it6161_mipi_rx_set_bits(it6161, 0xA0, 0x01, EnMBPM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)     /* enable auto detect format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640)     it6161_mipi_rx_set_bits(it6161, 0x21, 0x08, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 	// if( REGSELDEF == true )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 	// {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 		// DRM_INFO("REGSELDEF MODE !!! ...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 		// PHFP = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 		// PHSW = 0x3e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 		// PHBP = 0x3c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 		// it6161_mipi_rx_write(it6161, 0x30, PHFP);					// HFP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 		// it6161_mipi_rx_write(it6161, 0x31, 0x80+((PHFP&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 		// it6161_mipi_rx_write(it6161, 0x32, PHSW);					// HBP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 		// it6161_mipi_rx_write(it6161, 0x33, 0x80+((PHSW&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 		// it6161_mipi_rx_write(it6161, 0x34, PHBP);					// HBP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) 		// it6161_mipi_rx_write(it6161, 0x35, 0x80+((PHFP&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) 	// }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) 	it6161_mipi_rx_set_bits(it6161, 0x70, 0x01, EnMAvg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 	it6161_mipi_rx_set_bits(it6161, 0x05, 0x02, 0x02);  // Video Clock Domain Reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) 	if( EnMBPM ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) 		//HSW = pSetVTiming->HSyncWidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 		//VSW = pSetVTiming->VSyncWidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) 		it6161_mipi_rx_write(it6161, 0xA1, 0x00);	// HRS offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 		it6161_mipi_rx_write(it6161, 0xA2, 0x00);	// VRS offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 		// it6161_mipi_rx_write(it6161, 0xA3, 44);//HSW);	// HSW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 		// it6161_mipi_rx_write(it6161, 0xA5, 5);//VSW);	// VSW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 			it6161_mipi_rx_write(it6161, 0xA3, 0x08);//0x10);	// HSW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 			it6161_mipi_rx_write(it6161, 0xA5, 0x04);	// VSw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 		// it6161_hdmi_tx_set_bits(it6161, 0xa9, 0xc0, (EnTBPM<<7)/* + (EnTxPatMux<<6)*/);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 		// it6161_hdmi_tx_set_bits(it6161, 0xbf, 0x80, (NRTXRCLK<<7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 	if( MPForceStb == true ){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 		// mprxwr(0x30, HFP);					// HSP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 		// mprxwr(0x31, 0x80+((HFP&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 		// mprxwr(0x32, HSW);					// HSW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 		// mprxwr(0x33, 0x80+((HSW&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 		// mprxwr(0x34, HBP&0xFF);				// HBP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 		// mprxwr(0x35, 0x80+((HBP&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 		// mprxwr(0x36, HDEW&0xFF);				// HDEW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 		// mprxwr(0x37, 0x80+((HDEW&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 		// mprxwr(0x38, HVR2nd&0xFF);			// HVR2nd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 		// mprxwr(0x39, 0x80+((HVR2nd&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 		// mprxwr(0x3A, VFP);					// VSP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 		// mprxwr(0x3B, 0x80+((VFP&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 		// mprxwr(0x3C, VSW);					// VSW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) 		// mprxwr(0x3D, 0x80+((VSW&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) 		// mprxwr(0x3E, VBP&0xFF);				// VBP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 		// mprxwr(0x3F, 0x80+((VBP&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) 		// mprxwr(0x40, VDEW&0xFF);				// VDEW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 		// mprxwr(0x41, 0x80+((VDEW&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) 		// mprxwr(0x42, VFP2nd&0xFF);			// VFP2nd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 		// mprxwr(0x43, 0x80+((VFP2nd&0x3F00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) 		// mprxset(0x4e, 0x03, 0xC0+(VPol<<1)+HPol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 		if( REGSELDEF == false ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 			it6161_mipi_rx_set_bits(it6161, 0x31, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 			it6161_mipi_rx_set_bits(it6161, 0x33, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 			it6161_mipi_rx_set_bits(it6161, 0x35, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 			it6161_mipi_rx_set_bits(it6161, 0x37, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 			it6161_mipi_rx_set_bits(it6161, 0x39, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) 			it6161_mipi_rx_set_bits(it6161, 0x3A, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) 			it6161_mipi_rx_set_bits(it6161, 0x3C, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 			it6161_mipi_rx_set_bits(it6161, 0x3E, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 			it6161_mipi_rx_set_bits(it6161, 0x41, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) 			it6161_mipi_rx_set_bits(it6161, 0x43, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 		// mprxset(0x4e, 0x03, 0x00+(VPol<<1)+HPol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) static void mipi_rx_init(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722)     //struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724)     it6161_debug("init mpip rx");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)     mipi_rx_configuration(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726)     it6161_mipi_rx_set_bits(it6161, 0x05, 0x03, 0x00);  // Enable MPRX clock domain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) static void hdmi_tx_video_reset(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)     //struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733)     it6161_debug("%s reg04:0x%02x reg05:0x%02x reg6:0x%02x reg07:0x%02x reg08:0x%02x reg0e:0x%02x", __func__, it6161_hdmi_tx_read(it6161, 0x04), it6161_hdmi_tx_read(it6161, 0x05), it6161_hdmi_tx_read(it6161, 0x06), it6161_hdmi_tx_read(it6161, 0x07), it6161_hdmi_tx_read(it6161, 0x08), it6161_hdmi_tx_read(it6161, 0x0e));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_HDMITX_VID_RST, B_HDMITX_VID_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_HDMITX_VID_RST, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736)     msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) static void hdmi_tx_audio_fifo_reset(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_HDMITX_AUD_RST, B_HDMITX_AUD_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_HDMITX_AUD_RST, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) /* DDC master will set to be host */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) static void it6161_hdmi_tx_clear_ddc_fifo(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERDDC | B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD, CMD_FIFO_CLR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERHOST, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) #ifdef HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) static void it6161_hdmi_tx_generate_ddc_sclk(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL,B_TX_MASTERDDC|B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD,CMD_GEN_SCLCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) static void hdmi_tx_generate_blank_timing(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 	struct drm_display_mode *display_mode = &it6161->source_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 	bool force_hdmi_tx_clock_stable = true, force_hdmi_tx_video_stable = true, hdmi_tx_by_pass_mode = false, de_generation = false, enable_de_only = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 	u8 polarity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 	u16 hsync_start, hsync_end, vsync_start, vsync_end, htotal, hde_start, vtotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 	u16 vsync_start_2nd = 0, vsync_end_2nd = 0, vsync_rising_at_h_2nd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) 	it6161_debug("start %s", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 	polarity = ((display_mode->flags & DRM_MODE_FLAG_PHSYNC) == DRM_MODE_FLAG_PHSYNC) ? 0x02 : 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) 	polarity |= ((display_mode->flags & DRM_MODE_FLAG_PVSYNC) == DRM_MODE_FLAG_PVSYNC) ? 0x04 : 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) 	hsync_start = display_mode->hsync_start - display_mode->hdisplay - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) 	hsync_end = hsync_start + display_mode->hsync_end - display_mode->hsync_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) 	vsync_rising_at_h_2nd = hsync_start + display_mode->htotal / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) 	hde_start = display_mode->htotal - display_mode->hsync_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 	it6161_hdmi_tx_set_bits(it6161, 0xD1, 0x0C, force_hdmi_tx_clock_stable << 3 | force_hdmi_tx_video_stable << 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) 	it6161_hdmi_tx_set_bits(it6161, 0xA9, 0x80, hdmi_tx_by_pass_mode << 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 	it6161_hdmi_tx_set_bits(it6161, 0x90, 0x01, de_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) 	it6161_hdmi_tx_write(it6161, 0x91, vsync_rising_at_h_2nd >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) 	it6161_hdmi_tx_set_bits(it6161, 0x90, 0xF0, (vsync_rising_at_h_2nd & 0x00F) << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 	it6161_hdmi_tx_set_bits(it6161, 0x90, 0x06, polarity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) 	it6161_hdmi_tx_write(it6161, 0x95, (u8)hsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 	it6161_hdmi_tx_write(it6161, 0x96, (u8)hsync_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 	it6161_hdmi_tx_write(it6161, 0x97, (hsync_end & 0x0F00) >> 4 | hsync_start >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) 	vsync_start = display_mode->vsync_start - display_mode->vdisplay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 	vsync_end = display_mode->vsync_end - display_mode->vdisplay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 	if ((display_mode->flags & DRM_MODE_FLAG_INTERLACE) != DRM_MODE_FLAG_INTERLACE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) 		vsync_start_2nd = 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 		vsync_end_2nd = 0x3F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 		vtotal = display_mode->vtotal - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 		it6161_hdmi_tx_set_bits(it6161, 0xA5, 0x10, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 		vtotal = display_mode->vtotal * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) 		it6161_hdmi_tx_set_bits(it6161, 0xA5, 0x10, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 	it6161_hdmi_tx_write(it6161, 0xA0, (u8)vsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 	it6161_hdmi_tx_write(it6161, 0xA1, (vsync_end & 0x0F) << 4 | vsync_start >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 	it6161_hdmi_tx_write(it6161, 0xA2, (u8)vsync_start_2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 	it6161_hdmi_tx_write(it6161, 0xA6, (vsync_end_2nd & 0xF0) | vsync_end >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 	it6161_hdmi_tx_write(it6161, 0xA3, (vsync_end_2nd & 0x0F) << 4 | vsync_start_2nd >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 	it6161_hdmi_tx_write(it6161, 0xA4, vsync_rising_at_h_2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 	it6161_hdmi_tx_set_bits(it6161, 0xB1, 0x51, (hsync_end & 0x1000) >> 6 | (hsync_start & 0x1000) >> 8 | hde_start >> 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 	it6161_hdmi_tx_set_bits(it6161, 0xA5, 0x2F, enable_de_only << 5 | vsync_rising_at_h_2nd >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 	it6161_hdmi_tx_set_bits(it6161, 0xB2, 0x05, (vsync_rising_at_h_2nd & 0x1000) >> 10 | (vsync_rising_at_h_2nd & 0x1000) >> 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 	htotal = display_mode->htotal - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) 	it6161_hdmi_tx_set_bits(it6161, 0x90, 0xF0, (htotal & 0x0F) << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 	it6161_hdmi_tx_write(it6161, 0x91, (htotal & 0x0FF0) >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) 	it6161_hdmi_tx_set_bits(it6161, 0xB2, 0x01, (htotal & 0x1000) >> 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 	it6161_hdmi_tx_write(it6161, 0x98, vtotal & 0x0FF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) 	it6161_hdmi_tx_write(it6161, 0x99, (vtotal & 0xF00) >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) /* force abort DDC and reset DDC bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) static void it6161_hdmi_tx_abort_ddc(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 	u8 cp_desire, sw_reset, ddc_master, retry = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 	u8 uc, timeout, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 	it6161_debug("%s", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) 	/* save the sw reset, ddc master and cp desire setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 	sw_reset = it6161_hdmi_tx_read(it6161, REG_TX_SW_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 	cp_desire = it6161_hdmi_tx_read(it6161, REG_TX_HDCP_DESIRE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 	ddc_master = it6161_hdmi_tx_read(it6161, REG_TX_DDC_MASTER_CTRL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 	// it6161_hdmi_tx_write(it6161, REG_TX_HDCP_DESIRE,CPDesire&(~B_TX_CPDESIRE)); // @emily change order
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 	it6161_hdmi_tx_write(it6161, REG_TX_SW_RST, sw_reset | B_TX_HDCP_RST_HDMITX);         // @emily change order
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERDDC | B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 	/* do abort DDC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 	for (i = 0; i < retry; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 		it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD, CMD_DDC_ABORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 		it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD, CMD_GEN_SCLCLK);//hdmitxwr(0x15, 0x0A); //it6161A0   // Generate SCL Clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 		for (timeout = 0; timeout < 200; timeout++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 			uc = it6161_hdmi_tx_read(it6161, REG_TX_DDC_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 			if (uc&B_TX_DDC_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 				break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 			if (uc & (B_TX_DDC_NOACK | B_TX_DDC_WAITBUS | B_TX_DDC_ARBILOSE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 				DRM_INFO("it6161_hdmi_tx_abort_ddc Fail by reg16=%02X\n",(int)uc);//pet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 				break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 			/* delay 1 ms to stable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 			msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) static bool hdmi_tx_get_video_state(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 	return !!(B_TXVIDSTABLE & it6161_hdmi_tx_read(it6161, REG_TX_SYS_STATUS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) static bool inline hdmi_tx_get_sink_hpd(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863)     return !!(it6161_hdmi_tx_read(it6161, REG_TX_SYS_STATUS) & B_TX_HPDETECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) static bool it6161_ddc_op_finished(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868)     int reg16 = it6161_hdmi_tx_read(it6161, REG_TX_DDC_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)     if (reg16 < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871)         return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)     return (reg16 & B_TX_DDC_DONE) == B_TX_DDC_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) static int it6161_ddc_wait(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)     int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879)     unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)     //struct device *dev = &it6161->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)     timeout = jiffies + msecs_to_jiffies(AUX_WAIT_TIMEOUT_MS) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)     while (!it6161_ddc_op_finished(it6161)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885)         if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886)             DRM_INFO("Timed out waiting AUX to finish");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)             return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889)         usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)     status = it6161_hdmi_tx_read(it6161, REG_TX_DDC_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)     if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894)         DRM_INFO("Failed to read DDC channel: 0x%02x", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)         return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)     if(status & B_TX_DDC_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)         return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900)     } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901)         DRM_INFO("DDC error: 0x%02x", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902)         return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) static void hdmi_tx_ddc_operation(struct it6161 *it6161, u8 addr, u8 offset, u8 size, u8 segment, u8 cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 	size = min(size, (u8)DDC_FIFO_MAXREQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERDDC | B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_HEADER, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQOFF, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQCOUNT, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_EDIDSEG, segment);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) // Function: it6161_ddc_get_edid_operation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) // Parameter: buffer - the pointer of buffer to receive EDID ucdata.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) //            segment - the segment of EDID readback.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) //            offset - the offset of EDID ucdata in the segment. in byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) //            size - the read back bytes count,cannot exceed 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) // Return: ER_SUCCESS if successfully getting EDID. ER_FAIL otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) // Remark: function for read EDID ucdata from reciever.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) // Side-Effect: DDC master will set to be HOST. DDC FIFO will be used and dirty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) static int it6161_ddc_get_edid_operation(struct it6161 *it6161, u8 *buffer, u8 segment, u8 offset, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 	u8 status, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 	if(!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 	if(it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT1) & B_TX_INT_DDC_BUS_HANG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 		DRM_INFO("Called it6161_hdmi_tx_abort_ddc()");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 		it6161_hdmi_tx_abort_ddc(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) 	it6161_hdmi_tx_clear_ddc_fifo(it6161);    
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 	status = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) 	if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) 	hdmi_tx_ddc_operation(it6161, DDC_EDID_ADDRESS, offset, size, segment, CMD_EDID_READ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) 	status = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) 	if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 	for (i = 0; i < size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) 		status = it6161_hdmi_tx_read(it6161, REG_TX_DDC_READFIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) 		if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) 			goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) 		buffer[i] = status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) 	return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) static int it6161_get_edid_block(void *data, u8 *buf, unsigned int block_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)                                                 size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971)     struct it6161 *it6161 = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)     u8 offset, ret, step = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)     step = min(step, (u8)DDC_FIFO_MAXREQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975)     DRM_INFO("[%s] edid block number:%d read step:%d", __func__, block_num, step);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977)     for (offset = 0; offset < len; offset += step) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978)         ret = it6161_ddc_get_edid_operation(it6161, buf + offset, block_num / 2, (block_num % 2) * EDID_LENGTH + offset, step);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980)         if(ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981)             return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) #ifdef __linux__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)         DRM_INFO("[0x%02x]: %*ph", offset, step, buf + offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985)         DRM_INFO("[0x%02x]:", offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987)         for (ret = 0; ret < step; ret++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988)             printf(" 0x%02x", (buf + offset)[ret]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989)         printf("\n\r");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992)     return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) static void hdmi_tx_set_capability_from_edid_parse(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) 	struct drm_display_info *info = &it6161->connector.display_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 	it6161->hdmi_mode = drm_detect_hdmi_monitor(it6161->edid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 	it6161->support_audio = drm_detect_monitor_audio(it6161->edid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 	if (it6161->hdmi_tx_output_color_space == F_MODE_YUV444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 		if ((info->color_formats & DRM_COLOR_FORMAT_YCRCB444) != DRM_COLOR_FORMAT_YCRCB444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 			it6161->hdmi_tx_output_color_space &= ~F_MODE_CLRMOD_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 			it6161->hdmi_tx_output_color_space |= F_MODE_RGB444;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 	if (it6161->hdmi_tx_output_color_space == F_MODE_YUV422) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 		if ((info->color_formats & DRM_COLOR_FORMAT_YCRCB422) != DRM_COLOR_FORMAT_YCRCB422) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 			it6161->hdmi_tx_output_color_space &= ~F_MODE_CLRMOD_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 			it6161->hdmi_tx_output_color_space |= F_MODE_RGB444;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 	DRM_INFO("%s mode, monitor %ssupport audio, outputcolormode:%d color_formats:0x%08x color_depth:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 		it6161->hdmi_mode ? "HDMI" : "DVI", it6161->support_audio ? "" : "not ", it6161->hdmi_tx_output_color_space, info->color_formats, info->bpc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 	if ((info->color_formats & DRM_COLOR_FORMAT_RGB444) == DRM_COLOR_FORMAT_RGB444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 		DRM_INFO("support RGB444 output");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 	if ((info->color_formats & DRM_COLOR_FORMAT_YCRCB444) == DRM_COLOR_FORMAT_YCRCB444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) 		DRM_INFO("support YUV444 output");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) 	if ((info->color_formats & DRM_COLOR_FORMAT_YCRCB422) == DRM_COLOR_FORMAT_YCRCB422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 		DRM_INFO("support YUV422 output");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) static void it6161_variable_config(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)     it6161->hdmi_tx_hdcp_retry = HDMI_TX_HDCP_RETRY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028)     it6161->hdmi_tx_mode = HDMI_TX_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029)     it6161->mipi_rx_lane_count = MIPI_RX_LANE_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) #ifdef __linux__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) static int it6161_get_modes(struct drm_connector *connector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036)  	struct it6161 *it6161 = connector_to_it6161(connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037)  	int err, num_modes = 0, i, retry = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 	it6161_debug("%s start", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 	if (it6161->edid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) 		return drm_add_edid_modes(connector, it6161->edid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 	mutex_lock(&it6161->mode_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 	reinit_completion(&it6161->wait_edid_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 	for (i = 0; i < retry; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 		it6161->edid =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 		drm_do_get_edid(&it6161->connector, it6161_get_edid_block, it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) 		if (it6161->edid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 	if (!it6161->edid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 		DRM_DEV_ERROR(dev, "Failed to read EDID");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 	err = drm_connector_update_edid_property(connector, it6161->edid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 		DRM_DEV_ERROR(dev, "Failed to update EDID property: %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 	num_modes = drm_add_edid_modes(connector, it6161->edid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) 	complete(&it6161->wait_edid_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 	DRM_INFO("edid mode number:%d", num_modes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 	mutex_unlock(&it6161->mode_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) 	return num_modes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075)  static const struct drm_connector_helper_funcs it6161_connector_helper_funcs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)  	.get_modes = it6161_get_modes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)  };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) static enum drm_connector_status it6161_detect(struct drm_connector *connector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) 					       bool force)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 	struct it6161 *it6161 = connector_to_it6161(connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) 	enum drm_connector_status status = connector_status_disconnected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) 	bool hpd = hdmi_tx_get_sink_hpd(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) 	DRM_INFO("hpd:%s", hpd ? "high" : "low");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) 	//mutex_lock(&it6161->mode_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) 	if (hpd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) 		it6161_variable_config(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) 		status = connector_status_connected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) 	it6161_set_interrupts_active_level(HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) 	it6161_mipi_rx_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) 	it6161_hdmi_tx_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) 	//mutex_lock(&it6161->mode_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) static const struct drm_connector_funcs it6161_connector_funcs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 	.fill_modes = drm_helper_probe_single_connector_modes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 	.detect = it6161_detect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) 	.destroy = drm_connector_cleanup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) 	.reset = drm_atomic_helper_connector_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) static int it6161_attach_dsi(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113)     struct mipi_dsi_host *host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)     struct mipi_dsi_device *dsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115)     int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116)     const struct mipi_dsi_device_info info = { .type = "it6161",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)                          };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119)     host = of_find_mipi_dsi_host_by_node(it6161->host_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)     if (!host) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)         DRM_INFO("it6161 failed to find dsi host\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)         return -EPROBE_DEFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125)     dsi = mipi_dsi_device_register_full(host, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126)     if (IS_ERR(dsi)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)         DRM_INFO("it6161 failed to create dsi device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128)         ret = PTR_ERR(dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)         goto err_dsi_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132)     it6161->dsi = dsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134)     dsi->lanes = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135)     dsi->format = MIPI_DSI_FMT_RGB888;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136)     dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137)               MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139)     ret = mipi_dsi_attach(dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140)     if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141)         DRM_INFO("it6161 failed to attach dsi to host\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)         goto err_dsi_attach;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145)     return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) err_dsi_attach:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148)     mipi_dsi_device_unregister(dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) err_dsi_device:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150)     return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) static int it6161_bridge_attach(struct drm_bridge *bridge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) 				enum drm_bridge_attach_flags flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 	struct it6161 *it6161 = bridge_to_it6161(bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 	struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 	dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 	if (!bridge->encoder) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 		DRM_DEV_ERROR(dev, "Parent encoder object not found");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 	err = drm_connector_init(bridge->dev, &it6161->connector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 				 &it6161_connector_funcs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 				 DRM_MODE_CONNECTOR_HDMIA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 		DRM_DEV_ERROR(dev, "Failed to initialize connector: %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) 	drm_connector_helper_add(&it6161->connector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) 				 &it6161_connector_helper_funcs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 	it6161->connector.polled = DRM_CONNECTOR_POLL_HPD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 	err = drm_connector_attach_encoder(&it6161->connector, bridge->encoder);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) 		DRM_DEV_ERROR(dev, "Failed to link up connector to encoder: %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) 			      err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 		goto cleanup_connector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186)     	DRM_INFO("%s, ret:%d", __func__, it6161_attach_dsi(it6161));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 	err = drm_connector_register(&it6161->connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 		DRM_DEV_ERROR(dev, "Failed to register connector: %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) 		goto cleanup_connector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) 	it6161_debug("%s finish", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) // unregister_connector:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) // 	drm_connector_unregister(&it6161->connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) cleanup_connector:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 	drm_connector_cleanup(&it6161->connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) static void it6161_detach_dsi(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 	mipi_dsi_detach(it6161->dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 	mipi_dsi_device_unregister(it6161->dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) static void it6161_bridge_detach(struct drm_bridge *bridge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) 	struct it6161 *it6161 = bridge_to_it6161(bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) 	drm_connector_unregister(&it6161->connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 	drm_connector_cleanup(&it6161->connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) 	it6161_detach_dsi(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) static enum drm_mode_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) it6161_bridge_mode_valid(struct drm_bridge *bridge, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 								const struct drm_display_info *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) 								const struct drm_display_mode *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) 	//struct it6161 *it6161 = bridge_to_it6161(bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 	// if (mode->flags & DRM_MODE_FLAG_INTERLACE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 	// 	return MODE_NO_INTERLACE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) 	it6161_debug("%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 	// /* Max 1200p at 5.4 Ghz, one lane */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) 	// if (mode->clock > MAX_PIXEL_CLK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) 	// 	return MODE_CLOCK_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 	if (mode->clock == 27027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) 		return MODE_BAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 	if (mode->clock > 165000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 		return MODE_CLOCK_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 	//DRM_INFO("%s end", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 	return MODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) // static int it6161_send_video_infoframe(struct it6161 *it6161,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) // 				       struct hdmi_avi_infoframe *frame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) // {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) // 	u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) // 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) // 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) // 	err = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) // 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) // 		DRM_DEV_ERROR(dev, "Failed to pack AVI infoframe: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) // 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) // 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) // 	err = dptx_set_bits(it6161, 0xE8, 0x01, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) // 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) // 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) // 	err = regmap_bulk_write(it6161->regmap_mipi_rx, 0xE9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) // 				buffer + HDMI_INFOFRAME_HEADER_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) // 				frame->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) // 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) // 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) // 	err = dptx_set_bits(it6161, 0xE8, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) // 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) // 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) // 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) // }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) static void it6161_bridge_mode_set(struct drm_bridge *bridge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 				   const struct drm_display_mode *mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) 				   const struct drm_display_mode *adjusted_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 	struct it6161 *it6161 = bridge_to_it6161(bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 	struct drm_display_mode *display_mode = &it6161->source_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 	mutex_lock(&it6161->mode_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) 	err = drm_hdmi_avi_infoframe_from_display_mode(&it6161->source_avi_infoframe, &it6161->connector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) 						       mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 		DRM_DEV_ERROR(dev, "Failed to setup AVI infoframe: %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) 	//it6161->hdmi_tx_display_mode.base.id = adjusted_mode->base.id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) 	strlcpy(it6161->hdmi_tx_display_mode.name, adjusted_mode->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) 		DRM_DISPLAY_MODE_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) 	it6161->hdmi_tx_display_mode.type = adjusted_mode->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) 	it6161->hdmi_tx_display_mode.flags = adjusted_mode->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) 	//err = it6161_send_video_infoframe(it6161, &frame);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) 	strlcpy(display_mode->name, adjusted_mode->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 		DRM_DISPLAY_MODE_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 	display_mode->clock = mode->clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 	display_mode->hdisplay = mode->hdisplay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 	display_mode->hsync_start = mode->hsync_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 	display_mode->hsync_end = mode->hsync_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 	display_mode->htotal = mode->htotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) 	display_mode->vdisplay = mode->vdisplay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 	display_mode->vsync_start = mode->vsync_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) 	display_mode->vsync_end = mode->vsync_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) 	display_mode->vtotal = mode->vtotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) 	display_mode->flags = mode->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) 	it6161->vic = it6161->source_avi_infoframe.video_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 	DRM_INFO("config display mode clk: %d\n", display_mode->clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 	DRM_INFO("config display mode hdisplay: %d\n", display_mode->hdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 	DRM_INFO("config display mode hsync_start: %d\n", display_mode->hsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 	DRM_INFO("config display mode hsync_end: %d\n", display_mode->hsync_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 	DRM_INFO("config display mode htotal: %d\n", display_mode->htotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) 	DRM_INFO("config display mode vdisplay: %d\n", display_mode->vdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 	DRM_INFO("config display mode vsync_start: %d\n", display_mode->vsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 	DRM_INFO("config display mode vsync_end: %d\n", display_mode->vsync_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 	DRM_INFO("config display mode vtotal: %d\n", display_mode->vtotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 		DRM_DEV_ERROR(dev, "Failed to send AVI infoframe: %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) 	mutex_unlock(&it6161->mode_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) static void it6161_bridge_enable(struct drm_bridge *bridge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) 	struct it6161 *it6161 = bridge_to_it6161(bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) 	it6161_bridge = bridge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 	it6161_debug("%s start", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) 	mipi_rx_init(it6161);//allen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) 	hdmi_tx_init(it6161);//allen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 	it6161_set_interrupts_active_level(HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) 	it6161_mipi_rx_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) 	it6161_hdmi_tx_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 	it6161_debug("%s start restart delayed work\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) 	schedule_delayed_work(&it6161->restart, msecs_to_jiffies(2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) 	//if (enable_de_only)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) 	//			hdmi_tx_generate_blank_timing(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) 	//hdmi_tx_video_reset(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) 	// if (!it6161->enable_drv_hold) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) 	// 	it6161_int_mask_on(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) 	// 	dptx_sys_chg(it6161, SYS_HPD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) 	// }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) static void it6161_bridge_disable(struct drm_bridge *bridge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) 	struct it6161 *it6161 = bridge_to_it6161(bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) 	it6161_debug("%s start", __func__);//----TODO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) 	mipi_rx_logic_reset(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) 	hdmi_tx_logic_reset(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) 	it6161_set_interrupts_active_level(HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) 	it6161_mipi_rx_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) 	it6161_hdmi_tx_int_mask_enable(it6161);//---
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) 	//kfree(it6161->edid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) 	//it6161->edid = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) static const struct drm_bridge_funcs it6161_bridge_funcs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) 	.attach = it6161_bridge_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) 	.detach = it6161_bridge_detach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) 	.mode_valid = it6161_bridge_mode_valid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) 	.mode_set = it6161_bridge_mode_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) 	.enable = it6161_bridge_enable,// set NULL for old linux version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) 	.disable = it6161_bridge_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) #define InitCEC() it6161_hdmi_tx_write(it6161, 0x8D, (CEC_I2C_SLAVE_ADDR|0x01))//HDMITX_SetI2C_Byte(0x8D, 0x01, 0x01)//HDMITX_SetI2C_Byte(0x0F, 0x08, 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) #define DisableCEC() it6161_hdmi_tx_set_bits(it6161, 0x8D, 0x01, 0x00)//HDMITX_SetI2C_Byte(0x0F, 0x08, 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) static bool it6161_check_device_ready(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382)     u8 Vendor_ID[2], Device_ID[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384)     Vendor_ID[0] = it6161_mipi_rx_read(it6161, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385)     Vendor_ID[1] = it6161_mipi_rx_read(it6161, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386)     Device_ID[0] = it6161_mipi_rx_read(it6161, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387)     Device_ID[1] = it6161_mipi_rx_read(it6161, 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388)     // Version_ID = MIPIRX_ReadI2C_Byte(0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389)     if (Vendor_ID[0] == 0x54 && Vendor_ID[1] == 0x49 && Device_ID[0] == 0x61 && Device_ID[1] == 0x61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391)         DRM_INFO("Find 6161 revision: 0x%2x", (u32)it6161_mipi_rx_read(it6161, 0x04));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392)         return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394)     DRM_INFO("find it6161 Fail");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395)     return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) static u32 hdmi_tx_calc_rclk(struct it6161 *it6161)//in c code: cal_txrclk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) 	// u8 uc ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) 	int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) 	long sum = 0, RCLKCNT, TimeLoMax, retry = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) 	InitCEC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) 	// it6161_hdmi_tx_write(it6161, 0x8D, (CEC_I2C_SLAVE_ADDR|0x01));// Enable CRCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) 	msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) 	for (i = 0; i < retry; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) 		// uc = it6161_cec_read(it6161, 0x09) & 0xFE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) 		it6161_cec_write(it6161, 0x09, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) 		msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) 		it6161_cec_write(it6161, 0x09, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) 		RCLKCNT = it6161_cec_read(it6161, 0x47);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) 		RCLKCNT <<= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) 		RCLKCNT |= it6161_cec_read(it6161, 0x46);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) 		RCLKCNT <<= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) 		RCLKCNT |= it6161_cec_read(it6161, 0x45);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) 		// DRM_INFO1(("RCLK = %d\n",RCLKCNT) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) 		sum += RCLKCNT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) 	sum /= retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) 	RCLKCNT = sum/1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) 	it6161_cec_write(it6161, 0x0C, (RCLKCNT & 0xFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) 	DisableCEC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) //	it6161->hdmi_tx_rclk = (sum << 4) / 108;//actually nxp platform msleep(100) is 108ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) 	it6161->hdmi_tx_rclk = (sum << 4) / 104;//actually nxp platform msleep(100) is 108ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) 	DRM_INFO("hdmi tx rclk = %d.%dMHz", it6161->hdmi_tx_rclk / 1000, it6161->hdmi_tx_rclk % 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) 	TimeLoMax = (sum << 4)/10;//10*TxRCLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433)      // add HDCP TimeLomax over-flow protection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434)      if(TimeLoMax>0x3FFFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435)          TimeLoMax = 0x3FFFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437)      DRM_INFO("TimeLoMax=%08lx\n", TimeLoMax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438)      it6161_hdmi_tx_write(it6161, 0x47, (TimeLoMax&0xFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439)      it6161_hdmi_tx_write(it6161, 0x48, ((TimeLoMax&0xFF00)>>8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440)      it6161_hdmi_tx_set_bits(it6161, 0x49, 0x03, ((TimeLoMax&0x30000)>>16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442)      return it6161->hdmi_tx_rclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) static u32 hdmi_tx_calc_pclk(struct it6161 *it6161) //c code void cal_txclk( void )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) 	u8 uc, RCLKFreqSelRead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) 	int div, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) 	u32 sum , count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) 	// uc = it6161_hdmi_tx_read(it6161, 0x5F) & 0x80 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) 	// if( ! uc )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) 	// {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) 	    // return 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) 	// }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) 	RCLKFreqSelRead = (it6161_hdmi_tx_read(it6161, 0x5D) & 0x04)>>2;//hdmitxset(0x5D, 0x04, (RCLKFreqSel<<2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) 	/* PCLK Count Pre-Test */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) 	it6161_hdmi_tx_set_bits(it6161, 0xD7, 0xF0, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) 	msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) 	it6161_hdmi_tx_set_bits(it6161, 0xD7, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) 	count = it6161_hdmi_tx_read(it6161, 0xD7) & 0xF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) 	count <<= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) 	count |= it6161_hdmi_tx_read(it6161, 0xD8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) 	if (RCLKFreqSelRead)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) 		count <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) 	for ( div = 7 ; div > 0 ; div-- ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) 		if (count < (1<<(11-div)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) 	if (div < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) 		div = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) 	it6161_hdmi_tx_set_bits(it6161, 0xD7, 0x70, div<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) 	uc = it6161_hdmi_tx_read(it6161, 0xD7) & 0x7F ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) 	for( i = 0 , sum = 0 ; i < 100 ; i ++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) 		it6161_hdmi_tx_write(it6161, 0xD7, uc|0x80) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) 		msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) 		it6161_hdmi_tx_write(it6161, 0xD7, uc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) 		count = it6161_hdmi_tx_read(it6161, 0xD7) & 0xF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) 		count <<= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) 		count |= it6161_hdmi_tx_read(it6161, 0xD8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) 		if (RCLKFreqSelRead)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) 			count <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) 		sum += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) 	sum /= 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) 	count = sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) 	it6161->hdmi_tx_pclk = it6161->hdmi_tx_rclk * 128 / count * 16 ;//128*16=2048
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) 	it6161->hdmi_tx_pclk *= (1<<div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) 	// if( it6161_hdmi_tx_read(it6161, 0x70) & 0x10 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) 	// {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) 		// it6161->hdmi_tx_pclk /= 2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) 	// }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) 	DRM_INFO("hdmi tx pclk = %d.%dMHz", it6161->hdmi_tx_pclk / 1000, it6161->hdmi_tx_pclk % 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) 	return it6161->hdmi_tx_pclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) static void hdmi_tx_get_display_mode(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) 	struct drm_display_mode *display_mode = &it6161->hdmi_tx_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) 	u32 hsyncpol, vsyncpol, interlaced;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) 	u32 htotal, hdes, hdee, hsyncw, hactive, hfront_porch, H2ndVRRise;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) 	u32 vtotal, vdes, vdee, vsyncw, vactive, vfront_porch, vdes2nd, vdee2nd, vsyncw2nd, VRS2nd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) 	u32 vdew2nd, vfph2nd, vbph2nd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) 	u8 rega9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) 	hdmi_tx_calc_rclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) 	hdmi_tx_calc_pclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) 	/* enable video timing read back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) 	it6161_hdmi_tx_set_bits(it6161, 0xA8, 0x08, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) 	rega9 = it6161_hdmi_tx_read(it6161, 0xa9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) 	hsyncpol = rega9 & 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) 	vsyncpol = (rega9 & 0x02) >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) 	interlaced = (rega9 & 0x04) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) 	htotal = hdmi_tx_read_word(it6161, 0x98) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) 	hdes = hdmi_tx_read_word(it6161, 0x90) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) 	hdee = hdmi_tx_read_word(it6161, 0x92) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) 	hsyncw = hdmi_tx_read_word(it6161, 0x94) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) 	hactive = hdee - hdes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) 	hfront_porch = htotal - hdee;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) 	vtotal = hdmi_tx_read_word(it6161, 0xA6) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) 	vdes = hdmi_tx_read_word(it6161, 0x9C) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) 	vdee = hdmi_tx_read_word(it6161, 0x9E) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) 	vsyncw = it6161_hdmi_tx_read(it6161, 0xA0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) 	vactive = vdee - vdes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) 	vfront_porch = (interlaced == 0x01) ? (vtotal / 2 - vdee) : (vtotal - vdee);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) 	display_mode->clock = it6161->hdmi_tx_pclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) 	display_mode->hdisplay = hactive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) 	display_mode->hsync_start = hactive + hfront_porch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) 	display_mode->hsync_end = hactive + hfront_porch + hsyncw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) 	display_mode->htotal = htotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) 	display_mode->vdisplay = vactive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) 	display_mode->vsync_start = vactive + vfront_porch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) 	display_mode->vsync_end = vactive + vfront_porch + vsyncw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) 	display_mode->vtotal = vtotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) 	display_mode->flags = ((hsyncpol == 0x01) ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) 			      ((vsyncpol == 0x01) ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) 			      ((interlaced == 0x01) ? DRM_MODE_FLAG_INTERLACE : 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) 	if (interlaced) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) 		vdes2nd = hdmi_tx_read_word(it6161, 0xA2) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) 		vdee2nd = hdmi_tx_read_word(it6161, 0xA4) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) 		VRS2nd = hdmi_tx_read_word(it6161, 0xB1) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) 		vsyncw2nd = it6161_hdmi_tx_read(it6161, 0xA1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) 		H2ndVRRise = hdmi_tx_read_word(it6161, 0x96) & 0x0FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) 		vdew2nd = vdee2nd-vdes2nd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) 		vfph2nd = VRS2nd-vdee;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) 		vbph2nd = vdes2nd-VRS2nd-vsyncw2nd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) 		DRM_INFO("vdew2nd    = %d\n", vdew2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) 		DRM_INFO("vfph2nd    = %d\n", vfph2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) 		DRM_INFO("VSyncW2nd  = %d\n", vsyncw2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) 		DRM_INFO("vbph2nd    = %d\n", vbph2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) 		DRM_INFO("H2ndVRRise = %d\n", H2ndVRRise);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) 	/* disable video timing read back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) 	it6161_hdmi_tx_set_bits(it6161, 0xA8, 0x08, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) static void it6161_hdmi_tx_set_av_mute(struct it6161 *it6161, u8 bEnable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585)     it6161_hdmi_tx_set_bits(it6161, REG_TX_GCP,B_TX_SETAVMUTE, bEnable?B_TX_SETAVMUTE:0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_GENERAL_CTRL,B_TX_ENABLE_PKT|B_TX_REPEAT_PKT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) #ifdef HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) #ifdef SUPPORT_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) static u8 SHABuff[64] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) static u8 V[20] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) static u8 KSVList[32] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) static u8 Vr[20] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) static u8 M0[8] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) static bool hdmi_tx_hdcp_auth_status(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) 	return !!(it6161_hdmi_tx_read(it6161, REG_TX_AUTH_STAT) & B_TX_AUTH_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) static bool hdmi_tx_hdcp_get_auth_done(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) 	return hdmiTxDev[0].bAuthenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) static void hdmi_tx_hdcp_clear_auth_interrupt(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_INT_MASK2, B_TX_KSVLISTCHK_MASK | B_TX_AUTH_DONE_MASK | B_TX_AUTH_FAIL_MASK, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) 	it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR0, B_TX_CLR_AUTH_FAIL | B_TX_CLR_AUTH_DONE | B_TX_CLR_KSVLISTCHK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) 	it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR1, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) 	it6161_hdmi_tx_write(it6161, REG_TX_SYS_STATUS, B_TX_INTACTDONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) static void hdmi_tx_hdcp_reset_auth(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) 	it6161_hdmi_tx_write(it6161, REG_TX_LISTCTRL, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) 	it6161_hdmi_tx_write(it6161, REG_TX_HDCP_DESIRE, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_TX_HDCP_RST_HDMITX, B_TX_HDCP_RST_HDMITX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERDDC | B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) 	it6161_hdmi_tx_clear_ddc_fifo(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) 	it6161_hdmi_tx_abort_ddc(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) /* write anything to reg21 to enable HDCP authentication by HW */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) static void hdmi_tx_hdcp_auth_fire(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERDDC | B_TX_MASTERHDCP); // MASTERHDCP,no need command but fire.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) 	it6161_hdmi_tx_write(it6161, REG_TX_AUTHFIRE, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635)  * Start the Cipher to free run for random number. When stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636)  * An is ready in Reg30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) static void hdmi_tx_hdcp_start_an_cipher(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) 	it6161_hdmi_tx_write(it6161, REG_TX_AN_GENERATE, B_TX_START_CIPHER_GEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) /* Stop the Cipher,and An is ready in Reg30 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) static void hdmi_tx_hdcp_stop_an_cipher(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) 	it6161_hdmi_tx_write(it6161, REG_TX_AN_GENERATE, B_TX_STOP_CIPHER_GEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)  * start An ciper random run at first,then stop it. Software can get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653)  * An in reg30~reg38,the write to reg28~2F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) static void hdmi_tx_hdcp_generate_an(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) 	u8 an[DRM_HDCP_AN_LEN], i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) 	hdmi_tx_hdcp_start_an_cipher(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) 	usleep_range(2000, 3000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) 	hdmi_tx_hdcp_stop_an_cipher(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) 	/* new An is ready in reg30 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) 	it6161_hdmi_tx_burst_read(it6161, REG_TX_AN_GEN, an, DRM_HDCP_AN_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) 	for (i = 0; i < DRM_HDCP_AN_LEN; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) 		it6161_hdmi_tx_write(it6161, REG_TX_AN + i, an[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672)  * Parameter: pBCaps - pointer of byte to get BCaps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673)  *            pBStatus - pointer of two bytes to get BStatus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674)  * Return: ER_SUCCESS if successfully got BCaps and BStatus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675)  * Remark: get B status and capability from HDCP reciever via DDC bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) static SYS_STATUS hdmi_tx_get_hdcp_bcaps_bstatus(struct it6161 *it6161, u8 *pBCaps, u16 *pBStatus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) 	int ucdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL,B_TX_MASTERDDC|B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_HEADER,DDC_HDCP_ADDRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQOFF,0x40); // BCaps offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQCOUNT,3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD,CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) 	ucdata = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) 	if (ucdata < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) 		DRM_INFO("get bcaps/bstatus failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) 		return ER_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) #if 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) 	ucdata = it6161_hdmi_tx_read(it6161, REG_TX_BSTAT + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) 	*pBStatus = (u16)ucdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) 	*pBStatus <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) 	ucdata = it6161_hdmi_tx_read(it6161, REG_TX_BSTAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) 	*pBStatus |= ((u16)ucdata & 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) 	*pBCaps = it6161_hdmi_tx_read(it6161, REG_TX_BCAP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704)     *pBCaps = it6161_hdmi_tx_read(it6161, 0x17);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705)     *pBStatus = it6161_hdmi_tx_read(it6161, 0x17) & 0xFF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706)     *pBStatus |= (int)(it6161_hdmi_tx_read(it6161, 0x17)&0xFF)<<8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707)     DRM_INFO("hdmi_tx_get_hdcp_bcaps_bstatus(): ucdata = %02X\n",(int)it6161_hdmi_tx_read(it6161, 0x16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) #ifdef _SUPPORT_HDCP_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) 	TxBstatus = *pBStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) 	return ER_SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) /* Get bksv from HDCP sink */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) static int hdmi_tx_hdcp_get_bksv(struct it6161 *it6161, u8 *bksv, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) #ifdef _SUPPORT_HDMI_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) 	int timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) 	hdmi_tx_ddc_operation(it6161, DDC_HDCP_ADDRESS, DRM_HDCP_DDC_BKSV, size, 0x00, CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) 	ret = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) 		DRM_INFO("ddc get bksv failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) 	ret = it6161_hdmi_tx_burst_read(it6161, REG_TX_BKSV, bksv, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) 		DRM_INFO("i2c get bksv failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) #ifdef _SUPPORT_HDMI_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) 	for (timeout = 0; timeout < 5; timeout++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) 		KSVList[timeout] = *(bksv+timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) static u8 countbit(u8 b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) 	u8 i, count ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) 	for (i = 0, count = 0; i < 8; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) 		if (b & (1 << i))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) 			count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) static void hdmitx_hdcp_CancelRepeaterAuthenticate(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) 	it6161_debug("hdmitx_hdcp_CancelRepeaterAuthenticate");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERDDC | B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) 	it6161_hdmi_tx_abort_ddc(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) 	it6161_hdmi_tx_write(it6161, REG_TX_LISTCTRL, B_TX_LISTFAIL | B_TX_LISTDONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) 	it6161_hdmi_tx_write(it6161, REG_TX_LISTCTRL, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) 	hdmi_tx_hdcp_clear_auth_interrupt(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) static void hdmitx_hdcp_ResumeRepeaterAuthenticate(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) 	it6161_hdmi_tx_write(it6161, REG_TX_LISTCTRL, B_TX_LISTDONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) 	it6161_hdmi_tx_write(it6161, REG_TX_LISTCTRL, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) 	it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERHDCP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) #define WCOUNT 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) u32    VH[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) u32    w[WCOUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) #define rol(x,y)(((x)<< (y))| (((u32)x)>> (32-y)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) static void SHATransform(u32 * h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783)     int t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784)     u32 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786)     h[0]=0x67452301;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787)     h[1]=0xefcdab89;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788)     h[2]=0x98badcfe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789)     h[3]=0x10325476;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790)     h[4]=0xc3d2e1f0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792)     for (t=0; t < 20; t++){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793)         if(t>=16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795)             tmp=w[(t - 3)% WCOUNT] ^ w[(t - 8)% WCOUNT] ^ w[(t - 14)% WCOUNT] ^ w[(t - 16)% WCOUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796)             w[(t)% WCOUNT]=rol(tmp,1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798)         DRM_INFO("w[%d]=%08X\n",t,w[(t)% WCOUNT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800)         tmp=rol(h[0],5)+ ((h[1] & h[2])| (h[3] & ~h[1]))+ h[4] + w[(t)% WCOUNT] + 0x5a827999;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801)         DRM_INFO("%08X %08X %08X %08X %08X\n",h[0],h[1],h[2],h[3],h[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803)         h[4]=h[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804)         h[3]=h[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805)         h[2]=rol(h[1],30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806)         h[1]=h[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807)         h[0]=tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810)     for (t=20; t < 40; t++){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811)         tmp=w[(t - 3)% WCOUNT] ^ w[(t - 8)% WCOUNT] ^ w[(t - 14)% WCOUNT] ^ w[(t - 16)% WCOUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812)         w[(t)% WCOUNT]=rol(tmp,1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813)         DRM_INFO("w[%d]=%08X\n",t,w[(t)% WCOUNT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814)         tmp=rol(h[0],5)+ (h[1] ^ h[2] ^ h[3])+ h[4] + w[(t)% WCOUNT] + 0x6ed9eba1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815)         DRM_INFO("%08X %08X %08X %08X %08X\n",h[0],h[1],h[2],h[3],h[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816)         h[4]=h[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817)         h[3]=h[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818)         h[2]=rol(h[1],30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819)         h[1]=h[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820)         h[0]=tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822)     for (t=40; t < 60; t++){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823)         tmp=w[(t - 3)% WCOUNT] ^ w[(t - 8)% WCOUNT] ^ w[(t - 14)% WCOUNT] ^ w[(t - 16)% WCOUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824)         w[(t)% WCOUNT]=rol(tmp,1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825)         DRM_INFO("w[%d]=%08X\n",t,w[(t)% WCOUNT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826)         tmp=rol(h[0],5)+ ((h[1] & h[2])| (h[1] & h[3])| (h[2] & h[3]))+ h[4] + w[(t)% WCOUNT] + 0x8f1bbcdc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827)         DRM_INFO("%08X %08X %08X %08X %08X\n",h[0],h[1],h[2],h[3],h[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828)         h[4]=h[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829)         h[3]=h[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830)         h[2]=rol(h[1],30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831)         h[1]=h[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832)         h[0]=tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834)     for (t=60; t < 80; t++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836)         tmp=w[(t - 3)% WCOUNT] ^ w[(t - 8)% WCOUNT] ^ w[(t - 14)% WCOUNT] ^ w[(t - 16)% WCOUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837)         w[(t)% WCOUNT]=rol(tmp,1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838)         DRM_INFO("w[%d]=%08X\n",t,w[(t)% WCOUNT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839)         tmp=rol(h[0],5)+ (h[1] ^ h[2] ^ h[3])+ h[4] + w[(t)% WCOUNT] + 0xca62c1d6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840)         DRM_INFO("%08X %08X %08X %08X %08X\n",h[0],h[1],h[2],h[3],h[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841)         h[4]=h[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)         h[3]=h[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843)         h[2]=rol(h[1],30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844)         h[1]=h[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845)         h[0]=tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847)     DRM_INFO("%08X %08X %08X %08X %08X\n",h[0],h[1],h[2],h[3],h[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848)     h[0] +=0x67452301;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849)     h[1] +=0xefcdab89;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850)     h[2] +=0x98badcfe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851)     h[3] +=0x10325476;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852)     h[4] +=0xc3d2e1f0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854)     DRM_INFO("%08X %08X %08X %08X %08X\n",h[0],h[1],h[2],h[3],h[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) static void SHA_Simple(void *p,u32 len,u8 *output)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859)     // SHA_State s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860)     u32 i,t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861)     u32 c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862)     u8 *pBuff=p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864)     for(i=0;i < len;i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866)         t=i/4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867)         if(i%4==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869)             w[t]=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871)         c=pBuff[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872)         c <<=(3-(i%4))*8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873)         w[t] |=c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874)         DRM_INFO("pBuff[%d]=%02X,c=%08X,w[%d]=%08X\n",(int)i,(int)pBuff[i],c,(int)t,w[t]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876)     t=i/4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877)     if(i%4==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879)         w[t]=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881)     //c=0x80 << ((3-i%4)*24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882)     c=0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883)     c <<=((3-i%4)*8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884)     w[t]|=c;t++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885)     for(; t < 15;t++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887)         w[t]=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889)     w[15]=len*8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891)     for(i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893)         DRM_INFO("w[%d] = %08X\n",i,w[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895)     SHATransform(VH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897)     for(i=0;i < 5;i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899)         output[i*4+3]=(u8)((VH[i]>>24)&0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900)         output[i*4+2]=(u8)((VH[i]>>16)&0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901)         output[i*4+1]=(u8)((VH[i]>>8)&0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902)         output[i*4+0]=(u8)(VH[i]&0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) #ifdef SUPPORT_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) static SYS_STATUS hdmitx_hdcp_CheckSHA(u8 pM0[],u16 BStatus,u8 pKSVList[],int cDownStream,u8 Vr[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910)     int i,n ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912)     for(i = 0 ; i < cDownStream*5 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914)         SHABuff[i] = pKSVList[i] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916)     SHABuff[i++] = BStatus & 0xFF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917)     SHABuff[i++] = (BStatus>>8) & 0xFF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918)     for(n = 0 ; n < 8 ; n++,i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920)         SHABuff[i] = pM0[n] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922)     n = i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923)     // SHABuff[i++] = 0x80 ; // end mask
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924)     for(; i < 64 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926)         SHABuff[i] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928)     // n = cDownStream * 5 + 2 /* for BStatus */ + 8 /* for M0 */ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929)     // n *= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930)     // SHABuff[62] = (n>>8) & 0xff ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931)     // SHABuff[63] = (n>>8) & 0xff ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933)     for(i = 0 ; i < 64 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935)         if(i % 16 == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937)             DRM_INFO("SHA[]: ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939)         DRM_INFO(" %02X",SHABuff[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940)         if((i%16)==15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942)             DRM_INFO("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945)     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946)     SHA_Simple(SHABuff,n,V);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947)     for(i = 0 ; i < 20 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949)         if(V[i] != Vr[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951)             DRM_INFO("V[] =");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952)             for(i = 0 ; i < 20 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954)                 DRM_INFO(" %02X",(int)V[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956)             DRM_INFO("\nVr[] =");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957)             for(i = 0 ; i < 20 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959)                 DRM_INFO(" %02X",(int)Vr[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961)             return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) #endif // SUPPORT_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) static SYS_STATUS hdmi_tx_hdcp_get_ksv_list(struct it6161 *it6161, u8 *pKSVList,u8 cDownStream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971)     u8 timeout = 100, ucdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973)     if( cDownStream == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975)         return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977)     if( /* cDownStream == 0 || */ pKSVList == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL, B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_HEADER, 0x74);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQOFF, 0x43);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQCOUNT, cDownStream * 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD, CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987)     ucdata = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989)     if (ucdata < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993)     DRM_INFO("hdmi_tx_hdcp_get_ksv_list(): KSV");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994)     for(timeout = 0 ; timeout < cDownStream * 5 ; timeout++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996)         pKSVList[timeout] = it6161_hdmi_tx_read(it6161, REG_TX_DDC_READFIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) 		#ifdef _SUPPORT_HDCP_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) 		KSVList[timeout] = pKSVList[timeout];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999)         DRM_INFO(" %x",(int)pKSVList[timeout]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000)         DRM_INFO(" %02X",(int)pKSVList[timeout]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) 		#endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) static SYS_STATUS hdmitx_hdcp_GetVr(struct it6161 *it6161, u8 *pVr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009)     u8 timeout, ucdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011)     if(pVr == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_MASTER_CTRL,B_TX_MASTERHOST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_HEADER,0x74);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQOFF,0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_REQCOUNT,20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019)     it6161_hdmi_tx_write(it6161, REG_TX_DDC_CMD,CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021)     ucdata = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022)     if (ucdata < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024)         DRM_INFO("hdmitx_hdcp_GetVr(): DDC fail by timeout.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029)     for(timeout = 0 ; timeout < 5 ; timeout++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031)         it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL ,timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032)         pVr[timeout*4]  = (u32)it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033)         pVr[timeout*4+1] = (u32)it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034)         pVr[timeout*4+2] = (u32)it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035)         pVr[timeout*4+3] = (u32)it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) //        DRM_INFO("V' = %02X %02X %02X %02X\n",(int)pVr[timeout*4],(int)pVr[timeout*4+1],(int)pVr[timeout*4+2],(int)pVr[timeout*4+3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) static SYS_STATUS hdmitx_hdcp_GetM0(struct it6161 *it6161, u8 *pM0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043)     int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045)     if(!pM0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049)     it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL,5); // read m0[31:0] from reg51~reg54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050)     pM0[0] = it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051)     pM0[1] = it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052)     pM0[2] = it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053)     pM0[3] = it6161_hdmi_tx_read(it6161, REG_TX_SHA_RD_BYTE4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054)     it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL,0); // read m0[39:32] from reg55
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055)     pM0[4] = it6161_hdmi_tx_read(it6161, REG_TX_AKSV_RD_BYTE5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056)     it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL,1); // read m0[47:40] from reg55
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057)     pM0[5] = it6161_hdmi_tx_read(it6161, REG_TX_AKSV_RD_BYTE5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058)     it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL,2); // read m0[55:48] from reg55
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059)     pM0[6] = it6161_hdmi_tx_read(it6161, REG_TX_AKSV_RD_BYTE5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060)     it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL,3); // read m0[63:56] from reg55
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061)     pM0[7] = it6161_hdmi_tx_read(it6161, REG_TX_AKSV_RD_BYTE5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063)     DRM_INFO("M[] =");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064)     for(i = 0 ; i < 8 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066)         DRM_INFO("0x%02x,",(int)pM0[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068)     DRM_INFO("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) #ifdef _SUPPORT_HDCP_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) static void TxHDCP_chg(HDMITX_HDCP_State state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076)     if( state == hdmiTxDev[0].TxHDCP_State )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078)         return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080)     DRM_INFO("TxHDCP %d -> %d\n",hdmiTxDev[0].TxHDCP_State,state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081)     hdmiTxDev[0].TxHDCP_State = state ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083)     switch(state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085)     case TxHDCP_Off:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086)         hdmiTxDev[0].bAuthenticated=false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087)         hdmiTxDev[0].usHDCPTimeOut = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088)         hdmi_tx_hdcp_reset_auth(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091)     case TxHDCP_AuthRestart:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092)         hdmiTxDev[0].bAuthenticated = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093)         hdmi_tx_hdcp_reset_auth(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094)         hdmiTxDev[0].usHDCPTimeOut = 5 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097)     case TxHDCP_AuthStart:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098)         hdmi_tx_hdcp_reset_auth(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099)         hdmiTxDev[0].bAuthenticated = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100)         hdmiTxDev[0].usHDCPTimeOut = 80 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103)     case TxHDCP_Receiver:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104)         hdmiTxDev[0].usHDCPTimeOut = 250 ; // set the count as the 5000ms/interval
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107)     case TxHDCP_Repeater:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108)         hdmiTxDev[0].usHDCPTimeOut = 250 ; // set the count as the 5000ms/interval
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111)     case TxHDCP_CheckFIFORDY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113)         hdmiTxDev[0].usHDCPTimeOut = 300 ; // set the count as the 6000ms/interval
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116)     case TxHDCP_VerifyRevocationList:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120)     case TxHDCP_AuthFail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121)         hdmi_tx_hdcp_reset_auth(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122)         hdmiTxDev[0].bAuthenticated = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125)     case TxHDCP_RepeaterFail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126)         hdmitx_hdcp_CancelRepeaterAuthenticate(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127)         hdmi_tx_hdcp_reset_auth(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128)         hdmiTxDev[0].bAuthenticated = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131)     case TxHDCP_RepeaterSuccess:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132)         hdmitx_hdcp_ResumeRepeaterAuthenticate(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133)     case TxHDCP_Authenticated:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134)         it6161_hdmi_tx_set_av_mute(it6161, false) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135)         hdmiTxDev[0].bAuthenticated = true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) static void TxHDCP_fsm()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143)     u8 ucdata ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144)     int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146)     static u8 BCaps ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147)     static u16 BStatus ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148)     static u8 cDownStream ;// this value will be use in the function....
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149)     static u8 bksv[5] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152)     switch(hdmiTxDev[0].TxHDCP_State)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154)     case TxHDCP_Off:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157)     case TxHDCP_AuthRestart:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158)         if(hdmiTxDev[0].usHDCPTimeOut>0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160)             hdmiTxDev[0].usHDCPTimeOut -- ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162)         if( hdmiTxDev[0].usHDCPTimeOut == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164)             TxHDCP_chg(TxHDCP_AuthStart) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168)     case TxHDCP_AuthStart:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169)         cDownStream = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170)         it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171)         if(hdmiTxDev[0].usHDCPTimeOut>0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173)             hdmiTxDev[0].usHDCPTimeOut -- ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174)             ucdata = it6161_hdmi_tx_read(it6161, REG_TX_SYS_STATUS)& (B_TX_HPDETECT|B_TX_RXSENDETECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176)         	if(ucdata != (B_TX_HPDETECT|B_TX_RXSENDETECT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177)         	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178)         	    // if no Rx sense, do not start authentication.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179)         	    // Eventhough start it, cannot work.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180)         	    return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181)         	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183)             if(hdmi_tx_get_hdcp_bcaps_bstatus(it6161, &BCaps,&BStatus) != ER_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185)                 DRM_INFO("hdmi_tx_get_hdcp_bcaps_bstatus fail.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186)                 return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188)             // wait for HDMI State
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190)             if(B_TX_HDMI_MODE == (it6161_hdmi_tx_read(it6161, REG_TX_HDMI_MODE) & B_TX_HDMI_MODE ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192)                 if((BStatus & B_TX_CAP_HDMI_MODE)!=B_TX_CAP_HDMI_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193)                 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194)                     return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197)             else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199)                 if((BStatus & B_TX_CAP_HDMI_MODE)==B_TX_CAP_HDMI_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200)                 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201)                     return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206)         else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208)             TxHDCP_chg(TxHDCP_AuthRestart) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211)     	DRM_INFO("BCAPS = %x BSTATUS = %X\n", (int)BCaps, BStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212)         hdmi_tx_hdcp_get_bksv(it6161, bksv, ARRAY_SIZE(bksv));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213)         DRM_INFO("bksv %X %X %X %X %X\n",(int)bksv[0],(int)bksv[1],(int)bksv[2],(int)bksv[3],(int)bksv[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215)         for(i = 0, ucdata = 0 ; i < 5 ; i ++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217)             ucdata += countbit(bksv[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219)         if( ucdata != 20 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221)             DRM_INFO("countbit error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222)             TxHDCP_chg(TxHDCP_AuthFail) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223)             return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227)         it6161_hdmi_tx_change_bank(it6161, 0); // switch bank action should start on direct register writting of each function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229)         it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_TX_HDCP_RST_HDMITX, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231)         it6161_hdmi_tx_write(it6161, REG_TX_HDCP_DESIRE,8|B_TX_CPDESIRE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232)         hdmi_tx_hdcp_clear_auth_interrupt(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234)         hdmi_tx_hdcp_generate_an(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235)         it6161_hdmi_tx_write(it6161, REG_TX_LISTCTRL,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236)         hdmiTxDev[0].bAuthenticated = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238)         it6161_hdmi_tx_clear_ddc_fifo(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239)         hdmi_tx_hdcp_auth_fire(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240)         hdmiTxDev[0].Tx_BStatus = BStatus ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241)         if(BCaps & B_TX_CAP_HDMI_REPEATER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243)             TxHDCP_chg(TxHDCP_Repeater) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245)         else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248)             for(i = 0; i < 5 ; i ++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250)                 KSVList[i] = bksv[i] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252)             TxHDCP_chg(TxHDCP_Receiver) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256)     case TxHDCP_Receiver:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258)         if(hdmiTxDev[0].usHDCPTimeOut >0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260)             hdmiTxDev[0].usHDCPTimeOut -- ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263)         if(hdmiTxDev[0].usHDCPTimeOut==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265)             TxHDCP_chg(TxHDCP_AuthFail) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266)             return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268)         else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270)             DRM_INFO("[Fsm] Receiver: usHDCPTimeOut = %d\n",hdmiTxDev[0].usHDCPTimeOut);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271)             ucdata = it6161_hdmi_tx_read(it6161, REG_TX_AUTH_STAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272)             DRM_INFO("[Fsm] Receiver: ucdata = %X, BStatus = %X\n",ucdata,BStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274)             if(ucdata & B_TX_AUTH_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276)                 //BStatus += 0x101 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277)             	IT680X_DownStream_AuthDoneCallback(bksv, BStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278)                 TxHDCP_chg(TxHDCP_Authenticated) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279)                 break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284)     case TxHDCP_Repeater:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285)         if(hdmiTxDev[0].usHDCPTimeOut >0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287)             hdmiTxDev[0].usHDCPTimeOut -- ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290)         if(hdmiTxDev[0].usHDCPTimeOut==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292)             TxHDCP_chg(TxHDCP_AuthFail) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293)             return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297)     case TxHDCP_CheckFIFORDY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298)         if(hdmiTxDev[0].usHDCPTimeOut >0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300)             hdmiTxDev[0].usHDCPTimeOut -- ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303)         if(hdmiTxDev[0].usHDCPTimeOut==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305)             TxHDCP_chg(TxHDCP_RepeaterFail) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306)             return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309)         if(hdmi_tx_get_hdcp_bcaps_bstatus(it6161, &BCaps,&BStatus) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311)             DRM_INFO("Get BCaps fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312)             break ;  // get fail, again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316)         if(BCaps & B_TX_CAP_KSV_FIFO_RDY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318)             DRM_INFO("FIFO Ready\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321)             it6161_hdmi_tx_clear_ddc_fifo(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322)             it6161_hdmi_tx_generate_ddc_sclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323)             hdmiTxDev[0].Tx_BStatus = BStatus ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324)             cDownStream=(BStatus & M_TX_DOWNSTREAM_COUNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325)             //+++++++++++++++++++++++++++++++++++++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326)             DRM_INFO("Downstream=%X \n",cDownStream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328)             if( cDownStream > (MAX_REPEATER_DOWNSTREAM_COUNT-1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330)                 hdmiTxDev[0].Tx_BStatus |= B_TX_DOWNSTREAM_OVER ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332)             if( cDownStream > (MAX_REPEATER_DOWNSTREAM_COUNT-1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333)                 BStatus & (B_TX_MAX_CASCADE_EXCEEDED|B_TX_DOWNSTREAM_OVER))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335)                 DRM_INFO("Invalid Down stream count,fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337)                 // RxAuthSetBStatus(B_DOWNSTREAM_OVER|B_MAX_CASCADE_EXCEEDED);    //for ALLION HDCP 3C-2-06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338)                 // ForceKSVFIFOReady(B_DOWNSTREAM_OVER|B_MAX_CASCADE_EXCEEDED) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339)                 IT680X_DownStream_AuthDoneCallback(KSVList, 0xFFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340)                 TxHDCP_chg(TxHDCP_RepeaterFail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341)                 break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344)              TxHDCP_chg(TxHDCP_VerifyRevocationList) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345)              break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350)     case TxHDCP_VerifyRevocationList:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352)     #ifdef SUPPORT_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353)         DRM_INFO("TxHDCP_VerifyRevocationList: cDownStream = %d",cDownStream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354)         if(hdmi_tx_hdcp_get_ksv_list(it6161, KSVList,cDownStream) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356)         	DRM_INFO("hdmitx_hdcp_Repeater_Fail 2\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357)             TxHDCP_chg(TxHDCP_RepeaterFail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358)             break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361)         if(hdmitx_hdcp_GetVr(it6161, Vr) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363)         	DRM_INFO("hdmitx_hdcp_Repeater_Fail 3\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364)             TxHDCP_chg(TxHDCP_RepeaterFail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365)             break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367)         if(hdmitx_hdcp_GetM0(it6161, M0) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369)         	DRM_INFO("hdmitx_hdcp_Repeater_Fail 4\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370)             TxHDCP_chg(TxHDCP_RepeaterFail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371)             break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373)         // do check SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374)         if(hdmitx_hdcp_CheckSHA(M0,BStatus,KSVList,cDownStream,Vr) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376)         	DRM_INFO("hdmitx_hdcp_Repeater_Fail 5\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377)             TxHDCP_chg(TxHDCP_RepeaterFail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378)             break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380)     #endif // SUPPORT_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381)         // checkSHA success, append the bksv to KSV List
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382)         for(i = 0; i < 5 ; i ++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384)             KSVList[cDownStream*5+i] = bksv[i] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387)         for( i = 0 ; i < ((cDownStream+1)*5) ; i ++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389)             DRM_INFO("KSVLIST[%d] = %X\n",i,KSVList[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392)         //BStatus += 0x101 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393)     	IT680X_DownStream_AuthDoneCallback(KSVList, BStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395)         TxHDCP_chg(TxHDCP_RepeaterSuccess) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399)     case TxHDCP_Authenticated:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402)     case TxHDCP_AuthFail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403)         // force revoke the KSVList
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404)         // IT680X_DownStream_AuthDoneCallback(KSVList, 0xFFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405)         TxHDCP_chg(TxHDCP_AuthRestart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408)     case TxHDCP_RepeaterFail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409)         TxHDCP_chg(TxHDCP_AuthFail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412)     case TxHDCP_RepeaterSuccess:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413)         TxHDCP_chg(TxHDCP_Authenticated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) // Function: hdmi_tx_hdcp_auth_process_Repeater
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) // Parameter: BCaps and BStatus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) // Return: ER_SUCCESS if success,if AUTH_FAIL interrupt status,return fail.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) // Remark:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) // Side-Effect: as Authentication
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) #ifdef HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) static SYS_STATUS hdmi_tx_hdcp_auth_process_Repeater(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431)     u8 uc ,ii;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432)     // u8 revoked ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433)     // int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434)     u8 cDownStream ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436)     u8 BCaps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437)     u16 BStatus ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438)     u16 timeout ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440)     DRM_INFO("Authentication for repeater\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441)     // emily add for test,abort HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442)     // 2007/10/01 marked by jj_tseng@chipadvanced.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443)     // it6161_hdmi_tx_write(it6161, 0x20,0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444)     // it6161_hdmi_tx_write(it6161, 0x04,0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445)     // it6161_hdmi_tx_write(it6161, 0x10,0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446)     // it6161_hdmi_tx_write(it6161, 0x15,0x0F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447)     // msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448)     // it6161_hdmi_tx_write(it6161, 0x04,0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449)     // it6161_hdmi_tx_write(it6161, 0x10,0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450)     // it6161_hdmi_tx_write(it6161, 0x20,0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451)     // msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452)     // test07 = it6161_hdmi_tx_read(it6161, 0x7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453)     // test06 = it6161_hdmi_tx_read(it6161, 0x6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454)     // test08 = it6161_hdmi_tx_read(it6161, 0x8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455)     //~jj_tseng@chipadvanced.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456)     // end emily add for test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457)     //////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458)     // Authenticate Fired
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459)     //////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461)     hdmi_tx_get_hdcp_bcaps_bstatus(it6161, &BCaps,&BStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462)     msleep(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463)     if((B_TX_INT_HPD_PLUG|B_TX_INT_RX_SENSE)&it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465)         DRM_INFO("HPD Before Fire Auth\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468)     hdmi_tx_hdcp_auth_fire(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469)     //msleep(550); // emily add for test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470)     for(ii=0;ii<55;ii++)    //msleep(550); // emily add for test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472)         if((B_TX_INT_HPD_PLUG|B_TX_INT_RX_SENSE)&it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474)             goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476)         msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478)     for(timeout = /*250*6*/10 ; timeout > 0 ; timeout --)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480)         DRM_INFO("timeout = %d wait part 1\n",timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481)         if((B_TX_INT_HPD_PLUG|B_TX_INT_RX_SENSE)&it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483)             DRM_INFO("HPD at wait part 1\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484)             goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486)         uc = it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487)         if(uc & B_TX_INT_DDC_BUS_HANG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489)             DRM_INFO("DDC Bus hang\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490)             goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492)         uc = it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494)         if(uc & B_TX_INT_AUTH_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496)             /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497)             it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR0,B_TX_CLR_AUTH_FAIL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498)             it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR1,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499)             it6161_hdmi_tx_write(it6161, REG_TX_SYS_STATUS,B_TX_INTACTDONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500)             it6161_hdmi_tx_write(it6161, REG_TX_SYS_STATUS,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501)             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502)             DRM_INFO("hdmi_tx_hdcp_auth_process_Repeater(): B_TX_INT_AUTH_FAIL.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503)             goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505)         // emily add for test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506)         // test =(it6161_hdmi_tx_read(it6161, 0x7)&0x4)>>2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507)         if(uc & B_TX_INT_KSVLIST_CHK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509)             it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR0,B_TX_CLR_KSVLISTCHK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510)             it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR1,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511)             it6161_hdmi_tx_write(it6161, REG_TX_SYS_STATUS,B_TX_INTACTDONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512)             it6161_hdmi_tx_write(it6161, REG_TX_SYS_STATUS,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513)             DRM_INFO("B_TX_INT_KSVLIST_CHK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516)         msleep(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518)     if(timeout == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520)         DRM_INFO("Time out for wait KSV List checking interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523)     ///////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524)     // clear KSVList check interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525)     ///////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527)     for(timeout = 500 ; timeout > 0 ; timeout --)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529)         DRM_INFO("timeout=%d at wait FIFO ready\n",timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530)         if((B_TX_INT_HPD_PLUG|B_TX_INT_RX_SENSE)&it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532)             DRM_INFO("HPD at wait FIFO ready\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533)             goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535)         if(hdmi_tx_get_hdcp_bcaps_bstatus(it6161, &BCaps,&BStatus) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537)             DRM_INFO("Get BCaps fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538)             goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540)         if(BCaps & B_TX_CAP_KSV_FIFO_RDY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542)              DRM_INFO("FIFO Ready\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543)              break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545)         msleep(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548)     if(timeout == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550)         DRM_INFO("Get KSV FIFO ready timeout\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553)     DRM_INFO("Wait timeout = %d\n",timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555)     it6161_hdmi_tx_clear_ddc_fifo(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556)     it6161_hdmi_tx_generate_ddc_sclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557)     cDownStream =  (BStatus & M_TX_DOWNSTREAM_COUNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559)     if(/*cDownStream == 0 ||*/ cDownStream > 6 || BStatus & (B_TX_MAX_CASCADE_EXCEEDED|B_TX_DOWNSTREAM_OVER))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561)         DRM_INFO("Invalid Down stream count,fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) #ifdef SUPPORT_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565)     if(hdmi_tx_hdcp_get_ksv_list(it6161, KSVList,cDownStream) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570)     for(i = 0 ; i < cDownStream ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572)         revoked=false ; uc = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573)         for( timeout = 0 ; timeout < 5 ; timeout++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575)             // check bit count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576)             uc += countbit(KSVList[i*5+timeout]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578)         if( uc != 20 ) revoked = true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580)         if(revoked)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582)             DRM_INFO("KSVFIFO[%d] = %02X %02X %02X %02X %02X is revoked\n",i,(int)KSVList[i*5],(int)KSVList[i*5+1],(int)KSVList[i*5+2],(int)KSVList[i*5+3],(int)KSVList[i*5+4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583)              goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588)     if(hdmitx_hdcp_GetVr(it6161, Vr) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592)     if(hdmitx_hdcp_GetM0(it6161, M0) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596)     // do check SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597)     if(hdmitx_hdcp_CheckSHA(M0,BStatus,KSVList,cDownStream,Vr) == ER_FAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601)     if((B_TX_INT_HPD_PLUG|B_TX_INT_RX_SENSE)&it6161_hdmi_tx_read(it6161, REG_TX_INT_STAT1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603)         DRM_INFO("HPD at Final\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604)         goto hdmitx_hdcp_Repeater_Fail ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) #endif // SUPPORT_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608)     hdmitx_hdcp_ResumeRepeaterAuthenticate(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609)     hdmiTxDev[0].bAuthenticated = true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) hdmitx_hdcp_Repeater_Fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613)     hdmitx_hdcp_CancelRepeaterAuthenticate(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614)     return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) static int hdmi_tx_hdcp_get_m0(struct it6161 *it6161, u8 *m0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620)     int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) 	if(!m0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) 	/* read m0[31:0] from reg51~reg54 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) 	it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) 	ret = it6161_hdmi_tx_burst_read(it6161, REG_TX_SHA_RD_BYTE1, m0, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) 		DRM_INFO("i2c read m0 failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) 	/* read m0[39 + i * 8 : 32 + i * 8] from reg55 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) 	for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) 		it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) 		m0[4 + i] = it6161_hdmi_tx_read(it6161, REG_TX_AKSV_RD_BYTE5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) static int hdmi_tx_hdcp_get_bcaps(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) 	hdmi_tx_ddc_operation(it6161, DDC_HDCP_ADDRESS, DRM_HDCP_DDC_BCAPS, 0x01, 0x00, CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) 	ret = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) 		DRM_INFO("ddc get bcaps failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) 	ret = it6161_hdmi_tx_read(it6161, REG_TX_BCAP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659) 		DRM_INFO("i2c get bcaps failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) static int hdmi_tx_hdcp_get_bstatus(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) 	int ret, bstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) 	hdmi_tx_ddc_operation(it6161, DDC_HDCP_ADDRESS, DRM_HDCP_DDC_BSTATUS, 0x02, 0x00, CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) 	ret = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) 		DRM_INFO("ddc get bstatus failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) 	ret = it6161_hdmi_tx_read(it6161, REG_TX_BSTAT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) 		DRM_INFO("i2c get bstatus failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) 	bstatus = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) 	ret = it6161_hdmi_tx_read(it6161, REG_TX_BSTAT + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) 		DRM_INFO("i2c get bstatus failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) 	bstatus |= ret << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) 	return bstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) static void hdmi_tx_hdcp_show_ksv_list(struct it6161 *it6161, u8 *ksvlist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702) 	u8 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) 	for (i = 0; i < it6161->hdcp_downstream_count; i++, ksvlist += DRM_HDCP_KSV_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705) 		DRM_INFO("device%d ksv:0x %*ph", i, DRM_HDCP_KSV_LEN, ksvlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) static int hdmi_tx_hdcp_get_ksv_list1(struct it6161 *it6161, u8 *ksvlist, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) 	int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) 	hdmi_tx_ddc_operation(it6161, DDC_HDCP_ADDRESS, DRM_HDCP_DDC_KSV_FIFO, size, 0x00, CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) 	ret = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) 		DRM_INFO("ddc get ksv list failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) 	for (i = 0; i < size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) 		ret = it6161_hdmi_tx_read(it6161, REG_TX_DDC_READFIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) 		if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) 			DRM_INFO("i2c get ksv list failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) 		ksvlist[i] = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) static int hdmi_tx_hdcp_get_v_prime(struct it6161 *it6161, u8 *v_prime, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) 	int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) 	hdmi_tx_ddc_operation(it6161, DDC_HDCP_ADDRESS, DRM_HDCP_DDC_V_PRIME(0), size, 0x00, CMD_DDC_SEQ_BURSTREAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) 	ret = it6161_ddc_wait(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) 		DRM_INFO("ddc get v prime failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) 	for(i = 0 ; i < DRM_HDCP_V_PRIME_NUM_PARTS ; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) 		it6161_hdmi_tx_write(it6161, REG_TX_SHA_SEL ,i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) 		ret = it6161_hdmi_tx_burst_read(it6161, REG_TX_SHA_RD_BYTE1, v_prime, DRM_HDCP_V_PRIME_PART_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) 		if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) 			DRM_INFO("i2c get v prime failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) 		v_prime += DRM_HDCP_V_PRIME_PART_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) static int hdmi_tx_setup_sha1_input(struct it6161 *it6161, u8 *ksvlist, u8 *sha1_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) 	u8 i, m0[8], msg_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) 	hdmi_tx_hdcp_get_m0(it6161, m0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) 	for (i = 0; i < it6161->hdcp_downstream_count * DRM_HDCP_KSV_LEN; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) 		sha1_input[i] = ksvlist[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) 	msg_count += i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) 	sha1_input[msg_count++] = (u8)it6161->bstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) 	sha1_input[msg_count++] = (u8)(it6161->bstatus >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) 	i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) 	while (i < ARRAY_SIZE(m0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) 		sha1_input[msg_count++] = m0[i++];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) 	return msg_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) static int it6161_sha1_digest(struct it6161 *it6161, u8 *sha1_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) 			      unsigned int size, u8 *output_av)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) 	struct shash_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) 	struct crypto_shash *tfm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) 	tfm = crypto_alloc_shash("sha1", 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) 	if (IS_ERR(tfm)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) 		DRM_DEV_ERROR(dev, "crypto_alloc_shash sha1 failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) 		return PTR_ERR(tfm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) 	desc = kzalloc(sizeof(*desc) + crypto_shash_descsize(tfm), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) 	if (!desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) 		crypto_free_shash(tfm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) 	desc->tfm = tfm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) 	err = crypto_shash_digest(desc, sha1_input, size, output_av);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) 		DRM_DEV_ERROR(dev, "crypto_shash_digest sha1 failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) 	crypto_free_shash(tfm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) 	kfree(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) static bool hdmi_tX_hdcp_compare_sha1_v_prime_v(struct it6161 *it6161, u8 *v_array, u8 *v_prime_array)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) 	int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) 	u8 (*v)[DRM_HDCP_V_PRIME_PART_LEN] = (u8 (*)[DRM_HDCP_V_PRIME_PART_LEN])v_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) 	u8 (*v_prime)[DRM_HDCP_V_PRIME_PART_LEN] = (u8 (*)[DRM_HDCP_V_PRIME_PART_LEN])v_prime_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) 	for (i = 0; i < DRM_HDCP_V_PRIME_NUM_PARTS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) 		for (j = 0; j < DRM_HDCP_V_PRIME_PART_LEN; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) 			if (v[i][j] !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) 			    v_prime[i][DRM_HDCP_V_PRIME_PART_LEN - 1- j])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) 				return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) static void hdmi_tx_hdcp_auth_part2_process(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) 	struct it6161 *it6161 = container_of(work, struct it6161,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) 					     wait_hdcp_ksv_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) 	int timeout = 5000, ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) 	//u8 bcaps, ksvlist[DRM_HDCP_KSV_LEN * it6161->hdcp_downstream_count], *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) 	u8 bcaps, ksvlist[DRM_HDCP_KSV_LEN], *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) 	u8 v[DRM_HDCP_V_PRIME_NUM_PARTS][DRM_HDCP_V_PRIME_PART_LEN], v_prime[DRM_HDCP_V_PRIME_NUM_PARTS][DRM_HDCP_V_PRIME_PART_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) 	while (timeout > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) 		if (!hdmi_tx_get_sink_hpd(it6161))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) 		ret = hdmi_tx_hdcp_get_bcaps(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845) 		bcaps = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) 		if (!!(bcaps & DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) 			DRM_INFO("ksv list fifo ready");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) 		usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) 	if (timeout <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) 		DRM_INFO("wait ksv list ready timeout");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) 	ret = hdmi_tx_hdcp_get_ksv_list1(it6161, ksvlist, ARRAY_SIZE(ksvlist));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) 	if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) 	hdmi_tx_hdcp_show_ksv_list(it6161, ksvlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) 	ret = hdmi_tx_setup_sha1_input(it6161, ksvlist, it6161->sha1_transform_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) 	DRM_INFO("sha1 msg_count :%d \nsha1_input:0x %*ph", ret, ret, it6161->sha1_transform_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) 	ret = it6161_sha1_digest(it6161, it6161->sha1_transform_input, ret, (u8 *)v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) 	if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) 	tmp = (u8 *)v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) 	for (i = 0; i < DRM_HDCP_V_PRIME_NUM_PARTS; i++, tmp += DRM_HDCP_V_PRIME_PART_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) 		DRM_INFO("v:0x %*ph", DRM_HDCP_V_PRIME_PART_LEN, tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) 	ret = hdmi_tx_hdcp_get_v_prime(it6161, (u8 *)v_prime, sizeof(v_prime));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) 	if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) 	tmp = (u8 *)v_prime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) 	for (i = 0; i < DRM_HDCP_V_PRIME_NUM_PARTS; i++, tmp += DRM_HDCP_V_PRIME_PART_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) 		DRM_INFO("v_prime:0x %*ph", DRM_HDCP_V_PRIME_PART_LEN, tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) 	ret = hdmi_tX_hdcp_compare_sha1_v_prime_v(it6161, (u8 *)v, (u8 *)v_prime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) 	DRM_INFO("sha1 check result: %s", ret ? "pass" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) 		it6161_hdmi_tx_set_bits(it6161, REG_TX_LISTCTRL, B_TX_LISTDONE , B_TX_LISTDONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) 		it6161_hdmi_tx_set_bits(it6161, REG_TX_LISTCTRL, B_TX_LISTDONE | B_TX_LISTFAIL, B_TX_LISTDONE | B_TX_LISTFAIL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_LISTCTRL, B_TX_LISTDONE | B_TX_LISTFAIL, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) static bool hdmi_tx_hdcp_enable_auth_part1(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) 	u8 i, count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) 	ret = hdmi_tx_hdcp_get_bksv(it6161, it6161->bksv, (int)ARRAY_SIZE(it6161->bksv));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) 		return hdmiTxDev[0].bAuthenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) 	DRM_INFO("bksv: 0x %*ph", (int)ARRAY_SIZE(it6161->bksv), it6161->bksv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) 	for (i = 0; i < ARRAY_SIZE(it6161->bksv); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) 		count += countbit(it6161->bksv[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) 	if (count != 20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) 		DRM_INFO("not a valid bksv");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) 		return hdmiTxDev[0].bAuthenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) 	if ((it6161->bksv[4] == 0x93) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) 		(it6161->bksv[3] == 0x43) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915) 		(it6161->bksv[2] == 0x5C) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) 		(it6161->bksv[1] == 0xDE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) 		(it6161->bksv[0] == 0x23)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) 		DRM_INFO("Revoked bksv");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) 		return hdmiTxDev[0].bAuthenticated ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) 	it6161_hdmi_tx_write(it6161, REG_TX_HDCP_DESIRE, 0x08 | B_TX_CPDESIRE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) 	hdmi_tx_hdcp_generate_an(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) 	hdmi_tx_hdcp_auth_fire(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) static bool hdmi_tx_hdcp_auth_process(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) 	u8 bcaps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) 	u16 i, retry = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) 	/* Authenticate should be called after AFE setup up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) 	DRM_INFO("start");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) 	hdmiTxDev[0].bAuthenticated = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) 	it6161->hdmi_tx_hdcp_retry--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) 	hdmi_tx_hdcp_reset_auth(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_TX_HDCP_RST_HDMITX, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) 	it6161_hdmi_tx_write(it6161, REG_TX_LISTCTRL, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) 	it6161_hdmi_tx_clear_ddc_fifo(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) 	hdmi_tx_hdcp_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) 	for (i = 0; i < retry; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) 		ret = hdmi_tx_hdcp_get_bstatus(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) 		if(ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) 		it6161->bstatus = (u16)ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) 		ret = hdmi_tx_hdcp_get_bcaps(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) 		bcaps = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) 	if (i == retry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) 		return hdmiTxDev[0].bAuthenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) 	DRM_INFO("bcaps: 0x%02x, bstatus: 0x%04x, hdmi_mode: %d", bcaps, it6161->bstatus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) 		 it6161->bstatus & B_TX_CAP_HDMI_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) 	it6161->is_repeater = !!(bcaps & DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) 	DRM_INFO("downstream is hdcp %s", it6161->is_repeater ? "repeater" : "receiver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) 	if (it6161->is_repeater) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) 		it6161->hdcp_downstream_count = (u8)DRM_HDCP_NUM_DOWNSTREAM(it6161->bstatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) 		DRM_INFO("down stream Count %d", it6161->hdcp_downstream_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970) 		if (it6161->hdcp_downstream_count > 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) 			DRM_INFO("over maximum supported number 6");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972) 			return hdmiTxDev[0].bAuthenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) 	ret = hdmi_tx_hdcp_enable_auth_part1(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) 	if (!it6161->is_repeater) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) 		ret = wait_for_completion_timeout(&it6161->wait_hdcp_event, msecs_to_jiffies(1000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) 		DRM_INFO("completion:%d", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) 		if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) 			DRM_INFO("hdcp-receiver: timeout");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) 		return hdmiTxDev[0].bAuthenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) 	return hdmiTxDev[0].bAuthenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) static void hdmitx_hdcp_ResumeAuthentication(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995)     it6161_hdmi_tx_set_av_mute(it6161, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996)     if(hdmi_tx_hdcp_auth_process(it6161) == ER_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999)     it6161_hdmi_tx_set_av_mute(it6161, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) static void hdmi_tx_hdcp_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) 	struct it6161 *it6161 = container_of(work, struct it6161,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) 					     hdcp_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) 	//struct device *dev = &it6161->i2c_hdmi_tx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) 	bool ret, sink_hpd = hdmi_tx_get_sink_hpd(it6161), video_state = hdmi_tx_get_video_state(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) 	if (it6161->hdmi_tx_hdcp_retry <= 0 || !sink_hpd || !video_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) 		DRM_INFO("hdcp_retry:%d sink_hpd:%d video_stable_state:%d", it6161->hdmi_tx_hdcp_retry, sink_hpd, video_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) 	ret = hdmi_tx_hdcp_auth_process(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) 	if (it6161->is_repeater) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016) 		DRM_INFO("is repeater and wait for ksv list interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) 	DRM_INFO("hdcp_auth_process %s", ret ? "pass" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) static void hdmi_tx_enable_hdcp(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) 	struct device *dev = &it6161->i2c_hdmi_tx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) 	DRM_DEV_DEBUG_DRIVER(dev, "start");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) 	queue_delayed_work(system_wq, &it6161->hdcp_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) 			   msecs_to_jiffies(500));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) static bool getHDMITX_LinkStatus()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) it6161_debug("%s reg0E:0x%02x reg0x61:0x%02x", __func__, it6161_hdmi_tx_read(it6161, REG_TX_SYS_STATUS), it6161_hdmi_tx_read(it6161, REG_TX_AFE_DRV_CTRL));//allen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036)     if(B_TX_RXSENDETECT & it6161_hdmi_tx_read(it6161, REG_TX_SYS_STATUS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037)         if(0==it6161_hdmi_tx_read(it6161, REG_TX_AFE_DRV_CTRL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039)             //DRM_INFO("getHDMITX_LinkStatus()!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040)             return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043)     DRM_INFO("GetTMDS not Ready()!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045)     return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) // static void HDMITX_PowerDown()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) // {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) //     it6161_hdmi_tx_write_table(it6161, HDMITX_PwrDown_Table, ARRAY_SIZE(HDMITX_PwrDown_Table));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) // }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) static void hdmi_tx_setup_pclk_div2(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) 	if (HDMI_TX_PCLK_DIV2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) 		DRM_INFO("PCLK Divided by 2 mode");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) 		it6161_hdmi_tx_set_bits(it6161, REG_TX_INPUT_MODE, B_TX_PCLKDIV2, B_TX_PCLKDIV2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) // Function: hdmi_tx_setup_csc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) // Parameter: input_mode -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) //             D[1:0] - Color Mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) //             D[4] - Colorimetry 0: ITU_BT601 1: ITU_BT709
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) //             D[5] - Quantization 0: 0_255 1: 16_235
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) //             D[6] - Up/Dn Filter 'Required'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) //                    0: no up/down filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) //                    1: enable up/down filter when csc need.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) //             D[7] - Dither Filter 'Required'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) //                    0: no dither enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) //                    1: enable dither and dither free go "when required".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) //            output_mode -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) //             D[1:0] - Color mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) // Return: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) // Remark: reg72~reg8D will be programmed depended the input with table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) // Side-Effect:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) static void hdmi_tx_setup_csc(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082)     u8 ucData, csc = 0, i, filter = 0; // filter is for Video CTRL DN_FREE_GO,EN_DITHER,and ENUDFILT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083)     u8 input_mode = it6161->hdmi_tx_input_color_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084)     u8 output_mode = it6161->hdmi_tx_output_color_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086)     // (1) YUV422 in,RGB/YUV444 output (Output is 8-bit,input is 12-bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087)     // (2) YUV444/422  in,RGB output (CSC enable,and output is not YUV422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088)     // (3) RGB in,YUV444 output   (CSC enable,and output is not YUV422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089)     //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090)     // YUV444/RGB24 <-> YUV422 need set up/down filter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091)     DRM_INFO("hdmi_tx_setup_csc(u8 input_mode = %x,u8 output_mode = %x)\n", (int)input_mode, (int)output_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092)     switch(input_mode&F_MODE_CLRMOD_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094)     #ifdef SUPPORT_INPUTYUV444
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095)     case F_MODE_YUV444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096)         DRM_INFO("Input mode is YUV444 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097)         switch(output_mode&F_MODE_CLRMOD_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099)         case F_MODE_YUV444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100)             DRM_INFO("Output mode is YUV444\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101)             csc = B_HDMITX_CSC_BYPASS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104)         case F_MODE_YUV422:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105)             DRM_INFO("Output mode is YUV422\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106)             if(input_mode & F_VIDMODE_EN_UDFILT) // YUV444 to YUV422 need up/down filter for processing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108)                 filter |= B_TX_EN_UDFILTER ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110)             csc = B_HDMITX_CSC_BYPASS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112)         case F_MODE_RGB444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113)             DRM_INFO("Output mode is RGB24\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114)             csc = B_HDMITX_CSC_YUV2RGB ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115)             if(input_mode & F_VIDMODE_EN_DITHER) // YUV444 to RGB24 need dither
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117)                 filter |= B_TX_EN_DITHER | B_TX_DNFREE_GO ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124)     #ifdef SUPPORT_INPUTYUV422
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125)     case F_MODE_YUV422:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126)         DRM_INFO("Input mode is YUV422\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127)         switch(output_mode&F_MODE_CLRMOD_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129)         case F_MODE_YUV444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130)             DRM_INFO("Output mode is YUV444\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131)             csc = B_HDMITX_CSC_BYPASS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132)             if(input_mode & F_VIDMODE_EN_UDFILT) // YUV422 to YUV444 need up filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134)                 filter |= B_TX_EN_UDFILTER ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136)             if(input_mode & F_VIDMODE_EN_DITHER) // YUV422 to YUV444 need dither
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138)                 filter |= B_TX_EN_DITHER | B_TX_DNFREE_GO ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141)         case F_MODE_YUV422:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142)             DRM_INFO("Output mode is YUV422\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143)             csc = B_HDMITX_CSC_BYPASS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147)         case F_MODE_RGB444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148)             DRM_INFO("Output mode is RGB24\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149)             csc = B_HDMITX_CSC_YUV2RGB ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150)             if(input_mode & F_VIDMODE_EN_UDFILT) // YUV422 to RGB24 need up/dn filter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152)                 filter |= B_TX_EN_UDFILTER ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154)             if(input_mode & F_VIDMODE_EN_DITHER) // YUV422 to RGB24 need dither
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156)                 filter |= B_TX_EN_DITHER | B_TX_DNFREE_GO ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163)     #ifdef SUPPORT_INPUTRGB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164)     case F_MODE_RGB444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165)         DRM_INFO("Input mode is RGB24\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166)         switch(output_mode&F_MODE_CLRMOD_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168)         case F_MODE_YUV444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169)             DRM_INFO("Output mode is YUV444\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170)             csc = B_HDMITX_CSC_RGB2YUV ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172)             if(input_mode & F_VIDMODE_EN_DITHER) // RGB24 to YUV444 need dither
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174)                 filter |= B_TX_EN_DITHER | B_TX_DNFREE_GO ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178)         case F_MODE_YUV422:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179)             DRM_INFO("Output mode is YUV422\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180)             if(input_mode & F_VIDMODE_EN_UDFILT) // RGB24 to YUV422 need down filter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182)                 filter |= B_TX_EN_UDFILTER ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184)             if(input_mode & F_VIDMODE_EN_DITHER) // RGB24 to YUV422 need dither
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186)                 filter |= B_TX_EN_DITHER | B_TX_DNFREE_GO ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188)             csc = B_HDMITX_CSC_RGB2YUV ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191)         case F_MODE_RGB444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192)             DRM_INFO("Output mode is RGB24\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193)             csc = B_HDMITX_CSC_BYPASS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) #ifndef DISABLE_HDMITX_CSC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201)     #ifdef SUPPORT_INPUTRGB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202)     // set the CSC metrix registers by colorimetry and quantization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203)     if(csc == B_HDMITX_CSC_RGB2YUV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205)         DRM_INFO("CSC = RGB2YUV %x ",csc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206)         switch(input_mode&(F_VIDMODE_ITU709|F_VIDMODE_16_235))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208)         case F_VIDMODE_ITU709|F_VIDMODE_16_235:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209)             DRM_INFO("ITU709 16-235 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_RGB2YUV_ITU709_16_235[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_RGB2YUV_ITU709_16_235[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212)         case F_VIDMODE_ITU709|F_VIDMODE_0_255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213)             DRM_INFO("ITU709 0-255 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_RGB2YUV_ITU709_0_255[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_RGB2YUV_ITU709_0_255[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216)         case F_VIDMODE_ITU601|F_VIDMODE_16_235:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217)             DRM_INFO("ITU601 16-235 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_RGB2YUV_ITU601_16_235[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_RGB2YUV_ITU601_16_235[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220)         case F_VIDMODE_ITU601|F_VIDMODE_0_255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221)         default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222)             DRM_INFO("ITU601 0-255 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_RGB2YUV_ITU601_0_255[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_RGB2YUV_ITU601_0_255[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229)     #ifdef SUPPORT_INPUTYUV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230)     if (csc == B_HDMITX_CSC_YUV2RGB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232)         DRM_INFO("CSC = YUV2RGB %x ",csc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234)         switch(input_mode&(F_VIDMODE_ITU709|F_VIDMODE_16_235))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236)         case F_VIDMODE_ITU709|F_VIDMODE_16_235:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237)             DRM_INFO("ITU709 16-235 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_YUV2RGB_ITU709_16_235[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_YUV2RGB_ITU709_16_235[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240)         case F_VIDMODE_ITU709|F_VIDMODE_0_255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241)             DRM_INFO("ITU709 0-255 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_YUV2RGB_ITU709_0_255[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_YUV2RGB_ITU709_0_255[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244)         case F_VIDMODE_ITU601|F_VIDMODE_16_235:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245)             DRM_INFO("ITU601 16-235 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_YUV2RGB_ITU601_16_235[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_YUV2RGB_ITU601_16_235[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248)         case F_VIDMODE_ITU601|F_VIDMODE_0_255:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249)         default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250)             DRM_INFO("ITU601 0-255 ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251)             for( i = 0 ; i < SIZEOF_CSCMTX ; i++ ){ it6161_hdmi_tx_write(it6161, REG_TX_CSC_YOFF+i,bCSCMtx_YUV2RGB_ITU601_0_255[i]) ; DRM_INFO("reg%02X <- %02X\n",(int)(i+REG_TX_CSC_YOFF),(int)bCSCMtx_YUV2RGB_ITU601_0_255[i]);}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) #else// DISABLE_HDMITX_CSC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257)     csc = B_HDMITX_CSC_BYPASS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) #endif// DISABLE_HDMITX_CSC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260)     if( csc == B_HDMITX_CSC_BYPASS )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262)         it6161_hdmi_tx_set_bits(it6161, 0xF, 0x10, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266)         it6161_hdmi_tx_set_bits(it6161, 0xF, 0x10, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268)     ucData = it6161_hdmi_tx_read(it6161, REG_TX_CSC_CTRL) & ~(M_TX_CSC_SEL|B_TX_DNFREE_GO|B_TX_EN_DITHER|B_TX_EN_UDFILTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269)     ucData |= filter|csc ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271)     it6161_hdmi_tx_write(it6161, REG_TX_CSC_CTRL,ucData);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) // Parameter: VIDEOPCLKLEVEL level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275) //            PCLK_LOW - for 13.5MHz (for mode less than 1080p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) //            PCLK MEDIUM - for 25MHz~74MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) //            PCLK HIGH - PCLK > 80Hz (for 1080p mode or above)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) // Remark: set reg62~reg65 depended on HighFreqMode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279) //         reg61 have to be programmed at last and after video stable input.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) static void hdmi_tx_setup_afe(struct it6161 *it6161, VIDEOPCLKLEVEL level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284)     it6161_hdmi_tx_write(it6161, REG_TX_AFE_DRV_CTRL, B_TX_AFE_DRV_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285)     switch(level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287)         case PCLK_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288)             it6161_hdmi_tx_set_bits(it6161, 0x62, 0x90, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289)             it6161_hdmi_tx_set_bits(it6161, 0x64, 0x89, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290)             it6161_hdmi_tx_set_bits(it6161, 0x68, 0x10, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291)             it6161_hdmi_tx_set_bits(it6161, 0x66, 0x80, 0x80);//hdmitxset(0x66, 0x80, 0x80);// mark fix 6017
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293)         default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294)             it6161_hdmi_tx_set_bits(it6161, 0x62, 0x90, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295)             it6161_hdmi_tx_set_bits(it6161, 0x64, 0x89, 0x09);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296)             it6161_hdmi_tx_set_bits(it6161, 0x68, 0x10, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) 	DRM_INFO("setup afe: %s", level ? "high" : "low");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) #ifdef REDUCE_HDMITX_SRC_JITTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301)     //it6161_hdmi_tx_set_bits(it6161, 0x64, 0x01, 0x00); //pet: TODO need check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302)     // it6161_hdmi_tx_set_bits(it6161, 0x6A, 0xFF, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304)     // 2019/02/15 modified by jjtseng, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305)     // Dr. Liu: 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306)     // it6161 �b�� Solomon mipi TX (�Ψ�Ljitter �ܤj��source��), �Х[�H�U�]�w
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307)     // reg[6A]=0x5D 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308)     // Note: Register 6A  is REG_XP_TEST[7:0], its eye and jitter CTS report please see attached file 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309)     // 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310)     // it6161 �b�� ite mipi TX (��Ljitter OK��source��), keep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311)     // [6A]=0x00 (default setting)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313)     it6161_hdmi_tx_set_bits(it6161, 0x6A, 0xFF, 0x5D);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317) // Remark: write reg61 with 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) //         When program reg61 with 0x04,then audio and video circuit work.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320) static void hdmi_tx_fire_afe(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322)     it6161_hdmi_tx_change_bank(it6161, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323)     it6161_hdmi_tx_write(it6161, REG_TX_AFE_DRV_CTRL, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) // utility function for main..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330) // #ifndef DISABLE_HDMITX_CSC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) //     #if (defined (SUPPORT_OUTPUTYUV)) && (defined (SUPPORT_INPUTRGB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) //         extern const u8 bCSCMtx_RGB2YUV_ITU601_16_235[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) //         extern const u8 bCSCMtx_RGB2YUV_ITU601_0_255[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) //         extern const u8 bCSCMtx_RGB2YUV_ITU709_16_235[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) //         extern const u8 bCSCMtx_RGB2YUV_ITU709_0_255[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336) //     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) //     #if (defined (SUPPORT_OUTPUTRGB)) && (defined (SUPPORT_INPUTYUV))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) //         extern const u8 bCSCMtx_YUV2RGB_ITU601_16_235[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) //         extern const u8 bCSCMtx_YUV2RGB_ITU601_0_255[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341) //         extern const u8 bCSCMtx_YUV2RGB_ITU709_16_235[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) //         extern const u8 bCSCMtx_YUV2RGB_ITU709_0_255[] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) //     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345) // #endif// DISABLE_HDMITX_CSC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) static void hdmi_tx_disable_video_output(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350) 	it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_HDMITX_VID_RST, B_HDMITX_VID_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) 	it6161_hdmi_tx_write(it6161, REG_TX_AFE_DRV_CTRL,B_TX_AFE_DRV_RST|B_TX_AFE_DRV_PWD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352) 	it6161_hdmi_tx_set_bits(it6161, 0x62, 0x90, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353) 	it6161_hdmi_tx_set_bits(it6161, 0x64, 0x89, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) static void hdmi_tx_enable_video_output(struct it6161 *it6161, VIDEOPCLKLEVEL level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358) 	it6161_hdmi_tx_write(it6161, REG_TX_SW_RST, B_HDMITX_AUD_RST | B_TX_AREF_RST | B_TX_HDCP_RST_HDMITX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359) 	it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360) 	it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB1, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363) 	if(it6161->hdmi_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364) 		it6161_hdmi_tx_set_av_mute(it6161, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) 	hdmi_tx_setup_pclk_div2(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) 	hdmi_tx_setup_csc(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) 	it6161_hdmi_tx_write(it6161, REG_TX_HDMI_MODE, it6161->hdmi_mode ? B_TX_HDMI_MODE : B_TX_DVI_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) 	hdmi_tx_setup_afe(it6161, level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370) 	hdmi_tx_fire_afe(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373) static u8 AudioDelayCnt=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) static u8 LastRefaudfreqnum=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) static bool bForceCTS = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377) static void setHDMITX_ChStat(struct it6161 *it6161, u8 ucIEC60958ChStat[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379)     u8 uc ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382)     uc = (ucIEC60958ChStat[0] <<1)& 0x7C ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383)     it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_MODE,uc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384)     it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_CAT,ucIEC60958ChStat[1]); // 192, audio CATEGORY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385)     it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_SRCNUM,ucIEC60958ChStat[2]&0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386)     it6161_hdmi_tx_write(it6161, REG_TX_AUD0CHST_CHTNUM,(ucIEC60958ChStat[2]>>4)&0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387)     it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_CA_FS,ucIEC60958ChStat[3]); // choose clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388)     it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_OFS_WL,ucIEC60958ChStat[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392) void setHDMITX_UpdateChStatFs(u32 Fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394)     u8 uc ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396)     /////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397)     // Fs should be the following value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398)     // #define AUDFS_22p05KHz  4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399)     // #define AUDFS_44p1KHz 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400)     // #define AUDFS_88p2KHz 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401)     // #define AUDFS_176p4KHz    12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402)     //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403)     // #define AUDFS_24KHz  6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404)     // #define AUDFS_48KHz  2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405)     // #define AUDFS_96KHz  10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406)     // #define AUDFS_192KHz 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407)     //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408)     // #define AUDFS_768KHz 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409)     //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410)     // #define AUDFS_32KHz  3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411)     // #define AUDFS_OTHER    1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412)     /////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415)     uc = it6161_hdmi_tx_read(it6161, REG_TX_AUDCHST_CA_FS); // choose clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416)     it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_CA_FS,uc); // choose clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417)     uc &= 0xF0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418)     uc |= (Fs&0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420)     uc = it6161_hdmi_tx_read(it6161, REG_TX_AUDCHST_OFS_WL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421)     uc &= 0xF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422)     uc |= ((~Fs) << 4)&0xF0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423)     it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_OFS_WL,uc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428) static void setHDMITX_LPCMAudio(u8 AudioSrcNum, u8 AudSWL, u8 bAudInterface /*I2S/SPDIF/TDM*/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431)     u8 AudioEnable, AudioFormat ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432)     u8 bTDMSetting ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433)     AudioEnable = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434)     AudioFormat = hdmiTxDev[0].bOutputAudioMode ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436)     switch(AudSWL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438)     case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439)         AudioEnable |= M_TX_AUD_16BIT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441)     case 18:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442)         AudioEnable |= M_TX_AUD_18BIT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444)     case 20:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445)         AudioEnable |= M_TX_AUD_20BIT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447)     case 24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448)     default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449)         AudioEnable |= M_TX_AUD_24BIT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454)         AudioFormat &= ~0x40 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455)         AudioEnable |= B_TX_AUD_SPDIF|B_TX_AUD_EN_I2S0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459)         AudioFormat |= 0x40 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460)         switch(AudioSrcNum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462)         case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463)             AudioEnable |= B_TX_AUD_EN_I2S3|B_TX_AUD_EN_I2S2|B_TX_AUD_EN_I2S1|B_TX_AUD_EN_I2S0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466)         case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467)             AudioEnable |= B_TX_AUD_EN_I2S2|B_TX_AUD_EN_I2S1|B_TX_AUD_EN_I2S0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470)         case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471)             AudioEnable |= B_TX_AUD_EN_I2S1|B_TX_AUD_EN_I2S0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474)         case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475)         default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476)             AudioFormat &= ~0x40 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477)             AudioEnable |= B_TX_AUD_EN_I2S0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478)             break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482)     AudioFormat|=0x01;//mingchih add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483)     hdmiTxDev[0].bAudioChannelEnable=AudioEnable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0,AudioEnable&0xF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL1,AudioFormat); // regE1 bOutputAudioMode should be loaded from ROM image.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) #ifdef USE_IT66120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490)     it6161_hdmi_tx_set_bits(it6161, 0x5A,0x02, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xFF); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) #ifdef USE_SPDIF_CHSTAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,B_TX_CHSTSEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512) #else // not USE_SPDIF_CHSTAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) #endif // USE_SPDIF_CHSTAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_SRCVALID_FLAT,0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_HDAUDIO,0x00); // regE5 = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521)         u8 i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522)         it6161_hdmi_tx_set_bits(it6161, 0x5c,(1<<6), (1<<6));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523)         for( i = 0 ; i < 100 ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525)             if(it6161_hdmi_tx_read(it6161, REG_TX_CLK_STATUS2) & B_TX_OSF_LOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527)                 break ; // stable clock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533)         bTDMSetting = it6161_hdmi_tx_read(it6161, REG_TX_AUD_HDAUDIO) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534)         if( bAudInterface == TDM )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536)             bTDMSetting |= B_TX_TDM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537)             bTDMSetting &= 0x9F ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538)             bTDMSetting |= (AudioSrcNum-1)<< 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540)         else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542)             bTDMSetting &= ~B_TX_TDM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544)         it6161_hdmi_tx_write(it6161, REG_TX_AUD_HDAUDIO, bTDMSetting) ; // 2 channel NLPCM, no TDM mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) static void setHDMITX_NLPCMAudio(u8 bAudInterface /*I2S/SPDIF/TDM*/) // no Source Num, no I2S.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550)     u8 AudioEnable, AudioFormat ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551)     u8 i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553)     AudioFormat = 0x01 ; // NLPCM must use standard I2S mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556)         AudioEnable = M_TX_AUD_24BIT|B_TX_AUD_SPDIF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560)         AudioEnable = M_TX_AUD_24BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564)     // it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, M_TX_AUD_24BIT|B_TX_AUD_SPDIF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, AudioEnable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566)     //it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_HDMITX_AUD_RST|B_TX_AREF_RST, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL1,0x01); // regE1 bOutputAudioMode should be loaded from ROM image.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) #ifdef USE_IT66120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xFF); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) #ifdef USE_SPDIF_CHSTAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,B_TX_CHSTSEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) #else // not USE_SPDIF_CHSTAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) #endif // USE_SPDIF_CHSTAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_SRCVALID_FLAT,0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_HDAUDIO,0x00); // regE5 = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593)         for( i = 0 ; i < 100 ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595)             if(it6161_hdmi_tx_read(it6161, REG_TX_CLK_STATUS2) & B_TX_OSF_LOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597)                 break ; // stable clock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603)         i = it6161_hdmi_tx_read(it6161, REG_TX_AUD_HDAUDIO) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604)         i &= ~B_TX_TDM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605)         it6161_hdmi_tx_write(it6161, REG_TX_AUD_HDAUDIO, i) ; // 2 channel NLPCM, no TDM mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, AudioEnable|B_TX_AUD_EN_I2S0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) static void setHDMITX_HBRAudio(u8 bAudInterface /*I2S/SPDIF/TDM*/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612)     // u8 rst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615)     // rst = it6161_hdmi_tx_read(it6161, REG_TX_SW_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) 	// rst &= ~(B_HDMITX_AUD_RST|B_TX_AREF_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618)     // it6161_hdmi_tx_write(it6161, REG_TX_SW_RST, rst | B_HDMITX_AUD_RST );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL1,0x47); // regE1 bOutputAudioMode should be loaded from ROM image.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) #ifdef USE_IT66120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xFF); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, M_TX_AUD_24BIT|B_TX_AUD_SPDIF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,B_TX_CHSTSEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, M_TX_AUD_24BIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_SRCVALID_FLAT,0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_HDAUDIO,B_TX_HBR); // regE5 = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647)     //uc = it6161_hdmi_tx_read(it6161, REG_TX_CLK_CTRL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648)     //uc &= ~M_TX_AUD_DIV ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649)     //it6161_hdmi_tx_write(it6161, REG_TX_CLK_CTRL1, uc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651)     if( bAudInterface == SPDIF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653)         u8 i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654)         for( i = 0 ; i < 100 ; i++ )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656)             if(it6161_hdmi_tx_read(it6161, REG_TX_CLK_STATUS2) & B_TX_OSF_LOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658)                 break ; // stable clock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, M_TX_AUD_24BIT|B_TX_AUD_SPDIF|B_TX_AUD_EN_SPDIF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665)         it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, M_TX_AUD_24BIT|B_TX_AUD_EN_I2S3|B_TX_AUD_EN_I2S2|B_TX_AUD_EN_I2S1|B_TX_AUD_EN_I2S0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667)     it6161_hdmi_tx_set_bits(it6161, 0x5c, BIT(6), 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668)     hdmiTxDev[0].bAudioChannelEnable=it6161_hdmi_tx_read(it6161, REG_TX_AUDIO_CTRL0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669)     // it6161_hdmi_tx_write(it6161, REG_TX_SW_RST, rst  );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672) static void setHDMITX_DSDAudio()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674)     // to be continue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675)     // u8 rst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676)     // rst = it6161_hdmi_tx_read(it6161, REG_TX_SW_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678)     //it6161_hdmi_tx_write(it6161, REG_TX_SW_RST, rst | (B_HDMITX_AUD_RST|B_TX_AREF_RST) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL1,0x41); // regE1 bOutputAudioMode should be loaded from ROM image.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, M_TX_AUD_24BIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL3,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_SRCVALID_FLAT,0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687)     it6161_hdmi_tx_write(it6161, REG_TX_AUD_HDAUDIO,B_TX_DSD); // regE5 = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688)     //it6161_hdmi_tx_write(it6161, REG_TX_SW_RST, rst & ~(B_HDMITX_AUD_RST|B_TX_AREF_RST) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690)     //uc = it6161_hdmi_tx_read(it6161, REG_TX_CLK_CTRL1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691)     //uc &= ~M_TX_AUD_DIV ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692)     //it6161_hdmi_tx_write(it6161, REG_TX_CLK_CTRL1, uc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, M_TX_AUD_24BIT|B_TX_AUD_EN_I2S3|B_TX_AUD_EN_I2S2|B_TX_AUD_EN_I2S1|B_TX_AUD_EN_I2S0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) static void HDMITX_DisableAudioOutput(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699)     //u8 uc = (it6161_hdmi_tx_read(it6161, REG_TX_SW_RST) | (B_HDMITX_AUD_RST | B_TX_AREF_RST));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700)     //it6161_hdmi_tx_write(it6161, REG_TX_SW_RST,uc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701)     AudioDelayCnt=AudioOutDelayCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702)     LastRefaudfreqnum=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703)     it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, (B_HDMITX_AUD_RST | B_TX_AREF_RST), (B_HDMITX_AUD_RST | B_TX_AREF_RST) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704)     it6161_hdmi_tx_set_bits(it6161, 0x0F, 0x10, 0x10 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) static void HDMITX_EnableAudioOutput(struct it6161 *it6161, u8 AudioType, u8 bAudInterface /*I2S/SPDIF/TDM*/,  u32 SampleFreq,  u8 ChNum, u8 *pIEC60958ChStat, u32 TMDSClock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709)     static u8 ucIEC60958ChStat[5] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711)     u8 Fs ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712)     AudioDelayCnt=36;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713)     LastRefaudfreqnum=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714)     hdmiTxDev[0].TMDSClock=TMDSClock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715)     hdmiTxDev[0].bAudioChannelEnable=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716)     hdmiTxDev[0].bAudInterface=bAudInterface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718)     //DRM_INFO1(("HDMITX_EnableAudioOutput(%02X, %s, %d, %d, %p, %d);\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719)     //    AudioType, bSPDIF?"SPDIF":"I2S",SampleFreq, ChNum, pIEC60958ChStat, TMDSClock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720)     //    ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722)     it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST,(B_HDMITX_AUD_RST | B_TX_AREF_RST), (B_HDMITX_AUD_RST | B_TX_AREF_RST));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723)     it6161_hdmi_tx_write(it6161, REG_TX_CLK_CTRL0,B_TX_AUTO_OVER_SAMPLING_CLOCK|B_TX_EXT_256FS|0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725)     it6161_hdmi_tx_set_bits(it6161, 0x0F, 0x10, 0x00 ); // power on the ACLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727)     if(bAudInterface == SPDIF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729)         if(AudioType==T_AUDIO_HBR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731)             it6161_hdmi_tx_write(it6161, REG_TX_CLK_CTRL0,0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733)         it6161_hdmi_tx_set_bits(it6161, REG_TX_AUDIO_CTRL0,B_TX_AUD_SPDIF, B_TX_AUD_SPDIF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737)         it6161_hdmi_tx_set_bits(it6161, REG_TX_AUDIO_CTRL0, B_TX_AUD_SPDIF, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739)     if( AudioType != T_AUDIO_DSD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741)         // one bit audio have no channel status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742)         switch(SampleFreq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744)         case  44100L: Fs =  AUDFS_44p1KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745)         case  88200L: Fs =  AUDFS_88p2KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746)         case 176400L: Fs = AUDFS_176p4KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747)         case  32000L: Fs =    AUDFS_32KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748)         case  48000L: Fs =    AUDFS_48KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749)         case  96000L: Fs =    AUDFS_96KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750)         case 192000L: Fs =   AUDFS_192KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751)         case 768000L: Fs =   AUDFS_768KHz ; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752)         default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753)             SampleFreq = 48000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754)             Fs =    AUDFS_48KHz ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755)             break ; // default, set Fs = 48KHz.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757)     #ifdef SUPPORT_AUDIO_MONITOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758)         hdmiTxDev[0].bAudFs=Fs;// AUDFS_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759)     #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760)         hdmiTxDev[0].bAudFs=Fs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761)     #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762)         setHDMITX_NCTS(hdmiTxDev[0].bAudFs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763)         if( pIEC60958ChStat == NULL )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765)             ucIEC60958ChStat[0] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766)             ucIEC60958ChStat[1] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767)             ucIEC60958ChStat[2] = (ChNum+1)/2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769)             if(ucIEC60958ChStat[2]<1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771)                 ucIEC60958ChStat[2] = 1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773)             else if( ucIEC60958ChStat[2] >4 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775)                 ucIEC60958ChStat[2] = 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777)             ucIEC60958ChStat[3] = Fs ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778)             ucIEC60958ChStat[4] = (((~Fs)<<4) & 0xF0) | CHTSTS_SWCODE ; // Fs | 24bit u32 length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779)             pIEC60958ChStat = ucIEC60958ChStat ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782)     it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST,(B_HDMITX_AUD_RST|B_TX_AREF_RST),B_TX_AREF_RST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784)     switch(AudioType)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786)     case T_AUDIO_HBR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787)         DRM_INFO("T_AUDIO_HBR\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788)         pIEC60958ChStat[0] |= 1<<1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789)         pIEC60958ChStat[2] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790)         pIEC60958ChStat[3] &= 0xF0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791)         pIEC60958ChStat[3] |= AUDFS_768KHz ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792)         pIEC60958ChStat[4] |= (((~AUDFS_768KHz)<<4) & 0xF0)| 0xB ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793)         setHDMITX_ChStat(it6161, pIEC60958ChStat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794)         setHDMITX_HBRAudio(bAudInterface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797)     case T_AUDIO_DSD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798)         DRM_INFO("T_AUDIO_DSD\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799)         setHDMITX_DSDAudio();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801)     case T_AUDIO_NLPCM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802)         DRM_INFO("T_AUDIO_NLPCM\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803)         pIEC60958ChStat[0] |= 1<<1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804)         setHDMITX_ChStat(it6161, pIEC60958ChStat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805)         setHDMITX_NLPCMAudio(bAudInterface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807)     case T_AUDIO_LPCM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808)         DRM_INFO("T_AUDIO_LPCM\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809)         pIEC60958ChStat[0] &= ~(1<<1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811)         setHDMITX_ChStat(it6161, pIEC60958ChStat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812)         setHDMITX_LPCMAudio((ChNum+1)/2, SUPPORT_AUDI_AudSWL, bAudInterface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813)         // can add auto adjust
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816)     it6161_hdmi_tx_set_bits(it6161, REG_TX_INT_MASK1, B_TX_AUDIO_OVFLW_MASK, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817)     it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, hdmiTxDev[0].bAudioChannelEnable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819)     it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST,(B_HDMITX_AUD_RST|B_TX_AREF_RST),0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821) #ifdef SUPPORT_AUDIO_MONITOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822) void hdmitx_AutoAdjustAudio()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824)     u32 SampleFreq,cTMDSClock ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825)     u32 N ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826)     u32 aCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827)     u8 fs, uc,LoopCnt=10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828)     if(bForceCTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4830)         it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4831)         it6161_hdmi_tx_write(it6161, 0xF8, 0xC3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4832)         it6161_hdmi_tx_write(it6161, 0xF8, 0xA5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4833)         it6161_hdmi_tx_set_bits(it6161, REG_TX_PKT_SINGLE_CTRL, B_TX_SW_CTS, 0x00); // D[1] = 0, HW auto count CTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4834)         it6161_hdmi_tx_write(it6161, 0xF8, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4835)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4836)     //msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4837)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4838)     N = ((u32)it6161_hdmi_tx_read(it6161, REGPktAudN2)&0xF) << 16 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4839)     N |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudN1)) <<8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4840)     N |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudN0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4842)     while(LoopCnt--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4843)     {   u32 TempCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4844)         aCTS = ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt2)) << 12 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4845)         aCTS |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt1)) <<4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4846)         aCTS |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt0)&0xf0)>>4  ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4847)         if(aCTS==TempCTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4848)         {break;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4849)         TempCTS=aCTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4850)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4851)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4852)     if( aCTS == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4853)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4854)         DRM_INFO("aCTS== 0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4855)         return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4856)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4857)     uc = it6161_hdmi_tx_read(it6161, REG_TX_GCP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4858) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4859)     cTMDSClock = hdmiTxDev[0].TMDSClock ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4860)     //TMDSClock=GetInputPclk();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4861)     DRM_INFO("PCLK = %u0,000\n",(u32)(cTMDSClock/10000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4862)     switch(uc & 0x70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4863)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4864)     case 0x50:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4865)         cTMDSClock *= 5 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4866)         cTMDSClock /= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4867)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4868)     case 0x60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4869)         cTMDSClock *= 3 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4870)         cTMDSClock /= 2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4871)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4872)     SampleFreq = cTMDSClock/aCTS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4873)     SampleFreq *= N ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4874)     SampleFreq /= 128 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4875)     //SampleFreq=48000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4876) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4877)     DRM_INFO("SampleFreq = %u0\n",(u32)(SampleFreq/10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4878)     if( SampleFreq>31000L && SampleFreq<=38050L ){fs = AUDFS_32KHz ;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4879)     else if (SampleFreq < 46550L )  {fs = AUDFS_44p1KHz ;}//46050
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4880)     else if (SampleFreq < 68100L )  {fs = AUDFS_48KHz ;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4881)     else if (SampleFreq < 92100L )  {fs = AUDFS_88p2KHz ;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4882)     else if (SampleFreq < 136200L ) {fs = AUDFS_96KHz ;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4883)     else if (SampleFreq < 184200L ) {fs = AUDFS_176p4KHz ;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4884)     else if (SampleFreq < 240200L ) {fs = AUDFS_192KHz ;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4885)     else if (SampleFreq < 800000L ) {fs = AUDFS_768KHz ;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4886)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4887)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4888)         fs = AUDFS_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4889)         DRM_INFO("fs = AUDFS_OTHER\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4890)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4891)     if(hdmiTxDev[0].bAudFs != fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4892)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4893)         hdmiTxDev[0].bAudFs=fs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4894)         setHDMITX_NCTS(hdmiTxDev[0].bAudFs); // set N, CTS by new generated clock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4895)         //CurrCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4896)         return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4897)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4898)     return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4901) bool hdmitx_IsAudioChang()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4902) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4903)     //u32 pCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4904)     u8 FreDiff=0,Refaudfreqnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4906)     //it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4907)     //pCTS = ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt2)) << 12 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4908)     //pCTS |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt1)) <<4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4909)     //pCTS |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt0)&0xf0)>>4  ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4910)     //it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4911)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4912)     Refaudfreqnum=it6161_hdmi_tx_read(it6161, 0x60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4913)     //"Refaudfreqnum=%X    pCTS= %u",(u32)Refaudfreqnum,(u32)(pCTS/10000)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4914)     //if((pCTS%10000)<1000)DRM_INFO("0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4915)     //if((pCTS%10000)<100)DRM_INFO("0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4916)     //if((pCTS%10000)<10)DRM_INFO("0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4917)     //DRM_INFO("%u\n",(u32)(pCTS%10000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4918)     if((1<<4)&it6161_hdmi_tx_read(it6161, 0x5f))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4919)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4920)         //printf("=======XXXXXXXXXXX=========\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4921)         return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4922)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4923)     if(LastRefaudfreqnum>Refaudfreqnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4924)         {FreDiff=LastRefaudfreqnum-Refaudfreqnum;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4925)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4926)         {FreDiff=Refaudfreqnum-LastRefaudfreqnum;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4927)     LastRefaudfreqnum=Refaudfreqnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4928)     if(3<FreDiff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4929)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4930)         DRM_INFO("Aduio FreDiff=%d\n",(int)FreDiff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4931)         it6161_hdmi_tx_set_bits(it6161, REG_TX_PKT_SINGLE_CTRL,(1<<5), (1<<5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4932)         it6161_hdmi_tx_set_bits(it6161, REG_TX_AUDIO_CTRL0, 0x0F, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4933)         return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4934)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4935)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4936)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4937)         return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4938)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4940) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4941) void setHDMITX_AudioChannelEnable(bool EnableAudio_b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4942) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4943)     static bool AudioOutStatus=false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4944)     if(EnableAudio_b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4945)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4946)         if(AudioDelayCnt==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4947)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4948)             //if(hdmiTxDev[0].bAuthenticated==false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4949)             //{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4950)         #ifdef SUPPORT_AUDIO_MONITOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4951)             if(hdmitx_IsAudioChang())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4952)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4953)                 hdmitx_AutoAdjustAudio();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4954)         #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4955)             if(AudioOutStatus==false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4956)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4957)                 setHDMITX_NCTS(hdmiTxDev[0].bAudFs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4958)         #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4959)                 it6161_hdmi_tx_write(it6161, REG_TX_AUD_SRCVALID_FLAT,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4960)                 it6161_hdmi_tx_set_bits(it6161, REG_TX_PKT_SINGLE_CTRL,(1<<5), (1<<5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4961)                 it6161_hdmi_tx_write(it6161, REG_TX_AUDIO_CTRL0, hdmiTxDev[0].bAudioChannelEnable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4962)                 //it6161_hdmi_tx_set_bits(it6161, 0x59,(1<<2), (1<<2));  //for test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4963)                 it6161_hdmi_tx_set_bits(it6161, REG_TX_PKT_SINGLE_CTRL, 0x3C, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4964)                 it6161_hdmi_tx_set_bits(it6161, REG_TX_PKT_SINGLE_CTRL, 1<<5, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4965)                 printf("Audio Out Enable\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4966)         #ifndef SUPPORT_AUDIO_MONITOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4967)                 AudioOutStatus=true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4968)         #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4969)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4970)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4971)         else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4972)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4973)             AudioOutStatus=false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4974)             if(0==(it6161_hdmi_tx_read(it6161, REG_TX_CLK_STATUS2)&0x10))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4975)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4976)                 AudioDelayCnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4977)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4978)             else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4979)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4980)                 AudioDelayCnt=AudioOutDelayCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4981)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4982)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4983)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4984)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4985)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4986)        // CurrCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4987)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4988) }*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4989) #endif //#ifdef SUPPORT_AUDIO_MONITOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4990) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4991) // Function: setHDMITX_NCTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4992) // Parameter: PCLK - video clock in Hz.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4993) //            Fs - Encoded audio sample rate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4994) //                          AUDFS_22p05KHz  4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4995) //                          AUDFS_44p1KHz 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4996) //                          AUDFS_88p2KHz 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4997) //                          AUDFS_176p4KHz    12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4998) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4999) //                          AUDFS_24KHz  6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5000) //                          AUDFS_48KHz  2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5001) //                          AUDFS_96KHz  10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5002) //                          AUDFS_192KHz 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5003) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5004) //                          AUDFS_768KHz 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5005) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5006) //                          AUDFS_32KHz  3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5007) //                          AUDFS_OTHER    1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5008) // Return: ER_SUCCESS if success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5009) // Remark: set N value,the CTS will be auto generated by HW.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5010) // Side-Effect: register bank will reset to bank 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5011) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5013) static void setHDMITX_NCTS(u8 Fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5014) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5015)     u32 n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5016)     u8 LoopCnt=255,CTSStableCnt=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5017)     u32 diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5018)     u32 CTS=0,LastCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5019)     bool HBR_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5020)     // u8 aVIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5021) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5022)     if(B_TX_HBR & it6161_hdmi_tx_read(it6161, REG_TX_AUD_HDAUDIO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5023)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5024)         HBR_mode=true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5025)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5026)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5027)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5028)         HBR_mode=false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5029)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5030)     switch(Fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5031)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5032)     case AUDFS_32KHz: n = 4096; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5033)     case AUDFS_44p1KHz: n = 6272; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5034)     case AUDFS_48KHz: n = 6144; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5035)     case AUDFS_88p2KHz: n = 12544; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5036)     case AUDFS_96KHz: n = 12288; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5037)     case AUDFS_176p4KHz: n = 25088; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5038)     case AUDFS_192KHz: n = 24576; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5039)     case AUDFS_768KHz: n = 24576; break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5040)     default: n = 6144;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5041)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5042)     // tr_printf((" n = %d\n",n));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5043)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5044)     it6161_hdmi_tx_write(it6161, REGPktAudN0,(u8)((n)&0xFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5045)     it6161_hdmi_tx_write(it6161, REGPktAudN1,(u8)((n>>8)&0xFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5046)     it6161_hdmi_tx_write(it6161, REGPktAudN2,(u8)((n>>16)&0xF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5047) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5048)     if(bForceCTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5049)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5050)         u32 SumCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5051)         while(LoopCnt--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5052)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5053)             msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5054)             CTS = ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt2)) << 12 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5055)             CTS |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt1)) <<4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5056)             CTS |= ((u32)it6161_hdmi_tx_read(it6161, REGPktAudCTSCnt0)&0xf0)>>4  ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5057)             if( CTS == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5058)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5059)                 continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5060)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5061)             else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5062)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5063)                 if(LastCTS>CTS )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5064)                     {diff=LastCTS-CTS;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5065)                 else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5066)                     {diff=CTS-LastCTS;}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5067)                 //DRM_INFO("LastCTS= %u%u",(u32)(LastCTS/10000),(u32)(LastCTS%10000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5068)                 //DRM_INFO("       CTS= %u%u\n",(u32)(CTS/10000),(u32)(CTS%10000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5069)                 LastCTS=CTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5070)                 if(5>diff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5071)                 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5072)                     CTSStableCnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5073)                     SumCTS+=CTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5074)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5075)                 else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5076)                 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5077)                     CTSStableCnt=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5078)                     SumCTS=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5079)                     continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5080)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5081)                 if(CTSStableCnt>=32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5082)                 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5083)                     LastCTS=(SumCTS>>5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5084)                     break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5085)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5086)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5087)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5088)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5089)     it6161_hdmi_tx_write(it6161, REGPktAudCTS0,(u8)((LastCTS)&0xFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5090)     it6161_hdmi_tx_write(it6161, REGPktAudCTS1,(u8)((LastCTS>>8)&0xFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5091)     it6161_hdmi_tx_write(it6161, REGPktAudCTS2,(u8)((LastCTS>>16)&0xF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5092)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5093) #ifdef Force_CTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5094)     bForceCTS = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5095) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5096)     it6161_hdmi_tx_write(it6161, 0xF8, 0xC3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5097)     it6161_hdmi_tx_write(it6161, 0xF8, 0xA5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5098)     if(bForceCTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5099)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5100)         it6161_hdmi_tx_set_bits(it6161, REG_TX_PKT_SINGLE_CTRL,B_TX_SW_CTS, B_TX_SW_CTS); // D[1] = 0, HW auto count CTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5101)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5102)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5103)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5104)         it6161_hdmi_tx_set_bits(it6161, REG_TX_PKT_SINGLE_CTRL, B_TX_SW_CTS, 0x00); // D[1] = 0, HW auto count CTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5105)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5106)     it6161_hdmi_tx_write(it6161, 0xF8, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5108)     if(false==HBR_mode) //LPCM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5109)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5110)         u8 uData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5111)         it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5112)         Fs = AUDFS_768KHz ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5113)         it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_CA_FS,0x00|Fs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5114)         Fs = ~Fs ; // OFS is the one's complement of FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5115)         uData = (0x0f&it6161_hdmi_tx_read(it6161, REG_TX_AUDCHST_OFS_WL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5116)         it6161_hdmi_tx_write(it6161, REG_TX_AUDCHST_OFS_WL,(Fs<<4)|uData);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5117)         it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5118)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5121) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5122) // Function: hdmitx_SetAudioInfoFrame()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5123) // Parameter: pAudioInfoFrame - the pointer to HDMI Audio Infoframe ucData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5124) // Return: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5125) // Remark: Fill the Audio InfoFrame ucData,and count checksum,then fill into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5126) //         Audio InfoFrame registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5127) // Side-Effect: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5128) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5130) static SYS_STATUS hdmitx_SetAudioInfoFrame(struct it6161 *it6161, Audio_InfoFrame *pAudioInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5132)     u8 checksum ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5134)     if(!pAudioInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5135)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5136)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5137)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5138)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5139)     checksum = 0x100-(AUDIO_INFOFRAME_VER+AUDIO_INFOFRAME_TYPE+AUDIO_INFOFRAME_LEN );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5140)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_AUDINFO_CC,pAudioInfoFrame->pktbyte.AUD_DB[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5141)     checksum -= it6161_hdmi_tx_read(it6161, REG_TX_PKT_AUDINFO_CC); checksum &= 0xFF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5142)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_AUDINFO_SF,pAudioInfoFrame->pktbyte.AUD_DB[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5143)     checksum -= it6161_hdmi_tx_read(it6161, REG_TX_PKT_AUDINFO_SF); checksum &= 0xFF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5144)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_AUDINFO_CA,pAudioInfoFrame->pktbyte.AUD_DB[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5145)     checksum -= it6161_hdmi_tx_read(it6161, REG_TX_PKT_AUDINFO_CA); checksum &= 0xFF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5146)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_AUDINFO_DM_LSV,pAudioInfoFrame->pktbyte.AUD_DB[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5147)     checksum -= it6161_hdmi_tx_read(it6161, REG_TX_PKT_AUDINFO_DM_LSV); checksum &= 0xFF ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5149)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_AUDINFO_SUM,checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5151)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5152)     hdmitx_ENABLE_AUD_INFOFRM_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5153)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5156) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5157) // Function: hdmitx_SetAVIInfoFrame()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5158) // Parameter: pAVIInfoFrame - the pointer to HDMI AVI Infoframe ucData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5159) // Return: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5160) // Remark: Fill the AVI InfoFrame ucData,and count checksum,then fill into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5161) //         AVI InfoFrame registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5162) // Side-Effect: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5163) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5164) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5165) static SYS_STATUS hdmitx_SetAVIInfoFrame(struct it6161 *it6161, AVI_InfoFrame *pAVIInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5167)     int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5168)     u8 checksum ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5170)     if(!pAVIInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5171)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5172)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5173)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5174)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5175)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB1,pAVIInfoFrame->pktbyte.AVI_DB[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5176)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB2,pAVIInfoFrame->pktbyte.AVI_DB[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5177)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB3,pAVIInfoFrame->pktbyte.AVI_DB[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5178)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB4,pAVIInfoFrame->pktbyte.AVI_DB[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5179)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB5,pAVIInfoFrame->pktbyte.AVI_DB[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5180)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB6,pAVIInfoFrame->pktbyte.AVI_DB[5]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5181)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB7,pAVIInfoFrame->pktbyte.AVI_DB[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5182)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB8,pAVIInfoFrame->pktbyte.AVI_DB[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5183)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB9,pAVIInfoFrame->pktbyte.AVI_DB[8]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5184)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB10,pAVIInfoFrame->pktbyte.AVI_DB[9]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5185)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB11,pAVIInfoFrame->pktbyte.AVI_DB[10]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5186)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB12,pAVIInfoFrame->pktbyte.AVI_DB[11]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5187)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB13,pAVIInfoFrame->pktbyte.AVI_DB[12]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5188)     for(i = 0,checksum = 0; i < 13 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5189)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5190)         checksum -= pAVIInfoFrame->pktbyte.AVI_DB[i] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5191)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5192)     /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5193)     DRM_INFO("SetAVIInfo(): ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5194)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5195)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5196)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5197)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5198)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5199)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB6));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5200)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5201)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5202)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB9));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5203)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5204)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB11));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5205)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5206)     DRM_INFO("%02X ",(int)it6161_hdmi_tx_read(it6161, REG_TX_AVIINFO_DB13));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5207)     DRM_INFO("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5208)     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5209)     checksum -= AVI_INFOFRAME_VER+AVI_INFOFRAME_TYPE+AVI_INFOFRAME_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5210)     it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_SUM,checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5212)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5213)     hdmitx_ENABLE_AVI_INFOFRM_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5214)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5216) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5217) static SYS_STATUS hdmitx_SetVSIInfoFrame(struct it6161 *it6161, VendorSpecific_InfoFrame *pVSIInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5219)     u8 ucData=0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5221)     if(!pVSIInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5222)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5223)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5224)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5226)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5227)     it6161_hdmi_tx_write(it6161, 0x80,pVSIInfoFrame->pktbyte.VS_DB[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5228)     it6161_hdmi_tx_write(it6161, 0x81,pVSIInfoFrame->pktbyte.VS_DB[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5230)     ucData -= pVSIInfoFrame->pktbyte.VS_DB[3] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5231)     ucData -= pVSIInfoFrame->pktbyte.VS_DB[4] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5233)     if(  pVSIInfoFrame->pktbyte.VS_DB[4] & (1<<7 ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5234)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5235)         ucData -= pVSIInfoFrame->pktbyte.VS_DB[5] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5236)         it6161_hdmi_tx_write(it6161, 0x82,pVSIInfoFrame->pktbyte.VS_DB[5]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5237)         ucData -= VENDORSPEC_INFOFRAME_TYPE + VENDORSPEC_INFOFRAME_VER + 6 + 0x0C + 0x03 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5238)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5239)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5240)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5241)         ucData -= VENDORSPEC_INFOFRAME_TYPE + VENDORSPEC_INFOFRAME_VER + 5 + 0x0C + 0x03 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5242)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5244)     pVSIInfoFrame->pktbyte.CheckSum=ucData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5246)     it6161_hdmi_tx_write(it6161, 0x83,pVSIInfoFrame->pktbyte.CheckSum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5247)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5248)     it6161_hdmi_tx_write(it6161, REG_TX_3D_INFO_CTRL,B_TX_ENABLE_PKT|B_TX_REPEAT_PKT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5249)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5252) static bool HDMITX_EnableVSInfoFrame(struct it6161 *it6161, u8 bEnable,u8 *pVSInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5254)     if(!bEnable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5255)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5256)         hdmitx_DISABLE_VSDB_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5257)         return true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5258)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5259)     if(hdmitx_SetVSIInfoFrame(it6161, (VendorSpecific_InfoFrame *)pVSInfoFrame) == ER_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5260)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5261)         return true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5262)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5263)     return false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5265) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5266) static bool HDMITX_EnableAVIInfoFrame(struct it6161 *it6161, u8 bEnable,u8 *pAVIInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5268)     if(!bEnable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5269)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5270)         hdmitx_DISABLE_AVI_INFOFRM_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5271)         return true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5272)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5273)     if(hdmitx_SetAVIInfoFrame(it6161, (AVI_InfoFrame *)pAVIInfoFrame) == ER_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5274)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5275)         return true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5276)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5277)     return false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5279) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5280) static bool HDMITX_EnableAudioInfoFrame(struct it6161 *it6161, u8 bEnable,u8 *pAudioInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5282)     if(!bEnable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5283)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5284)         hdmitx_DISABLE_AVI_INFOFRM_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5285)         return true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5286)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5287)     if(hdmitx_SetAudioInfoFrame(it6161, (Audio_InfoFrame *)pAudioInfoFrame) == ER_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5288)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5289)         return true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5290)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5291)     return false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5294) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5295) // Function: hdmitx_SetSPDInfoFrame()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5296) // Parameter: pSPDInfoFrame - the pointer to HDMI SPD Infoframe ucData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5297) // Return: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5298) // Remark: Fill the SPD InfoFrame ucData,and count checksum,then fill into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5299) //         SPD InfoFrame registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5300) // Side-Effect: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5301) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5302) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5303) SYS_STATUS hdmitx_SetSPDInfoFrame(SPD_InfoFrame *pSPDInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5305)     int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5306)     u8 ucData ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5308)     if(!pSPDInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5309)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5310)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5311)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5312)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5313)     for(i = 0,ucData = 0 ; i < 25 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5314)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5315)         ucData -= pSPDInfoFrame->pktbyte.SPD_DB[i] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5316)         it6161_hdmi_tx_write(it6161, REG_TX_PKT_SPDINFO_PB1+i,pSPDInfoFrame->pktbyte.SPD_DB[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5317)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5318)     ucData -= SPD_INFOFRAME_VER+SPD_INFOFRAME_TYPE+SPD_INFOFRAME_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5319)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_SPDINFO_SUM,ucData); // checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5320)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5321)     hdmitx_ENABLE_SPD_INFOFRM_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5322)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5324) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5325) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5326) // Function: hdmitx_SetMPEGInfoFrame()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5327) // Parameter: pMPEGInfoFrame - the pointer to HDMI MPEG Infoframe ucData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5328) // Return: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5329) // Remark: Fill the MPEG InfoFrame ucData,and count checksum,then fill into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5330) //         MPEG InfoFrame registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5331) // Side-Effect: N/A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5332) //////////////////////////////////////////////////////////////////////
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5333) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5334) SYS_STATUS hdmitx_SetMPEGInfoFrame(MPEG_InfoFrame *pMPGInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5336)     int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5337)     u8 ucData ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5339)     if(!pMPGInfoFrame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5340)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5341)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5342)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5343)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5345)     it6161_hdmi_tx_write(it6161, REG_TX_PKT_MPGINFO_FMT,pMPGInfoFrame->info.FieldRepeat|(pMPGInfoFrame->info.MpegFrame<<1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5346)     it6161_hdmi_tx_write(it6161, REG_TX_PKG_MPGINFO_DB0,pMPGInfoFrame->pktbyte.MPG_DB[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5347)     it6161_hdmi_tx_write(it6161, REG_TX_PKG_MPGINFO_DB1,pMPGInfoFrame->pktbyte.MPG_DB[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5348)     it6161_hdmi_tx_write(it6161, REG_TX_PKG_MPGINFO_DB2,pMPGInfoFrame->pktbyte.MPG_DB[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5349)     it6161_hdmi_tx_write(it6161, REG_TX_PKG_MPGINFO_DB3,pMPGInfoFrame->pktbyte.MPG_DB[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5351)     for(ucData = 0,i = 0 ; i < 5 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5352)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5353)         ucData -= pMPGInfoFrame->pktbyte.MPG_DB[i] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5354)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5355)     ucData -= MPEG_INFOFRAME_VER+MPEG_INFOFRAME_TYPE+MPEG_INFOFRAME_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5357)     it6161_hdmi_tx_write(it6161, REG_TX_PKG_MPGINFO_SUM,ucData);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5359)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5360)     hdmitx_ENABLE_SPD_INFOFRM_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5362)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5364) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5365) // 2009/12/04 added by Ming-chih.lung@ite.com.tw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5367) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5368) SYS_STATUS hdmitx_Set_GeneralPurpose_PKT(u8 *pData)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5370)     int i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5372)     if( pData == NULL )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5373)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5374)         return ER_FAIL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5376)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5377)     it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5378)     for( i = 0x38 ; i <= 0x56 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5379)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5380)         it6161_hdmi_tx_write(it6161, i, pData[i-0x38] );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5381)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5382)     it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5383)     hdmitx_ENABLE_GeneralPurpose_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5384)     //hdmitx_ENABLE_NULL_PKT();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5385)     return ER_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5387) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5388) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5389) static void ConfigAVIInfoFrame(u8 VIC, u8 pixelrep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5391)     AVI_InfoFrame *AviInfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5392)     AviInfo = (AVI_InfoFrame *)CommunBuff ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5394)     AviInfo->pktbyte.AVI_HB[0] = AVI_INFOFRAME_TYPE|0x80 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5395)     AviInfo->pktbyte.AVI_HB[1] = AVI_INFOFRAME_VER ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5396)     AviInfo->pktbyte.AVI_HB[2] = AVI_INFOFRAME_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5398)     switch(it6161->hdmi_tx_output_color_space)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5399)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5400)     case F_MODE_YUV444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5401)         // AviInfo->info.ColorMode = 2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5402)         AviInfo->pktbyte.AVI_DB[0] = (2<<5)|(1<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5403)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5404)     case F_MODE_YUV422:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5405)         // AviInfo->info.ColorMode = 1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5406)         AviInfo->pktbyte.AVI_DB[0] = (1<<5)|(1<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5407)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5408)     case F_MODE_RGB444:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5409)     default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5410)         // AviInfo->info.ColorMode = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5411)         AviInfo->pktbyte.AVI_DB[0] = (0<<5)|(1<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5412)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5413)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5414)     AviInfo->pktbyte.AVI_DB[1] = 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5415)     AviInfo->pktbyte.AVI_DB[1] |= (aspec != HDMI_16x9)?(1<<4):(2<<4); // 4:3 or 16:9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5416)     AviInfo->pktbyte.AVI_DB[1] |= (Colorimetry != HDMI_ITU709)?(1<<6):(2<<6); // 4:3 or 16:9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5417)     AviInfo->pktbyte.AVI_DB[2] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5418)     AviInfo->pktbyte.AVI_DB[3] = VIC ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5419)     AviInfo->pktbyte.AVI_DB[4] =  pixelrep & 3 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5420)     AviInfo->pktbyte.AVI_DB[5] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5421)     AviInfo->pktbyte.AVI_DB[6] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5422)     AviInfo->pktbyte.AVI_DB[7] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5423)     AviInfo->pktbyte.AVI_DB[8] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5424)     AviInfo->pktbyte.AVI_DB[9] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5425)     AviInfo->pktbyte.AVI_DB[10] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5426)     AviInfo->pktbyte.AVI_DB[11] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5427)     AviInfo->pktbyte.AVI_DB[12] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5429)     HDMITX_EnableAVIInfoFrame(it6161, true, (unsigned char *)AviInfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5431) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5432) static void ConfigAudioInfoFrm(struct it6161 *it6161, u8 channel_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5434)     int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5435)     Audio_InfoFrame *AudioInfo ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5436)     AudioInfo = (Audio_InfoFrame *)CommunBuff ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5438)     DRM_INFO("ConfigAudioInfoFrm channel count: %d", channel_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5440)     AudioInfo->pktbyte.AUD_HB[0] = AUDIO_INFOFRAME_TYPE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5441)     AudioInfo->pktbyte.AUD_HB[1] = 1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5442)     AudioInfo->pktbyte.AUD_HB[2] = AUDIO_INFOFRAME_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5443)     AudioInfo->pktbyte.AUD_DB[0] = channel_count - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5445)     for (i = 1 ;i < AUDIO_INFOFRAME_LEN ; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5446)         AudioInfo->pktbyte.AUD_DB[i] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5447)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5449)     /* audio_infoframe_ca */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5450) 	switch (channel_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5451) 		case 0 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5452) 			AudioInfo->pktbyte.AUD_DB[3] = 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5453) 			break;  // no audio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5454) 		case 2 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5455) 			AudioInfo->pktbyte.AUD_DB[3] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5456) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5457) 		case 3 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5458) 			AudioInfo->pktbyte.AUD_DB[3] = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5459) 			break;  // 0x01,0x02,0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5460) 		case 4 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5461) 			AudioInfo->pktbyte.AUD_DB[3] = 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5462) 			break;  // 0x03,0x05,0x06,0x08,0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5463) 		case 5 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5464) 			AudioInfo->pktbyte.AUD_DB[3] = 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5465) 			break;  // 0x07,0x09,0x0A,0x0C,0x15,0x16,0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5466) 		case 6 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5467) 			AudioInfo->pktbyte.AUD_DB[3] = 0x0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5468) 			break;  // 0x0B,0x0D,0x0E,0x10,0x17,0x19,0x1A,0x1C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5469) 		case 7 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5470) 			AudioInfo->pktbyte.AUD_DB[3] = 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5471) 			break;  // 0x0F,0x11,0x12,0x1B,0x1D,0x1E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5472) 		case 8 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5473) 			AudioInfo->pktbyte.AUD_DB[3] = 0x1F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5474) 			break;  // 0x13,0x1F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5475) 		default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5476) 			DRM_INFO("Error: Audio Channel Number Error!");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5477) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5479)     HDMITX_EnableAudioInfoFrame(it6161, TRUE, (unsigned char *)AudioInfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5482) #ifdef OUTPUT_3D_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5483) void ConfigfHdmiVendorSpecificInfoFrame(struct it6161 *it6161, u8 _3D_Stru)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5484) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5485)     VendorSpecific_InfoFrame *VS_Info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5487)     VS_Info=(VendorSpecific_InfoFrame *)CommunBuff ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5489)     VS_Info->pktbyte.VS_HB[0] = VENDORSPEC_INFOFRAME_TYPE|0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5490)     VS_Info->pktbyte.VS_HB[1] = VENDORSPEC_INFOFRAME_VER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5491)     VS_Info->pktbyte.VS_HB[2] = (_3D_Stru == Side_by_Side)?6:5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5492)     VS_Info->pktbyte.VS_DB[0] = 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5493)     VS_Info->pktbyte.VS_DB[1] = 0x0C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5494)     VS_Info->pktbyte.VS_DB[2] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5495)     VS_Info->pktbyte.VS_DB[3] = 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5496)     switch(_3D_Stru)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5497)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5498)     case Side_by_Side:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5499)     case Frame_Pcaking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5500)     case Top_and_Botton:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5501)         VS_Info->pktbyte.VS_DB[4] = (_3D_Stru<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5502)         break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5503)     default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5504)         VS_Info->pktbyte.VS_DB[4] = (Frame_Pcaking<<4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5505)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5506)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5507)     VS_Info->pktbyte.VS_DB[5] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5508)     HDMITX_EnableVSInfoFrame(it6161, true,(u8 *)VS_Info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5510) #endif //#ifdef OUTPUT_3D_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5512) static void hdmi_tx_audio_process(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5514)     if (it6161->support_audio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5515)         ConfigAudioInfoFrm(it6161, bOutputAudioChannel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5516)         // HDMITX_EnableAudioOutput(T_AUDIO_LPCM, false, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,TMDSClock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5517)         HDMITX_EnableAudioOutput(it6161,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5518)             //CNOFIG_INPUT_AUDIO_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5519)             bOutputAudioType,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5520)             CONFIG_INPUT_AUDIO_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5521)             ulAudioSampleFS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5522)             bOutputAudioChannel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5523)             NULL, // pointer to cahnnel status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5524)             VideoPixelClock*(pixelrep+1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5525)         // if you have channel status , set here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5526)         // setHDMITX_ChStat(it6161, u8 ucIEC60958ChStat[]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5527)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5530) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5531) static u8 hdmi_infoframe_checksum(u8 *ptr, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5532) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5533) 	u8 csum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5534) 	size_t i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5536) 	/* compute checksum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5537) 	for (i = 0; i < size; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5538) 		csum += ptr[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5540) 	return 256 - csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5543) static void hdmi_infoframe_set_checksum(void *buffer, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5545) 	u8 *ptr = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5547) 	ptr[3] = hdmi_infoframe_checksum(buffer, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5549) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5551) static int hdmi_tx_get_avi_infoframe_from_source(struct it6161 *it6161, u8 *buffer, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5553) 	struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5554) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5556) 	err = hdmi_avi_infoframe_pack(&it6161->source_avi_infoframe, buffer, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5557) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5558) 		DRM_DEV_ERROR(dev, "Failed to pack AVI infoframe: %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5559) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5560) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5561) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5562) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5565) static int hdmi_tx_get_avi_infoframe_from_user_define(struct it6161 *it6161, u8 *buffer, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5566) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5567) 	struct device *dev = &it6161->i2c_hdmi_tx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5568) 	struct hdmi_avi_infoframe *frame = &it6161->source_avi_infoframe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5569) 	struct drm_display_mode *display_mode = &it6161->source_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5570) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5571) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5572) 	DRM_INFO( "user define to setup AVI infoframe");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5574) 	ret = drm_hdmi_avi_infoframe_from_display_mode(frame, &it6161->connector, display_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5575) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5576) 		DRM_DEV_ERROR(dev, "Failed to setup AVI infoframe: %d", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5577) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5578) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5580) 	if ((it6161->hdmi_tx_output_color_space & F_MODE_CLRMOD_MASK) == F_MODE_RGB444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5581) 		frame->colorspace =  HDMI_COLORSPACE_RGB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5583) 	if ((it6161->hdmi_tx_output_color_space & F_MODE_CLRMOD_MASK) == F_MODE_YUV444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5584) 		frame->colorspace =  HDMI_COLORSPACE_YUV444;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5586) 	if ((it6161->hdmi_tx_output_color_space & F_MODE_CLRMOD_MASK) == F_MODE_YUV422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5587) 		frame->colorspace =  HDMI_COLORSPACE_YUV422;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5589) 	ret = hdmi_tx_get_avi_infoframe_from_source(it6161, buffer, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5590) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5591) 		DRM_DEV_ERROR(dev, "Failed to pack AVI infoframe: %d", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5592) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5593) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5595) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5598) static int (*hdmi_tx_get_avi_infoframe)(struct it6161*, u8*, size_t) = hdmi_tx_get_avi_infoframe_from_user_define;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5599) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5600) static void hdmi_tx_setup_avi_infoframe(struct it6161 *it6161, u8 *buffer, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5601) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5602) 	u8 i, *ptr = buffer + HDMI_INFOFRAME_HEADER_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5604) 	it6161_hdmi_tx_change_bank(it6161, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5606) 	for (i = 0; i < it6161->source_avi_infoframe.length; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5607) 		it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_DB1 + i, ptr[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5609) 	it6161_hdmi_tx_write(it6161, REG_TX_AVIINFO_SUM, buffer[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5611) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5612) static inline void hdmi_tx_disable_avi_infoframe(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5613) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5614) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5615) 	it6161_hdmi_tx_write(it6161, REG_TX_AVI_INFOFRM_CTRL, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5618) static inline void hdmi_tx_enable_avi_infoframe(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5620) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5621) 	it6161_hdmi_tx_write(it6161, REG_TX_AVI_INFOFRM_CTRL, B_TX_ENABLE_PKT | B_TX_REPEAT_PKT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5624) static int hdmi_tx_avi_infoframe_process(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5626) 	u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5627) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5629) 	hdmi_tx_disable_avi_infoframe(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5630) 	err = hdmi_tx_get_avi_infoframe(it6161, buffer, sizeof(buffer));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5632) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5633) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5635) 	hdmi_tx_setup_avi_infoframe(it6161, buffer, sizeof(buffer));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5636) 	hdmi_tx_enable_avi_infoframe(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5638) 	DRM_INFO("avi_infoframe:0x%*ph", (int)ARRAY_SIZE(buffer), buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5639) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5640) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5643) static void hdmi_tx_set_output_process(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5644) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5645) 	VIDEOPCLKLEVEL level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5646) 	u32 TMDSClock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5648) 	TMDSClock = it6161->hdmi_tx_pclk * 1000 * (it6161->source_avi_infoframe.pixel_repeat + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5650) 	HDMITX_DisableAudioOutput(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5651) 	//hdmi_tx_hdcp_reset_auth(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5652)     hdmi_tx_disable_avi_infoframe(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5653)     HDMITX_EnableVSInfoFrame(it6161, false,NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5654) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5655) 	if (TMDSClock > 80000000L) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5656) 		level = PCLK_HIGH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5657) 	} else if(TMDSClock > 20000000L) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5658) 		level = PCLK_MEDIUM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5659) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5660) 		level = PCLK_LOW ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5661) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5663) 	hdmi_tx_enable_video_output(it6161, level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5665) 	if (it6161->hdmi_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5666) #ifdef OUTPUT_3D_MODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5667) 		ConfigfHdmiVendorSpecificInfoFrame(it6161, OUTPUT_3D_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5668) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5670) 		hdmi_tx_avi_infoframe_process(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5671) 		hdmi_tx_audio_process(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5673)         // if( it6161->support_audio )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5674)         // {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5675)         //     ConfigAudioInfoFrm(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5676)         // #ifdef SUPPORT_HBR_AUDIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5677)         //     HDMITX_EnableAudioOutput(it6161, T_AUDIO_HBR, CONFIG_INPUT_AUDIO_INTERFACE, 768000L,8,NULL,TMDSClock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5678)         // #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5679)         //     // HDMITX_EnableAudioOutput(it6161, T_AUDIO_LPCM, false, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,TMDSClock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5680)         //     HDMITX_EnableAudioOutput(it6161, CNOFIG_INPUT_AUDIO_TYPE, CONFIG_INPUT_AUDIO_INTERFACE, ulAudioSampleFS,bOutputAudioChannel,NULL,TMDSClock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5681)         // #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5682)         // }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5684) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5685) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5686) #ifdef SUPPORT_CEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5687) 	it6161_hdmi_tx_change_bank(it6161, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5688) 	it6161_hdmi_tx_write(it6161,  0xf, 0 );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5689) 	Initial_Ext_Int1();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5690) 	HDMITX_CEC_Init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5691) #endif // SUPPORT_CEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5692) 	it6161_hdmi_tx_set_av_mute(it6161, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5693) 	bChangeMode = false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5695) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5696) /*void HDMITX_ChangeAudioOption(u8 Option, u8 channelNum, u8 AudioFs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5697) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5699)     switch(Option )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5700)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5701)     case T_AUDIO_HBR :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5702)         bOutputAudioType = T_AUDIO_HBR ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5703)         ulAudioSampleFS = 768000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5704)         bOutputAudioChannel = 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5705)         return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5706)     case T_AUDIO_NLPCM :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5707)         bOutputAudioType = T_AUDIO_NLPCM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5708)         bOutputAudioChannel = 2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5709)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5710)     default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5711)         bOutputAudioType = T_AUDIO_LPCM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5712)         if( channelNum < 1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5713)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5714)             bOutputAudioChannel = 1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5715)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5716)         else if( channelNum > 8 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5717)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5718)             bOutputAudioChannel = 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5719)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5720)         else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5721)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5722)             bOutputAudioChannel = channelNum ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5723)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5724)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5725)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5726) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5727)     switch(AudioFs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5728)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5729)     case AUDFS_44p1KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5730)         ulAudioSampleFS =  44100L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5731)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5732)     case AUDFS_88p2KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5733)         ulAudioSampleFS =  88200L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5734)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5735)     case AUDFS_176p4KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5736)         ulAudioSampleFS = 176400L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5737)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5738) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5739)     case AUDFS_48KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5740)         ulAudioSampleFS =  48000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5741)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5742)     case AUDFS_96KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5743)         ulAudioSampleFS =  96000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5744)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5745)     case AUDFS_192KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5746)         ulAudioSampleFS = 192000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5747)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5749)     case AUDFS_768KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5750)         ulAudioSampleFS = 768000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5751)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5752) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5753)     case AUDFS_32KHz:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5754)         ulAudioSampleFS =  32000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5755)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5756)     default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5757)         ulAudioSampleFS =  48000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5758)         break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5759)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5760)     DRM_INFO("HDMITX_ChangeAudioOption():bOutputAudioType = %02X, ulAudioSampleFS = %8ld, bOutputAudioChannel = %d\n",(int)bOutputAudioType,ulAudioSampleFS,(int)bOutputAudioChannel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5762) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5763) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5764) #ifdef HDMITX_AUTO_MONITOR_INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5766) void HDMITX_MonitorInputAudioChange()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5768)     static u32 prevAudioSampleFS = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5769)     u32 AudioFS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5770) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5771)     if( !it6161->support_audio )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5772)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5773)         prevAudioSampleFS = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5774)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5775)     else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5776)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5777)         AudioFS = CalcAudFS() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5778)         DRM_INFO1(("Audio Chagne, Audio clock = %dHz\n",AudioFS)) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5779)         if( AudioFS > 188000L ) // 192KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5780)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5781)             ulAudioSampleFS = 192000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5782)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5783)         else if( AudioFS > 144000L ) // 176.4KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5784)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5785)             ulAudioSampleFS = 176400L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5786)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5787)         else if( AudioFS >  93000L ) // 96KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5788)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5789)             ulAudioSampleFS = 96000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5790)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5791)         else if( AudioFS >  80000L ) // 88.2KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5792)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5793)             ulAudioSampleFS = 88200L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5794)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5795)         else if( AudioFS >  45000L ) // 48 KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5796)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5797)             ulAudioSampleFS = 48000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5798)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5799)         else if( AudioFS >  36000L ) // 44.1KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5800)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5801)             ulAudioSampleFS = 44100L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5802)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5803)         else                         // 32KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5804)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5805)             ulAudioSampleFS = 32000L ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5806)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5808)         if(!bChangeMode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5809)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5810)             if( ulAudioSampleFS != prevAudioSampleFS )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5811)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5812)                 DRM_INFO("ulAudioSampleFS = %dHz -> %dHz\n",ulAudioSampleFS,ulAudioSampleFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5813)                 ConfigAudioInfoFrm(it6161, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5814)                 HDMITX_EnableAudioOutput(it6161, CNOFIG_INPUT_AUDIO_TYPE, CONFIG_INPUT_AUDIO_INTERFACE, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5815)                 // HDMITX_EnableAudioOutput(it6161, T_AUDIO_LPCM, false, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5817)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5818)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5820)         prevAudioSampleFS = ulAudioSampleFS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5821) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5822)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5825) #endif // HDMITX_AUTO_MONITOR_INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5827) static void mipi_rx_calc_rclk(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5829) 	u32 sum = 0, i, retry = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5830) 	int t10usint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5831) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5832) 	//it6161_hdmi_tx_write(it6161, 0x8D, (CEC_I2C_SLAVE_ADDR|0x01));// Enable CRCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5833) 	for (i = 0; i < retry; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5834) 		it6161_mipi_rx_set_bits(it6161, 0x94, 0x80, 0x80); // Enable RCLK 100ms count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5835) 		msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5836) 		it6161_mipi_rx_set_bits(it6161, 0x94, 0x80, 0x00); // Disable RCLK 100ms count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5837) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5838) 		it6161->mipi_rx_rclk = it6161_mipi_rx_read(it6161, 0x97);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5839) 		it6161->mipi_rx_rclk <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5840) 		it6161->mipi_rx_rclk += it6161_mipi_rx_read(it6161, 0x96);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5841) 		it6161->mipi_rx_rclk <<=8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5842) 		it6161->mipi_rx_rclk += it6161_mipi_rx_read(it6161, 0x95);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5843) 		sum += it6161->mipi_rx_rclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5844) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5846) 	sum /= retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5847) 	DRM_INFO("rclk: %d\n", sum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5848) 	//it6161->mipi_rx_rclk = sum / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5849) 	it6161->mipi_rx_rclk = sum / 104;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5850) 	t10usint = it6161->mipi_rx_rclk / 108;//actually nxp platform msleep(100) is 108ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5851) 	DRM_INFO("it6161->mipi_rx_rclk = %d,%03d,%03d\n",(sum*10)/1000000,((sum*10)%1000000)/1000,((sum*10)%100));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5852) 	DRM_INFO("T10usInt=0x%03X\n", (int)t10usint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5853) 	it6161_mipi_rx_write(it6161, 0x91, t10usint&0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5856) static void mipi_rx_calc_mclk(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5858) 	u32 i, rddata, sum = 0, calc_time = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5859) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5860) 	for (i = 0; i < calc_time; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5861) 		it6161_mipi_rx_set_bits(it6161, 0x9B, 0x80, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5862) 		msleep(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5863) 		it6161_mipi_rx_set_bits(it6161, 0x9B, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5865) 		rddata = it6161_mipi_rx_read(it6161, 0x9B) & 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5866) 		rddata <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5867) 		rddata += it6161_mipi_rx_read(it6161, 0x9A);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5869) 		sum += rddata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5870) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5872) 	sum /= calc_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5873) 	it6161->mipi_rx_mclk = it6161->mipi_rx_rclk * 2048 / sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5874) 	DRM_INFO("MCLK = %d.%03dMHz", it6161->mipi_rx_mclk / 1000, it6161->mipi_rx_mclk % 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5876) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5877) static void mipi_rx_calc_pclk(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5878) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5879) 	u32 rddata, sum = 0, retry = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5880) 	u8 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5882) 	it6161_mipi_rx_set_bits(it6161, 0x99, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5883) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5884) 	for (i = 0; i < retry; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5885) 		it6161_mipi_rx_set_bits(it6161, 0x99, 0x80, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5886) 		msleep(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5887) 		it6161_mipi_rx_set_bits(it6161, 0x99, 0x80, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5888) 		msleep(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5890) 		rddata = it6161_mipi_rx_read(it6161, 0x99) & 0x0F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5891) 		rddata <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5892) 		rddata += it6161_mipi_rx_read(it6161, 0x98);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5893) 		sum += rddata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5894) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5896) 	sum /= retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5897) 	DRM_INFO("pclk: %d\n", sum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5898) 	it6161->mipi_rx_pclk = it6161->mipi_rx_rclk * 2048 / sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5899) 	//it6161->mipi_rx_pclk = it6161->mipi_rx_rclk * 1960 / sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5900) 	DRM_INFO("it6161->mipi_rx_pclk = %d.%03dMHz", it6161->mipi_rx_pclk / 1000, it6161->mipi_rx_pclk % 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5902) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5903) static void mipi_rx_show_mrec(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5904) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5905) 	int m_hfront_porch, m_hsyncw, m_hback_porch, m_hactive, MHVR2nd, MHBlank;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5906) 	int m_vfront_porch, m_vsyncw, m_vback_porch, m_vactive, MVFP2nd, MVTotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5908) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5909) 	m_hfront_porch  = mipi_rx_read_word(it6161, 0x50) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5910) 	m_hsyncw  = mipi_rx_read_word(it6161, 0x52) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5911) 	m_hback_porch  = mipi_rx_read_word(it6161, 0x54) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5912) 	m_hactive  = mipi_rx_read_word(it6161, 0x56) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5913) 	MHVR2nd  = mipi_rx_read_word(it6161, 0x58) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5914) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5915) 	MHBlank = m_hfront_porch + m_hsyncw + m_hback_porch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5917) 	m_vfront_porch  = mipi_rx_read_word(it6161, 0x5A) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5918) 	m_vsyncw  = mipi_rx_read_word(it6161, 0x5C) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5919) 	m_vback_porch  = mipi_rx_read_word(it6161, 0x5E) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5920) 	m_vactive  = mipi_rx_read_word(it6161, 0x60) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5921) 	MVFP2nd  = mipi_rx_read_word(it6161, 0x62) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5923) 	MVTotal = m_vfront_porch + m_vsyncw + m_vback_porch + m_vactive ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5925) 	DRM_INFO("m_hfront_porch    = %d\n", m_hfront_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5926) 	DRM_INFO("m_hsyncw    = %d\n", m_hsyncw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5927) 	DRM_INFO("m_hback_porch    = %d\n", m_hback_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5928) 	DRM_INFO("m_hactive   = %d\n", m_hactive);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5929) 	DRM_INFO("MHVR2nd = %d\n", MHVR2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5930) 	DRM_INFO("MHBlank  = %d\n", MHBlank);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5931) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5932) 	DRM_INFO("m_vfront_porch    = %d\n", m_vfront_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5933) 	DRM_INFO("m_vsyncw    = %d\n", m_vsyncw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5934) 	DRM_INFO("m_vback_porch   = %d\n", m_vback_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5935) 	DRM_INFO("m_vactive   = %d\n", m_vactive);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5936) 	DRM_INFO("MVFP2nd   = %d\n", MVFP2nd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5937) 	DRM_INFO("MVTotal = %d\n", MVTotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5940) static void mipi_rx_prec_get_display_mode(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5941) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5942) 	struct drm_display_mode *display_mode = &it6161->mipi_rx_p_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5943) 	struct device *dev = &it6161->i2c_hdmi_tx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5944) 	int p_hfront_porch, p_hsyncw, p_hback_porch, p_hactive, p_htotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5945) 	int p_vfront_porch, p_vsyncw, p_vback_porch, p_vactive, p_vtotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5947) 	p_hfront_porch  = mipi_rx_read_word(it6161, 0x30) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5948) 	p_hsyncw  = mipi_rx_read_word(it6161, 0x32) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5949) 	p_hback_porch  = mipi_rx_read_word(it6161, 0x34) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5950) 	p_hactive  = mipi_rx_read_word(it6161, 0x36) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5951) 	p_htotal  = mipi_rx_read_word(it6161, 0x38) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5953) 	//p_htotal = p_hfront_porch + p_hsyncw + p_hback_porch + p_hactive ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5954) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5955) 	p_vfront_porch  = mipi_rx_read_word(it6161, 0x3A) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5956) 	p_vsyncw  = mipi_rx_read_word(it6161, 0x3C) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5957) 	p_vback_porch  = mipi_rx_read_word(it6161, 0x3E) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5958) 	p_vactive  = mipi_rx_read_word(it6161, 0x40) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5959) 	p_vtotal  = mipi_rx_read_word(it6161, 0x42) & 0x3FFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5961) 	//p_vtotal = p_vfront_porch + p_vsyncw + p_vback_porch + p_vactive ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5963)     display_mode->clock = it6161->mipi_rx_pclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5964) 	display_mode->hdisplay = p_hactive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5965) 	display_mode->hsync_start = p_hactive + p_hfront_porch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5966) 	display_mode->hsync_end = p_hactive + p_hfront_porch + p_hsyncw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5967) 	display_mode->htotal = p_htotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5968) 	display_mode->vdisplay = p_vactive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5969) 	display_mode->vsync_start = p_vactive + p_vfront_porch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5970) 	display_mode->vsync_end = p_vactive + p_vfront_porch + p_vsyncw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5971) 	display_mode->vtotal = p_vtotal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5973)     DRM_DEV_DEBUG_DRIVER(dev, "mipi pixel clock: %d KHz", display_mode->clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5974) 	DRM_INFO("p_hfront_porch    = %d\r\n", p_hfront_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5975) 	DRM_INFO("p_hsyncw    = %d\r\n", p_hsyncw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5976) 	DRM_INFO("p_hback_porch   = %d\r\n", p_hback_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5977) 	DRM_INFO("p_hactive   = %d\r\n", p_hactive);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5978) 	DRM_INFO("p_htotal = %d\r\n", p_htotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5979) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5980) 	DRM_INFO("p_vfront_porch    = %d\r\n", p_vfront_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5981) 	DRM_INFO("p_vsyncw    = %d\r\n", p_vsyncw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5982) 	DRM_INFO("p_vback_porch   = %d\r\n", p_vback_porch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5983) 	DRM_INFO("p_vactive   = %d\r\n", p_vactive);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5984) 	DRM_INFO("p_vtotal = %d\r\n", p_vtotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5987) static void mipi_rx_reset_p_domain(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5988) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5989) 	it6161_mipi_rx_set_bits(it6161, 0x05, 0x04, 0x04);  // Video Clock Domain Reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5990) 	it6161_mipi_rx_set_bits(it6161, 0x05, 0x04, 0x00);  // Release Video Clock Domain Reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5991) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5993) static void it6161_mipi_rx_interrupt_clear(struct it6161 *it6161, u8 reg06, u8 reg07, u8 reg08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5994) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5995) 	it6161_mipi_rx_write(it6161, 0x06, reg06);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5996) 	it6161_mipi_rx_write(it6161, 0x07, reg07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5997) 	it6161_mipi_rx_write(it6161, 0x08, reg08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5998) 	it6161_debug("mipi rx i2c read reg06:0x%02x reg07:0x%02x reg08:0x%02x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5999) 		 it6161_mipi_rx_read(it6161, 0x06), it6161_mipi_rx_read(it6161, 0x07), it6161_mipi_rx_read(it6161, 0x08));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6002) static void it6161_mipi_rx_interrupt_reg06_process(struct it6161 *it6161, u8 reg06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6003) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6004) 	bool m_video_stable, p_video_stable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6005) #ifndef __linux__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6006)     struct drm_display_mode *dmt_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6007) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6008)     u8 data_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6009) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6010)     if (reg06 == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6011)         return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6013)     if (reg06 & 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6014)     	m_video_stable = mipi_rx_get_m_video_stable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6015)         DRM_INFO("PPS M video stable Change Interrupt, %sstable", m_video_stable ? "" : "un");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6016) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6017)         if (m_video_stable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6018)             data_id = it6161_mipi_rx_read(it6161, 0x28);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6019)             DRM_INFO("mipi receive video format: 0x%02x", data_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6020)             mipi_rx_calc_rclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6021)             mipi_rx_calc_mclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6022)             mipi_rx_show_mrec(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6023)             mipi_rx_afe_configuration(it6161, data_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6024)             mipi_rx_reset_p_domain(it6161);            
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6025)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6026)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6028)     if(reg06 & 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6029)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6030)         DRM_INFO("PPS MHSync error interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6031)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6032) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6033)     if(reg06 & 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6034)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6035)         DRM_INFO("PPS MHDE Error Interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6036)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6038)     if(reg06 & 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6039)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6040)         DRM_INFO("PPS MVSync Error Interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6041)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6043)     if (reg06 & 0x10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6044)     	p_video_stable = mipi_rx_get_p_video_stable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6045)         DRM_INFO("PPS P video stable Change Interrupt, %sstable",  p_video_stable ? "" : "un");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6046) 		it6161_debug("cancel restart work\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6047) 		cancel_delayed_work(&it6161->restart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6048) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6049)         if (p_video_stable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6050)             DRM_INFO("PVidStb Change to HIGH");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6051)             mipi_rx_calc_rclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6052)             mipi_rx_calc_pclk(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6053)             mipi_rx_prec_get_display_mode(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6054)             it6161->vic = drm_match_cea_mode(&it6161->mipi_rx_p_display_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6056) #ifndef __linux__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6057)             if (it6161->vic == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6058)                 dmt_display_mode = drm_match_dmt_mode(&it6161->mipi_rx_p_display_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6059) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6060)                 if (dmt_display_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6061)                     it6161->source_display_mode = *dmt_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6063)                 DRM_INFO("%sfind dmt timing", dmt_display_mode ? "" : "not ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6064)             } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6065)                 it6161->source_display_mode = edid_cea_modes[it6161->vic];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6066)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6067) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6069)             DRM_INFO("source output vic: %d, %s cea timing", it6161->vic, it6161->vic ? " standard" : " not");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6070)             show_display_mode(it6161, &it6161->source_display_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6071) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6072)             show_display_mode(it6161, &it6161->mipi_rx_p_display_mode, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6073)             mipi_rx_setup_polarity(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6074)             it6161_mipi_rx_write(it6161, 0xC0,(EnTxCRC<<7) +TxCRCnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6075)             // setup 1 sec timer interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6076)             it6161_mipi_rx_set_bits(it6161, 0x0b,0x40, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6077) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6078) 			switch (it6161->hdmi_tx_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6079) 			case HDMI_TX_BY_PASS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6080) 				it6161_hdmi_tx_set_bits(it6161, 0xA9, 0x80, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6081) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6083) 			case HDMI_TX_ENABLE_DE_ONLY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6084) 				hdmi_tx_generate_blank_timing(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6085) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6087) 			case HDMI_TX_ENABLE_PATTERN_GENERATOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6088) 				hdmi_tx_setup_pattern_generator(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6089) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6090) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6091) 			default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6092) 				DRM_INFO("use hdmi tx normal mode");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6093) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6094) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6095) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6096) 			hdmi_tx_video_reset(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6097)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6098)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6099) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6100)     if(reg06 & 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6101)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6102)         if(DisPHSyncErr == false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6103)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6104)             DRM_INFO("PPS PHSync Error Interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6105)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6106)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6108)     if(reg06 & 0x40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6109)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6110)         DRM_INFO("PPS PHDE Error Interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6111)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6113)     if(reg06 & 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6114)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6115)         DRM_INFO("PPS MVDE Error Interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6116)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6119) static void it6161_mipi_rx_interrupt_reg07_process(struct it6161 *it6161, u8 reg07)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6121)     if (reg07 == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6122)         return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6124)     if(reg07 & 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6125)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6126)         DRM_INFO("PatGen PPGVidStb change interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6127)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6129)     if(reg07 & 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6130)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6131)         DRM_INFO("PPS Data Byte Error Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6132)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6134)     if(reg07 & 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6135)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6136)         DRM_INFO("PPS CMOff Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6137)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6139)     if(reg07 & 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6140)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6141)         DRM_INFO("PPS CMOn Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6142)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6144)     if(reg07 & 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6145)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6146)         DRM_INFO("PPS ShutDone cmd Interrupt !!! \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6147)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6149)     if(reg07 & 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6150)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6151)         DRM_INFO("PPS TurnOn Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6152)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6154)     if((reg07 & 0x40) || (reg07 & 0x80))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6155)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6156)          if( reg07&0x40 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6157)              DRM_INFO("PPS FIFO over read Interrupt !!! tx video stable:%d", hdmi_tx_get_video_state(it6161));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6158)              it6161_mipi_rx_set_bits(it6161, 0x07, 0x40, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6159)          }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6160)          if( reg07&0x80 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6161)              DRM_INFO("PPS FIFO over write Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6162)              it6161_mipi_rx_set_bits(it6161, 0x07, 0x80, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6163)          }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6164)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6167) static void it6161_mipi_rx_interrupt_reg08_process(struct it6161 *it6161, u8 reg08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6169)     int crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6171)     if (reg08 == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6172)         return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6174)     if(reg08 & 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6175)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6176)         if(DisECCErr == false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6177)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6178)             DRM_INFO("ECC 1-bit Error Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6179)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6180)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6182)     if(reg08 & 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6183)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6184)         if(DisECCErr == false)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6185)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6186)             DRM_INFO("ECC 2-bit Error Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6187)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6188)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6190)     if(reg08 & 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6191)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6192)         DRM_INFO("LM FIFO Error Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6193)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6195)     if(reg08 & 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6196)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6197)         DRM_INFO("CRC Error Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6198)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6200)     if(reg08 & 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6201)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6202)         DRM_INFO("MCLK Off Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6203)         //DRM_INFO("setP1_6 High Mipi not Stable\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6204)         //P1_6=1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6205)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6207)     if(reg08 & 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6208)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6209)         DRM_INFO("PPI FIFO OverWrite Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6210)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6212)     if(reg08 & 0x40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6213)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6214)         DRM_INFO("FW Timer Interrupt !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6215)         it6161_mipi_rx_set_bits(it6161, 0x0b, 0x40, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6217)         if((it6161_mipi_rx_read(it6161, 0xC1)&0x03) == 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6218)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6219)             DRM_INFO("CRC Fail !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6220)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6221)         if((it6161_mipi_rx_read(it6161, 0xC1)&0x05) == 0x05)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6222)         {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6223)             DRM_INFO("CRC Pass !!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6224)             crc = it6161_mipi_rx_read(it6161, 0xC2) + (it6161_mipi_rx_read(it6161, 0xC3) <<8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6225)             DRM_INFO("CRCR = 0x%x !!!\n" , crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6226)             crc = it6161_mipi_rx_read(it6161, 0xC4) + (it6161_mipi_rx_read(it6161, 0xC5) <<8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6227)             DRM_INFO("CRCG = 0x%x !!!\n" , crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6228)             crc = it6161_mipi_rx_read(it6161, 0xC6) + (it6161_mipi_rx_read(it6161, 0xC7) <<8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6229)             DRM_INFO("CRCB = 0x%x !!!\n" , crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6230)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6231)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6234) static void it6161_hdmi_tx_interrupt_clear(struct it6161 *it6161, u8 reg06, u8 reg07, u8 reg08, u8 regee)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6236) 	u8 int_clear;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6238) 	if(reg06 & B_TX_INT_AUD_OVERFLOW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6239) 		DRM_INFO("B_TX_INT_AUD_OVERFLOW");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6240) 		it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST,(B_HDMITX_AUD_RST|B_TX_AREF_RST), (B_HDMITX_AUD_RST|B_TX_AREF_RST));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6241) 		it6161_hdmi_tx_set_bits(it6161, REG_TX_SW_RST, B_HDMITX_AUD_RST|B_TX_AREF_RST, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6242) 		//AudioDelayCnt=AudioOutDelayCnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6243) 		//LastRefaudfreqnum=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6244) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6246) 	if(reg06 & B_TX_INT_DDCFIFO_ERR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6247) 		DRM_INFO("DDC FIFO Error");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6248) 		it6161_hdmi_tx_clear_ddc_fifo(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6249) 		hdmiTxDev[0].bAuthenticated= false ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6250) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6252) 	if(reg06 & B_TX_INT_DDC_BUS_HANG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6253) 		DRM_INFO("DDC BUS HANG");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6254) 		it6161_hdmi_tx_abort_ddc(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6256)         	if (hdmiTxDev[0].bAuthenticated) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6257) 			DRM_INFO("when DDC hang,and aborted DDC,the HDCP authentication need to restart");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6258) #ifndef _SUPPORT_HDCP_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6259) #ifdef ENABLE_HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6260) 			hdmitx_hdcp_ResumeAuthentication(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6261) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6262) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6263) 			TxHDCP_chg(TxHDCP_AuthFail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6264) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6265) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6266) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6268) 	/* clear ext interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6269) 	it6161_hdmi_tx_write(it6161, 0xEE, regee);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6270) 	it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR0, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6271) 	it6161_hdmi_tx_write(it6161, REG_TX_INT_CLR1, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6272) 	/* write B_TX_INTACTDONE '1' to trigger clear interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6273) 	int_clear = (it6161_hdmi_tx_read(it6161, REG_TX_SYS_STATUS)) | B_TX_CLR_AUD_CTS | B_TX_INTACTDONE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6274) 	it6161_hdmi_tx_write(it6161, REG_TX_SYS_STATUS, int_clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6276) 	it6161_debug("hdmi tx i2c read reg06:0x%02x reg07:0x%02x reg08:0x%02x regee:0x%02x", it6161_hdmi_tx_read(it6161, 0x06), it6161_hdmi_tx_read(it6161, 0x07), it6161_hdmi_tx_read(it6161, 0x08), it6161_hdmi_tx_read(it6161, 0xEE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6279) static void it6161_hdmi_tx_interrupt_reg06_process(struct it6161 *it6161, u8 reg06)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6281)     //struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6282) 	u8 ret;//, reg0e = it6161_hdmi_tx_read(it6161, 0x0e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6284) 	if(reg06 & B_TX_INT_HPD_PLUG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6285) 		drm_helper_hpd_irq_event(it6161->connector.dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6286) 		if(hdmi_tx_get_sink_hpd(it6161)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6287) 			DRM_INFO("hpd on");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6288) 			ret = wait_for_completion_timeout(&it6161->wait_edid_complete, msecs_to_jiffies(2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6290) 			if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6291) 				DRM_INFO("wait edid timeout");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6293) 			it6161->hdmi_tx_output_color_space = OUTPUT_COLOR_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6294) 			it6161->hdmi_tx_input_color_space = INPUT_COLOR_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6295) 			hdmi_tx_set_capability_from_edid_parse(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6296) 			reinit_completion(&it6161->wait_hdcp_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6297) 			hdmi_tx_video_reset(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6299) 			bChangeMode=true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6300) 			// 1. not only HDMI but DVI need the set the upstream HPD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6301) 			// 2. Before set upstream HPD , the EDID must be ready.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6302) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6303) 			DRM_INFO("hpd off");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6304) 			hdmi_tx_disable_video_output(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6305) 			kfree(it6161->edid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6306) 			it6161->edid = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6308) 			if (it6161->hdmi_tx_mode == HDMI_TX_ENABLE_PATTERN_GENERATOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6309) 				hdmi_tx_disable_pattern_generator(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6310)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6311)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6313)     if (reg06 & B_TX_INT_RX_SENSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6314)         DRM_INFO("rx sense interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6315)         hdmiTxDev[0].bAuthenticated = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6316)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6319) static void it6161_hdmi_tx_interrupt_reg07_process(struct it6161 *it6161, u8 reg07)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6320) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6321) 	bool video_state = hdmi_tx_get_video_state(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6323) 	if(reg07 & B_TX_INT_AUTH_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6324) 		DRM_INFO("hdmi tx authenticate done interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6325) 		hdmi_tx_hdcp_int_mask_disable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6326) 		hdmiTxDev[0].bAuthenticated = true ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6327) 		it6161_hdmi_tx_set_av_mute(it6161, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6328) 		complete(&it6161->wait_hdcp_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6329) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6330) 	if(reg07 & B_TX_INT_AUTH_FAIL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6331) 		hdmiTxDev[0].bAuthenticated = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6332) 		DRM_INFO("hdmi tx interrupt authenticate fail reg46:0x%02x, start HDCP again", it6161_hdmi_tx_read(it6161, 0x46));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6333) 		complete(&it6161->wait_hdcp_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6334) #ifdef ENABLE_HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6335) 		hdmi_tx_enable_hdcp(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6336) #ifdef _SUPPORT_HDCP_REPEATER_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6337) 		TxHDCP_chg(TxHDCP_AuthFail) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6338) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6339) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6340) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6342) 	if(reg07 & B_TX_INT_KSVLIST_CHK ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6343) 		DRM_INFO("ksv list event interrupt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6344) 		schedule_work(&it6161->wait_hdcp_ksv_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6345) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6347) 	if (reg07 & B_TX_INT_VID_UNSTABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6348) 		if (!video_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6349) 			DRM_INFO("hdmi tx interrupt video unstable!");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6350) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6353) static void it6161_hdmi_tx_interrupt_reg08_process(struct it6161 *it6161, u8 reg08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6355) 	if (reg08 & B_TX_INT_VIDSTABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6356) 		it6161_hdmi_tx_write(it6161, REG_TX_INT_STAT3, reg08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6357) 			if (hdmi_tx_get_video_state(it6161)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6358) 				DRM_INFO("hdmi tx interrupt video stable link status:%d, rx reg0d:0x%02x start HDCP", getHDMITX_LinkStatus(), it6161_mipi_rx_read(it6161, 0x0D));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6359) 				hdmi_tx_get_display_mode(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6360)                 show_display_mode(it6161, &it6161->source_display_mode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6361)                 show_display_mode(it6161, &it6161->hdmi_tx_display_mode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6362)                 hdmi_tx_set_output_process(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6363) #ifdef ENABLE_HDCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6364) 				hdmi_tx_enable_hdcp(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6365) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6366) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6367) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6370) static void it6161_hdmi_tx_interrupt_regee_process(struct it6161 *it6161, u8 regee)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6371) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6372) 	if (regee != 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6373) 		DRM_INFO("%s%s%s%s%s%s%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6374) 			(regee & 0x40) ? "video parameter change ":"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6375) 			(regee & 0x20) ? "HDCP Pj check done ":"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6376) 			(regee & 0x10) ? "HDCP Ri check done ":"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6377) 			(regee & 0x8) ? "DDC bus hang ":"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6378) 			(regee & 0x4) ? "Video input FIFO auto reset ":"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6379) 			(regee & 0x2) ? "No audio input interrupt  ":"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6380) 			(regee & 0x1) ? "Audio decode error interrupt ":"");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6381) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6384) static irqreturn_t it6161_intp_threaded_handler(int unused, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6386) 	struct it6161 *it6161 = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6387) 	//struct device *dev = &it6161->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6388) 	u8 mipi_rx_reg06, mipi_rx_reg07, mipi_rx_reg08, mipi_rx_reg0d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6389) 	u8 hdmi_tx_reg06, hdmi_tx_reg07, hdmi_tx_reg08, hdmi_tx_regee, hdmi_tx_reg0e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6390) 	//it6161_dump = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6392) 	if (it6161->enable_drv_hold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6393) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6395) 	mipi_rx_reg06 = it6161_mipi_rx_read(it6161, 0x06);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6396) 	mipi_rx_reg07 = it6161_mipi_rx_read(it6161, 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6397) 	mipi_rx_reg08 = it6161_mipi_rx_read(it6161, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6398) 	mipi_rx_reg0d = it6161_mipi_rx_read(it6161, 0x0D);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6400) 	hdmi_tx_reg06 = it6161_hdmi_tx_read(it6161, 0x06);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6401) 	hdmi_tx_reg07 = it6161_hdmi_tx_read(it6161, 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6402) 	hdmi_tx_reg08 = it6161_hdmi_tx_read(it6161, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6403) 	hdmi_tx_reg0e = it6161_hdmi_tx_read(it6161, 0x0E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6404) 	hdmi_tx_regee = it6161_hdmi_tx_read(it6161, 0xEE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6406)     if ((mipi_rx_reg06 != 0) || (mipi_rx_reg07 != 0) || (mipi_rx_reg08 != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6407)         it6161_debug("rx reg06: 0x%02x reg07:0x%02x reg08:0x%02x reg0d:0x%02x", mipi_rx_reg06, mipi_rx_reg07, mipi_rx_reg08, mipi_rx_reg0d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6408)         it6161_mipi_rx_interrupt_clear(it6161, mipi_rx_reg06, mipi_rx_reg07, mipi_rx_reg08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6409)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6410) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6411)     if ((hdmi_tx_reg06 != 0) || (hdmi_tx_reg07 != 0) || (hdmi_tx_reg08 != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6412)         it6161_debug("tx reg06: 0x%02x reg07: 0x%02x reg08: 0x%02x reg0e: 0x%02x regee: 0x%02x", hdmi_tx_reg06, hdmi_tx_reg07, hdmi_tx_reg08, hdmi_tx_reg0e, hdmi_tx_regee);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6413)         it6161_hdmi_tx_interrupt_clear(it6161, hdmi_tx_reg06, hdmi_tx_reg07, hdmi_tx_reg08, hdmi_tx_regee);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6414)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6416)     it6161_mipi_rx_interrupt_reg08_process(it6161, mipi_rx_reg08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6417) 	it6161_mipi_rx_interrupt_reg06_process(it6161, mipi_rx_reg06);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6418) 	it6161_mipi_rx_interrupt_reg07_process(it6161, mipi_rx_reg07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6419) 	it6161_hdmi_tx_interrupt_reg06_process(it6161, hdmi_tx_reg06);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6420) 	it6161_hdmi_tx_interrupt_reg07_process(it6161, hdmi_tx_reg07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6421) 	it6161_hdmi_tx_interrupt_reg08_process(it6161, hdmi_tx_reg08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6422) 	it6161_hdmi_tx_interrupt_regee_process(it6161, hdmi_tx_regee);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6423) 	it6161_debug("end %s", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6425) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6426) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6429) static void mipirx_restart(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6431) 	it6161_debug("****it6161: %s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6432) 	it6161_bridge_enable(it6161_bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6435) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6436) static ssize_t enable_drv_hold_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6437) 				    struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6439) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6441) 	return scnprintf(buf, PAGE_SIZE, "drv_hold: %d\n", it6161->enable_drv_hold);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6444) static ssize_t enable_drv_hold_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6445) 				     struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6446) 				     const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6447) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6448) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6449) 	unsigned int drv_hold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6451) 	if (kstrtoint(buf, 10, &drv_hold) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6452) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6454) 	it6161->enable_drv_hold = !!drv_hold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6456) 	if (it6161->enable_drv_hold) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6457) 		it6161_mipi_rx_int_mask_disable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6458) 		it6161_hdmi_tx_int_mask_disable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6459) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6460) 		it6161_mipi_rx_interrupt_clear(it6161, 0xFF, 0xFF, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6461) 		it6161_hdmi_tx_interrupt_clear(it6161, 0xFF, 0xFF, 0xFF, 0xFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6462) 		it6161_mipi_rx_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6463) 		it6161_hdmi_tx_int_mask_enable(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6464) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6465) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6468) static ssize_t hdmi_output_color_space_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6469) 					     struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6470) 					     const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6472) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6474) 	DRM_INFO("config color space: %s", buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6475) 	it6161->hdmi_tx_output_color_space &= ~F_MODE_CLRMOD_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6477) 	if (strncmp(buf, "ycbcr444", strlen(buf) - 1) == 0 || strncmp(buf, "yuv444", strlen(buf) - 1) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6478) 		it6161->hdmi_tx_output_color_space |= F_MODE_YUV444;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6479) 		goto end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6480) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6482) 	if (strncmp(buf, "ycbcr422", strlen(buf) - 1) == 0 || strncmp(buf, "yuv422", strlen(buf) - 1) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6483) 		it6161->hdmi_tx_output_color_space |= F_MODE_YUV422;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6484) 		goto end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6485) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6487) 	if (strncmp(buf, "rgb444", strlen(buf) - 1) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6488) 		it6161->hdmi_tx_output_color_space |= F_MODE_RGB444;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6489) 		goto end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6490) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6492) 	DRM_INFO("not support this color space, only support ycbcr444/yuv444, ycbcr422/yuv422, rgb444");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6493) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6495) end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6496) 	DRM_INFO("config color space: %s value:0x%02x", buf, it6161->hdmi_tx_output_color_space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6497) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6500) static ssize_t hdmi_output_color_space_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6501) 					    struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6503) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6504) 	char *str = buf, *end = buf + PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6506) 	str += scnprintf(str, end - str, "it6161->hdmi_tx_output_color_space:%d\n", it6161->hdmi_tx_output_color_space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6508) 	return str - buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6510) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6512) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6513) static ssize_t print_timing_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6514) 				 struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6516) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6517) 	struct drm_display_mode *vid = &it6161->source_display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6518) 	char *str = buf, *end = buf + PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6520) 	str += scnprintf(str, end - str, "---video timing---\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6521) 	str += scnprintf(str, end - str, "PCLK:%d.%03dMHz\n", vid->clock / 1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6522) 			 vid->clock % 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6523) 	str += scnprintf(str, end - str, "HTotal:%d\n", vid->htotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6524) 	str += scnprintf(str, end - str, "HActive:%d\n", vid->hdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6525) 	str += scnprintf(str, end - str, "HFrontPorch:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6526) 			 vid->hsync_start - vid->hdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6527) 	str += scnprintf(str, end - str, "HSyncWidth:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6528) 			 vid->hsync_end - vid->hsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6529) 	str += scnprintf(str, end - str, "HBackPorch:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6530) 			 vid->htotal - vid->hsync_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6531) 	str += scnprintf(str, end - str, "VTotal:%d\n", vid->vtotal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6532) 	str += scnprintf(str, end - str, "VActive:%d\n", vid->vdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6533) 	str += scnprintf(str, end - str, "VFrontPorch:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6534) 			 vid->vsync_start - vid->vdisplay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6535) 	str += scnprintf(str, end - str, "VSyncWidth:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6536) 			 vid->vsync_end - vid->vsync_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6537) 	str += scnprintf(str, end - str, "VBackPorch:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6538) 			 vid->vtotal - vid->vsync_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6540) 	return str - buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6543) static ssize_t sha_debug_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6544) 			      char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6545) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6546) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6547) 	char *str = buf, *end = buf + PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6548) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6550) 	str += scnprintf(str, end - str, "sha input:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6551) 	for (i = 0; i < ARRAY_SIZE(it6161->sha1_input); i += 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6552) 		str += scnprintf(str, end - str, "%16ph\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6553) 				 it6161->sha1_input + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6555) 	str += scnprintf(str, end - str, "av:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6556) 	for (i = 0; i < ARRAY_SIZE(it6161->av); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6557) 		str += scnprintf(str, end - str, "%4ph\n", it6161->av[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6559) 	str += scnprintf(str, end - str, "bv:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6560) 	for (i = 0; i < ARRAY_SIZE(it6161->bv); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6561) 		str += scnprintf(str, end - str, "%4ph\n", it6161->bv[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6563) 	return end - str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6566) static ssize_t enable_hdcp_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6567) 				struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6569) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6570) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6571) 	return scnprintf(buf, PAGE_SIZE, "%d\n", it6161->enable_hdcp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6574) static ssize_t enable_hdcp_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6575) 				 struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6576) 				 const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6578) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6579) 	unsigned int reg3f, hdcp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6581) 	if (kstrtoint(buf, 10, &hdcp) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6582) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6584) 	if (!it6161->powered || it6161->state == SYS_UNPLUG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6585) 		DRM_DEV_DEBUG_DRIVER(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6586) 				     "power down or unplug, can not fire HDCP");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6587) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6588) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6589) 	it6161->enable_hdcp = hdcp ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6591) 	if (it6161->enable_hdcp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6592) 		if (it6161->cp_capable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6593) 			dptx_sys_chg(it6161, SYS_HDCP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6594) 			dptx_sys_fsm(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6595) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6596) 			DRM_DEV_ERROR(dev, "sink not support HDCP");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6597) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6598) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6599) 		dptx_set_bits(it6161, 0x05, 0x10, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6600) 		dptx_set_bits(it6161, 0x05, 0x10, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6601) 		reg3f = dptx_read(it6161, 0x3F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6602) 		hdcp = (reg3f & BIT(7)) >> 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6603) 		DRM_DEV_DEBUG_DRIVER(dev, "%s to disable hdcp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6604) 				     hdcp ? "failed" : "succeeded");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6605) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6606) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6609) static ssize_t force_pwronoff_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6610) 				    struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6611) 				    const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6613) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6614) 	int pwr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6616) 	if (kstrtoint(buf, 10, &pwr) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6617) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6618) 	if (pwr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6619) 		it6161_poweron(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6620) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6621) 		it6161_poweroff(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6622) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6625) static ssize_t pwr_state_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6626) 			      struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6627) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6628) 	struct it6161 *it6161 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6630) 	return scnprintf(buf, PAGE_SIZE, "%d\n", it6161->powered);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6633) static DEVICE_ATTR_RO(print_timing);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6634) static DEVICE_ATTR_RO(pwr_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6635) static DEVICE_ATTR_RO(sha_debug);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6636) static DEVICE_ATTR_WO(force_pwronoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6637) static DEVICE_ATTR_RW(enable_hdcp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6639) static const struct attribute *it6161_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6640) 	&dev_attr_enable_drv_hold.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6641) 	&dev_attr_print_timing.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6642) 	&dev_attr_sha_debug.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6643) 	&dev_attr_enable_hdcp.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6644) 	&dev_attr_force_pwronoff.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6645) 	&dev_attr_pwr_state.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6646) 	NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6647) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6649) static void it6161_shutdown(struct i2c_client *i2c_mipi_rx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6650) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6651) 	struct it6161 *it6161 = dev_get_drvdata(&i2c_mipi_rx->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6653) 	dptx_sys_chg(it6161, SYS_UNPLUG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6656) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6658) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6659) static DEVICE_ATTR_RW(enable_drv_hold);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6660) static DEVICE_ATTR_RW(hdmi_output_color_space);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6662) static const struct attribute *it6161_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6663) 	&dev_attr_enable_drv_hold.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6664) 	&dev_attr_hdmi_output_color_space.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6665) 	NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6666) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6667) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6668) static int it6161_parse_dt(struct it6161 *it6161, struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6670)     //struct device *dev = &adv->i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6672)     it6161->host_node = of_graph_get_remote_node(np, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6673)     if (!it6161->host_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6674)         DRM_INFO("no host node");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6675)         return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6676)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6677) 	DRM_INFO("%s", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6678)     of_node_put(it6161->host_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6680)     return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6683) static int it6161_gpio_init(struct it6161 *it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6685) 	struct device *dev = it6161->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6687) 	it6161->enable_gpio = devm_gpiod_get_optional(dev, "enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6688) 						      GPIOD_OUT_LOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6689) 	if (IS_ERR(it6161->enable_gpio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6690) 		dev_err(dev, "failed to acquire enable gpio\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6691) 		return PTR_ERR(it6161->enable_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6692) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6694) 	it6161->test_gpio = devm_gpiod_get_optional(dev, "test",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6695) 						      GPIOD_OUT_LOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6696) 	if (IS_ERR(it6161->test_gpio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6697) 		dev_info(dev, "failed to acquire test gpio\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6698) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6700) 	msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6701) 	gpiod_set_value_cansleep(it6161->enable_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6702) 	msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6704) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6707) static int it6161_i2c_probe(struct i2c_client *i2c_mipi_rx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6708) 			    const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6709) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6710) 	//struct it6161 *it6161;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6711) 	struct device *dev = &i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6712) 	int err, intp_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6714) 	it6161 = devm_kzalloc(dev, sizeof(*it6161), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6715) 	if (!it6161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6716) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6718) 	it6161_bridge = devm_kzalloc(dev, sizeof(*it6161), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6719) 	if (!it6161_bridge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6720) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6722) 	it6161->i2c_mipi_rx = i2c_mipi_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6723) 	it6161->dev = &i2c_mipi_rx->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6724) 	// mutex_init(&it6161->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6725) 	mutex_init(&it6161->mode_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6726) 	//init_completion(&it6161->wait_hdcp_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6727) 	init_completion(&it6161->wait_edid_complete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6729) 	//INIT_DELAYED_WORK(&it6161->hdcp_work, hdmi_tx_hdcp_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6730) 	//INIT_WORK(&it6161->wait_hdcp_ksv_list, hdmi_tx_hdcp_auth_part2_process);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6731) 	// init_waitqueue_head(&it6161->edid_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6733) 	/* set up mipirx restart work*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6734) 	INIT_DELAYED_WORK(&it6161->restart, mipirx_restart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6735) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6736) 	it6161->bridge.of_node = i2c_mipi_rx->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6738) 	it6161_parse_dt(it6161, dev->of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6739) 	it6161_gpio_init(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6741) 	it6161->regmap_mipi_rx =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6742) 		devm_regmap_init_i2c(i2c_mipi_rx, &it6161_mipi_rx_bridge_regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6743) 	if (IS_ERR(it6161->regmap_mipi_rx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6744) 		DRM_DEV_ERROR(dev, "regmap_mipi_rx i2c init failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6745) 		return PTR_ERR(it6161->regmap_mipi_rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6746) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6747) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6748) 	if (device_property_read_u32(dev, "it6161-addr-hdmi-tx", &it6161->it6161_addr_hdmi_tx) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6749) 		it6161->it6161_addr_hdmi_tx = 0x4c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6751) 	it6161->i2c_hdmi_tx = i2c_new_dummy_device(i2c_mipi_rx->adapter, it6161->it6161_addr_hdmi_tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6752) 	if (IS_ERR(it6161->i2c_hdmi_tx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6753) 		DRM_DEV_ERROR(dev, "Failed to register it6161 I2C device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6754) 		return PTR_ERR(it6161->i2c_hdmi_tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6755) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6756) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6757) 	it6161->regmap_hdmi_tx =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6758) 		devm_regmap_init_i2c(it6161->i2c_hdmi_tx, &it6161_hdmi_tx_bridge_regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6760) 	if (IS_ERR(it6161->regmap_hdmi_tx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6761) 		DRM_DEV_ERROR(dev, "regmap_hdmi_tx i2c init failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6762) 		err = PTR_ERR(it6161->regmap_hdmi_tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6763) 		goto err_hdmitx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6764) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6766) 	if (device_property_read_u32(dev, "it6161-addr-cec", &it6161->it6161_addr_cec) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6767) 		it6161->it6161_addr_cec = 0x4E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6769) 	it6161->i2c_cec = i2c_new_dummy_device(i2c_mipi_rx->adapter, it6161->it6161_addr_cec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6770) 	if (IS_ERR(it6161->i2c_cec)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6771) 		DRM_DEV_ERROR(dev, "i2c_cec init failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6772) 		err = PTR_ERR(it6161->i2c_cec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6773) 		goto  err_hdmitx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6774) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6776) 	it6161->regmap_cec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6777) 		devm_regmap_init_i2c(it6161->i2c_cec, &it6161_cec_bridge_regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6778) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6779) 	if (IS_ERR(it6161->regmap_cec)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6780) 		DRM_DEV_ERROR(dev, "regmap_cec i2c init failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6781) 		err = PTR_ERR(it6161->regmap_cec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6782) 		goto err_cec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6783) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6784) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6785) 	if (!it6161_check_device_ready(it6161)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6786) 		err =  -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6787) 		goto err_cec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6788) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6790) 	it6161->enable_drv_hold = DEFAULT_DRV_HOLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6791) 	it6161_set_interrupts_active_level(HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6792) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6793) 	intp_irq = i2c_mipi_rx->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6794) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6795) 	if (!intp_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6796) 		DRM_DEV_ERROR(dev, "it6112 failed to get INTP IRQ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6797) 		err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6798) 		goto err_cec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6799) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6800) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6801) 	err = devm_request_threaded_irq(&i2c_mipi_rx->dev, intp_irq, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6802) 					/*it6161_intp_threaded_handler,*/it6161_intp_threaded_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6803) 					IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6804) 					"it6161-intp", it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6805) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6806) 		DRM_DEV_ERROR(dev, "it6112 failed to request INTP threaded IRQ: %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6807) 			      err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6808) 		goto err_cec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6809) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6811) 	i2c_set_clientdata(i2c_mipi_rx, it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6812) 	it6161->bridge.funcs = &it6161_bridge_funcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6813) 	drm_bridge_add(&it6161->bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6815) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6817) err_cec:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6818) 	i2c_unregister_device(it6161->i2c_cec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6819) err_hdmitx:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6820) 	i2c_unregister_device(it6161->i2c_hdmi_tx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6821) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6822) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6825) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6826) static int it6161_remove(struct i2c_client *i2c_mipi_rx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6827) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6828) 	struct it6161 *it6161 = i2c_get_clientdata(i2c_mipi_rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6830) 	drm_connector_unregister(&it6161->connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6831) 	drm_connector_cleanup(&it6161->connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6832) 	drm_bridge_remove(&it6161->bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6833) 	// sysfs_remove_files(&i2c_mipi_rx->dev.kobj, it6161_attrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6834) 	// drm_dp_aux_unregister(&it6161->aux);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6835) 	// it6161_poweroff(it6161);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6836) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6838) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6839) static const struct i2c_device_id it6161_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6840) 	{ "it6161", 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6841) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6842) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6844) MODULE_DEVICE_TABLE(i2c, it6161_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6846) static const struct of_device_id it6161_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6847) 	{ .compatible = "ite,it6161" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6848) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6849) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6850) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6851) static struct i2c_driver it6161_i2c_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6852) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6853) 		.name = "it6161_mipirx_hdmitx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6854) 		.of_match_table = it6161_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6855) 		//.pm = &it6161_bridge_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6856) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6857) 	.probe = it6161_i2c_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6858) 	//.remove = it6161_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6859) 	//.shutdown = it6161_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6860) 	.id_table = it6161_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6861) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6863) module_i2c_driver(it6161_i2c_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6865) MODULE_AUTHOR("allen chen <allen.chen@ite.com.tw>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6866) MODULE_DESCRIPTION("it6161 HDMI Transmitter driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6867) MODULE_LICENSE("GPL v2");