author | hongmin hua <hongmin.hua@amlogic.com> | 2018-06-05 13:06:00 (GMT) |
---|---|---|
committer | hongmin hua <hongmin.hua@amlogic.com> | 2018-08-06 02:34:53 (GMT) |
commit | 4e76488f2cf4c007c4e90c090d10a06ec93e872d (patch) | |
tree | dd3e68dc3a0c80d39b27d66b849afcabe3de4747 | |
parent | 3281c4c10b24d0a567459ec2080960099ce5c4e6 (diff) | |
download | common-4e76488f2cf4c007c4e90c090d10a06ec93e872d.zip common-4e76488f2cf4c007c4e90c090d10a06ec93e872d.tar.gz common-4e76488f2cf4c007c4e90c090d10a06ec93e872d.tar.bz2 |
hdmirx: add lock for top sw reset & edid size protect [1/2]
PD#170713: hdmirx: add lock for top sw reset & edid size protect
Change-Id: I97502324d01d2e99d3a30bb1829affef5d2c123b
Signed-off-by: hongmin hua <hongmin.hua@amlogic.com>
Signed-off-by: Zongdong Jiao <zongdong.jiao@amlogic.com>
9 files changed, 325 insertions, 248 deletions
diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c index 8eec6af..8863426 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c @@ -572,6 +572,9 @@ void hdmirx_set_timing_info(struct tvin_sig_property_s *prop) prop->ve = 1; } +/* + * hdmirx_get_connect_info - get 5v info + */ int hdmirx_get_connect_info(void) { return pwr_sts; diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h index 8f43b86..fcac817 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h @@ -46,15 +46,25 @@ * * */ -#define RX_VER2 "ver.2018/07/30" - +#define RX_VER2 "ver.2018/07/30a" + +/*print type*/ +#define LOG_EN 0x01 +#define VIDEO_LOG 0x02 +#define AUDIO_LOG 0x04 +#define HDCP_LOG 0x08 +#define PACKET_LOG 0x10 +#define EQ_LOG 0x20 +#define REG_LOG 0x40 +#define ERR_LOG 0x80 +#define VSI_LOG 0x800 /* 50ms timer for hdmirx main loop (HDMI_STATE_CHECK_FREQ is 20) */ #define ABS(x) ((x) < 0 ? -(x) : (x)) - +#define EDID_MIX_MAX_SIZE 64 #define ESM_KILL_WAIT_TIMES 250 #define str_cmp(buff, str) ((strlen((str)) == strlen((buff))) && \ @@ -366,6 +376,7 @@ struct rx_s { struct aud_info_s aud_info; struct vsi_info_s vs_info_details; struct tvin_hdr_info_s hdr_info; + unsigned char edid_mix_buf[EDID_MIX_MAX_SIZE]; unsigned int pwr_sts; /* for debug */ /*struct pd_infoframe_s dbg_info;*/ diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c index d880bc7..545ca57 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.c @@ -515,7 +515,8 @@ void rx_edid_update_hdr_info( { u_char hdr_edid[EDID_HDR_SIZE]; - if (p_edid == NULL) + if ((p_edid == NULL) || ((receive_hdr_lum[0] == 0) + && (receive_hdr_lum[1] == 0) && (receive_hdr_lum[2] == 0))) return; /*check if data is updated*/ if (!(receive_hdr_lum[0] | receive_hdr_lum[1] @@ -534,17 +535,284 @@ unsigned int rx_exchange_bits(unsigned int value) { unsigned int temp; - rx_pr("bfe:%#x\n", value); temp = value & 0xF; value = (((value >> 4) & 0xF) | (value & 0xFFF0)); value = ((value & 0xFF0F) | (temp << 4)); temp = value & 0xF00; value = (((value >> 4) & 0xF00) | (value & 0xF0FF)); value = ((value & 0x0FFF) | (temp << 4)); - rx_pr("aft:%#x\n", value); return value; } +int rx_get_tag_code(uint8_t *edid_data) +{ + int tag_code; + + if ((*edid_data >> 5) != 7) + tag_code = (*edid_data >> 5); + else + tag_code = (7 << 8) | *(edid_data + 1);/*extern tag*/ + + return tag_code; +} + +int rx_get_ceadata_offset(uint8_t *cur_edid, uint8_t *addition) +{ + int i; + int type; + + if ((cur_edid == NULL) || (addition == NULL)) + return 0; + + type = rx_get_tag_code(addition); + i = EDID_DEFAULT_START;/*block check start index*/ + while (i < 255) { + if (type == rx_get_tag_code(cur_edid + i)) + return i; + i += (1 + (*(cur_edid + i) & 0x1f)); + } + if (log_level & VIDEO_LOG) + rx_pr("type: %#x, start addr: %#x\n", type, i); + + return 0; +} + +void rx_mix_edid_audio(uint8_t *cur_data, uint8_t *addition) +{ + struct edid_audio_block_t *ori_data; + struct edid_audio_block_t *add_data; + unsigned char ori_len, add_len; + int i, j; + + if ((cur_data == 0) || (addition == 0) || + (*cur_data >> 5) != (*addition >> 5)) + return; + + ori_data = (struct edid_audio_block_t *)(cur_data + 1); + add_data = (struct edid_audio_block_t *)(addition + 1); + ori_len = (*cur_data & 0x1f)/FORMAT_SIZE; + add_len = (*addition & 0x1f)/FORMAT_SIZE; + if (log_level & VIDEO_LOG) + rx_pr("mix audio format ori len:%d,add len:%d\n", + ori_len, add_len); + for (i = 0; i < add_len; i++) { + if (log_level & VIDEO_LOG) + rx_pr("mix audio format:%d\n", add_data[i].format_code); + /*only support lpcm dts dd+*/ + if (!is_audio_support(add_data[i].format_code)) + continue; + /*mix audio data*/ + for (j = 0; j < ori_len; j++) { + if (ori_data[j].format_code == + add_data[i].format_code) { + if (log_level & VIDEO_LOG) + rx_pr("mix audio mix format:%d\n", + add_data[i].format_code); + /*choose channel is lager*/ + ori_data[j].max_channel = + ((ori_data[j].max_channel > + add_data[i].max_channel) ? + ori_data[j].max_channel : + add_data[i].max_channel); + /*mix sample freqence*/ + *(((unsigned char *)&ori_data[j]) + 1) = + *(((unsigned char *)&ori_data[j]) + 1) | + *(((unsigned char *)&add_data[i]) + 1); + /*mix bit rate*/ + if (add_data[i].format_code == + AUDIO_FORMAT_LPCM) + *(((unsigned char *)&ori_data[j]) + 2) = + *(((unsigned char *)&ori_data[j]) + 2) | + *(((unsigned char *)&add_data[i]) + 2); + else + ori_data[j].bit_rate.others = + add_data[i].bit_rate.others; + break; + } + if (j == (ori_len - 1)) { + if (log_level & VIDEO_LOG) + rx_pr("mix audio add new format: %d\n", + add_data[i].format_code); + if (((*cur_data & 0x1f) + FORMAT_SIZE) + <= 0x1f) { + memcpy(cur_data + + (*cur_data & 0x1f) + 1, + &add_data[i], FORMAT_SIZE); + *cur_data += FORMAT_SIZE; + } + } + } + } +} + +void rx_mix_edid_hdr(uint8_t *cur_data, uint8_t *addition) +{ + struct edid_hdr_block_t *cur_block; + struct edid_hdr_block_t *add_block; + + if ((cur_data == 0) || (addition == 0) || + (*cur_data >> 5) != (*addition >> 5)) + return; + + cur_block = (struct edid_hdr_block_t *)(cur_data + 1); + add_block = (struct edid_hdr_block_t *)(addition + 1); + if (add_block->max_lumi | add_block->avg_lumi | + add_block->min_lumi) { + cur_block->max_lumi = add_block->max_lumi; + cur_block->avg_lumi = add_block->avg_lumi; + cur_block->min_lumi = add_block->min_lumi; + if ((*cur_data & 0x1f) < (*addition & 0x1f)) + *cur_data = *addition; + } +} + +int rx_edid_free_size(uint8_t *cur_edid, int size) +{ + int block_start; + + if (cur_edid == 0) + return -1; + /*get description offset*/ + block_start = cur_edid[EDID_BLOCK1_OFFSET + + EDID_DESCRIP_OFFSET]; + block_start += EDID_BLOCK1_OFFSET; + if (log_level & VIDEO_LOG) + rx_pr("%s block_start:%d\n", __func__, block_start); + /*find the empty data index*/ + while ((cur_edid[block_start] > 0) && + (block_start < size)) { + if (log_level & VIDEO_LOG) + rx_pr("%s running:%d\n", __func__, block_start); + if ((cur_edid[block_start] & 0x1f) == 0) + break; + block_start += DETAILED_TIMING_LEN; + } + if (log_level & VIDEO_LOG) + rx_pr("%s block_start end:%d\n", __func__, block_start); + /*compute the free size*/ + if (block_start < (size - 1)) + return (size - block_start - 1); + else + return -1; +} + +void rx_mix_block(uint8_t *cur_data, uint8_t *addition) +{ + int tag_code; + + if ((cur_data == 0) || (addition == 0) || + (*cur_data >> 5) != (*addition >> 5)) + return; + if (log_level & VIDEO_LOG) + rx_pr("before type:%d - %d,len:%d - %d\n", + (*cur_data >> 5), (*addition >> 5), + (*cur_data & 0x1f), (*addition & 0x1f)); + + tag_code = rx_get_tag_code(cur_data); + + switch (tag_code) { + case EDID_TAG_AUDIO: + rx_mix_edid_audio(cur_data, addition); + break; + + case EDID_TAG_HDR: + rx_mix_edid_hdr(cur_data, addition); + break; + } + if (log_level & VIDEO_LOG) + rx_pr("end type:%d - %d,len:%d - %d\n", + (*cur_data >> 5), (*addition >> 5), + (*cur_data & 0x1f), (*addition & 0x1f)); +} + +void rx_modify_edid(unsigned char *buffer, + int len, unsigned char *addition) +{ + int start_addr = 0;/*the addr in edid need modify*/ + int start_addr_temp = 0;/*edid_temp start addr*/ + int temp_len = 0; + unsigned char *cur_data = rx.edid_mix_buf; + int addition_size = 0; + int cur_size = 0; + int i, free_size; + + if ((len <= 255) || (buffer == 0) || (addition == 0)) + return; + + /*get the mix block value*/ + if (*addition & 0x1f) { + /*get addition block index in local edid*/ + start_addr = rx_get_ceadata_offset(buffer, addition); + if (log_level & VIDEO_LOG) + rx_pr("%s start addr:%d\n", __func__, start_addr); + if (start_addr > EDID_DEFAULT_START) { + cur_size = (*(buffer + start_addr) & 0x1f) + 1; + addition_size = (*addition & 0x1f) + 1; + if (sizeof(rx.edid_mix_buf) >= + (cur_size + addition_size)) + memcpy(cur_data, buffer + start_addr, cur_size); + else + return; + if (log_level & VIDEO_LOG) + rx_pr("%s mix size:%d\n", __func__, + (cur_size + addition_size)); + /*add addition block property to local edid*/ + rx_mix_block(cur_data, addition); + addition_size = (*cur_data & 0x1f) + 1; + } else + return; + if (log_level & VIDEO_LOG) + rx_pr( + "start_addr: %#x,cur_size: %d,addition_size: %d\n", + start_addr, cur_size, addition_size); + + /*set the block value to edid_temp*/ + start_addr_temp = rx_get_ceadata_offset(buffer, addition); + temp_len = ((buffer[start_addr_temp] & 0x1f) + 1); + /*check the free size is enough for merged block*/ + free_size = rx_edid_free_size(buffer, EDID_SIZE); + if (log_level & VIDEO_LOG) + rx_pr("%s free_size:%d\n", __func__, free_size); + if ((free_size < (addition_size - temp_len)) || + (free_size <= 0)) + return; + if (log_level & VIDEO_LOG) + rx_pr("edid_temp start: %#x, len: %d\n", + start_addr_temp, temp_len); + /*move data behind current data if need*/ + if (temp_len < addition_size) { + for (i = 0; i < EDID_SIZE - start_addr_temp - + addition_size; i++) { + buffer[255 - i] = + buffer[255 - (addition_size - temp_len) + - i]; + } + } else if (temp_len > addition_size) { + for (i = 0; i < EDID_SIZE - start_addr_temp - + temp_len; i++) { + buffer[start_addr_temp + i + addition_size] + = buffer[start_addr_temp + i + temp_len]; + } + } + /*check detail description offset if needs modify*/ + if (start_addr_temp < buffer[EDID_BLOCK1_OFFSET + + EDID_DESCRIP_OFFSET] + EDID_BLOCK1_OFFSET) + buffer[EDID_BLOCK1_OFFSET + EDID_DESCRIP_OFFSET] + += (addition_size - temp_len); + /*copy current edid data*/ + memcpy(buffer + start_addr_temp, cur_data, + addition_size); + } +} + +void rx_edid_update_audio_info(unsigned char *p_edid, + unsigned int len) +{ + if (p_edid == NULL) + return; + rx_modify_edid(p_edid, len, rx_get_receiver_edid()); +} + unsigned int rx_edid_cal_phy_addr( u_int brepeat, u_int up_addr, diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h index 32c45cc..5b533fd 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_edid.h @@ -622,4 +622,8 @@ unsigned char *rx_get_edid(int edid_index); void edid_parse_block0(uint8_t *p_edid, struct edid_info_s *edid_info); void edid_parse_cea_block(uint8_t *p_edid, struct edid_info_s *edid_info); void rx_edid_parse_print(struct edid_info_s *edid_info); +void rx_modify_edid(unsigned char *buffer, + int len, unsigned char *addition); +void rx_edid_update_audio_info(unsigned char *p_edid, + unsigned int len); #endif diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c index 1a148e1..314aca0 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c @@ -262,6 +262,7 @@ unsigned int hdmirx_rd_top(unsigned int addr) ulong flags; int data; unsigned int dev_offset = 0; + spin_lock_irqsave(®_rw_lock, flags); wr_reg(MAP_ADDR_MODULE_TOP, hdmirx_addr_port | dev_offset, addr); wr_reg(MAP_ADDR_MODULE_TOP, hdmirx_addr_port | dev_offset, addr); @@ -563,6 +564,26 @@ void hdmirx_wr_ctl_port(unsigned int offset, unsigned int data) } /* + * hdmirx_top_sw_reset + */ +void hdmirx_top_sw_reset(void) +{ + ulong flags; + unsigned long dev_offset = 0; + + spin_lock_irqsave(®_rw_lock, flags); + wr_reg(MAP_ADDR_MODULE_TOP, + hdmirx_addr_port | dev_offset, TOP_SW_RESET); + wr_reg(MAP_ADDR_MODULE_TOP, + hdmirx_data_port | dev_offset, 1); + udelay(1); + wr_reg(MAP_ADDR_MODULE_TOP, + hdmirx_addr_port | dev_offset, TOP_SW_RESET); + wr_reg(MAP_ADDR_MODULE_TOP, hdmirx_data_port | dev_offset, 0); + spin_unlock_irqrestore(®_rw_lock, flags); +} + +/* * rx_irq_en - hdmirx controller irq config * @enable - irq set or clear */ @@ -1172,6 +1193,9 @@ void control_reset(void) { unsigned long data32; + /* disable functional modules */ + hdmirx_top_sw_reset(); + /* Enable functional modules */ data32 = 0; data32 |= 1 << 5; /* [5] cec_enable */ @@ -1746,6 +1770,7 @@ void hdmirx_hw_config(void) DWC_init(); hdmirx_irq_hdcp_enable(true); hdmirx_phy_init(); + hdmirx_wr_top(TOP_INTR_MASKN, top_intr_maskn_value); rx_pr("%s %d Done!\n", __func__, rx.port); } @@ -1853,6 +1878,7 @@ bool is_aud_pll_error(void) void rx_aud_pll_ctl(bool en) { int tmp = 0; + if (en) { tmp = hdmirx_rd_phy(PHY_MAINFSM_STATUS1); wr_reg_hhi(HHI_AUD_PLL_CNTL, 0x20000000); @@ -2081,6 +2107,7 @@ unsigned int hdmirx_get_clock(int index) unsigned int hdmirx_get_tmds_clock(void) { uint32_t clk = clk_util_clk_msr(25); + if (clk == 0) { clk = hdmirx_rd_dwc(DWC_HDMI_CKM_RESULT) & 0xffff; clk = clk * 158000 / 4095 * 1000; diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.c index c9b5cc2..47bff53 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.c @@ -184,235 +184,11 @@ void rx_check_repeat(void) /*}*/ } -int rx_get_tag_code(uint8_t *edid_data) +unsigned char *rx_get_receiver_edid(void) { - int tag_code; - - if ((*edid_data >> 5) != 7) - tag_code = (*edid_data >> 5); - else - tag_code = (7 << 8) | *(edid_data + 1);/*extern tag*/ - - return tag_code; -} - -int rx_get_ceadata_offset(uint8_t *cur_edid, uint8_t *addition) -{ - int i; - int type; - - if ((cur_edid == NULL) || (addition == NULL)) - return 0; - - type = rx_get_tag_code(addition); - i = EDID_DEFAULT_START;/*block check start index*/ - while (i < 255) { - if (type == rx_get_tag_code(cur_edid + i)) - return i; - i += (1 + (*(cur_edid + i) & 0x1f)); - } - if (log_level & VIDEO_LOG) - rx_pr("type: %#x, start addr: %#x\n", type, i); - - return 0; -} - -void rx_mix_edid_audio(uint8_t *cur_data, uint8_t *addition) -{ -struct edid_audio_block_t *ori_data; -struct edid_audio_block_t *add_data; -unsigned char ori_len, add_len; -int i, j; - -if ((cur_data == 0) || (addition == 0) || - (*cur_data >> 5) != (*addition >> 5)) - return; - -ori_data = (struct edid_audio_block_t *)(cur_data + 1); -add_data = (struct edid_audio_block_t *)(addition + 1); -ori_len = (*cur_data & 0x1f)/FORMAT_SIZE; -add_len = (*addition & 0x1f)/FORMAT_SIZE; - -for (i = 0; i < add_len; i++) { - if (log_level & VIDEO_LOG) - rx_pr("mix audio format:%d\n", add_data[i].format_code); - /*only support lpcm dts dd+*/ - if (!is_audio_support(add_data[i].format_code)) - continue; - /*mix audio data*/ - for (j = 0; j < ori_len; j++) { - if (ori_data[j].format_code == - add_data[i].format_code) { - if (log_level & VIDEO_LOG) - rx_pr("mix audio mix format:%d\n", - add_data[i].format_code); - /*choose channel is lager*/ - ori_data[j].max_channel = - ((ori_data[j].max_channel > - add_data[i].max_channel) ? - ori_data[j].max_channel : - add_data[i].max_channel); - /*mix sample freqence*/ - *(((unsigned char *)&ori_data[j]) + 1) = - *(((unsigned char *)&ori_data[j]) + 1) | - *(((unsigned char *)&add_data[i]) + 1); - /*mix bit rate*/ - if (add_data[i].format_code == - AUDIO_FORMAT_LPCM) - *(((unsigned char *)&ori_data[j]) + 2) = - *(((unsigned char *)&ori_data[j]) + 2) | - *(((unsigned char *)&add_data[i]) + 2); - else - ori_data[j].bit_rate.others = - add_data[i].bit_rate.others; - } else { - if (j == (ori_len - 1)) { - if (log_level & VIDEO_LOG) - rx_pr("mix audio add new format: %d\n", - add_data[i].format_code); - if (((*cur_data & 0x1f) + FORMAT_SIZE) - <= 0x1f) { - memcpy(cur_data + - (*cur_data & 0x1f) + 1, - &add_data[i], FORMAT_SIZE); - *cur_data += FORMAT_SIZE; - } - } - } - } -} -} -void rx_mix_edid_hdr(uint8_t *cur_data, uint8_t *addition) -{ - struct edid_hdr_block_t *cur_block; - struct edid_hdr_block_t *add_block; - - if ((cur_data == 0) || (addition == 0) || - (*cur_data >> 5) != (*addition >> 5)) - return; - - cur_block = (struct edid_hdr_block_t *)(cur_data + 1); - add_block = (struct edid_hdr_block_t *)(addition + 1); - if (add_block->max_lumi | add_block->avg_lumi | - add_block->min_lumi) { - cur_block->max_lumi = add_block->max_lumi; - cur_block->avg_lumi = add_block->avg_lumi; - cur_block->min_lumi = add_block->min_lumi; - if ((*cur_data & 0x1f) < (*addition & 0x1f)) - *cur_data = *addition; - } -} - -void rx_mix_block(uint8_t *cur_data, uint8_t *addition) -{ - int tag_code; - - if ((cur_data == 0) || (addition == 0) || - (*cur_data >> 5) != (*addition >> 5)) - return; - if (log_level & VIDEO_LOG) - rx_pr("before type:%d - %d,len:%d - %d\n", - (*cur_data >> 5), (*addition >> 5), - (*cur_data & 0x1f), (*addition & 0x1f)); - - tag_code = rx_get_tag_code(cur_data); - - switch (tag_code) { - case EDID_TAG_AUDIO: - rx_mix_edid_audio(cur_data, addition); - break; - - case EDID_TAG_HDR: - rx_mix_edid_hdr(cur_data, addition); - break; - } - if (log_level & VIDEO_LOG) - rx_pr("end type:%d - %d,len:%d - %d\n", - (*cur_data >> 5), (*addition >> 5), - (*cur_data & 0x1f), (*addition & 0x1f)); -} - -void rx_modify_edid(unsigned char *buffer, - int len, unsigned char *addition) -{ - int start_addr = 0;/*the addr in edid need modify*/ - int start_addr_temp = 0;/*edid_temp start addr*/ - int temp_len = 0; - unsigned char *cur_data = NULL; - int addition_size = 0; - int cur_size = 0; - int i; - - if ((len <= 255) || (buffer == 0) || (addition == 0)) - return; - - /*get the mix block value*/ - if (*addition & 0x1f) { - /*get addition block index in local edid*/ - start_addr = rx_get_ceadata_offset(buffer, addition); - if (start_addr > EDID_DEFAULT_START) { - cur_size = (*(buffer + start_addr) & 0x1f) + 1; - addition_size = (*addition & 0x1f) + 1; - cur_data = kmalloc( - addition_size + cur_size, GFP_KERNEL); - if (!cur_data) { - rx_pr("allocate cur_data memory failed\n"); - return; - } - memcpy(cur_data, buffer + start_addr, cur_size); - /*add addition block property to local edid*/ - rx_mix_block(cur_data, addition); - addition_size = (*cur_data & 0x1f) + 1; - } else - return; - if (log_level & VIDEO_LOG) - rx_pr( - "start_addr: %#x,cur_size: %d,addition_size: %d\n", - start_addr, cur_size, addition_size); - - /*set the block value to edid_temp*/ - start_addr_temp = rx_get_ceadata_offset(buffer, addition); - temp_len = ((buffer[start_addr_temp] & 0x1f) + 1); - if (log_level & VIDEO_LOG) - rx_pr("edid_temp start: %#x, len: %d\n", - start_addr_temp, temp_len); - /*move data behind current data if need*/ - if (temp_len < addition_size) { - for (i = 0; i < EDID_SIZE - start_addr_temp - - addition_size; i++) { - buffer[255 - i] = - buffer[255 - (addition_size - temp_len) - - i]; - } - } else if (temp_len > addition_size) { - for (i = 0; i < EDID_SIZE - start_addr_temp - - temp_len; i++) { - buffer[start_addr_temp + i + addition_size] - = buffer[start_addr_temp + i + temp_len]; - } - } - /*check detail description offset if needs modify*/ - if (start_addr_temp < buffer[EDID_BLOCK1_OFFSET + - EDID_DESCRIP_OFFSET] + EDID_BLOCK1_OFFSET) - buffer[EDID_BLOCK1_OFFSET + EDID_DESCRIP_OFFSET] - += (addition_size - temp_len); - /*copy current edid data*/ - memcpy(buffer + start_addr_temp, cur_data, - addition_size); - } - kfree(cur_data); + return receive_edid; } -void rx_edid_update_audio_info(unsigned char *p_edid, - unsigned int len) -{ - if (p_edid == NULL) - return; - rx_modify_edid(p_edid, len, receive_edid); -} - - - int rx_set_receiver_edid(unsigned char *data, int len) { if ((data == NULL) || (len == 0) || (len > MAX_RECEIVE_EDID)) diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.h index fa1b455..82340b4 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_repeater.h @@ -24,6 +24,7 @@ #define MAX_REPEAT_COUNT 127 #define MAX_REPEAT_DEPTH 7 #define MAX_KSV_LIST_SIZE (MAX_KSV_SIZE*MAX_REPEAT_COUNT) +#define DETAILED_TIMING_LEN 18 /*size of one format in edid*/ #define FORMAT_SIZE sizeof(struct edid_audio_block_t) #define EDID_DEFAULT_START 132 @@ -56,15 +57,11 @@ extern bool downstream_rp_en; void rx_set_repeater_support(bool enable); extern int rx_set_receiver_edid(unsigned char *data, int len); -extern void rx_modify_edid(unsigned char *buffer, - int len, unsigned char *addition); extern void rx_start_repeater_auth(void); -extern void rx_edid_update_audio_info(unsigned char *p_edid, - unsigned int len); extern void rx_set_repeat_signal(bool repeat); extern bool rx_set_repeat_aksv(unsigned char *data, int len, int depth, bool dev_exceed, bool cascade_exceed); - +extern unsigned char *rx_get_receiver_edid(void); extern void repeater_dwork_handle(struct work_struct *work); bool rx_set_receive_hdcp(unsigned char *data, int len, int depth, bool cas_exceed, bool devs_exceed); diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c index 092ca63..513a05d 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c @@ -1312,6 +1312,7 @@ void fsm_restart(void) rx_esm_tmdsclk_en(false); esm_set_stable(false); } + hdmirx_hw_config(); set_scdc_cfg(1, 0); vic_check_en = true; dvi_check_en = true; @@ -1967,6 +1968,7 @@ void rx_main_state_machine(void) case FSM_5V_LOST: if (rx.cur_5v_sts) rx.state = FSM_INIT; + fsm_restart(); break; case FSM_HPD_LOW: rx_set_hpd(0); diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h index d91c1d5..e7f318f 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.h @@ -18,17 +18,6 @@ #ifndef HDMI_RX_WRAPPER_H_ #define HDMI_RX_WRAPPER_H_ - -#define LOG_EN 0x01 -#define VIDEO_LOG 0x02 -#define AUDIO_LOG 0x04 -#define HDCP_LOG 0x08 -#define PACKET_LOG 0x10 -#define EQ_LOG 0x20 -#define REG_LOG 0x40 -#define ERR_LOG 0x80 -#define VSI_LOG 0x800 - /* stable_check_lvl */ #define HACTIVE_EN 0x01 #define VACTIVE_EN 0x02 |