Skip to content

Commit

Permalink
ASoC: compress/component: Use module_get_when_open/put_when_close for…
Browse files Browse the repository at this point in the history
… 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 <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
ujfalusi authored and broonie committed Sep 20, 2021
1 parent a739fdc commit cd46f38
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 33 deletions.
6 changes: 4 additions & 2 deletions include/sound/soc-component.h
Original file line number Diff line number Diff line change
Expand Up @@ -453,8 +453,10 @@ int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
int snd_soc_component_of_xlate_dai_name(struct snd_soc_component *component,
const struct of_phandle_args *args,
const char **dai_name);
int snd_soc_component_compr_open(struct snd_compr_stream *cstream);
void snd_soc_component_compr_free(struct snd_compr_stream *cstream,
int snd_soc_component_compr_open(struct snd_soc_component *component,
struct snd_compr_stream *cstream);
void snd_soc_component_compr_free(struct snd_soc_component *component,
struct snd_compr_stream *cstream,
int rollback);
int snd_soc_component_compr_trigger(struct snd_compr_stream *cstream, int cmd);
int snd_soc_component_compr_set_params(struct snd_compr_stream *cstream,
Expand Down
45 changes: 19 additions & 26 deletions sound/soc/soc-component.c
Original file line number Diff line number Diff line change
Expand Up @@ -423,43 +423,36 @@ EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);

#endif

int snd_soc_component_compr_open(struct snd_compr_stream *cstream)
int snd_soc_component_compr_open(struct snd_soc_component *component,
struct snd_compr_stream *cstream)
{
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
struct snd_soc_component *component;
int i, ret;
int ret = 0;

for_each_rtd_components(rtd, i, component) {
if (component->driver->compress_ops &&
component->driver->compress_ops->open) {
ret = component->driver->compress_ops->open(component, cstream);
if (ret < 0)
return soc_component_ret(component, ret);
}
if (component->driver->compress_ops &&
component->driver->compress_ops->open)
ret = component->driver->compress_ops->open(component, cstream);

/* mark substream if succeeded */
if (ret == 0)
soc_component_mark_push(component, cstream, compr_open);
}

return 0;
return soc_component_ret(component, ret);
}
EXPORT_SYMBOL_GPL(snd_soc_component_compr_open);

void snd_soc_component_compr_free(struct snd_compr_stream *cstream,
void snd_soc_component_compr_free(struct snd_soc_component *component,
struct snd_compr_stream *cstream,
int rollback)
{
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
struct snd_soc_component *component;
int i;

for_each_rtd_components(rtd, i, component) {
if (rollback && !soc_component_mark_match(component, cstream, compr_open))
continue;
if (rollback && !soc_component_mark_match(component, cstream, compr_open))
return;

if (component->driver->compress_ops &&
component->driver->compress_ops->free)
component->driver->compress_ops->free(component, cstream);
if (component->driver->compress_ops &&
component->driver->compress_ops->free)
component->driver->compress_ops->free(component, cstream);

soc_component_mark_pop(component, cstream, compr_open);
}
/* remove marked substream */
soc_component_mark_pop(component, cstream, compr_open);
}
EXPORT_SYMBOL_GPL(snd_soc_component_compr_free);

Expand Down
43 changes: 38 additions & 5 deletions sound/soc/soc-compress.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,39 @@
#include <sound/soc-link.h>
#include <linux/pm_runtime.h>

static int snd_soc_compr_components_open(struct snd_compr_stream *cstream)
{
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
struct snd_soc_component *component;
int ret = 0;
int i;

for_each_rtd_components(rtd, i, component) {
ret = snd_soc_component_module_get_when_open(component, cstream);
if (ret < 0)
break;

ret = snd_soc_component_compr_open(component, cstream);
if (ret < 0)
break;
}

return ret;
}

static void snd_soc_compr_components_free(struct snd_compr_stream *cstream,
int rollback)
{
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
struct snd_soc_component *component;
int i;

for_each_rtd_components(rtd, i, component) {
snd_soc_component_compr_free(component, cstream, rollback);
snd_soc_component_module_put_when_close(component, cstream, rollback);
}
}

static int soc_compr_clean(struct snd_compr_stream *cstream, int rollback)
{
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
Expand All @@ -44,7 +77,7 @@ static int soc_compr_clean(struct snd_compr_stream *cstream, int rollback)

snd_soc_link_compr_shutdown(cstream, rollback);

snd_soc_component_compr_free(cstream, rollback);
snd_soc_compr_components_free(cstream, rollback);

snd_soc_dai_compr_shutdown(cpu_dai, cstream, rollback);

Expand Down Expand Up @@ -80,7 +113,7 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
if (ret < 0)
goto err;

ret = snd_soc_component_compr_open(cstream);
ret = snd_soc_compr_components_open(cstream);
if (ret < 0)
goto err;

Expand Down Expand Up @@ -137,7 +170,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
if (ret < 0)
goto out;

ret = snd_soc_component_compr_open(cstream);
ret = snd_soc_compr_components_open(cstream);
if (ret < 0)
goto open_err;

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

machine_err:
snd_soc_component_compr_free(cstream, 1);
snd_soc_compr_components_free(cstream, 1);
open_err:
snd_soc_dai_compr_shutdown(cpu_dai, cstream, 1);
out:
Expand Down Expand Up @@ -205,7 +238,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)

snd_soc_link_compr_shutdown(cstream, 0);

snd_soc_component_compr_free(cstream, 0);
snd_soc_compr_components_free(cstream, 0);

snd_soc_dai_compr_shutdown(cpu_dai, cstream, 0);

Expand Down

0 comments on commit cd46f38

Please sign in to comment.