@@ -1999,6 +1999,8 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
1999
1999
struct snd_soc_pcm_runtime * be ;
2000
2000
struct snd_soc_dpcm * dpcm ;
2001
2001
int ret = 0 ;
2002
+ unsigned long flags ;
2003
+ enum snd_soc_dpcm_state state ;
2002
2004
2003
2005
for_each_dpcm_be (fe , stream , dpcm ) {
2004
2006
struct snd_pcm_substream * be_substream ;
@@ -2015,76 +2017,141 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
2015
2017
2016
2018
switch (cmd ) {
2017
2019
case SNDRV_PCM_TRIGGER_START :
2020
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2018
2021
if ((be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_PREPARE ) &&
2019
2022
(be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_STOP ) &&
2020
- (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_PAUSED ))
2023
+ (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_PAUSED )) {
2024
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2021
2025
continue ;
2026
+ }
2027
+ state = be -> dpcm [stream ].state ;
2028
+ be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_START ;
2029
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2022
2030
2023
2031
ret = soc_pcm_trigger (be_substream , cmd );
2024
- if (ret )
2032
+ if (ret ) {
2033
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2034
+ be -> dpcm [stream ].state = state ;
2035
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2025
2036
goto end ;
2037
+ }
2026
2038
2027
- be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_START ;
2028
2039
break ;
2029
2040
case SNDRV_PCM_TRIGGER_RESUME :
2030
- if ((be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_SUSPEND ))
2041
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2042
+ if (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_SUSPEND ) {
2043
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2031
2044
continue ;
2045
+ }
2046
+
2047
+ state = be -> dpcm [stream ].state ;
2048
+ be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_START ;
2049
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2032
2050
2033
2051
ret = soc_pcm_trigger (be_substream , cmd );
2034
- if (ret )
2052
+ if (ret ) {
2053
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2054
+ be -> dpcm [stream ].state = state ;
2055
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2035
2056
goto end ;
2057
+ }
2036
2058
2037
- be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_START ;
2038
2059
break ;
2039
2060
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE :
2040
- if ((be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_PAUSED ))
2061
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2062
+ if (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_PAUSED ) {
2063
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2041
2064
continue ;
2065
+ }
2066
+
2067
+ state = be -> dpcm [stream ].state ;
2068
+ be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_START ;
2069
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2042
2070
2043
2071
ret = soc_pcm_trigger (be_substream , cmd );
2044
- if (ret )
2072
+ if (ret ) {
2073
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2074
+ be -> dpcm [stream ].state = state ;
2075
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2045
2076
goto end ;
2077
+ }
2046
2078
2047
- be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_START ;
2048
2079
break ;
2049
2080
case SNDRV_PCM_TRIGGER_STOP :
2081
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2050
2082
if ((be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_START ) &&
2051
- (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_PAUSED ))
2083
+ (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_PAUSED )) {
2084
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2052
2085
continue ;
2086
+ }
2087
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2053
2088
2054
2089
if (!snd_soc_dpcm_can_be_free_stop (fe , be , stream ))
2055
2090
continue ;
2056
2091
2092
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2093
+ state = be -> dpcm [stream ].state ;
2094
+ be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_STOP ;
2095
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2096
+
2057
2097
ret = soc_pcm_trigger (be_substream , cmd );
2058
- if (ret )
2098
+ if (ret ) {
2099
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2100
+ be -> dpcm [stream ].state = state ;
2101
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2059
2102
goto end ;
2103
+ }
2060
2104
2061
- be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_STOP ;
2062
2105
break ;
2063
2106
case SNDRV_PCM_TRIGGER_SUSPEND :
2064
- if (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_START )
2107
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2108
+ if (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_START ) {
2109
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2065
2110
continue ;
2111
+ }
2112
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2066
2113
2067
2114
if (!snd_soc_dpcm_can_be_free_stop (fe , be , stream ))
2068
2115
continue ;
2069
2116
2117
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2118
+ state = be -> dpcm [stream ].state ;
2119
+ be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_STOP ;
2120
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2121
+
2070
2122
ret = soc_pcm_trigger (be_substream , cmd );
2071
- if (ret )
2123
+ if (ret ) {
2124
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2125
+ be -> dpcm [stream ].state = state ;
2126
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2072
2127
goto end ;
2128
+ }
2073
2129
2074
- be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_SUSPEND ;
2075
2130
break ;
2076
2131
case SNDRV_PCM_TRIGGER_PAUSE_PUSH :
2077
- if (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_START )
2132
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2133
+ if (be -> dpcm [stream ].state != SND_SOC_DPCM_STATE_START ) {
2134
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2078
2135
continue ;
2136
+ }
2137
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2079
2138
2080
2139
if (!snd_soc_dpcm_can_be_free_stop (fe , be , stream ))
2081
2140
continue ;
2082
2141
2142
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2143
+ state = be -> dpcm [stream ].state ;
2144
+ be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_PAUSED ;
2145
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2146
+
2083
2147
ret = soc_pcm_trigger (be_substream , cmd );
2084
- if (ret )
2148
+ if (ret ) {
2149
+ spin_lock_irqsave (& fe -> card -> dpcm_lock , flags );
2150
+ be -> dpcm [stream ].state = state ;
2151
+ spin_unlock_irqrestore (& fe -> card -> dpcm_lock , flags );
2085
2152
goto end ;
2153
+ }
2086
2154
2087
- be -> dpcm [stream ].state = SND_SOC_DPCM_STATE_PAUSED ;
2088
2155
break ;
2089
2156
}
2090
2157
}
0 commit comments