History

Merge tag 'sound-7.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai: "Again a collection of device-specific fixes. Most of changes are fairly small device-specific quirks of fixes for HD- and USB-audio, ASoC Intel, AMD, fsl, Cirrus and co. The only large LOC is for plumbing ASoC ACP driver to add the Cirrus Logic codec support, so this one is also just adding some tables" * tag 'sound-7.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (21 commits) ALSA: us122l: drop redundant interface references ASoC: amd: yc: Add DMI quirk for ASUS EXPERTBOOK PM1503CDA ASoC: dt-bindings: renesas,rz-ssi: Document RZ/G3L SoC ASoC: SDCA: Add allocation failure check for Entity name ALSA: hda/senary: Ensure EAPD is enabled during init ALSA: hda/senary: Use codec->core.afg for GPIO access ALSA: doc: usb-audio: Add doc for QUIRK_FLAG_SKIP_IFACE_SETUP ASoC: dt-bindings: tegra: Add compatible for Tegra238 sound card ALSA: hda/hdmi: Add Tegra238 HDA codec device ID ASoC: cs35l56: Suppress pointless warning about number of GPIO pulls ASoC: amd: acp: Add ACP6.3 match entries for Cirrus Logic parts ASoC: Intel: sof_sdw: Add quirk for Alienware Area 51 (2025) 0CCD SKU ASoC: rt1321: fix DMIC ch2/3 mask issue ASoC: cs35l56: Only patch ASP registers if the DAI is part of a DAIlink ASoC: fsl_easrc: Fix event generation in fsl_easrc_iec958_set_reg() ASoC: fsl_easrc: Fix event generation in fsl_easrc_iec958_put_bits() ALSA: firewire: dice: Fix printf warning with W=1 ALSA: hda/tas2781: A workaround solution to lower-vol issue among lower calibrated-impedance micro-speaker on TAS2781 ALSA: hda/realtek: Add quirk for HP Pavilion 15-eh1xxx to enable mute LED ALSA: usb-audio: Add iface reset and delay quirk for AB13X USB Audio ...

Linus Torvalds committed 8 months ago

Commit d2490372 parents 48976c0 845766922 files · +599 −39Browse files

Unified · Split

22 files
  1. Documentation/devicetree/bindings/sound/nvidia,tegra-audio-graph-card.yaml +1 −0
  2. Documentation/devicetree/bindings/sound/renesas,rz-ssi.yaml +1 −0
  3. Documentation/sound/alsa-configuration.rst +4 −0
  4. include/sound/cs35l56.h +1 −0
  5. include/sound/tas2781.h +1 −0
  6. sound/firewire/dice/dice.c +1 −1
  7. sound/hda/codecs/ca0132.c +9 −0
  8. sound/hda/codecs/hdmi/tegrahdmi.c +1 −0
  9. sound/hda/codecs/realtek/alc269.c +1 −0
  10. sound/hda/codecs/senarytech.c +8 −6
  11. sound/hda/codecs/side-codecs/tas2781_hda_i2c.c +3 −12
  12. sound/soc/amd/acp/amd-acp63-acpi-match.c +413 −0
  13. sound/soc/amd/yc/acp6x-mach.c +7 −0
  14. sound/soc/codecs/cs35l56-shared.c +15 −1
  15. sound/soc/codecs/cs35l56.c +10 −2
  16. sound/soc/codecs/rt1320-sdw.c +3 −2
  17. sound/soc/codecs/tas2781-fmwlib.c +94 −0
  18. sound/soc/fsl/fsl_easrc.c +10 −4
  19. sound/soc/intel/boards/sof_sdw.c +8 −0
  20. sound/soc/sdca/sdca_functions.c +4 −1
  21. sound/usb/quirks.c +2 −0
  22. sound/usb/usx2y/us122l.c +2 −10
Documentation/devicetree/bindings/sound/nvidia,tegra-audio-graph-card.yaml+1−0
@@ -23,6 +23,7 @@ properties: · 22 unmodified lines
2323 enum:
2424 - nvidia,tegra210-audio-graph-card
2525 - nvidia,tegra186-audio-graph-card
26+ - nvidia,tegra238-audio-graph-card
2627 - nvidia,tegra264-audio-graph-card
2728
2829 clocks:
Documentation/devicetree/bindings/sound/renesas,rz-ssi.yaml+1−0
@@ -20,6 +20,7 @@ properties: · 19 unmodified lines
2020 - renesas,r9a07g044-ssi # RZ/G2{L,LC}
2121 - renesas,r9a07g054-ssi # RZ/V2L
2222 - renesas,r9a08g045-ssi # RZ/G3S
23+ - renesas,r9a08g046-ssi # RZ/G3L
2324 - const: renesas,rz-ssi
2425
2526 reg:
Documentation/sound/alsa-configuration.rst+4−0
@@ -2372,6 +2372,10 @@ quirk_flags · 2371 unmodified lines
23722372 audible volume
23732373 * bit 25: ``mixer_capture_min_mute``
23742374 Similar to bit 24 but for capture streams
2375+ * bit 26: ``skip_iface_setup``
2376+ Skip the probe-time interface setup (usb_set_interface,
2377+ init_pitch, init_sample_rate); redundant with
2378+ snd_usb_endpoint_prepare() at stream-open time
23752379
23762380 This module supports multiple devices, autoprobe and hotplugging.
23772381
include/sound/cs35l56.h+1−0
@@ -406,6 +406,7 @@ extern const char * const cs35l56_cal_set_status_text[3]; · 405 unmodified lines
406406 extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC];
407407 extern const unsigned int cs35l56_tx_input_values[CS35L56_NUM_INPUT_SRC];
408408
409+int cs35l56_set_asp_patch(struct cs35l56_base *cs35l56_base);
409410 int cs35l56_set_patch(struct cs35l56_base *cs35l56_base);
410411 int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command);
411412 int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base);
include/sound/tas2781.h+1−0
@@ -151,6 +151,7 @@ struct tasdevice { · 150 unmodified lines
151151 struct bulk_reg_val *cali_data_backup;
152152 struct bulk_reg_val alp_cali_bckp;
153153 struct tasdevice_fw *cali_data_fmw;
154+ void *cali_specific;
154155 unsigned int dev_addr;
155156 unsigned int err_code;
156157 unsigned char cur_book;
sound/firewire/dice/dice.c+1−1
@@ -122,7 +122,7 @@ static void dice_card_strings(struct snd_dice *dice) · 121 unmodified lines
122122 fw_csr_string(dev->config_rom + 5, CSR_VENDOR, vendor, sizeof(vendor));
123123 strscpy(model, "?");
124124 fw_csr_string(dice->unit->directory, CSR_MODEL, model, sizeof(model));
125− snprintf(card->longname, sizeof(card->longname),
125+ scnprintf(card->longname, sizeof(card->longname),
126126 "%s %s (serial %u) at %s, S%d",
127127 vendor, model, dev->config_rom[4] & 0x3fffff,
128128 dev_name(&dice->unit->device), 100 << dev->max_speed);
sound/hda/codecs/ca0132.c+9−0
@@ -9816,6 +9816,15 @@ static void ca0132_config(struct hda_codec *codec) · 9815 unmodified lines
98169816 spec->dig_in = 0x09;
98179817 break;
98189818 }
9819+
9820+ /* Default HP/Speaker auto-detect from headphone pin verb: enable if the
9821+ * pin config indicates presence detect (not AC_DEFCFG_MISC_NO_PRESENCE).
9822+ */
9823+ if (spec->unsol_tag_hp &&
9824+ (snd_hda_query_pin_caps(codec, spec->unsol_tag_hp) & AC_PINCAP_PRES_DETECT) &&
9825+ !(get_defcfg_misc(snd_hda_codec_get_pincfg(codec, spec->unsol_tag_hp)) &
9826+ AC_DEFCFG_MISC_NO_PRESENCE))
9827+ spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID] = 1;
98199828 }
98209829
98219830 static int ca0132_prepare_verbs(struct hda_codec *codec)
sound/hda/codecs/hdmi/tegrahdmi.c+1−0
@@ -299,6 +299,7 @@ static const struct hda_device_id snd_hda_id_tegrahdmi[] = { · 298 unmodified lines
299299 HDA_CODEC_ID_MODEL(0x10de002f, "Tegra194 HDMI/DP2", MODEL_TEGRA),
300300 HDA_CODEC_ID_MODEL(0x10de0030, "Tegra194 HDMI/DP3", MODEL_TEGRA),
301301 HDA_CODEC_ID_MODEL(0x10de0031, "Tegra234 HDMI/DP", MODEL_TEGRA234),
302+ HDA_CODEC_ID_MODEL(0x10de0032, "Tegra238 HDMI/DP", MODEL_TEGRA234),
302303 HDA_CODEC_ID_MODEL(0x10de0033, "SoC 33 HDMI/DP", MODEL_TEGRA234),
303304 HDA_CODEC_ID_MODEL(0x10de0034, "Tegra264 HDMI/DP", MODEL_TEGRA234),
304305 HDA_CODEC_ID_MODEL(0x10de0035, "SoC 35 HDMI/DP", MODEL_TEGRA234),
sound/hda/codecs/realtek/alc269.c+1−0
@@ -6904,6 +6904,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { · 6903 unmodified lines
69046904 SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
69056905 SND_PCI_QUIRK(0x103c, 0x88b3, "HP ENVY x360 Convertible 15-es0xxx", ALC245_FIXUP_HP_ENVY_X360_MUTE_LED),
69066906 SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
6907+ SND_PCI_QUIRK(0x103c, 0x88d1, "HP Pavilion 15-eh1xxx (mainboard 88D1)", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT),
69076908 SND_PCI_QUIRK(0x103c, 0x88dd, "HP Pavilion 15z-ec200", ALC285_FIXUP_HP_MUTE_LED),
69086909 SND_PCI_QUIRK(0x103c, 0x88eb, "HP Victus 16-e0xxx", ALC245_FIXUP_HP_MUTE_LED_V2_COEFBIT),
69096910 SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
sound/hda/codecs/senarytech.c+8−6
@@ -19,15 +19,13 @@ · 18 unmodified lines
1919 #include "hda_jack.h"
2020 #include "generic.h"
2121
22−/* GPIO node ID */
23−#define SENARY_GPIO_NODE 0x01
24−
2522 struct senary_spec {
2623 struct hda_gen_spec gen;
2724
2825 /* extra EAPD pins */
2926 unsigned int num_eapds;
3027 hda_nid_t eapds[4];
28+ bool dynamic_eapd;
3129 hda_nid_t mute_led_eapd;
3230
3331 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
@@ -123,19 +121,23 @@ static void senary_init_gpio_led(struct hda_codec *codec) · 89 unmodified lines
123121 unsigned int mask = spec->gpio_mute_led_mask | spec->gpio_mic_led_mask;
124122
125123 if (mask) {
126− snd_hda_codec_write(codec, SENARY_GPIO_NODE, 0, AC_VERB_SET_GPIO_MASK,
124+ snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_MASK,
127125 mask);
128− snd_hda_codec_write(codec, SENARY_GPIO_NODE, 0, AC_VERB_SET_GPIO_DIRECTION,
126+ snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_DIRECTION,
129127 mask);
130− snd_hda_codec_write(codec, SENARY_GPIO_NODE, 0, AC_VERB_SET_GPIO_DATA,
128+ snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_DATA,
131129 spec->gpio_led);
132130 }
133131 }
134132
135133 static int senary_init(struct hda_codec *codec)
136134 {
135+ struct senary_spec *spec = codec->spec;
136+
137137 snd_hda_gen_init(codec);
138138 senary_init_gpio_led(codec);
139+ if (!spec->dynamic_eapd)
140+ senary_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true);
139141 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
140142
141143 return 0;
sound/hda/codecs/side-codecs/tas2781_hda_i2c.c+3−12
@@ -60,7 +60,6 @@ struct tas2781_hda_i2c_priv { · 59 unmodified lines
6060 int (*save_calibration)(struct tas2781_hda *h);
6161
6262 int hda_chip_id;
63− bool skip_calibration;
6463 };
6564
6665 static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data)
@@ -479,8 +478,7 @@ static void tasdevice_dspfw_init(void *context) · 412 unmodified lines
479478 /* If calibrated data occurs error, dsp will still works with default
480479 * calibrated data inside algo.
481480 */
482− if (!hda_priv->skip_calibration)
483− hda_priv->save_calibration(tas_hda);
481+ hda_priv->save_calibration(tas_hda);
484482 }
485483
486484 static void tasdev_fw_ready(const struct firmware *fmw, void *context)
@@ -535,7 +533,6 @@ static int tas2781_hda_bind(struct device *dev, struct device *master, · 48 unmodified lines
535533 void *master_data)
536534 {
537535 struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
538− struct tas2781_hda_i2c_priv *hda_priv = tas_hda->hda_priv;
539536 struct hda_component_parent *parent = master_data;
540537 struct hda_component *comp;
541538 struct hda_codec *codec;
@@ -564,14 +561,6 @@ static int tas2781_hda_bind(struct device *dev, struct device *master, · 22 unmodified lines
564561 break;
565562 }
566563
567− /*
568− * Using ASUS ROG Xbox Ally X (RC73XA) UEFI calibration data
569− * causes audio dropouts during playback, use fallback data
570− * from DSP firmware as a workaround.
571− */
572− if (codec->core.subsystem_id == 0x10431384)
573− hda_priv->skip_calibration = true;
574−
575564 guard(pm_runtime_active_auto)(dev);
576565
577566 comp->dev = dev;
@@ -643,6 +632,7 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt) · 65 unmodified lines
643632 */
644633 device_name = "TIAS2781";
645634 hda_priv->hda_chip_id = HDA_TAS2781;
635+ tas_hda->priv->chip_id = TAS2781;
646636 hda_priv->save_calibration = tas2781_save_calibration;
647637 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR;
648638 } else if (strstarts(dev_name(&clt->dev), "i2c-TXNW2770")) {
@@ -656,6 +646,7 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt) · 7 unmodified lines
656646 "i2c-TXNW2781:00-tas2781-hda.0")) {
657647 device_name = "TXNW2781";
658648 hda_priv->hda_chip_id = HDA_TAS2781;
649+ tas_hda->priv->chip_id = TAS2781;
659650 hda_priv->save_calibration = tas2781_save_calibration;
660651 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR;
661652 } else if (strstr(dev_name(&clt->dev), "INT8866")) {
sound/soc/amd/acp/amd-acp63-acpi-match.c+413−0
@@ -30,6 +30,20 @@ static const struct snd_soc_acpi_endpoint spk_r_endpoint = { · 29 unmodified lines
3030 .group_id = 1
3131 };
3232
33+static const struct snd_soc_acpi_endpoint spk_2_endpoint = {
34+ .num = 0,
35+ .aggregated = 1,
36+ .group_position = 2,
37+ .group_id = 1
38+};
39+
40+static const struct snd_soc_acpi_endpoint spk_3_endpoint = {
41+ .num = 0,
42+ .aggregated = 1,
43+ .group_position = 3,
44+ .group_id = 1
45+};
46+
3347 static const struct snd_soc_acpi_adr_device rt711_rt1316_group_adr[] = {
3448 {
3549 .adr = 0x000030025D071101ull,
@@ -103,6 +117,345 @@ static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = { · 67 unmodified lines
103117 }
104118 };
105119
120+static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = {
121+ { /* Jack Playback Endpoint */
122+ .num = 0,
123+ .aggregated = 0,
124+ .group_position = 0,
125+ .group_id = 0,
126+ },
127+ { /* DMIC Capture Endpoint */
128+ .num = 1,
129+ .aggregated = 0,
130+ .group_position = 0,
131+ .group_id = 0,
132+ },
133+ { /* Jack Capture Endpoint */
134+ .num = 2,
135+ .aggregated = 0,
136+ .group_position = 0,
137+ .group_id = 0,
138+ },
139+ { /* Speaker Playback Endpoint */
140+ .num = 3,
141+ .aggregated = 0,
142+ .group_position = 0,
143+ .group_id = 0,
144+ },
145+};
146+
147+static const struct snd_soc_acpi_adr_device cs35l56x4_l1u3210_adr[] = {
148+ {
149+ .adr = 0x00013301FA355601ull,
150+ .num_endpoints = 1,
151+ .endpoints = &spk_l_endpoint,
152+ .name_prefix = "AMP1"
153+ },
154+ {
155+ .adr = 0x00013201FA355601ull,
156+ .num_endpoints = 1,
157+ .endpoints = &spk_r_endpoint,
158+ .name_prefix = "AMP2"
159+ },
160+ {
161+ .adr = 0x00013101FA355601ull,
162+ .num_endpoints = 1,
163+ .endpoints = &spk_2_endpoint,
164+ .name_prefix = "AMP3"
165+ },
166+ {
167+ .adr = 0x00013001FA355601ull,
168+ .num_endpoints = 1,
169+ .endpoints = &spk_3_endpoint,
170+ .name_prefix = "AMP4"
171+ },
172+};
173+
174+static const struct snd_soc_acpi_adr_device cs35l63x2_l0u01_adr[] = {
175+ {
176+ .adr = 0x00003001FA356301ull,
177+ .num_endpoints = 1,
178+ .endpoints = &spk_l_endpoint,
179+ .name_prefix = "AMP1"
180+ },
181+ {
182+ .adr = 0x00003101FA356301ull,
183+ .num_endpoints = 1,
184+ .endpoints = &spk_r_endpoint,
185+ .name_prefix = "AMP2"
186+ },
187+};
188+
189+static const struct snd_soc_acpi_adr_device cs35l63x2_l1u01_adr[] = {
190+ {
191+ .adr = 0x00013001FA356301ull,
192+ .num_endpoints = 1,
193+ .endpoints = &spk_l_endpoint,
194+ .name_prefix = "AMP1"
195+ },
196+ {
197+ .adr = 0x00013101FA356301ull,
198+ .num_endpoints = 1,
199+ .endpoints = &spk_r_endpoint,
200+ .name_prefix = "AMP2"
201+ },
202+};
203+
204+static const struct snd_soc_acpi_adr_device cs35l63x2_l1u13_adr[] = {
205+ {
206+ .adr = 0x00013101FA356301ull,
207+ .num_endpoints = 1,
208+ .endpoints = &spk_l_endpoint,
209+ .name_prefix = "AMP1"
210+ },
211+ {
212+ .adr = 0x00013301FA356301ull,
213+ .num_endpoints = 1,
214+ .endpoints = &spk_r_endpoint,
215+ .name_prefix = "AMP2"
216+ },
217+};
218+
219+static const struct snd_soc_acpi_adr_device cs35l63x4_l0u0246_adr[] = {
220+ {
221+ .adr = 0x00003001FA356301ull,
222+ .num_endpoints = 1,
223+ .endpoints = &spk_l_endpoint,
224+ .name_prefix = "AMP1"
225+ },
226+ {
227+ .adr = 0x00003201FA356301ull,
228+ .num_endpoints = 1,
229+ .endpoints = &spk_r_endpoint,
230+ .name_prefix = "AMP2"
231+ },
232+ {
233+ .adr = 0x00003401FA356301ull,
234+ .num_endpoints = 1,
235+ .endpoints = &spk_2_endpoint,
236+ .name_prefix = "AMP3"
237+ },
238+ {
239+ .adr = 0x00003601FA356301ull,
240+ .num_endpoints = 1,
241+ .endpoints = &spk_3_endpoint,
242+ .name_prefix = "AMP4"
243+ },
244+};
245+
246+static const struct snd_soc_acpi_adr_device cs42l43_l0u0_adr[] = {
247+ {
248+ .adr = 0x00003001FA424301ull,
249+ .num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
250+ .endpoints = cs42l43_endpoints,
251+ .name_prefix = "cs42l43"
252+ }
253+};
254+
255+static const struct snd_soc_acpi_adr_device cs42l43_l0u1_adr[] = {
256+ {
257+ .adr = 0x00003101FA424301ull,
258+ .num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
259+ .endpoints = cs42l43_endpoints,
260+ .name_prefix = "cs42l43"
261+ }
262+};
263+
264+static const struct snd_soc_acpi_adr_device cs42l43b_l0u1_adr[] = {
265+ {
266+ .adr = 0x00003101FA2A3B01ull,
267+ .num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
268+ .endpoints = cs42l43_endpoints,
269+ .name_prefix = "cs42l43"
270+ }
271+};
272+
273+static const struct snd_soc_acpi_adr_device cs42l43_l1u0_cs35l56x4_l1u0123_adr[] = {
274+ {
275+ .adr = 0x00013001FA424301ull,
276+ .num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
277+ .endpoints = cs42l43_endpoints,
278+ .name_prefix = "cs42l43"
279+ },
280+ {
281+ .adr = 0x00013001FA355601ull,
282+ .num_endpoints = 1,
283+ .endpoints = &spk_l_endpoint,
284+ .name_prefix = "AMP1"
285+ },
286+ {
287+ .adr = 0x00013101FA355601ull,
288+ .num_endpoints = 1,
289+ .endpoints = &spk_r_endpoint,
290+ .name_prefix = "AMP2"
291+ },
292+ {
293+ .adr = 0x00013201FA355601ull,
294+ .num_endpoints = 1,
295+ .endpoints = &spk_2_endpoint,
296+ .name_prefix = "AMP3"
297+ },
298+ {
299+ .adr = 0x00013301FA355601ull,
300+ .num_endpoints = 1,
301+ .endpoints = &spk_3_endpoint,
302+ .name_prefix = "AMP4"
303+ },
304+};
305+
306+static const struct snd_soc_acpi_adr_device cs42l45_l0u0_adr[] = {
307+ {
308+ .adr = 0x00003001FA424501ull,
309+ /* Re-use endpoints, but cs42l45 has no speaker */
310+ .num_endpoints = ARRAY_SIZE(cs42l43_endpoints) - 1,
311+ .endpoints = cs42l43_endpoints,
312+ .name_prefix = "cs42l45"
313+ }
314+};
315+
316+static const struct snd_soc_acpi_adr_device cs42l45_l1u0_adr[] = {
317+ {
318+ .adr = 0x00013001FA424501ull,
319+ /* Re-use endpoints, but cs42l45 has no speaker */
320+ .num_endpoints = ARRAY_SIZE(cs42l43_endpoints) - 1,
321+ .endpoints = cs42l43_endpoints,
322+ .name_prefix = "cs42l45"
323+ }
324+};
325+
326+static const struct snd_soc_acpi_link_adr acp63_cs35l56x4_l1u3210[] = {
327+ {
328+ .mask = BIT(1),
329+ .num_adr = ARRAY_SIZE(cs35l56x4_l1u3210_adr),
330+ .adr_d = cs35l56x4_l1u3210_adr,
331+ },
332+ {}
333+};
334+
335+static const struct snd_soc_acpi_link_adr acp63_cs35l63x4_l0u0246[] = {
336+ {
337+ .mask = BIT(0),
338+ .num_adr = ARRAY_SIZE(cs35l63x4_l0u0246_adr),
339+ .adr_d = cs35l63x4_l0u0246_adr,
340+ },
341+ {}
342+};
343+
344+static const struct snd_soc_acpi_link_adr acp63_cs42l43_l0u1[] = {
345+ {
346+ .mask = BIT(0),
347+ .num_adr = ARRAY_SIZE(cs42l43_l0u1_adr),
348+ .adr_d = cs42l43_l0u1_adr,
349+ },
350+ {}
351+};
352+
353+static const struct snd_soc_acpi_link_adr acp63_cs42l43b_l0u1[] = {
354+ {
355+ .mask = BIT(0),
356+ .num_adr = ARRAY_SIZE(cs42l43b_l0u1_adr),
357+ .adr_d = cs42l43b_l0u1_adr,
358+ },
359+ {}
360+};
361+
362+static const struct snd_soc_acpi_link_adr acp63_cs42l43_l0u0_cs35l56x4_l1u3210[] = {
363+ {
364+ .mask = BIT(0),
365+ .num_adr = ARRAY_SIZE(cs42l43_l0u0_adr),
366+ .adr_d = cs42l43_l0u0_adr,
367+ },
368+ {
369+ .mask = BIT(1),
370+ .num_adr = ARRAY_SIZE(cs35l56x4_l1u3210_adr),
371+ .adr_d = cs35l56x4_l1u3210_adr,
372+ },
373+ {}
374+};
375+
376+static const struct snd_soc_acpi_link_adr acp63_cs42l43_l1u0_cs35l56x4_l1u0123[] = {
377+ {
378+ .mask = BIT(1),
379+ .num_adr = ARRAY_SIZE(cs42l43_l1u0_cs35l56x4_l1u0123_adr),
380+ .adr_d = cs42l43_l1u0_cs35l56x4_l1u0123_adr,
381+ },
382+ {}
383+};
384+
385+static const struct snd_soc_acpi_link_adr acp63_cs42l45_l0u0[] = {
386+ {
387+ .mask = BIT(0),
388+ .num_adr = ARRAY_SIZE(cs42l45_l0u0_adr),
389+ .adr_d = cs42l45_l0u0_adr,
390+ },
391+ {}
392+};
393+
394+static const struct snd_soc_acpi_link_adr acp63_cs42l45_l0u0_cs35l63x2_l1u01[] = {
395+ {
396+ .mask = BIT(0),
397+ .num_adr = ARRAY_SIZE(cs42l45_l0u0_adr),
398+ .adr_d = cs42l45_l0u0_adr,
399+ },
400+ {
401+ .mask = BIT(1),
402+ .num_adr = ARRAY_SIZE(cs35l63x2_l1u01_adr),
403+ .adr_d = cs35l63x2_l1u01_adr,
404+ },
405+ {}
406+};
407+
408+static const struct snd_soc_acpi_link_adr acp63_cs42l45_l0u0_cs35l63x2_l1u13[] = {
409+ {
410+ .mask = BIT(0),
411+ .num_adr = ARRAY_SIZE(cs42l45_l0u0_adr),
412+ .adr_d = cs42l45_l0u0_adr,
413+ },
414+ {
415+ .mask = BIT(1),
416+ .num_adr = ARRAY_SIZE(cs35l63x2_l1u13_adr),
417+ .adr_d = cs35l63x2_l1u13_adr,
418+ },
419+ {}
420+};
421+
422+static const struct snd_soc_acpi_link_adr acp63_cs42l45_l1u0[] = {
423+ {
424+ .mask = BIT(1),
425+ .num_adr = ARRAY_SIZE(cs42l45_l1u0_adr),
426+ .adr_d = cs42l45_l1u0_adr,
427+ },
428+ {}
429+};
430+
431+static const struct snd_soc_acpi_link_adr acp63_cs42l45_l1u0_cs35l63x2_l0u01[] = {
432+ {
433+ .mask = BIT(1),
434+ .num_adr = ARRAY_SIZE(cs42l45_l1u0_adr),
435+ .adr_d = cs42l45_l1u0_adr,
436+ },
437+ {
438+ .mask = BIT(0),
439+ .num_adr = ARRAY_SIZE(cs35l63x2_l0u01_adr),
440+ .adr_d = cs35l63x2_l0u01_adr,
441+ },
442+ {}
443+};
444+
445+static const struct snd_soc_acpi_link_adr acp63_cs42l45_l1u0_cs35l63x4_l0u0246[] = {
446+ {
447+ .mask = BIT(1),
448+ .num_adr = ARRAY_SIZE(cs42l45_l1u0_adr),
449+ .adr_d = cs42l45_l1u0_adr,
450+ },
451+ {
452+ .mask = BIT(0),
453+ .num_adr = ARRAY_SIZE(cs35l63x4_l0u0246_adr),
454+ .adr_d = cs35l63x4_l0u0246_adr,
455+ },
456+ {}
457+};
458+
106459 static const struct snd_soc_acpi_link_adr acp63_rt722_only[] = {
107460 {
108461 .mask = BIT(0),
@@ -135,6 +488,66 @@ struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_sdw_machines[] = { · 26 unmodified lines
135488 .links = acp63_4_in_1_sdca,
136489 .drv_name = "amd_sdw",
137490 },
491+ {
492+ .link_mask = BIT(0) | BIT(1),
493+ .links = acp63_cs42l43_l0u0_cs35l56x4_l1u3210,
494+ .drv_name = "amd_sdw",
495+ },
496+ {
497+ .link_mask = BIT(0) | BIT(1),
498+ .links = acp63_cs42l45_l1u0_cs35l63x4_l0u0246,
499+ .drv_name = "amd_sdw",
500+ },
501+ {
502+ .link_mask = BIT(0) | BIT(1),
503+ .links = acp63_cs42l45_l0u0_cs35l63x2_l1u01,
504+ .drv_name = "amd_sdw",
505+ },
506+ {
507+ .link_mask = BIT(0) | BIT(1),
508+ .links = acp63_cs42l45_l0u0_cs35l63x2_l1u13,
509+ .drv_name = "amd_sdw",
510+ },
511+ {
512+ .link_mask = BIT(0) | BIT(1),
513+ .links = acp63_cs42l45_l1u0_cs35l63x2_l0u01,
514+ .drv_name = "amd_sdw",
515+ },
516+ {
517+ .link_mask = BIT(1),
518+ .links = acp63_cs42l43_l1u0_cs35l56x4_l1u0123,
519+ .drv_name = "amd_sdw",
520+ },
521+ {
522+ .link_mask = BIT(1),
523+ .links = acp63_cs35l56x4_l1u3210,
524+ .drv_name = "amd_sdw",
525+ },
526+ {
527+ .link_mask = BIT(0),
528+ .links = acp63_cs35l63x4_l0u0246,
529+ .drv_name = "amd_sdw",
530+ },
531+ {
532+ .link_mask = BIT(0),
533+ .links = acp63_cs42l43_l0u1,
534+ .drv_name = "amd_sdw",
535+ },
536+ {
537+ .link_mask = BIT(0),
538+ .links = acp63_cs42l43b_l0u1,
539+ .drv_name = "amd_sdw",
540+ },
541+ {
542+ .link_mask = BIT(0),
543+ .links = acp63_cs42l45_l0u0,
544+ .drv_name = "amd_sdw",
545+ },
546+ {
547+ .link_mask = BIT(1),
548+ .links = acp63_cs42l45_l1u0,
549+ .drv_name = "amd_sdw",
550+ },
138551 {},
139552 };
140553 EXPORT_SYMBOL(snd_soc_acpi_amd_acp63_sdw_machines);
sound/soc/amd/yc/acp6x-mach.c+7−0
@@ -710,6 +710,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { · 709 unmodified lines
710710 DMI_MATCH(DMI_PRODUCT_NAME, "ASUS EXPERTBOOK BM1503CDA"),
711711 }
712712 },
713+ {
714+ .driver_data = &acp6x_card,
715+ .matches = {
716+ DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
717+ DMI_MATCH(DMI_BOARD_NAME, "PM1503CDA"),
718+ }
719+ },
713720 {}
714721 };
715722
sound/soc/codecs/cs35l56-shared.c+15−1
@@ -26,7 +26,7 @@ · 25 unmodified lines
2626
2727 #include "cs35l56.h"
2828
29−static const struct reg_sequence cs35l56_patch[] = {
29+static const struct reg_sequence cs35l56_asp_patch[] = {
3030 /*
3131 * Firmware can change these to non-defaults to satisfy SDCA.
3232 * Ensure that they are at known defaults.
@@ -43,6 +43,20 @@ static const struct reg_sequence cs35l56_patch[] = { · 10 unmodified lines
4343 { CS35L56_ASP1TX2_INPUT, 0x00000000 },
4444 { CS35L56_ASP1TX3_INPUT, 0x00000000 },
4545 { CS35L56_ASP1TX4_INPUT, 0x00000000 },
46+};
47+
48+int cs35l56_set_asp_patch(struct cs35l56_base *cs35l56_base)
49+{
50+ return regmap_register_patch(cs35l56_base->regmap, cs35l56_asp_patch,
51+ ARRAY_SIZE(cs35l56_asp_patch));
52+}
53+EXPORT_SYMBOL_NS_GPL(cs35l56_set_asp_patch, "SND_SOC_CS35L56_SHARED");
54+
55+static const struct reg_sequence cs35l56_patch[] = {
56+ /*
57+ * Firmware can change these to non-defaults to satisfy SDCA.
58+ * Ensure that they are at known defaults.
59+ */
4660 { CS35L56_SWIRE_DP3_CH1_INPUT, 0x00000018 },
4761 { CS35L56_SWIRE_DP3_CH2_INPUT, 0x00000019 },
4862 { CS35L56_SWIRE_DP3_CH3_INPUT, 0x00000029 },
sound/soc/codecs/cs35l56.c+10−2
@@ -348,6 +348,13 @@ static int cs35l56_dsp_event(struct snd_soc_dapm_widget *w, · 347 unmodified lines
348348 return wm_adsp_event(w, kcontrol, event);
349349 }
350350
351+static int cs35l56_asp_dai_probe(struct snd_soc_dai *codec_dai)
352+{
353+ struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component);
354+
355+ return cs35l56_set_asp_patch(&cs35l56->base);
356+}
357+
351358 static int cs35l56_asp_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
352359 {
353360 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component);
@@ -552,6 +559,7 @@ static int cs35l56_asp_dai_set_sysclk(struct snd_soc_dai *dai, · 198 unmodified lines
552559 }
553560
554561 static const struct snd_soc_dai_ops cs35l56_ops = {
562+ .probe = cs35l56_asp_dai_probe,
555563 .set_fmt = cs35l56_asp_dai_set_fmt,
556564 .set_tdm_slot = cs35l56_asp_dai_set_tdm_slot,
557565 .hw_params = cs35l56_asp_dai_hw_params,
@@ -1617,9 +1625,9 @@ static int cs35l56_process_xu_onchip_speaker_id(struct cs35l56_private *cs35l56, · 1059 unmodified lines
16171625 if (num_pulls < 0)
16181626 return num_pulls;
16191627
1620− if (num_pulls != num_gpios) {
1628+ if (num_pulls && (num_pulls != num_gpios)) {
16211629 dev_warn(cs35l56->base.dev, "%s count(%d) != %s count(%d)\n",
1622− pull_name, num_pulls, gpio_name, num_gpios);
1630+ pull_name, num_pulls, gpio_name, num_gpios);
16231631 }
16241632
16251633 ret = cs35l56_check_and_save_onchip_spkid_gpios(&cs35l56->base,
sound/soc/codecs/rt1320-sdw.c+3−2
@@ -2629,7 +2629,7 @@ static int rt1320_sdw_hw_params(struct snd_pcm_substream *substream, · 2628 unmodified lines
26292629 struct sdw_port_config port_config;
26302630 struct sdw_port_config dmic_port_config[2];
26312631 struct sdw_stream_runtime *sdw_stream;
2632− int retval;
2632+ int retval, num_channels;
26332633 unsigned int sampling_rate;
26342634
26352635 dev_dbg(dai->dev, "%s %s", __func__, dai->name);
@@ -2661,7 +2661,8 @@ static int rt1320_sdw_hw_params(struct snd_pcm_substream *substream, · 25 unmodified lines
26612661 dmic_port_config[1].num = 10;
26622662 break;
26632663 case RT1321_DEV_ID:
2664− dmic_port_config[0].ch_mask = BIT(0) | BIT(1);
2664+ num_channels = params_channels(params);
2665+ dmic_port_config[0].ch_mask = GENMASK(num_channels - 1, 0);
26652666 dmic_port_config[0].num = 8;
26662667 break;
26672668 default:
sound/soc/codecs/tas2781-fmwlib.c+94−0
@@ -32,6 +32,10 @@ · 31 unmodified lines
3232 #define TAS2781_YRAM1_PAGE 42
3333 #define TAS2781_YRAM1_START_REG 88
3434
35+#define TAS2781_PG_REG TASDEVICE_REG(0x00, 0x00, 0x7c)
36+#define TAS2781_PG_1_0 0xA0
37+#define TAS2781_PG_2_0 0xA8
38+
3539 #define TAS2781_YRAM2_START_PAGE 43
3640 #define TAS2781_YRAM2_END_PAGE 49
3741 #define TAS2781_YRAM2_START_REG 8
@@ -98,6 +102,12 @@ struct blktyp_devidx_map { · 60 unmodified lines
98102 unsigned char dev_idx;
99103 };
100104
105+struct tas2781_cali_specific {
106+ unsigned char sin_gni[4];
107+ int sin_gni_reg;
108+ bool is_sin_gn_flush;
109+};
110+
101111 static const char deviceNumber[TASDEVICE_DSP_TAS_MAX_DEVICE] = {
102112 1, 2, 1, 2, 1, 1, 0, 2, 4, 3, 1, 2, 3, 4, 1, 2
103113 };
@@ -2454,6 +2464,84 @@ static int tasdevice_load_data(struct tasdevice_priv *tas_priv, · 2350 unmodified lines
24542464 return ret;
24552465 }
24562466
2467+static int tas2781_cali_preproc(struct tasdevice_priv *priv, int i)
2468+{
2469+ struct tas2781_cali_specific *spec = priv->tasdevice[i].cali_specific;
2470+ struct calidata *cali_data = &priv->cali_data;
2471+ struct cali_reg *p = &cali_data->cali_reg_array;
2472+ unsigned char *data = cali_data->data;
2473+ int rc;
2474+
2475+ /*
2476+ * On TAS2781, if the Speaker calibrated impedance is lower than
2477+ * default value hard-coded inside the TAS2781, it will cuase vol
2478+ * lower than normal. In order to fix this issue, the parameter of
2479+ * SineGainI need updating.
2480+ */
2481+ if (spec == NULL) {
2482+ int k = i * (cali_data->cali_dat_sz_per_dev + 1);
2483+ int re_org, re_cal, corrected_sin_gn, pg_id;
2484+ unsigned char r0_deflt[4];
2485+
2486+ spec = devm_kzalloc(priv->dev, sizeof(*spec), GFP_KERNEL);
2487+ if (spec == NULL)
2488+ return -ENOMEM;
2489+ priv->tasdevice[i].cali_specific = spec;
2490+ rc = tasdevice_dev_bulk_read(priv, i, p->r0_reg, r0_deflt, 4);
2491+ if (rc < 0) {
2492+ dev_err(priv->dev, "invalid RE from %d = %d\n", i, rc);
2493+ return rc;
2494+ }
2495+ /*
2496+ * SineGainI need to be re-calculated, calculate the high 16
2497+ * bits.
2498+ */
2499+ re_org = r0_deflt[0] << 8 | r0_deflt[1];
2500+ re_cal = data[k + 1] << 8 | data[k + 2];
2501+ if (re_org > re_cal) {
2502+ rc = tasdevice_dev_read(priv, i, TAS2781_PG_REG,
2503+ &pg_id);
2504+ if (rc < 0) {
2505+ dev_err(priv->dev, "invalid PG id %d = %d\n",
2506+ i, rc);
2507+ return rc;
2508+ }
2509+
2510+ spec->sin_gni_reg = (pg_id == TAS2781_PG_1_0) ?
2511+ TASDEVICE_REG(0, 0x1b, 0x34) :
2512+ TASDEVICE_REG(0, 0x18, 0x1c);
2513+
2514+ rc = tasdevice_dev_bulk_read(priv, i,
2515+ spec->sin_gni_reg,
2516+ spec->sin_gni, 4);
2517+ if (rc < 0) {
2518+ dev_err(priv->dev, "wrong sinegaini %d = %d\n",
2519+ i, rc);
2520+ return rc;
2521+ }
2522+ corrected_sin_gn = re_org * ((spec->sin_gni[0] << 8) +
2523+ spec->sin_gni[1]);
2524+ corrected_sin_gn /= re_cal;
2525+ spec->sin_gni[0] = corrected_sin_gn >> 8;
2526+ spec->sin_gni[1] = corrected_sin_gn & 0xff;
2527+
2528+ spec->is_sin_gn_flush = true;
2529+ }
2530+ }
2531+
2532+ if (spec->is_sin_gn_flush) {
2533+ rc = tasdevice_dev_bulk_write(priv, i, spec->sin_gni_reg,
2534+ spec->sin_gni, 4);
2535+ if (rc < 0) {
2536+ dev_err(priv->dev, "update failed %d = %d\n",
2537+ i, rc);
2538+ return rc;
2539+ }
2540+ }
2541+
2542+ return 0;
2543+}
2544+
24572545 static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i)
24582546 {
24592547 struct calidata *cali_data = &priv->cali_data;
@@ -2469,6 +2557,12 @@ static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i) · 9 unmodified lines
24692557 }
24702558 k++;
24712559
2560+ if (priv->chip_id == TAS2781) {
2561+ rc = tas2781_cali_preproc(priv, i);
2562+ if (rc < 0)
2563+ return;
2564+ }
2565+
24722566 rc = tasdevice_dev_bulk_write(priv, i, p->r0_reg, &(data[k]), 4);
24732567 if (rc < 0) {
24742568 dev_err(priv->dev, "chn %d r0_reg bulk_wr err = %d\n", i, rc);
sound/soc/fsl/fsl_easrc.c+10−4
@@ -52,10 +52,13 @@ static int fsl_easrc_iec958_put_bits(struct snd_kcontrol *kcontrol, · 51 unmodified lines
5252 struct soc_mreg_control *mc =
5353 (struct soc_mreg_control *)kcontrol->private_value;
5454 unsigned int regval = ucontrol->value.integer.value[0];
55+ int ret;
56+
57+ ret = (easrc_priv->bps_iec958[mc->regbase] != regval);
5558
5659 easrc_priv->bps_iec958[mc->regbase] = regval;
5760
58− return 0;
61+ return ret;
5962 }
6063
6164 static int fsl_easrc_iec958_get_bits(struct snd_kcontrol *kcontrol,
@@ -93,14 +96,17 @@ static int fsl_easrc_set_reg(struct snd_kcontrol *kcontrol, · 31 unmodified lines
9396 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
9497 struct soc_mreg_control *mc =
9598 (struct soc_mreg_control *)kcontrol->private_value;
99+ struct fsl_asrc *easrc = snd_soc_component_get_drvdata(component);
96100 unsigned int regval = ucontrol->value.integer.value[0];
101+ bool changed;
97102 int ret;
98103
99− ret = snd_soc_component_write(component, mc->regbase, regval);
100− if (ret < 0)
104+ ret = regmap_update_bits_check(easrc->regmap, mc->regbase,
105+ GENMASK(31, 0), regval, &changed);
106+ if (ret != 0)
101107 return ret;
102108
103− return 0;
109+ return changed;
104110 }
105111
106112 #define SOC_SINGLE_REG_RW(xname, xreg) \
sound/soc/intel/boards/sof_sdw.c+8−0
@@ -763,6 +763,14 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = { · 762 unmodified lines
763763 },
764764 .driver_data = (void *)(SOC_SDW_CODEC_SPKR),
765765 },
766+ {
767+ .callback = sof_sdw_quirk_cb,
768+ .matches = {
769+ DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
770+ DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0CCD")
771+ },
772+ .driver_data = (void *)(SOC_SDW_CODEC_SPKR),
773+ },
766774 /* Pantherlake devices*/
767775 {
768776 .callback = sof_sdw_quirk_cb,
sound/soc/sdca/sdca_functions.c+4−1
@@ -1156,9 +1156,12 @@ static int find_sdca_entity_iot(struct device *dev, · 1155 unmodified lines
11561156 if (!terminal->is_dataport) {
11571157 const char *type_name = sdca_find_terminal_name(terminal->type);
11581158
1159− if (type_name)
1159+ if (type_name) {
11601160 entity->label = devm_kasprintf(dev, GFP_KERNEL, "%s %s",
11611161 entity->label, type_name);
1162+ if (!entity->label)
1163+ return -ENOMEM;
1164+ }
11621165 }
11631166
11641167 ret = fwnode_property_read_u32(entity_node,
sound/usb/quirks.c+2−0
@@ -2219,6 +2219,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { · 2218 unmodified lines
22192219 QUIRK_FLAG_ALIGN_TRANSFER),
22202220 DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */
22212221 QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
2222+ DEVICE_FLG(0x0624, 0x3d3f, /* AB13X USB Audio */
2223+ QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY),
22222224 DEVICE_FLG(0x0644, 0x8043, /* TEAC UD-501/UD-501V2/UD-503/NT-503 */
22232225 QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
22242226 QUIRK_FLAG_IFACE_DELAY),
sound/usb/usx2y/us122l.c+2−10
@@ -520,8 +520,6 @@ static int us122l_usb_probe(struct usb_interface *intf, · 519 unmodified lines
520520 return err;
521521 }
522522
523− usb_get_intf(usb_ifnum_to_if(device, 0));
524− usb_get_dev(device);
525523 *cardp = card;
526524 return 0;
527525 }
@@ -542,11 +540,9 @@ static int snd_us122l_probe(struct usb_interface *intf, · 14 unmodified lines
542540 if (intf->cur_altsetting->desc.bInterfaceNumber != 1)
543541 return 0;
544542
545− err = us122l_usb_probe(usb_get_intf(intf), id, &card);
546− if (err < 0) {
547− usb_put_intf(intf);
543+ err = us122l_usb_probe(intf, id, &card);
544+ if (err < 0)
548545 return err;
549− }
550546
551547 usb_set_intfdata(intf, card);
552548 return 0;
@@ -574,10 +570,6 @@ static void snd_us122l_disconnect(struct usb_interface *intf) · 21 unmodified lines
574570 snd_usbmidi_disconnect(p);
575571 }
576572
577− usb_put_intf(usb_ifnum_to_if(us122l->dev, 0));
578− usb_put_intf(usb_ifnum_to_if(us122l->dev, 1));
579− usb_put_dev(us122l->dev);
580−
581573 snd_card_free_when_closed(card);
582574 }
583575