From 06205277b8beb28b240e9ea7493e2876243a3375 Mon Sep 17 00:00:00 2001 From: Hang Cheng Date: Wed, 14 Nov 2018 16:30:17 +0800 Subject: [PATCH] hdmirx: optimize for audio fifo [1/1] PD#SWPL-2114 Problem: When change audio channel count on VG-877, the subpkts of skipped middle channels are still carried, thus causing afifo overflow Solution: When afifo overflow, then store all audio subpkts(8ch) into afifo, and output 8ch audio from afifo Verify: R321 Change-Id: I4b0933935d3a1aed20be10a7a8d3fe23c3a39323 Signed-off-by: Hang Cheng --- .../amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h | 2 +- drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c | 22 ++++++++++++++++++++++ drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.h | 1 + .../media/vin/tvin/hdmirx/hdmi_rx_wrapper.c | 6 ++++++ 4 files changed, 30 insertions(+), 1 deletion(-) 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 b51798c..d35ea36 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h @@ -46,7 +46,7 @@ * * */ -#define RX_VER2 "ver.2018/10/30" +#define RX_VER2 "ver.2018/11/14" /*print type*/ #define LOG_EN 0x01 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 7d4adbc..ee8b4f4 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c @@ -1003,6 +1003,28 @@ bool is_clk_stable(void) return false; } +void rx_afifo_store_all_subpkt(bool all_pkt) +{ + static bool flag = true; + + if (all_pkt) { + if (log_level & AUDIO_LOG) + rx_pr("afifo store all subpkts: %d\n", flag); + /* when afifo overflow, try afifo store + * configuration alternatively + */ + if (flag) + hdmirx_wr_bits_dwc(DWC_AUD_FIFO_CTRL, + AFIF_SUBPACKETS, 0); + else + hdmirx_wr_bits_dwc(DWC_AUD_FIFO_CTRL, + AFIF_SUBPACKETS, 1); + flag = !flag; + } else + hdmirx_wr_bits_dwc(DWC_AUD_FIFO_CTRL, + AFIF_SUBPACKETS, 1); +} + /* * hdmirx_audio_fifo_rst - reset afifo */ diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.h index 8c64f4e..7c7efd3 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.h @@ -1171,6 +1171,7 @@ extern void rx_hpd_to_esm_handle(struct work_struct *work); extern void rx_hdcp14_resume(void); extern void hdmirx_load_firm_reset(int type); extern unsigned int hdmirx_packet_fifo_rst(void); +extern void rx_afifo_store_all_subpkt(bool all_pkt); extern unsigned int hdmirx_audio_fifo_rst(void); extern void hdmirx_phy_init(void); extern void hdmirx_hw_config(void); 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 8cb5cc3..bcc318d 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c @@ -444,6 +444,11 @@ static int hdmi_rx_ctrl_irq_handler(void) if (log_level & 0x100) rx_pr("[irq] OVERFL\n"); rx.irq_flag |= IRQ_AUD_FLAG; + /* when afifo overflow in multi-channel case(VG-877), + * then store all subpkts into afifo, 8ch in and 8ch out + */ + if (rx.aud_info.auds_layout) + rx_afifo_store_all_subpkt(true); //if (rx.aud_info.real_sr != 0) //error |= hdmirx_audio_fifo_rst(); } @@ -2257,6 +2262,7 @@ void rx_main_state_machine(void) rx_get_audinfo(&rx.aud_info); hdmirx_config_audio(); rx_aud_pll_ctl(1); + rx_afifo_store_all_subpkt(false); hdmirx_audio_fifo_rst(); rx.stable_timestamp = rx.timestamp; rx_pr("Sig ready\n"); -- 2.7.4