]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ASoC: sdw_utils: add vendor_id to asoc_sdw_codec_info
authorNiranjan H Y <niranjan.hy@ti.com>
Tue, 24 Mar 2026 04:12:59 +0000 (09:42 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 24 Mar 2026 13:17:18 +0000 (13:17 +0000)
 struct asoc_sdw_codec_info has part_id which is not
sufficient to uniquely identify devices. This change
adds the vendor_id field and updates the codec_info
list with the corresponding vendor id as per the
Manufacturer's id in https://mid.mipi.org/

Signed-off-by: Niranjan H Y <niranjan.hy@ti.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20260324041300.784-1-niranjan.hy@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc_sdw_utils.h
sound/soc/sdw_utils/soc_sdw_utils.c
sound/soc/sof/intel/hda.c

index 98531e500cbb398155e2ee0a4de5a7d0b41e1690..48f516ba682f76cd0f2ef4c50c7d4dc71a65b8ae 100644 (file)
@@ -71,6 +71,7 @@ struct asoc_sdw_aux_info {
 };
 
 struct asoc_sdw_codec_info {
+       const int vendor_id;
        const int part_id;
        const int version_id;
        const char *name_prefix;
index 75658148df57c0e3a0005f7469655671bf607c8b..637c640001d6929f61455166be87fa2dbcd62ef5 100644 (file)
@@ -73,6 +73,7 @@ static const struct snd_kcontrol_new rt700_controls[] = {
 
 struct asoc_sdw_codec_info codec_info_list[] = {
        {
+               .vendor_id = 0x0102,
                .part_id = 0x0000, /* TAS2783A */
                .name_prefix = "tas2783",
                .dais = {
@@ -92,6 +93,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x700,
                .name_prefix = "rt700",
                .dais = {
@@ -110,6 +112,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x711,
                .name_prefix = "rt711",
                .version_id = 3,
@@ -131,6 +134,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x711,
                .name_prefix = "rt711",
                .version_id = 2,
@@ -152,6 +156,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x712,
                .name_prefix = "rt712",
                .version_id = 3,
@@ -194,6 +199,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 3,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x1712,
                .name_prefix = "rt712-dmic",
                .version_id = 3,
@@ -209,6 +215,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x713,
                .name_prefix = "rt713",
                .version_id = 3,
@@ -237,6 +244,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 2,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x1713,
                .name_prefix = "rt713-dmic",
                .version_id = 3,
@@ -252,6 +260,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x1308,
                .name_prefix = "rt1308",
                .acpi_id = "10EC1308",
@@ -275,6 +284,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .ops = &soc_sdw_rt1308_i2s_ops,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x1316,
                .name_prefix = "rt1316",
                .dais = {
@@ -296,6 +306,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x1318,
                .name_prefix = "rt1318",
                .dais = {
@@ -317,6 +328,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x1320,
                .name_prefix = "rt1320",
                .dais = {
@@ -338,6 +350,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x1321,
                .name_prefix = "rt1320",
                .dais = {
@@ -359,6 +372,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x714,
                .name_prefix = "rt714",
                .version_id = 3,
@@ -375,6 +389,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x715,
                .name_prefix = "rt715",
                .version_id = 3,
@@ -391,6 +406,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x714,
                .name_prefix = "rt714",
                .version_id = 2,
@@ -407,6 +423,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x715,
                .name_prefix = "rt715",
                .version_id = 2,
@@ -423,6 +440,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x721,
                .name_prefix = "rt721",
                .version_id = 3,
@@ -466,6 +484,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 3,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x722,
                .name_prefix = "rt722",
                .version_id = 3,
@@ -513,6 +532,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 3,
        },
        {
+               .vendor_id = 0x019f,
                .part_id = 0x8373,
                .name_prefix = "Left",
                .dais = {
@@ -533,6 +553,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x019f,
                .part_id = 0x8363,
                .name_prefix = "Left",
                .dais = {
@@ -553,6 +574,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x025d,
                .part_id = 0x5682,
                .name_prefix = "rt5682",
                .dais = {
@@ -571,6 +593,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x3556,
                .name_prefix = "AMP",
                .dais = {
@@ -598,6 +621,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 2,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x3557,
                .name_prefix = "AMP",
                .dais = {
@@ -625,6 +649,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 2,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x3563,
                .name_prefix = "AMP",
                .dais = {
@@ -652,6 +677,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 2,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x4242,
                .name_prefix = "cs42l42",
                .dais = {
@@ -670,6 +696,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x4243,
                .name_prefix = "cs42l43",
                .count_sidecar = asoc_sdw_bridge_cs35l56_count_sidecar,
@@ -724,6 +751,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 4,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x2A3B,
                .name_prefix = "cs42l43",
                .count_sidecar = asoc_sdw_bridge_cs35l56_count_sidecar,
@@ -778,6 +806,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 4,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x4245,
                .name_prefix = "cs42l45",
                .dais = {
@@ -814,6 +843,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .aux_num = 1,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x4249,
                .name_prefix = "cs42l45", /* Use same user-space as cs42l45 */
                .dais = {
@@ -850,6 +880,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .aux_num = 1,
        },
        {
+               .vendor_id = 0x01fa,
                .part_id = 0x4747,
                .name_prefix = "cs47l47",
                .dais = {
@@ -886,6 +917,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .aux_num = 1,
        },
        {
+               .vendor_id = 0x0105,
                .part_id = 0xaaaa, /* generic codec mockup */
                .name_prefix = "sdw_mockup_mmulti-function",
                .version_id = 0,
@@ -912,6 +944,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 3,
        },
        {
+               .vendor_id = 0x0105,
                .part_id = 0xaa55, /* headset codec mockup */
                .name_prefix = "sdw_mockup_headset0",
                .version_id = 0,
@@ -926,6 +959,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x0105,
                .part_id = 0x55aa, /* amplifier mockup */
                .name_prefix = "sdw_mockup_amp1",
                .version_id = 0,
@@ -940,6 +974,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
                .dai_num = 1,
        },
        {
+               .vendor_id = 0x0105,
                .part_id = 0x5555,
                .name_prefix = "sdw_mockup_mic0",
                .version_id = 0,
@@ -964,9 +999,10 @@ EXPORT_SYMBOL_NS(asoc_sdw_get_codec_info_list_count, "SND_SOC_SDW_UTILS");
 
 struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr)
 {
-       unsigned int part_id, sdw_version;
+       unsigned int vendor_id, part_id, sdw_version;
        int i;
 
+       vendor_id = SDW_MFG_ID(adr);
        part_id = SDW_PART_ID(adr);
        sdw_version = SDW_VERSION(adr);
        for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
@@ -975,6 +1011,7 @@ struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr)
                 * version_id is not specified in the codec info.
                 */
                if (part_id == codec_info_list[i].part_id &&
+                   vendor_id == codec_info_list[i].vendor_id &&
                    (!codec_info_list[i].version_id ||
                     sdw_version == codec_info_list[i].version_id))
                        return &codec_info_list[i];
@@ -989,6 +1026,7 @@ static struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_sdw_id(const struct
 
        for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
                if (id->part_id == codec_info_list[i].part_id &&
+                   id->mfg_id == codec_info_list[i].vendor_id &&
                    (!codec_info_list[i].version_id ||
                     id->sdw_version == codec_info_list[i].version_id))
                        return &codec_info_list[i];
@@ -1093,8 +1131,8 @@ int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd)
                        ret = snd_soc_add_card_controls(card, codec_info->dais[dai_index].controls,
                                                        codec_info->dais[dai_index].num_controls);
                        if (ret) {
-                               dev_err(card->dev, "%#x controls addition failed: %d\n",
-                                       codec_info->part_id, ret);
+                               dev_err(card->dev, "%#x-%#x controls addition failed: %d\n",
+                                       codec_info->vendor_id, codec_info->part_id, ret);
                                return ret;
                        }
                }
@@ -1103,8 +1141,8 @@ int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd)
                                                        codec_info->dais[dai_index].widgets,
                                                        codec_info->dais[dai_index].num_widgets);
                        if (ret) {
-                               dev_err(card->dev, "%#x widgets addition failed: %d\n",
-                                       codec_info->part_id, ret);
+                               dev_err(card->dev, "%#x-%#x widgets addition failed: %d\n",
+                                       codec_info->vendor_id, codec_info->part_id, ret);
                                return ret;
                        }
                }
index c0cc7d3ce5262b9c20f6f220170c9c50f8b5869f..9ec33147d9af337e374a46e60240fd15402afd6c 100644 (file)
@@ -1179,6 +1179,9 @@ static struct snd_soc_acpi_adr_device *find_acpi_adr_device(struct device *dev,
                struct snd_soc_acpi_endpoint *endpoints;
                int amp_group_id = 1;
 
+               if (sdw_device->id.mfg_id != codec_info_list[i].vendor_id)
+                       continue;
+
                if (sdw_device->id.part_id != codec_info_list[i].part_id)
                        continue;
 
@@ -1193,8 +1196,8 @@ static struct snd_soc_acpi_adr_device *find_acpi_adr_device(struct device *dev,
                 * dereference
                 */
                if (!name_prefix) {
-                       dev_err(dev, "codec_info_list name_prefix of part id %#x is missing\n",
-                               codec_info_list[i].part_id);
+                       dev_err(dev, "codec_info_list name_prefix of part id %#x-%#x is missing\n",
+                               codec_info_list[i].vendor_id, codec_info_list[i].part_id);
                        return NULL;
                }
                for (j = 0; j < codec_info_list[i].dai_num; j++) {