[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260121132243.1256019-3-rf@opensource.cirrus.com>
Date: Wed, 21 Jan 2026 13:22:40 +0000
From: Richard Fitzgerald <rf@...nsource.cirrus.com>
To: broonie@...nel.org
Cc: linux-sound@...r.kernel.org, linux-kernel@...r.kernel.org,
patches@...nsource.cirrus.com
Subject: [PATCH 2/5] ASoC: cs35l56: Use vendor-specific qualifier in firmware file search
If cs_amp_devm_get_vendor_specific_variant_id() returns a string, use it
as part of the firmware filename. If this firmware isn't found, fall back
to the standard firmware name.
This re-uses the fwf_suffix fallback mechanism that was introduced in
commit e5d5b3aebdc8 ("ASoC: cs35l56: Use SoundWire address as alternate
firmware suffix on L56 B0").
This is for handling vendors that use the same PCI SSID on systems with
various audio hardware and have a custom vendor-specific way to identify
the hardware variant.
This is currently used on Dell laptops. Dell create a UEFI variable that
indicates varations to the base hardware. This variance can be any part
of the hardware (not necessarily affecting the audio). It would be
impractical to publish many aliases for the same firmware files to match
every possible variance to that base hardware. Hence the fallback to the
standard firmware name. This allows alternate firmware files to be
published only for variants that need it. For all other variants the
fallback will load the firmware for the base SSID.
This is not done for CS35L56 B0 because the fallback mechanism is already
used for a different purpose for these parts. None of the products with
the older L56 B0 silicon revision need the additional vendor-specific
descriptor.
For SoundWire the resulting firmware searches with a variant descriptor
will be:
1. cs35l??-dsp1-misc-SSID-VARIANT-l?u?.wmfw
2. cs35l??-dsp1-misc-SSID-VARIANT.wmfw
3. cs35l??-dsp1-misc-SSID-VARIANT-l?u?.bin
4. cs35l??-dsp1-misc-SSID-VARIANT.bin
If this doesn't find a wmfw and bin file it will then fallback to:
5. cs35l??-dsp1-misc-SSID-l?u?.wmfw
6. cs35l??-dsp1-misc-SSID.wmfw
7. cs35l??-dsp1-misc-SSID-l?u?.bin
8. cs35l??-dsp1-misc-SSID.bin
With the typical published firmware names and qualifiers (a single wmfw but
amp-specific bin file) this will load either:
cs35l??-dsp1-misc-SSID-VARIANT.wmfw
and cs35l??-dsp1-misc-SSID-VARIANT-l?u?.bin
or
cs35l??-dsp1-misc-SSID.wmfw
and cs35l??-dsp1-misc-SSID-l?u?.bin
For non-Soundwire (I2S/TDM) systems the searches and fallbacks are
as above except that the "l?u?" component of the name is instead the
ALSA name prefix, usually of the form "AMPn".
Signed-off-by: Richard Fitzgerald <rf@...nsource.cirrus.com>
---
sound/soc/codecs/cs35l56.c | 69 ++++++++++++++++++++++++++++++--------
1 file changed, 55 insertions(+), 14 deletions(-)
diff --git a/sound/soc/codecs/cs35l56.c b/sound/soc/codecs/cs35l56.c
index 55b4d0d55712..abea782bcd3f 100644
--- a/sound/soc/codecs/cs35l56.c
+++ b/sound/soc/codecs/cs35l56.c
@@ -1109,27 +1109,68 @@ static const struct snd_kcontrol_new cs35l56_cal_data_restore_controls[] = {
static int cs35l56_set_fw_suffix(struct cs35l56_private *cs35l56)
{
+ unsigned short vendor, device;
+ const char *vendor_id;
+ int ret;
+
if (cs35l56->dsp.fwf_suffix)
return 0;
- if (!cs35l56->sdw_peripheral)
- return 0;
+ if (cs35l56->sdw_peripheral) {
+ cs35l56->dsp.fwf_suffix = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL,
+ "l%uu%u",
+ cs35l56->sdw_link_num,
+ cs35l56->sdw_unique_id);
+ if (!cs35l56->dsp.fwf_suffix)
+ return -ENOMEM;
- cs35l56->dsp.fwf_suffix = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL,
- "l%uu%u",
- cs35l56->sdw_link_num,
- cs35l56->sdw_unique_id);
- if (!cs35l56->dsp.fwf_suffix)
- return -ENOMEM;
+ /*
+ * There are published firmware files for L56 B0 silicon using
+ * the ALSA prefix as the filename suffix. Default to trying these
+ * first, with the new SoundWire suffix as a fallback.
+ * None of these older systems use a vendor-specific ID.
+ */
+ if ((cs35l56->base.type == 0x56) && (cs35l56->base.rev == 0xb0)) {
+ cs35l56->fallback_fw_suffix = cs35l56->dsp.fwf_suffix;
+ cs35l56->dsp.fwf_suffix = cs35l56->component->name_prefix;
+
+ return 0;
+ }
+ }
/*
- * There are published firmware files for L56 B0 silicon using
- * the ALSA prefix as the filename suffix. Default to trying these
- * first, with the new name as an alternate.
+ * Some manufacturers use the same SSID on multiple products and have
+ * a vendor-specific qualifier to distinguish different models.
+ * Models with the same SSID but different qualifier might require
+ * different audio firmware, or they might all have the same audio
+ * firmware.
+ * Try searching for a firmware with this qualifier first, else
+ * fallback to standard naming.
*/
- if ((cs35l56->base.type == 0x56) && (cs35l56->base.rev == 0xb0)) {
- cs35l56->fallback_fw_suffix = cs35l56->dsp.fwf_suffix;
- cs35l56->dsp.fwf_suffix = cs35l56->component->name_prefix;
+ if (snd_soc_card_get_pci_ssid(cs35l56->component->card, &vendor, &device) < 0) {
+ vendor_id = cs_amp_devm_get_vendor_specific_variant_id(cs35l56->base.dev, -1, -1);
+ } else {
+ vendor_id = cs_amp_devm_get_vendor_specific_variant_id(cs35l56->base.dev,
+ vendor, device);
+ }
+ ret = PTR_ERR_OR_ZERO(vendor_id);
+ if (ret == -ENOENT)
+ return 0;
+ else if (ret)
+ return ret;
+
+ if (vendor_id) {
+ if (cs35l56->dsp.fwf_suffix)
+ cs35l56->fallback_fw_suffix = cs35l56->dsp.fwf_suffix;
+ else
+ cs35l56->fallback_fw_suffix = cs35l56->component->name_prefix;
+
+ cs35l56->dsp.fwf_suffix = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL,
+ "%s-%s",
+ vendor_id,
+ cs35l56->fallback_fw_suffix);
+ if (!cs35l56->dsp.fwf_suffix)
+ return -ENOMEM;
}
return 0;
--
2.47.3
Powered by blists - more mailing lists