@@ -61,6 +61,32 @@ static int hweight_32(uint32_t mask)
6161 return count ;
6262}
6363
64+ /* empty SSP receive FIFO */
65+ static void ssp_empty_rx_fifo (struct dai * dai )
66+ {
67+ struct ssp_pdata * ssp = dai_get_drvdata (dai );
68+ uint32_t sssr ;
69+ uint32_t entries ;
70+ uint32_t i ;
71+
72+ spin_lock (& ssp -> lock );
73+
74+ sssr = ssp_read (dai , SSSR );
75+
76+ /* clear interrupt */
77+ if (sssr & SSSR_ROR )
78+ ssp_write (dai , SSSR , sssr );
79+
80+ /* empty fifo */
81+ if (sssr & SSSR_RNE ) {
82+ entries = (ssp_read (dai , SSCR3 ) & SSCR3_RFL_MASK ) >> 8 ;
83+ for (i = 0 ; i < entries + 1 ; i ++ )
84+ ssp_read (dai , SSDR );
85+ }
86+
87+ spin_unlock (& ssp -> lock );
88+ }
89+
6490/* save SSP context prior to entering D3 */
6591static int ssp_context_store (struct dai * dai )
6692{
@@ -657,6 +683,7 @@ static void ssp_stop(struct dai *dai, int direction)
657683 ssp -> state [SOF_IPC_STREAM_CAPTURE ] == COMP_STATE_ACTIVE ) {
658684 ssp_update_bits (dai , SSCR1 , SSCR1_RSRE , 0 );
659685 ssp_update_bits (dai , SSRSA , 0x1 << 8 , 0x0 << 8 );
686+ ssp_empty_rx_fifo (dai );
660687 ssp -> state [SOF_IPC_STREAM_CAPTURE ] = COMP_STATE_PAUSED ;
661688 trace_ssp ("Ss0" );
662689 }
@@ -747,6 +774,8 @@ static int ssp_probe(struct dai *dai)
747774 platform_interrupt_unmask (ssp_irq (dai ), 1 );
748775 interrupt_enable (ssp_irq (dai ));
749776
777+ ssp_empty_rx_fifo (dai );
778+
750779 return 0 ;
751780}
752781
0 commit comments