Skip to content

Commit e92a9ce

Browse files
committed
ASoC: compress/component: Use module_get_when_open/put_when_close for cstream
Currently the try_module_get() and module_put() is not possible for compressed streams if the module_get_upon_open is set to 1 which means that\ the components are not protected in a same way as components when normal audio is used. SOF is setting module_get_upon_open to 1 for component drivers which works correctly for audio stream but when compressed stream is used then the module is not protected. Convert the compress open and free operation to mimic the steps of it's pcm counterpart to fix this issue. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
1 parent 36b831f commit e92a9ce

3 files changed

Lines changed: 61 additions & 33 deletions

File tree

include/sound/soc-component.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -453,8 +453,10 @@ int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
453453
int snd_soc_component_of_xlate_dai_name(struct snd_soc_component *component,
454454
const struct of_phandle_args *args,
455455
const char **dai_name);
456-
int snd_soc_component_compr_open(struct snd_compr_stream *cstream);
457-
void snd_soc_component_compr_free(struct snd_compr_stream *cstream,
456+
int snd_soc_component_compr_open(struct snd_soc_component *component,
457+
struct snd_compr_stream *cstream);
458+
void snd_soc_component_compr_free(struct snd_soc_component *component,
459+
struct snd_compr_stream *cstream,
458460
int rollback);
459461
int snd_soc_component_compr_trigger(struct snd_compr_stream *cstream, int cmd);
460462
int snd_soc_component_compr_set_params(struct snd_compr_stream *cstream,

sound/soc/soc-component.c

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -423,43 +423,36 @@ EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);
423423

424424
#endif
425425

426-
int snd_soc_component_compr_open(struct snd_compr_stream *cstream)
426+
int snd_soc_component_compr_open(struct snd_soc_component *component,
427+
struct snd_compr_stream *cstream)
427428
{
428-
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
429-
struct snd_soc_component *component;
430-
int i, ret;
429+
int ret = 0;
431430

432-
for_each_rtd_components(rtd, i, component) {
433-
if (component->driver->compress_ops &&
434-
component->driver->compress_ops->open) {
435-
ret = component->driver->compress_ops->open(component, cstream);
436-
if (ret < 0)
437-
return soc_component_ret(component, ret);
438-
}
431+
if (component->driver->compress_ops &&
432+
component->driver->compress_ops->open)
433+
ret = component->driver->compress_ops->open(component, cstream);
434+
435+
/* mark substream if succeeded */
436+
if (ret == 0)
439437
soc_component_mark_push(component, cstream, compr_open);
440-
}
441438

442-
return 0;
439+
return soc_component_ret(component, ret);
443440
}
444441
EXPORT_SYMBOL_GPL(snd_soc_component_compr_open);
445442

446-
void snd_soc_component_compr_free(struct snd_compr_stream *cstream,
443+
void snd_soc_component_compr_free(struct snd_soc_component *component,
444+
struct snd_compr_stream *cstream,
447445
int rollback)
448446
{
449-
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
450-
struct snd_soc_component *component;
451-
int i;
452-
453-
for_each_rtd_components(rtd, i, component) {
454-
if (rollback && !soc_component_mark_match(component, cstream, compr_open))
455-
continue;
447+
if (rollback && !soc_component_mark_match(component, cstream, compr_open))
448+
return;
456449

457-
if (component->driver->compress_ops &&
458-
component->driver->compress_ops->free)
459-
component->driver->compress_ops->free(component, cstream);
450+
if (component->driver->compress_ops &&
451+
component->driver->compress_ops->free)
452+
component->driver->compress_ops->free(component, cstream);
460453

461-
soc_component_mark_pop(component, cstream, compr_open);
462-
}
454+
/* remove marked substream */
455+
soc_component_mark_pop(component, cstream, compr_open);
463456
}
464457
EXPORT_SYMBOL_GPL(snd_soc_component_compr_free);
465458

sound/soc/soc-compress.c

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,39 @@
2222
#include <sound/soc-link.h>
2323
#include <linux/pm_runtime.h>
2424

25+
static int snd_soc_compr_components_open(struct snd_compr_stream *cstream)
26+
{
27+
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
28+
struct snd_soc_component *component;
29+
int ret = 0;
30+
int i;
31+
32+
for_each_rtd_components(rtd, i, component) {
33+
ret = snd_soc_component_module_get_when_open(component, cstream);
34+
if (ret < 0)
35+
break;
36+
37+
ret = snd_soc_component_compr_open(component, cstream);
38+
if (ret < 0)
39+
break;
40+
}
41+
42+
return ret;
43+
}
44+
45+
static void snd_soc_compr_components_free(struct snd_compr_stream *cstream,
46+
int rollback)
47+
{
48+
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
49+
struct snd_soc_component *component;
50+
int i;
51+
52+
for_each_rtd_components(rtd, i, component) {
53+
snd_soc_component_compr_free(component, cstream, rollback);
54+
snd_soc_component_module_put_when_close(component, cstream, rollback);
55+
}
56+
}
57+
2558
static int soc_compr_clean(struct snd_compr_stream *cstream, int rollback)
2659
{
2760
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
@@ -44,7 +77,7 @@ static int soc_compr_clean(struct snd_compr_stream *cstream, int rollback)
4477

4578
snd_soc_link_compr_shutdown(cstream, rollback);
4679

47-
snd_soc_component_compr_free(cstream, rollback);
80+
snd_soc_compr_components_free(cstream, rollback);
4881

4982
snd_soc_dai_compr_shutdown(cpu_dai, cstream, rollback);
5083

@@ -80,7 +113,7 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
80113
if (ret < 0)
81114
goto err;
82115

83-
ret = snd_soc_component_compr_open(cstream);
116+
ret = snd_soc_compr_components_open(cstream);
84117
if (ret < 0)
85118
goto err;
86119

@@ -137,7 +170,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
137170
if (ret < 0)
138171
goto out;
139172

140-
ret = snd_soc_component_compr_open(cstream);
173+
ret = snd_soc_compr_components_open(cstream);
141174
if (ret < 0)
142175
goto open_err;
143176

@@ -160,7 +193,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
160193
return 0;
161194

162195
machine_err:
163-
snd_soc_component_compr_free(cstream, 1);
196+
snd_soc_compr_components_free(cstream, 1);
164197
open_err:
165198
snd_soc_dai_compr_shutdown(cpu_dai, cstream, 1);
166199
out:
@@ -205,7 +238,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
205238

206239
snd_soc_link_compr_shutdown(cstream, 0);
207240

208-
snd_soc_component_compr_free(cstream, 0);
241+
snd_soc_compr_components_free(cstream, 0);
209242

210243
snd_soc_dai_compr_shutdown(cpu_dai, cstream, 0);
211244

0 commit comments

Comments
 (0)