apl-ssp: change and wrap status transition into ssp_stop

This will remove manual status change, wrap them into ssp_stop(),
where the status transition is protect by spin_lock.

Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
This commit is contained in:
Keyon Jie 2018-05-08 18:42:09 +08:00 committed by Liam Girdwood
parent e3f45d2770
commit 72e63a467f
1 changed files with 10 additions and 7 deletions

View File

@ -596,23 +596,27 @@ static void ssp_start(struct dai *dai, int direction)
} }
/* stop the SSP for either playback or capture */ /* stop the SSP for either playback or capture */
static void ssp_stop(struct dai *dai) static void ssp_stop(struct dai *dai, int direction)
{ {
struct ssp_pdata *ssp = dai_get_drvdata(dai); struct ssp_pdata *ssp = dai_get_drvdata(dai);
spin_lock(&ssp->lock); spin_lock(&ssp->lock);
/* stop Rx if we are not capturing */ /* stop Rx if neeed */
if (ssp->state[SOF_IPC_STREAM_CAPTURE] != COMP_STATE_ACTIVE) { if (direction == DAI_DIR_CAPTURE &&
ssp->state[SOF_IPC_STREAM_CAPTURE] == COMP_STATE_ACTIVE) {
ssp_update_bits(dai, SSCR1, SSCR1_RSRE, 0); ssp_update_bits(dai, SSCR1, SSCR1_RSRE, 0);
ssp_update_bits(dai, SSRSA, 0x1 << 8, 0x0 << 8); ssp_update_bits(dai, SSRSA, 0x1 << 8, 0x0 << 8);
ssp->state[SOF_IPC_STREAM_CAPTURE] = COMP_STATE_PAUSED;
trace_ssp("Ss0"); trace_ssp("Ss0");
} }
/* stop Tx if we are not playing */ /* stop Tx if needed */
if (ssp->state[SOF_IPC_STREAM_PLAYBACK] != COMP_STATE_ACTIVE) { if (direction == DAI_DIR_PLAYBACK &&
ssp->state[SOF_IPC_STREAM_PLAYBACK] == COMP_STATE_ACTIVE) {
ssp_update_bits(dai, SSCR1, SSCR1_TSRE, 0); ssp_update_bits(dai, SSCR1, SSCR1_TSRE, 0);
ssp_update_bits(dai, SSTSA, 0x1 << 8, 0x0 << 8); ssp_update_bits(dai, SSTSA, 0x1 << 8, 0x0 << 8);
ssp->state[SOF_IPC_STREAM_PLAYBACK] = COMP_STATE_PAUSED;
trace_ssp("Ss1"); trace_ssp("Ss1");
} }
@ -647,8 +651,7 @@ static int ssp_trigger(struct dai *dai, int cmd, int direction)
break; break;
case COMP_TRIGGER_STOP: case COMP_TRIGGER_STOP:
case COMP_TRIGGER_PAUSE: case COMP_TRIGGER_PAUSE:
ssp->state[direction] = COMP_STATE_PAUSED; ssp_stop(dai, direction);
ssp_stop(dai);
break; break;
case COMP_TRIGGER_RESUME: case COMP_TRIGGER_RESUME:
ssp_context_restore(dai); ssp_context_restore(dai);