Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TEST ONLY] ASoC: core: Move pcm_mutex up to card level from snd_soc_pcm_runtime #1132

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions include/sound/soc.h
Original file line number Diff line number Diff line change
Expand Up @@ -988,6 +988,10 @@ struct snd_soc_card {
struct mutex mutex;
struct mutex dapm_mutex;

/* Mutex for PCM operations */
struct mutex pcm_mutex;
enum snd_soc_pcm_subclass pcm_subclass;

spinlock_t dpcm_lock;

bool instantiated;
Expand Down Expand Up @@ -1116,8 +1120,6 @@ struct snd_soc_pcm_runtime {
struct device *dev;
struct snd_soc_card *card;
struct snd_soc_dai_link *dai_link;
struct mutex pcm_mutex;
enum snd_soc_pcm_subclass pcm_subclass;
struct snd_pcm_ops ops;

unsigned int params_select; /* currently selected param for dai link */
Expand Down
48 changes: 24 additions & 24 deletions sound/soc/soc-compress.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
Expand Down Expand Up @@ -108,7 +108,7 @@ static int soc_compr_open(struct snd_compr_stream *cstream)

snd_soc_runtime_activate(rtd, cstream->direction);

mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);

return 0;

Expand All @@ -118,7 +118,7 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
out:
mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand Down Expand Up @@ -224,7 +224,7 @@ static void close_delayed_work(struct work_struct *work)
container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
struct snd_soc_dai *codec_dai = rtd->codec_dai;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

dev_dbg(rtd->dev,
"Compress ASoC: pop wq checking: %s status: %s waiting: %s\n",
Expand All @@ -239,7 +239,7 @@ static void close_delayed_work(struct work_struct *work)
SND_SOC_DAPM_STREAM_STOP);
}

mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
}

static int soc_compr_free(struct snd_compr_stream *cstream)
Expand All @@ -249,7 +249,7 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
struct snd_soc_dai *codec_dai = rtd->codec_dai;
int stream;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

if (cstream->direction == SND_COMPRESS_PLAYBACK)
stream = SNDRV_PCM_STREAM_PLAYBACK;
Expand Down Expand Up @@ -292,7 +292,7 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
SND_SOC_DAPM_STREAM_STOP);
}

mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return 0;
}

Expand Down Expand Up @@ -375,7 +375,7 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

ret = soc_compr_components_trigger(cstream, cmd);
if (ret < 0)
Expand All @@ -394,7 +394,7 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
}

out:
mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand Down Expand Up @@ -480,7 +480,7 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

/*
* First we call set_params for the CPU DAI, then the component
Expand Down Expand Up @@ -514,14 +514,14 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,

/* cancel any delayed stream shutdown that is pending */
rtd->pop_wait = 0;
mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);

cancel_delayed_work_sync(&rtd->delayed_work);

return 0;

err:
mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand Down Expand Up @@ -593,7 +593,7 @@ static int soc_compr_get_params(struct snd_compr_stream *cstream,
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret = 0;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_params) {
ret = cpu_dai->driver->cops->get_params(cstream, params, cpu_dai);
Expand All @@ -613,7 +613,7 @@ static int soc_compr_get_params(struct snd_compr_stream *cstream,
}

err:
mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand All @@ -625,7 +625,7 @@ static int soc_compr_get_caps(struct snd_compr_stream *cstream,
struct snd_soc_rtdcom_list *rtdcom;
int ret = 0;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

for_each_rtdcom(rtd, rtdcom) {
component = rtdcom->component;
Expand All @@ -638,7 +638,7 @@ static int soc_compr_get_caps(struct snd_compr_stream *cstream,
break;
}

mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand All @@ -650,7 +650,7 @@ static int soc_compr_get_codec_caps(struct snd_compr_stream *cstream,
struct snd_soc_rtdcom_list *rtdcom;
int ret = 0;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

for_each_rtdcom(rtd, rtdcom) {
component = rtdcom->component;
Expand All @@ -664,7 +664,7 @@ static int soc_compr_get_codec_caps(struct snd_compr_stream *cstream,
break;
}

mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand All @@ -676,7 +676,7 @@ static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret = 0;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

if (cpu_dai->driver->cops && cpu_dai->driver->cops->ack) {
ret = cpu_dai->driver->cops->ack(cstream, bytes, cpu_dai);
Expand All @@ -697,7 +697,7 @@ static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
}

err:
mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand All @@ -710,7 +710,7 @@ static int soc_compr_pointer(struct snd_compr_stream *cstream,
int ret = 0;
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

if (cpu_dai->driver->cops && cpu_dai->driver->cops->pointer)
cpu_dai->driver->cops->pointer(cstream, tstamp, cpu_dai);
Expand All @@ -726,7 +726,7 @@ static int soc_compr_pointer(struct snd_compr_stream *cstream,
break;
}

mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand All @@ -738,7 +738,7 @@ static int soc_compr_copy(struct snd_compr_stream *cstream,
struct snd_soc_rtdcom_list *rtdcom;
int ret = 0;

mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);

for_each_rtdcom(rtd, rtdcom) {
component = rtdcom->component;
Expand All @@ -751,7 +751,7 @@ static int soc_compr_copy(struct snd_compr_stream *cstream,
break;
}

mutex_unlock(&rtd->pcm_mutex);
mutex_unlock(&rtd->card->pcm_mutex);
return ret;
}

Expand Down
2 changes: 1 addition & 1 deletion sound/soc/soc-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1358,7 +1358,6 @@ static int soc_post_component_init(struct snd_soc_pcm_runtime *rtd,
rtd->dev->groups = soc_dev_attr_groups;
dev_set_name(rtd->dev, "%s", name);
dev_set_drvdata(rtd->dev, rtd);
mutex_init(&rtd->pcm_mutex);
INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients);
INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].be_clients);
INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].fe_clients);
Expand Down Expand Up @@ -2381,6 +2380,7 @@ int snd_soc_register_card(struct snd_soc_card *card)
card->instantiated = 0;
mutex_init(&card->mutex);
mutex_init(&card->dapm_mutex);
mutex_init(&card->pcm_mutex);
spin_lock_init(&card->dpcm_lock);

return snd_soc_bind_card(card);
Expand Down
Loading