[Sound-open-firmware] [PATCH] byt-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> --- src/drivers/byt-ssp.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/drivers/byt-ssp.c b/src/drivers/byt-ssp.c index 758f211..fcde98f 100644 --- a/src/drivers/byt-ssp.c +++ b/src/drivers/byt-ssp.c @@ -504,20 +504,22 @@ static void ssp_start(struct dai *dai, int direction) } /* 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); spin_lock(&ssp->lock); - /* stop Rx if we are not capturing */ - if (ssp->state[SOF_IPC_STREAM_CAPTURE] != COMP_STATE_ACTIVE) { + /* stop Rx if neeed */ + if (direction == DAI_DIR_CAPTURE && + ssp->state[SOF_IPC_STREAM_CAPTURE] == COMP_STATE_ACTIVE) { ssp_update_bits(dai, SSCR1, SSCR1_RSRE, 0); trace_ssp("Ss0"); } - /* stop Tx if we are not playing */ - if (ssp->state[SOF_IPC_STREAM_PLAYBACK] != COMP_STATE_ACTIVE) { + /* stop Tx if needed */ + if (direction == DAI_DIR_PLAYBACK && + ssp->state[SOF_IPC_STREAM_PLAYBACK] == COMP_STATE_ACTIVE) { ssp_update_bits(dai, SSCR1, SSCR1_TSRE, 0); trace_ssp("Ss1"); } @@ -553,8 +555,7 @@ static int ssp_trigger(struct dai *dai, int cmd, int direction) break; case COMP_TRIGGER_STOP: case COMP_TRIGGER_PAUSE: - ssp->state[direction] = COMP_STATE_PAUSED; - ssp_stop(dai); + ssp_stop(dai, direction); break; case COMP_TRIGGER_RESUME: ssp_context_restore(dai); -- 2.14.1
On 5/8/18 5:48 AM, Keyon Jie wrote:
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> --- src/drivers/byt-ssp.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/drivers/byt-ssp.c b/src/drivers/byt-ssp.c index 758f211..fcde98f 100644 --- a/src/drivers/byt-ssp.c +++ b/src/drivers/byt-ssp.c @@ -504,20 +504,22 @@ static void ssp_start(struct dai *dai, int direction) }
/* 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);
spin_lock(&ssp->lock);
- /* stop Rx if we are not capturing */ - if (ssp->state[SOF_IPC_STREAM_CAPTURE] != COMP_STATE_ACTIVE) { + /* stop Rx if neeed */ + if (direction == DAI_DIR_CAPTURE && + ssp->state[SOF_IPC_STREAM_CAPTURE] == COMP_STATE_ACTIVE) { ssp_update_bits(dai, SSCR1, SSCR1_RSRE, 0); trace_ssp("Ss0"); }
- /* stop Tx if we are not playing */ - if (ssp->state[SOF_IPC_STREAM_PLAYBACK] != COMP_STATE_ACTIVE) { + /* stop Tx if needed */ + if (direction == DAI_DIR_PLAYBACK && + ssp->state[SOF_IPC_STREAM_PLAYBACK] == COMP_STATE_ACTIVE) { ssp_update_bits(dai, SSCR1, SSCR1_TSRE, 0); trace_ssp("Ss1"); } @@ -553,8 +555,7 @@ static int ssp_trigger(struct dai *dai, int cmd, int direction) break; case COMP_TRIGGER_STOP: case COMP_TRIGGER_PAUSE: - ssp->state[direction] = COMP_STATE_PAUSED;
so where is the state changed now?
- ssp_stop(dai); + ssp_stop(dai, direction);
after all this, ssp->state[direction] is still COMP_STATE_ACTIVE -> something's weird or missing.
break; case COMP_TRIGGER_RESUME: ssp_context_restore(dai);
participants (2)
-
Keyon Jie -
Pierre-Louis Bossart