Skip to content

Commit 38e42f6

Browse files
morimotobroonie
authored andcommitted
ASoC: expand snd_soc_dpcm_mutex_lock/unlock()
soc-pcm.c has snd_soc_dpcm_mutex_lock/unlock(), but other files can't use it because it is static function. It requests snd_soc_pcm_runtime as parameter (A), but sometimes we want to use it by snd_soc_card (B). (A) static inline void snd_soc_dpcm_mutex_lock(struct snd_soc_pcm_runtime *rtd) { mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); } ^^^^^^^^^ (B) mutex_lock_nested(&card->pcm_mutex, card->pcm_subclass); ^^^^ We want to use it with both "rtd" and "card" for dapm lock/unlock. To enable it, this patch uses _Generic macro. This patch makes snd_soc_dpcm_mutex_{un}lock() global function, and use it on each files. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Link: https://lore.kernel.org/r/87bkk1x3ud.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 4a778bd commit 38e42f6

5 files changed

Lines changed: 76 additions & 44 deletions

File tree

include/sound/soc.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,6 +1425,51 @@ static inline void _snd_soc_dapm_mutex_assert_held_d(struct snd_soc_dapm_context
14251425
struct snd_soc_card * : _snd_soc_dapm_mutex_assert_held_c, \
14261426
struct snd_soc_dapm_context * : _snd_soc_dapm_mutex_assert_held_d)(x)
14271427

1428+
/*
1429+
* PCM helper functions
1430+
*/
1431+
static inline void _snd_soc_dpcm_mutex_lock_c(struct snd_soc_card *card)
1432+
{
1433+
mutex_lock_nested(&card->pcm_mutex, card->pcm_subclass);
1434+
}
1435+
1436+
static inline void _snd_soc_dpcm_mutex_unlock_c(struct snd_soc_card *card)
1437+
{
1438+
mutex_unlock(&card->pcm_mutex);
1439+
}
1440+
1441+
static inline void _snd_soc_dpcm_mutex_assert_held_c(struct snd_soc_card *card)
1442+
{
1443+
lockdep_assert_held(&card->pcm_mutex);
1444+
}
1445+
1446+
static inline void _snd_soc_dpcm_mutex_lock_r(struct snd_soc_pcm_runtime *rtd)
1447+
{
1448+
_snd_soc_dpcm_mutex_lock_c(rtd->card);
1449+
}
1450+
1451+
static inline void _snd_soc_dpcm_mutex_unlock_r(struct snd_soc_pcm_runtime *rtd)
1452+
{
1453+
_snd_soc_dpcm_mutex_unlock_c(rtd->card);
1454+
}
1455+
1456+
static inline void _snd_soc_dpcm_mutex_assert_held_r(struct snd_soc_pcm_runtime *rtd)
1457+
{
1458+
_snd_soc_dpcm_mutex_assert_held_c(rtd->card);
1459+
}
1460+
1461+
#define snd_soc_dpcm_mutex_lock(x) _Generic((x), \
1462+
struct snd_soc_card * : _snd_soc_dpcm_mutex_lock_c, \
1463+
struct snd_soc_pcm_runtime * : _snd_soc_dpcm_mutex_lock_r)(x)
1464+
1465+
#define snd_soc_dpcm_mutex_unlock(x) _Generic((x), \
1466+
struct snd_soc_card * : _snd_soc_dpcm_mutex_unlock_c, \
1467+
struct snd_soc_pcm_runtime * : _snd_soc_dpcm_mutex_unlock_r)(x)
1468+
1469+
#define snd_soc_dpcm_mutex_assert_held(x) _Generic((x), \
1470+
struct snd_soc_card * : _snd_soc_dpcm_mutex_assert_held_c, \
1471+
struct snd_soc_pcm_runtime * : _snd_soc_dpcm_mutex_assert_held_r)(x)
1472+
14281473
#include <sound/soc-component.h>
14291474
#include <sound/soc-card.h>
14301475
#include <sound/soc-jack.h>

sound/soc/soc-component.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ int snd_soc_component_compr_get_caps(struct snd_compr_stream *cstream,
550550
struct snd_soc_component *component;
551551
int i, ret = 0;
552552

553-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
553+
snd_soc_dpcm_mutex_lock(rtd);
554554

555555
for_each_rtd_components(rtd, i, component) {
556556
if (component->driver->compress_ops &&
@@ -561,7 +561,7 @@ int snd_soc_component_compr_get_caps(struct snd_compr_stream *cstream,
561561
}
562562
}
563563

564-
mutex_unlock(&rtd->card->pcm_mutex);
564+
snd_soc_dpcm_mutex_unlock(rtd);
565565

566566
return soc_component_ret(component, ret);
567567
}
@@ -574,7 +574,7 @@ int snd_soc_component_compr_get_codec_caps(struct snd_compr_stream *cstream,
574574
struct snd_soc_component *component;
575575
int i, ret = 0;
576576

577-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
577+
snd_soc_dpcm_mutex_lock(rtd);
578578

579579
for_each_rtd_components(rtd, i, component) {
580580
if (component->driver->compress_ops &&
@@ -585,7 +585,7 @@ int snd_soc_component_compr_get_codec_caps(struct snd_compr_stream *cstream,
585585
}
586586
}
587587

588-
mutex_unlock(&rtd->card->pcm_mutex);
588+
snd_soc_dpcm_mutex_unlock(rtd);
589589

590590
return soc_component_ret(component, ret);
591591
}
@@ -638,7 +638,7 @@ int snd_soc_component_compr_copy(struct snd_compr_stream *cstream,
638638
struct snd_soc_component *component;
639639
int i, ret = 0;
640640

641-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
641+
snd_soc_dpcm_mutex_lock(rtd);
642642

643643
for_each_rtd_components(rtd, i, component) {
644644
if (component->driver->compress_ops &&
@@ -649,7 +649,7 @@ int snd_soc_component_compr_copy(struct snd_compr_stream *cstream,
649649
}
650650
}
651651

652-
mutex_unlock(&rtd->card->pcm_mutex);
652+
snd_soc_dpcm_mutex_unlock(rtd);
653653

654654
return soc_component_ret(component, ret);
655655
}

sound/soc/soc-compress.c

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ static int soc_compr_clean(struct snd_compr_stream *cstream, int rollback)
6262
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
6363
int stream = cstream->direction; /* SND_COMPRESS_xxx is same as SNDRV_PCM_STREAM_xxx */
6464

65-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
65+
snd_soc_dpcm_mutex_lock(rtd);
6666

6767
if (!rollback)
6868
snd_soc_runtime_deactivate(rtd, stream);
@@ -84,7 +84,7 @@ static int soc_compr_clean(struct snd_compr_stream *cstream, int rollback)
8484
if (!rollback)
8585
snd_soc_dapm_stream_stop(rtd, stream);
8686

87-
mutex_unlock(&rtd->card->pcm_mutex);
87+
snd_soc_dpcm_mutex_unlock(rtd);
8888

8989
snd_soc_pcm_component_pm_runtime_put(rtd, cstream, rollback);
9090

@@ -107,7 +107,7 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
107107
if (ret < 0)
108108
goto err_no_lock;
109109

110-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
110+
snd_soc_dpcm_mutex_lock(rtd);
111111

112112
ret = snd_soc_dai_compr_startup(cpu_dai, cstream);
113113
if (ret < 0)
@@ -123,7 +123,7 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
123123

124124
snd_soc_runtime_activate(rtd, stream);
125125
err:
126-
mutex_unlock(&rtd->card->pcm_mutex);
126+
snd_soc_dpcm_mutex_unlock(rtd);
127127
err_no_lock:
128128
if (ret < 0)
129129
soc_compr_clean(cstream, 1);
@@ -146,7 +146,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
146146
if (ret < 0)
147147
goto be_err;
148148

149-
mutex_lock_nested(&fe->card->pcm_mutex, fe->card->pcm_subclass);
149+
snd_soc_dpcm_mutex_lock(fe);
150150

151151
/* calculate valid and active FE <-> BE dpcms */
152152
dpcm_process_paths(fe, stream, &list, 1);
@@ -182,7 +182,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
182182
fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
183183

184184
snd_soc_runtime_activate(fe, stream);
185-
mutex_unlock(&fe->card->pcm_mutex);
185+
snd_soc_dpcm_mutex_unlock(fe);
186186

187187
mutex_unlock(&fe->card->mutex);
188188

@@ -209,7 +209,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
209209

210210
mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
211211

212-
mutex_lock_nested(&fe->card->pcm_mutex, fe->card->pcm_subclass);
212+
snd_soc_dpcm_mutex_lock(fe);
213213
snd_soc_runtime_deactivate(fe, stream);
214214

215215
fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE;
@@ -229,7 +229,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
229229

230230
dpcm_be_disconnect(fe, stream);
231231

232-
mutex_unlock(&fe->card->pcm_mutex);
232+
snd_soc_dpcm_mutex_unlock(fe);
233233

234234
snd_soc_link_compr_shutdown(cstream, 0);
235235

@@ -249,7 +249,7 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
249249
int stream = cstream->direction; /* SND_COMPRESS_xxx is same as SNDRV_PCM_STREAM_xxx */
250250
int ret;
251251

252-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
252+
snd_soc_dpcm_mutex_lock(rtd);
253253

254254
ret = snd_soc_component_compr_trigger(cstream, cmd);
255255
if (ret < 0)
@@ -269,7 +269,7 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
269269
}
270270

271271
out:
272-
mutex_unlock(&rtd->card->pcm_mutex);
272+
snd_soc_dpcm_mutex_unlock(rtd);
273273
return ret;
274274
}
275275

@@ -327,7 +327,7 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
327327
int stream = cstream->direction; /* SND_COMPRESS_xxx is same as SNDRV_PCM_STREAM_xxx */
328328
int ret;
329329

330-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
330+
snd_soc_dpcm_mutex_lock(rtd);
331331

332332
/*
333333
* First we call set_params for the CPU DAI, then the component
@@ -352,14 +352,14 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
352352

353353
/* cancel any delayed stream shutdown that is pending */
354354
rtd->pop_wait = 0;
355-
mutex_unlock(&rtd->card->pcm_mutex);
355+
snd_soc_dpcm_mutex_unlock(rtd);
356356

357357
cancel_delayed_work_sync(&rtd->delayed_work);
358358

359359
return 0;
360360

361361
err:
362-
mutex_unlock(&rtd->card->pcm_mutex);
362+
snd_soc_dpcm_mutex_unlock(rtd);
363363
return ret;
364364
}
365365

@@ -404,9 +404,9 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
404404
ret = snd_soc_link_compr_set_params(cstream);
405405
if (ret < 0)
406406
goto out;
407-
mutex_lock_nested(&fe->card->pcm_mutex, fe->card->pcm_subclass);
407+
snd_soc_dpcm_mutex_lock(fe);
408408
dpcm_dapm_stream_event(fe, stream, SND_SOC_DAPM_STREAM_START);
409-
mutex_unlock(&fe->card->pcm_mutex);
409+
snd_soc_dpcm_mutex_unlock(fe);
410410
fe->dpcm[stream].state = SND_SOC_DPCM_STATE_PREPARE;
411411

412412
out:
@@ -422,15 +422,15 @@ static int soc_compr_get_params(struct snd_compr_stream *cstream,
422422
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
423423
int ret = 0;
424424

425-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
425+
snd_soc_dpcm_mutex_lock(rtd);
426426

427427
ret = snd_soc_dai_compr_get_params(cpu_dai, cstream, params);
428428
if (ret < 0)
429429
goto err;
430430

431431
ret = snd_soc_component_compr_get_params(cstream, params);
432432
err:
433-
mutex_unlock(&rtd->card->pcm_mutex);
433+
snd_soc_dpcm_mutex_unlock(rtd);
434434
return ret;
435435
}
436436

@@ -440,15 +440,15 @@ static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
440440
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
441441
int ret;
442442

443-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
443+
snd_soc_dpcm_mutex_lock(rtd);
444444

445445
ret = snd_soc_dai_compr_ack(cpu_dai, cstream, bytes);
446446
if (ret < 0)
447447
goto err;
448448

449449
ret = snd_soc_component_compr_ack(cstream, bytes);
450450
err:
451-
mutex_unlock(&rtd->card->pcm_mutex);
451+
snd_soc_dpcm_mutex_unlock(rtd);
452452
return ret;
453453
}
454454

@@ -459,15 +459,15 @@ static int soc_compr_pointer(struct snd_compr_stream *cstream,
459459
int ret;
460460
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
461461

462-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
462+
snd_soc_dpcm_mutex_lock(rtd);
463463

464464
ret = snd_soc_dai_compr_pointer(cpu_dai, cstream, tstamp);
465465
if (ret < 0)
466466
goto out;
467467

468468
ret = snd_soc_component_compr_pointer(cstream, tstamp);
469469
out:
470-
mutex_unlock(&rtd->card->pcm_mutex);
470+
snd_soc_dpcm_mutex_unlock(rtd);
471471
return ret;
472472
}
473473

sound/soc/soc-core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ void snd_soc_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
348348
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
349349
int playback = SNDRV_PCM_STREAM_PLAYBACK;
350350

351-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
351+
snd_soc_dpcm_mutex_lock(rtd);
352352

353353
dev_dbg(rtd->dev,
354354
"ASoC: pop wq checking: %s status: %s waiting: %s\n",
@@ -364,7 +364,7 @@ void snd_soc_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
364364
SND_SOC_DAPM_STREAM_STOP);
365365
}
366366

367-
mutex_unlock(&rtd->card->pcm_mutex);
367+
snd_soc_dpcm_mutex_unlock(rtd);
368368
}
369369
EXPORT_SYMBOL_GPL(snd_soc_close_delayed_work);
370370

sound/soc/soc-pcm.c

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,6 @@ static inline int _soc_pcm_ret(struct snd_soc_pcm_runtime *rtd,
4949
return ret;
5050
}
5151

52-
static inline void snd_soc_dpcm_mutex_lock(struct snd_soc_pcm_runtime *rtd)
53-
{
54-
mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
55-
}
56-
57-
static inline void snd_soc_dpcm_mutex_unlock(struct snd_soc_pcm_runtime *rtd)
58-
{
59-
mutex_unlock(&rtd->card->pcm_mutex);
60-
}
61-
62-
#define snd_soc_dpcm_mutex_assert_held(rtd) \
63-
lockdep_assert_held(&(rtd)->card->pcm_mutex)
64-
6552
static inline void snd_soc_dpcm_stream_lock_irq(struct snd_soc_pcm_runtime *rtd,
6653
int stream)
6754
{
@@ -2664,7 +2651,7 @@ int snd_soc_dpcm_runtime_update(struct snd_soc_card *card)
26642651
struct snd_soc_pcm_runtime *fe;
26652652
int ret = 0;
26662653

2667-
mutex_lock_nested(&card->pcm_mutex, card->pcm_subclass);
2654+
snd_soc_dpcm_mutex_lock(card);
26682655
/* shutdown all old paths first */
26692656
for_each_card_rtds(card, fe) {
26702657
ret = soc_dpcm_fe_runtime_update(fe, 0);
@@ -2680,7 +2667,7 @@ int snd_soc_dpcm_runtime_update(struct snd_soc_card *card)
26802667
}
26812668

26822669
out:
2683-
mutex_unlock(&card->pcm_mutex);
2670+
snd_soc_dpcm_mutex_unlock(card);
26842671
return ret;
26852672
}
26862673
EXPORT_SYMBOL_GPL(snd_soc_dpcm_runtime_update);

0 commit comments

Comments
 (0)