ASoC: intel: sof_sdw: Move group_generated logic
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Mon, 31 Jul 2023 21:42:57 +0000 (16:42 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 31 Jul 2023 22:22:43 +0000 (23:22 +0100)
Hoist the handling logic for group_generated up to the
sof_card_dai_links_create level. This avoids the need to pass the array
through multiple levels of functions.

Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20230731214257.444605-24-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_sdw.c

index 25644ef..fd27e21 100644 (file)
@@ -1291,7 +1291,7 @@ static int set_codec_init_func(struct snd_soc_card *card,
 static int get_slave_info(const struct snd_soc_acpi_link_adr *adr_link,
                          struct device *dev, int *cpu_dai_id, int *cpu_dai_num,
                          int *codec_num, unsigned int *group_id,
-                         bool *group_generated, int adr_index)
+                         int adr_index)
 {
        const struct snd_soc_acpi_adr_device *adr_d;
        const struct snd_soc_acpi_link_adr *adr_next;
@@ -1351,11 +1351,6 @@ static int get_slave_info(const struct snd_soc_acpi_link_adr *adr_link,
                }
        }
 
-       /*
-        * indicate CPU DAIs for this group have been generated
-        * to avoid generating CPU DAIs for this group again.
-        */
-       group_generated[*group_id] = true;
        *cpu_dai_num = index;
 
        return 0;
@@ -1379,8 +1374,7 @@ static int create_sdw_dailink(struct snd_soc_card *card, int *link_index,
                              int sdw_be_num, int sdw_cpu_dai_num,
                              struct snd_soc_dai_link_component *cpus,
                              const struct snd_soc_acpi_link_adr *adr_link,
-                             int *cpu_id, bool *group_generated,
-                             struct snd_soc_codec_conf *codec_conf,
+                             int *cpu_id, struct snd_soc_codec_conf *codec_conf,
                              int codec_count, int *be_id,
                              int *codec_conf_index,
                              bool *ignore_pch_dmic,
@@ -1404,7 +1398,7 @@ static int create_sdw_dailink(struct snd_soc_card *card, int *link_index,
        int k;
 
        ret = get_slave_info(adr_link, dev, cpu_dai_id, &cpu_dai_num, &codec_num,
-                            &group_id, group_generated, adr_index);
+                            &group_id, adr_index);
        if (ret)
                return ret;
 
@@ -1559,13 +1553,14 @@ static int sof_card_dai_links_create(struct snd_soc_card *card)
        struct snd_soc_dai_link_component *ssp_components;
        struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params;
        const struct snd_soc_acpi_link_adr *adr_link = mach_params->links;
+       bool aggregation = !(sof_sdw_quirk & SOF_SDW_NO_AGGREGATION);
        struct snd_soc_dai_link_component *cpus;
        struct snd_soc_codec_conf *codec_conf;
        bool append_dai_type = false;
        bool ignore_pch_dmic = false;
        int codec_conf_num = 0;
        int codec_conf_index = 0;
-       bool group_generated[SDW_MAX_GROUPS];
+       bool group_generated[SDW_MAX_GROUPS] = { };
        int ssp_codec_index, ssp_mask;
        struct snd_soc_dai_link *dai_links;
        int num_links, link_index = 0;
@@ -1641,14 +1636,6 @@ static int sof_card_dai_links_create(struct snd_soc_card *card)
        if (!adr_link)
                return -EINVAL;
 
-       /*
-        * SoundWire Slaves aggregated in the same group may be
-        * located on different hardware links. Clear array to indicate
-        * CPU DAIs for this group have not been generated.
-        */
-       for (i = 0; i < SDW_MAX_GROUPS; i++)
-               group_generated[i] = false;
-
        for (i = 0; i < SDW_MAX_LINKS; i++)
                sdw_pin_index[i] = SDW_INTEL_BIDIR_PDI_BASE;
 
@@ -1706,7 +1693,7 @@ out:
                        for (j = 0; j < codec_info_list[codec_index].dai_num ; j++) {
                                ret = create_sdw_dailink(card, &link_index, dai_links,
                                                         sdw_be_num, sdw_cpu_dai_num, cpus,
-                                                        adr_link, &cpu_id, group_generated,
+                                                        adr_link, &cpu_id,
                                                         codec_conf, codec_conf_num,
                                                         &be_id, &codec_conf_index,
                                                         &ignore_pch_dmic, append_dai_type, i, j);
@@ -1715,6 +1702,9 @@ out:
                                        return ret;
                                }
                        }
+
+                       if (aggregation && endpoint->aggregated)
+                               group_generated[endpoint->group_id] = true;
                }
        }