BACKPORT: ASoC: soc-pcm: Get all BEs along DAPM path

dpcm_end_walk_at_be() stops the graph walk when first BE is found for
the given FE component. In a component model we may want to connect
multiple DAIs from different components. A new flag is introduced in
'snd_soc_card', which when set allows DAI/component chaining. Later
PCM operations can be called for all these listed components for a
valid DAPM path.

Signed-off-by: Sameer Pujar <spujar@nvidia.com>
Link:
https://lore.kernel.org/r/1604329814-24779-3-git-send-email-spujar@nvidia.com
Signed-off-by: Mark Brown <broonie@kernel.org>

Bug: 198732156
(cherry picked from commit aa293777bfeb75fb8872565ef99cc0e8b98b5c7d)

[ refactored to avoid breaking KMI ]
ALSA machine driver can setup component_chaining like below code slice.

static int my_board_late_probe(struct snd_soc_card *card)
{
	struct snd_soc_card_ext *card_ext =
		container_of(card, struct snd_soc_card_ext, card);

	card_ext->component_chaining = 1;

	return 0;
}

static struct snd_soc_card my_board_card = {
	.name = MY_BOARD_NAME,
	.owner = THIS_MODULE,
	.dai_link = my_board_dai_links,
	.num_links = ARRAY_SIZE(my_board_dai_links),
	.late_probe = my_board_late_probe,
};

Change-Id: Icc9e9b120e721a620f7c9f49515342422f80edb7
Signed-off-by: Bicycle Tsai <bicycle.tsai@mediatek.com>
This commit is contained in:
Bicycle Tsai
2021-09-06 11:50:47 +08:00
committed by Bicycle Tsai
parent de7ca5e752
commit c82dbcbec1
3 changed files with 19 additions and 1 deletions

View File

@@ -1105,6 +1105,12 @@ struct snd_soc_card {
ANDROID_KABI_RESERVE(3);
ANDROID_KABI_RESERVE(4);
};
struct snd_soc_card_ext {
struct snd_soc_card card;
unsigned int component_chaining:1;
};
#define for_each_card_prelinks(card, i, link) \
for ((i) = 0; \
((i) < (card)->num_links) && ((link) = &(card)->dai_link[i]); \

View File

@@ -2175,9 +2175,17 @@ EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
*/
int snd_soc_register_card(struct snd_soc_card *card)
{
struct snd_soc_card_ext *card_ext;
if (!card->name || !card->dev)
return -EINVAL;
card_ext = devm_kzalloc(card->dev,
sizeof(struct snd_soc_card_ext), GFP_KERNEL);
memcpy(&card_ext->card, card, sizeof(struct snd_soc_card));
card = &card_ext->card;
dev_set_drvdata(card->dev, card);
INIT_LIST_HEAD(&card->widgets);

View File

@@ -1274,6 +1274,7 @@ int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
int stream, struct snd_soc_dapm_widget_list **list)
{
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(fe, 0);
struct snd_soc_card_ext *card_ext;
int paths;
if (fe->num_cpus > 1) {
@@ -1282,9 +1283,12 @@ int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
return -EINVAL;
}
card_ext = container_of(fe->card, struct snd_soc_card_ext, card);
/* get number of valid DAI paths and their widgets */
paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, list,
dpcm_end_walk_at_be);
card_ext->component_chaining ?
NULL : dpcm_end_walk_at_be);
dev_dbg(fe->dev, "ASoC: found %d audio %s paths\n", paths,
stream ? "capture" : "playback");