Skip to content

Commit dcc6149

Browse files
committed
ssp: clear out FIFO stale samples
Reads SSP FIFO to clear out stale samples. Signed-off-by: Tomasz Lauda <tomasz.lauda@linux.intel.com>
1 parent c4a9cca commit dcc6149

1 file changed

Lines changed: 29 additions & 0 deletions

File tree

src/drivers/apl-ssp.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
6591
static 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

Comments
 (0)