hdmirx: add afifo threshold pass status for audio
authorHang Cheng <hang.cheng@amlogic.com>
Wed, 27 Jun 2018 08:26:07 +0000 (16:26 +0800)
committerYixun Lan <yixun.lan@amlogic.com>
Wed, 4 Jul 2018 10:18:22 +0000 (03:18 -0700)
PD#168492: hdmirx: add afifo threshold pass status for audio
when HDMI in,audio will check the fifo empty count to see
if the hdmirx fifo is empty,then audio hal will mute the dirty data
to avoid noise.

Change-Id: I37e19d1490c560ca9fb38ffa2c3c03793e81c9ae
Signed-off-by: Hang Cheng <hang.cheng@amlogic.com>
drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c
drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.h
include/linux/amlogic/media/frame_provider/tvin/tvin.h
sound/soc/amlogic/meson/tv.c

index 2ebda5bf83bb1e3518615d6e063b619fe0597032..3ee1ab0fa006ebce44fa726b145b528d0c2c741b 100644 (file)
@@ -746,6 +746,9 @@ void rx_get_audio_status(struct rx_audio_stat_s *aud_sts)
                aud_sts->aud_sr = rx.aud_info.real_sr;
                aud_sts->aud_channel_cnt = rx.aud_info.channel_count;
                aud_sts->aud_type = rx.aud_info.coding_type;
+               aud_sts->afifo_thres_pass =
+                       ((hdmirx_rd_dwc(DWC_AUD_FIFO_STS) &
+                       THS_PASS_STS) == 0) ? false : true;
        } else {
                memset(aud_sts, 0,
                        sizeof(struct rx_audio_stat_s));
index 021d298a28e6f18017a9939f1e92ee682ce85336..d70df95dfa0b849b8e76ec47eb933ee8239564ea 100644 (file)
 #define DWC_AUD_PAO_CTRL         (0x264UL)
 /** Register address: audio FIFO status */
 #define DWC_AUD_FIFO_STS         (0x27CUL)
-       #define OVERFL_STS              _BIT(4)
-       #define UNDERFL_STS             _BIT(3)
+#define OVERFL_STS _BIT(4)
+#define UNDERFL_STS _BIT(3)
+#define THS_PASS_STS _BIT(2)
 
 #define DWC_AUDPLL_GEN_CTS       (0x280UL)
 #define DWC_AUDPLL_GEN_N         (0x284UL)
index 2a1735a106a285a8c3e1eba6ae0cf1399cdd3677..2984c50e2e116bf29ed9e8dfb01c32719e80526a 100644 (file)
@@ -480,6 +480,8 @@ struct rx_audio_stat_s {
        /*10: Dolby Digital Plus, 11: DTS-HD,*/
        /*12: MAT (MLP), 13: DST, 14: WMA Pro*/
        int aud_type;
+       /* indicate if audio fifo start threshold is crossed */
+       bool afifo_thres_pass;
 };
 
 extern int adc_set_pll_cntl(bool on, unsigned int module_sel, void *pDtvPara);
index 4e88609cd0a7a2cf1e3a0cb15332a4ae45e0a741..69fd5ef4943daf492b03b6b6b73953abea69df54 100644 (file)
 #define AML_EQ_PARAM_LENGTH 100
 #define AML_DRC_PARAM_LENGTH 12
 #define AML_REG_BYTES 4
+#ifdef CONFIG_AMLOGIC_MEDIA_TVIN_HDMI
+static int hdmiin_fifo_disable_count;
+
+/* copy from drivers/amlogic/tvin/hdmirx/hdmirx_drv.h */
+struct hdmi_in_audio_status {
+       /*audio packets received*/
+       bool aud_rcv_flag;
+       /*audio stable status*/
+       bool aud_stb_flag;
+       /*audio sample rate*/
+       int aud_sr;
+       /*audio channel count*/
+       /*0: refer to stream header,*/
+       /*1: 2ch, 2: 3ch, 3: 4ch, 4: 5ch,*/
+       /*5: 6ch, 6: 7ch, 7: 8ch*/
+       int aud_channel_cnt;
+       /*audio coding type*/
+       /*0: refer to stream header, 1: IEC60958 PCM,*/
+       /*2: AC-3, 3: MPEG1 (Layers 1 and 2),*/
+       /*4: MP3 (MPEG1 Layer 3), 5: MPEG2 (multichannel),*/
+       /*6: AAC, 7: DTS, 8: ATRAC, 9: One Bit Audio,*/
+       /*10: Dolby Digital Plus, 11: DTS-HD,*/
+       /*12: MAT (MLP), 13: DST, 14: WMA Pro*/
+       int aud_type;
+       /* indicate if audio FIFO start threshold is crossed */
+       bool afifo_thres_pass;
+};
 
+#endif
 static u32 aml_EQ_table[AML_EQ_PARAM_LENGTH] = {
        /*channel 1 param*/
        0x800000, 0x00, 0x00, 0x00, 0x00, /*eq_ch1_coef0*/
@@ -224,6 +252,22 @@ static int aml_spdif_audio_type_get_enum(
                        break;
                }
        }
+       /* HDMI in,also check the hdmirx  fifo status*/
+#ifdef CONFIG_AMLOGIC_MEDIA_TVIN_HDMI
+       if (audio_in_source == 2) {
+               struct hdmi_in_audio_status aud_sts;
+               struct rx_audio_stat_s *rx_aud_sts;
+
+               rx_aud_sts = (struct rx_audio_stat_s *)&aud_sts;
+               rx_get_audio_status(rx_aud_sts);
+               if (aud_sts.afifo_thres_pass == true)
+                       hdmiin_fifo_disable_count = 0;
+               else
+                       hdmiin_fifo_disable_count++;
+               if (hdmiin_fifo_disable_count > 200)
+                       audio_type = 6/*PAUSE*/;
+       }
+#endif
        ucontrol->value.enumerated.item[0] = audio_type;
 
        return 0;
@@ -480,28 +524,7 @@ static int aml_get_atmos_audio_edid(struct snd_kcontrol *kcontrol,
        ucontrol->value.integer.value[0] = p_aml_audio->atmos_edid_enable;
        return 0;
 }
-/* copy from drivers/amlogic/tvin/hdmirx/hdmirx_drv.h */
-struct hdmi_in_audio_status {
-       /*audio packets received*/
-       bool aud_rcv_flag;
-       /*audio stable status*/
-       bool aud_stb_flag;
-       /*audio sample rate*/
-       int aud_sr;
-       /*audio channel count*/
-       /*0: refer to stream header,*/
-       /*1: 2ch, 2: 3ch, 3: 4ch, 4: 5ch,*/
-       /*5: 6ch, 6: 7ch, 7: 8ch*/
-       int aud_channel_cnt;
-       /*audio coding type*/
-       /*0: refer to stream header, 1: IEC60958 PCM,*/
-       /*2: AC-3, 3: MPEG1 (Layers 1 and 2),*/
-       /*4: MP3 (MPEG1 Layer 3), 5: MPEG2 (multichannel),*/
-       /*6: AAC, 7: DTS, 8: ATRAC, 9: One Bit Audio,*/
-       /*10: Dolby Digital Plus, 11: DTS-HD,*/
-       /*12: MAT (MLP), 13: DST, 14: WMA Pro*/
-       int aud_type;
-};
+;
 static const char *const hdmi_in_is_stable[] = {
        "false",
        "true"