Skip to content

Commit 3202e2f

Browse files
committed
ASoC: Revert PCM trigger changes
These have turned up some issues in further testing. Signed-off-by: Mark Brown <[email protected]>
1 parent 52c64e5 commit 3202e2f

File tree

2 files changed

+23
-130
lines changed

2 files changed

+23
-130
lines changed

include/sound/soc-dpcm.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,6 @@ struct snd_soc_dpcm_runtime {
101101
enum snd_soc_dpcm_state state;
102102

103103
int trigger_pending; /* trigger cmd + 1 if pending, 0 if not */
104-
105-
int be_start; /* refcount protected by dpcm_lock */
106104
};
107105

108106
#define for_each_dpcm_fe(be, stream, _dpcm) \

sound/soc/soc-pcm.c

Lines changed: 23 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,7 +1534,7 @@ int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
15341534
be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
15351535
goto unwind;
15361536
}
1537-
be->dpcm[stream].be_start = 0;
1537+
15381538
be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
15391539
count++;
15401540
}
@@ -1999,9 +1999,6 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
19991999
struct snd_soc_pcm_runtime *be;
20002000
struct snd_soc_dpcm *dpcm;
20012001
int ret = 0;
2002-
unsigned long flags;
2003-
enum snd_soc_dpcm_state state;
2004-
bool do_trigger;
20052002

20062003
for_each_dpcm_be(fe, stream, dpcm) {
20072004
struct snd_pcm_substream *be_substream;
@@ -2016,180 +2013,78 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
20162013
dev_dbg(be->dev, "ASoC: trigger BE %s cmd %d\n",
20172014
be->dai_link->name, cmd);
20182015

2019-
do_trigger = false;
20202016
switch (cmd) {
20212017
case SNDRV_PCM_TRIGGER_START:
2022-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
20232018
if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
20242019
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2025-
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED)) {
2026-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2027-
continue;
2028-
}
2029-
state = be->dpcm[stream].state;
2030-
if (be->dpcm[stream].be_start == 0)
2031-
do_trigger = true;
2032-
be->dpcm[stream].be_start++;
2033-
be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2034-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2035-
2036-
if (!do_trigger)
2020+
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
20372021
continue;
20382022

20392023
ret = soc_pcm_trigger(be_substream, cmd);
2040-
if (ret) {
2041-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2042-
be->dpcm[stream].state = state;
2043-
be->dpcm[stream].be_start--;
2044-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2024+
if (ret)
20452025
goto end;
2046-
}
20472026

2027+
be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
20482028
break;
20492029
case SNDRV_PCM_TRIGGER_RESUME:
2050-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2051-
if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND) {
2052-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2053-
continue;
2054-
}
2055-
2056-
state = be->dpcm[stream].state;
2057-
if (be->dpcm[stream].be_start == 0)
2058-
do_trigger = true;
2059-
be->dpcm[stream].be_start++;
2060-
be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2061-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2062-
2063-
if (!do_trigger)
2030+
if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
20642031
continue;
20652032

20662033
ret = soc_pcm_trigger(be_substream, cmd);
2067-
if (ret) {
2068-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2069-
be->dpcm[stream].state = state;
2070-
be->dpcm[stream].be_start--;
2071-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2034+
if (ret)
20722035
goto end;
2073-
}
20742036

2037+
be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
20752038
break;
20762039
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2077-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2078-
if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) {
2079-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2080-
continue;
2081-
}
2082-
2083-
state = be->dpcm[stream].state;
2084-
if (be->dpcm[stream].be_start == 0)
2085-
do_trigger = true;
2086-
be->dpcm[stream].be_start++;
2087-
be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
2088-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2089-
2090-
if (!do_trigger)
2040+
if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
20912041
continue;
20922042

20932043
ret = soc_pcm_trigger(be_substream, cmd);
2094-
if (ret) {
2095-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2096-
be->dpcm[stream].state = state;
2097-
be->dpcm[stream].be_start--;
2098-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2044+
if (ret)
20992045
goto end;
2100-
}
21012046

2047+
be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
21022048
break;
21032049
case SNDRV_PCM_TRIGGER_STOP:
2104-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
21052050
if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) &&
2106-
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED)) {
2107-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2108-
continue;
2109-
}
2110-
if ((be->dpcm[stream].state == SND_SOC_DPCM_STATE_START &&
2111-
be->dpcm[stream].be_start == 1) ||
2112-
(be->dpcm[stream].state == SND_SOC_DPCM_STATE_PAUSED &&
2113-
be->dpcm[stream].be_start == 0))
2114-
do_trigger = true;
2115-
be->dpcm[stream].be_start--;
2116-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2117-
2118-
if (!do_trigger)
2051+
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
21192052
continue;
21202053

2121-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2122-
state = be->dpcm[stream].state;
2123-
be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2124-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2054+
if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
2055+
continue;
21252056

21262057
ret = soc_pcm_trigger(be_substream, cmd);
2127-
if (ret) {
2128-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2129-
be->dpcm[stream].state = state;
2130-
be->dpcm[stream].be_start++;
2131-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2058+
if (ret)
21322059
goto end;
2133-
}
21342060

2061+
be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
21352062
break;
21362063
case SNDRV_PCM_TRIGGER_SUSPEND:
2137-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2138-
if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) {
2139-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2064+
if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
21402065
continue;
2141-
}
2142-
if (be->dpcm[stream].be_start == 1)
2143-
do_trigger = true;
2144-
be->dpcm[stream].be_start--;
2145-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
21462066

2147-
if (!do_trigger)
2067+
if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
21482068
continue;
21492069

2150-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2151-
state = be->dpcm[stream].state;
2152-
be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
2153-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2154-
21552070
ret = soc_pcm_trigger(be_substream, cmd);
2156-
if (ret) {
2157-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2158-
be->dpcm[stream].state = state;
2159-
be->dpcm[stream].be_start++;
2160-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2071+
if (ret)
21612072
goto end;
2162-
}
21632073

2074+
be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND;
21642075
break;
21652076
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
2166-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2167-
if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) {
2168-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2077+
if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
21692078
continue;
2170-
}
2171-
if (be->dpcm[stream].be_start == 1)
2172-
do_trigger = true;
2173-
be->dpcm[stream].be_start--;
2174-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
21752079

2176-
if (!do_trigger)
2080+
if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
21772081
continue;
21782082

2179-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2180-
state = be->dpcm[stream].state;
2181-
be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
2182-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2183-
21842083
ret = soc_pcm_trigger(be_substream, cmd);
2185-
if (ret) {
2186-
spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2187-
be->dpcm[stream].state = state;
2188-
be->dpcm[stream].be_start++;
2189-
spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2084+
if (ret)
21902085
goto end;
2191-
}
21922086

2087+
be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
21932088
break;
21942089
}
21952090
}

0 commit comments

Comments
 (0)