Skip to content

Commit 13b24f8

Browse files
vijendarmukundabroonie
authored andcommitted
ASoC: sdw_utils/intel: move soundwire endpoint parsing helper functions
Move SoundWire endpoint parsing helper functions to common place holder. These functions will be used by other platform machine driver code. Signed-off-by: Vijendar Mukunda <[email protected]> Reviewed-by: Bard Liao <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 7860df5 commit 13b24f8

File tree

3 files changed

+171
-158
lines changed

3 files changed

+171
-158
lines changed

include/sound/soc_sdw_utils.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,16 @@ int asoc_sdw_init_simple_dai_link(struct device *dev, struct snd_soc_dai_link *d
161161
int (*init)(struct snd_soc_pcm_runtime *rtd),
162162
const struct snd_soc_ops *ops);
163163

164+
int asoc_sdw_count_sdw_endpoints(struct snd_soc_card *card, int *num_devs, int *num_ends);
165+
166+
struct asoc_sdw_dailink *asoc_sdw_find_dailink(struct asoc_sdw_dailink *dailinks,
167+
const struct snd_soc_acpi_endpoint *new);
168+
169+
int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
170+
struct asoc_sdw_dailink *soc_dais,
171+
struct asoc_sdw_endpoint *soc_ends,
172+
int *num_devs);
173+
164174
int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd);
165175

166176
/* DMIC support */

sound/soc/intel/boards/sof_sdw.c

Lines changed: 0 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -619,164 +619,6 @@ static const struct snd_soc_ops sdw_ops = {
619619

620620
static const char * const type_strings[] = {"SimpleJack", "SmartAmp", "SmartMic"};
621621

622-
static int asoc_sdw_count_sdw_endpoints(struct snd_soc_card *card, int *num_devs, int *num_ends)
623-
{
624-
struct device *dev = card->dev;
625-
struct snd_soc_acpi_mach *mach = dev_get_platdata(dev);
626-
struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params;
627-
const struct snd_soc_acpi_link_adr *adr_link;
628-
int i;
629-
630-
for (adr_link = mach_params->links; adr_link->num_adr; adr_link++) {
631-
*num_devs += adr_link->num_adr;
632-
633-
for (i = 0; i < adr_link->num_adr; i++)
634-
*num_ends += adr_link->adr_d[i].num_endpoints;
635-
}
636-
637-
dev_dbg(dev, "Found %d devices with %d endpoints\n", *num_devs, *num_ends);
638-
639-
return 0;
640-
}
641-
642-
static struct asoc_sdw_dailink *asoc_sdw_find_dailink(struct asoc_sdw_dailink *dailinks,
643-
const struct snd_soc_acpi_endpoint *new)
644-
{
645-
while (dailinks->initialised) {
646-
if (new->aggregated && dailinks->group_id == new->group_id)
647-
return dailinks;
648-
649-
dailinks++;
650-
}
651-
652-
INIT_LIST_HEAD(&dailinks->endpoints);
653-
dailinks->group_id = new->group_id;
654-
dailinks->initialised = true;
655-
656-
return dailinks;
657-
}
658-
659-
static int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
660-
struct asoc_sdw_dailink *sof_dais,
661-
struct asoc_sdw_endpoint *sof_ends,
662-
int *num_devs)
663-
{
664-
struct device *dev = card->dev;
665-
struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
666-
struct snd_soc_acpi_mach *mach = dev_get_platdata(dev);
667-
struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params;
668-
const struct snd_soc_acpi_link_adr *adr_link;
669-
struct asoc_sdw_endpoint *sof_end = sof_ends;
670-
int num_dais = 0;
671-
int i, j;
672-
int ret;
673-
674-
for (adr_link = mach_params->links; adr_link->num_adr; adr_link++) {
675-
int num_link_dailinks = 0;
676-
677-
if (!is_power_of_2(adr_link->mask)) {
678-
dev_err(dev, "link with multiple mask bits: 0x%x\n",
679-
adr_link->mask);
680-
return -EINVAL;
681-
}
682-
683-
for (i = 0; i < adr_link->num_adr; i++) {
684-
const struct snd_soc_acpi_adr_device *adr_dev = &adr_link->adr_d[i];
685-
struct asoc_sdw_codec_info *codec_info;
686-
const char *codec_name;
687-
688-
if (!adr_dev->name_prefix) {
689-
dev_err(dev, "codec 0x%llx does not have a name prefix\n",
690-
adr_dev->adr);
691-
return -EINVAL;
692-
}
693-
694-
codec_info = asoc_sdw_find_codec_info_part(adr_dev->adr);
695-
if (!codec_info)
696-
return -EINVAL;
697-
698-
ctx->ignore_internal_dmic |= codec_info->ignore_internal_dmic;
699-
700-
codec_name = asoc_sdw_get_codec_name(dev, codec_info, adr_link, i);
701-
if (!codec_name)
702-
return -ENOMEM;
703-
704-
dev_dbg(dev, "Adding prefix %s for %s\n",
705-
adr_dev->name_prefix, codec_name);
706-
707-
sof_end->name_prefix = adr_dev->name_prefix;
708-
709-
if (codec_info->count_sidecar && codec_info->add_sidecar) {
710-
ret = codec_info->count_sidecar(card, &num_dais, num_devs);
711-
if (ret)
712-
return ret;
713-
714-
sof_end->include_sidecar = true;
715-
}
716-
717-
for (j = 0; j < adr_dev->num_endpoints; j++) {
718-
const struct snd_soc_acpi_endpoint *adr_end;
719-
const struct asoc_sdw_dai_info *dai_info;
720-
struct asoc_sdw_dailink *sof_dai;
721-
int stream;
722-
723-
adr_end = &adr_dev->endpoints[j];
724-
dai_info = &codec_info->dais[adr_end->num];
725-
sof_dai = asoc_sdw_find_dailink(sof_dais, adr_end);
726-
727-
if (dai_info->quirk && !(dai_info->quirk & sof_sdw_quirk))
728-
continue;
729-
730-
dev_dbg(dev,
731-
"Add dev: %d, 0x%llx end: %d, %s, %c/%c to %s: %d\n",
732-
ffs(adr_link->mask) - 1, adr_dev->adr,
733-
adr_end->num, type_strings[dai_info->dai_type],
734-
dai_info->direction[SNDRV_PCM_STREAM_PLAYBACK] ? 'P' : '-',
735-
dai_info->direction[SNDRV_PCM_STREAM_CAPTURE] ? 'C' : '-',
736-
adr_end->aggregated ? "group" : "solo",
737-
adr_end->group_id);
738-
739-
if (adr_end->num >= codec_info->dai_num) {
740-
dev_err(dev,
741-
"%d is too many endpoints for codec: 0x%x\n",
742-
adr_end->num, codec_info->part_id);
743-
return -EINVAL;
744-
}
745-
746-
for_each_pcm_streams(stream) {
747-
if (dai_info->direction[stream] &&
748-
dai_info->dailink[stream] < 0) {
749-
dev_err(dev,
750-
"Invalid dailink id %d for codec: 0x%x\n",
751-
dai_info->dailink[stream],
752-
codec_info->part_id);
753-
return -EINVAL;
754-
}
755-
756-
if (dai_info->direction[stream]) {
757-
num_dais += !sof_dai->num_devs[stream];
758-
sof_dai->num_devs[stream]++;
759-
sof_dai->link_mask[stream] |= adr_link->mask;
760-
}
761-
}
762-
763-
num_link_dailinks += !!list_empty(&sof_dai->endpoints);
764-
list_add_tail(&sof_end->list, &sof_dai->endpoints);
765-
766-
sof_end->link_mask = adr_link->mask;
767-
sof_end->codec_name = codec_name;
768-
sof_end->codec_info = codec_info;
769-
sof_end->dai_info = dai_info;
770-
sof_end++;
771-
}
772-
}
773-
774-
ctx->append_dai_type |= (num_link_dailinks > 1);
775-
}
776-
777-
return num_dais;
778-
}
779-
780622
static int create_sdw_dailink(struct snd_soc_card *card,
781623
struct asoc_sdw_dailink *sof_dai,
782624
struct snd_soc_dai_link **dai_links,

sound/soc/sdw_utils/soc_sdw_utils.c

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,5 +1005,166 @@ int asoc_sdw_init_simple_dai_link(struct device *dev, struct snd_soc_dai_link *d
10051005
}
10061006
EXPORT_SYMBOL_NS(asoc_sdw_init_simple_dai_link, SND_SOC_SDW_UTILS);
10071007

1008+
int asoc_sdw_count_sdw_endpoints(struct snd_soc_card *card, int *num_devs, int *num_ends)
1009+
{
1010+
struct device *dev = card->dev;
1011+
struct snd_soc_acpi_mach *mach = dev_get_platdata(dev);
1012+
struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params;
1013+
const struct snd_soc_acpi_link_adr *adr_link;
1014+
int i;
1015+
1016+
for (adr_link = mach_params->links; adr_link->num_adr; adr_link++) {
1017+
*num_devs += adr_link->num_adr;
1018+
1019+
for (i = 0; i < adr_link->num_adr; i++)
1020+
*num_ends += adr_link->adr_d[i].num_endpoints;
1021+
}
1022+
1023+
dev_dbg(dev, "Found %d devices with %d endpoints\n", *num_devs, *num_ends);
1024+
1025+
return 0;
1026+
}
1027+
EXPORT_SYMBOL_NS(asoc_sdw_count_sdw_endpoints, SND_SOC_SDW_UTILS);
1028+
1029+
struct asoc_sdw_dailink *asoc_sdw_find_dailink(struct asoc_sdw_dailink *dailinks,
1030+
const struct snd_soc_acpi_endpoint *new)
1031+
{
1032+
while (dailinks->initialised) {
1033+
if (new->aggregated && dailinks->group_id == new->group_id)
1034+
return dailinks;
1035+
1036+
dailinks++;
1037+
}
1038+
1039+
INIT_LIST_HEAD(&dailinks->endpoints);
1040+
dailinks->group_id = new->group_id;
1041+
dailinks->initialised = true;
1042+
1043+
return dailinks;
1044+
}
1045+
EXPORT_SYMBOL_NS(asoc_sdw_find_dailink, SND_SOC_SDW_UTILS);
1046+
1047+
int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
1048+
struct asoc_sdw_dailink *soc_dais,
1049+
struct asoc_sdw_endpoint *soc_ends,
1050+
int *num_devs)
1051+
{
1052+
struct device *dev = card->dev;
1053+
struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
1054+
struct snd_soc_acpi_mach *mach = dev_get_platdata(dev);
1055+
struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params;
1056+
const struct snd_soc_acpi_link_adr *adr_link;
1057+
struct asoc_sdw_endpoint *soc_end = soc_ends;
1058+
int num_dais = 0;
1059+
int i, j;
1060+
int ret;
1061+
1062+
for (adr_link = mach_params->links; adr_link->num_adr; adr_link++) {
1063+
int num_link_dailinks = 0;
1064+
1065+
if (!is_power_of_2(adr_link->mask)) {
1066+
dev_err(dev, "link with multiple mask bits: 0x%x\n",
1067+
adr_link->mask);
1068+
return -EINVAL;
1069+
}
1070+
1071+
for (i = 0; i < adr_link->num_adr; i++) {
1072+
const struct snd_soc_acpi_adr_device *adr_dev = &adr_link->adr_d[i];
1073+
struct asoc_sdw_codec_info *codec_info;
1074+
const char *codec_name;
1075+
1076+
if (!adr_dev->name_prefix) {
1077+
dev_err(dev, "codec 0x%llx does not have a name prefix\n",
1078+
adr_dev->adr);
1079+
return -EINVAL;
1080+
}
1081+
1082+
codec_info = asoc_sdw_find_codec_info_part(adr_dev->adr);
1083+
if (!codec_info)
1084+
return -EINVAL;
1085+
1086+
ctx->ignore_internal_dmic |= codec_info->ignore_internal_dmic;
1087+
1088+
codec_name = asoc_sdw_get_codec_name(dev, codec_info, adr_link, i);
1089+
if (!codec_name)
1090+
return -ENOMEM;
1091+
1092+
dev_dbg(dev, "Adding prefix %s for %s\n",
1093+
adr_dev->name_prefix, codec_name);
1094+
1095+
soc_end->name_prefix = adr_dev->name_prefix;
1096+
1097+
if (codec_info->count_sidecar && codec_info->add_sidecar) {
1098+
ret = codec_info->count_sidecar(card, &num_dais, num_devs);
1099+
if (ret)
1100+
return ret;
1101+
1102+
soc_end->include_sidecar = true;
1103+
}
1104+
1105+
for (j = 0; j < adr_dev->num_endpoints; j++) {
1106+
const struct snd_soc_acpi_endpoint *adr_end;
1107+
const struct asoc_sdw_dai_info *dai_info;
1108+
struct asoc_sdw_dailink *soc_dai;
1109+
int stream;
1110+
1111+
adr_end = &adr_dev->endpoints[j];
1112+
dai_info = &codec_info->dais[adr_end->num];
1113+
soc_dai = asoc_sdw_find_dailink(soc_dais, adr_end);
1114+
1115+
if (dai_info->quirk && !(dai_info->quirk & ctx->mc_quirk))
1116+
continue;
1117+
1118+
dev_dbg(dev,
1119+
"Add dev: %d, 0x%llx end: %d, dai: %d, %c/%c to %s: %d\n",
1120+
ffs(adr_link->mask) - 1, adr_dev->adr,
1121+
adr_end->num, dai_info->dai_type,
1122+
dai_info->direction[SNDRV_PCM_STREAM_PLAYBACK] ? 'P' : '-',
1123+
dai_info->direction[SNDRV_PCM_STREAM_CAPTURE] ? 'C' : '-',
1124+
adr_end->aggregated ? "group" : "solo",
1125+
adr_end->group_id);
1126+
1127+
if (adr_end->num >= codec_info->dai_num) {
1128+
dev_err(dev,
1129+
"%d is too many endpoints for codec: 0x%x\n",
1130+
adr_end->num, codec_info->part_id);
1131+
return -EINVAL;
1132+
}
1133+
1134+
for_each_pcm_streams(stream) {
1135+
if (dai_info->direction[stream] &&
1136+
dai_info->dailink[stream] < 0) {
1137+
dev_err(dev,
1138+
"Invalid dailink id %d for codec: 0x%x\n",
1139+
dai_info->dailink[stream],
1140+
codec_info->part_id);
1141+
return -EINVAL;
1142+
}
1143+
1144+
if (dai_info->direction[stream]) {
1145+
num_dais += !soc_dai->num_devs[stream];
1146+
soc_dai->num_devs[stream]++;
1147+
soc_dai->link_mask[stream] |= adr_link->mask;
1148+
}
1149+
}
1150+
1151+
num_link_dailinks += !!list_empty(&soc_dai->endpoints);
1152+
list_add_tail(&soc_end->list, &soc_dai->endpoints);
1153+
1154+
soc_end->link_mask = adr_link->mask;
1155+
soc_end->codec_name = codec_name;
1156+
soc_end->codec_info = codec_info;
1157+
soc_end->dai_info = dai_info;
1158+
soc_end++;
1159+
}
1160+
}
1161+
1162+
ctx->append_dai_type |= (num_link_dailinks > 1);
1163+
}
1164+
1165+
return num_dais;
1166+
}
1167+
EXPORT_SYMBOL_NS(asoc_sdw_parse_sdw_endpoints, SND_SOC_SDW_UTILS);
1168+
10081169
MODULE_LICENSE("GPL");
10091170
MODULE_DESCRIPTION("SoundWire ASoC helpers");

0 commit comments

Comments
 (0)