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
23 enum:23 enum:
24 - nvidia,tegra210-audio-graph-card24 - nvidia,tegra210-audio-graph-card
25 - nvidia,tegra186-audio-graph-card25 - nvidia,tegra186-audio-graph-card
26 - nvidia,tegra238-audio-graph-card
26 - nvidia,tegra264-audio-graph-card27 - nvidia,tegra264-audio-graph-card
27 28
28 clocks:29 clocks:
Documentation/devicetree/bindings/sound/renesas,rz-ssi.yaml+1−0
@@ -20,6 +20,7 @@ properties: · 19 unmodified lines
20 - renesas,r9a07g044-ssi # RZ/G2{L,LC}20 - renesas,r9a07g044-ssi # RZ/G2{L,LC}
21 - renesas,r9a07g054-ssi # RZ/V2L21 - renesas,r9a07g054-ssi # RZ/V2L
22 - renesas,r9a08g045-ssi # RZ/G3S22 - renesas,r9a08g045-ssi # RZ/G3S
23 - renesas,r9a08g046-ssi # RZ/G3L
23 - const: renesas,rz-ssi24 - const: renesas,rz-ssi
24 25
25 reg:26 reg:
Documentation/sound/alsa-configuration.rst+4−0
@@ -2372,6 +2372,10 @@ quirk_flags · 2371 unmodified lines
2372 audible volume2372 audible volume
2373 * bit 25: ``mixer_capture_min_mute``2373 * bit 25: ``mixer_capture_min_mute``
2374 Similar to bit 24 but for capture streams2374 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
2375 2379
2376This module supports multiple devices, autoprobe and hotplugging.2380This module supports multiple devices, autoprobe and hotplugging.
2377 2381
include/sound/cs35l56.h+1−0
@@ -406,6 +406,7 @@ extern const char * const cs35l56_cal_set_status_text[3]; · 405 unmodified lines
406extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC];406extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC];
407extern const unsigned int cs35l56_tx_input_values[CS35L56_NUM_INPUT_SRC];407extern const unsigned int cs35l56_tx_input_values[CS35L56_NUM_INPUT_SRC];
408 408
409int cs35l56_set_asp_patch(struct cs35l56_base *cs35l56_base);
409int cs35l56_set_patch(struct cs35l56_base *cs35l56_base);410int cs35l56_set_patch(struct cs35l56_base *cs35l56_base);
410int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command);411int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command);
411int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base);412int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base);
include/sound/tas2781.h+1−0
@@ -151,6 +151,7 @@ struct tasdevice { · 150 unmodified lines
151 struct bulk_reg_val *cali_data_backup;151 struct bulk_reg_val *cali_data_backup;
152 struct bulk_reg_val alp_cali_bckp;152 struct bulk_reg_val alp_cali_bckp;
153 struct tasdevice_fw *cali_data_fmw;153 struct tasdevice_fw *cali_data_fmw;
154 void *cali_specific;
154 unsigned int dev_addr;155 unsigned int dev_addr;
155 unsigned int err_code;156 unsigned int err_code;
156 unsigned char cur_book;157 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
122 fw_csr_string(dev->config_rom + 5, CSR_VENDOR, vendor, sizeof(vendor));122 fw_csr_string(dev->config_rom + 5, CSR_VENDOR, vendor, sizeof(vendor));
123 strscpy(model, "?");123 strscpy(model, "?");
124 fw_csr_string(dice->unit->directory, CSR_MODEL, model, sizeof(model));124 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),
126 "%s %s (serial %u) at %s, S%d",126 "%s %s (serial %u) at %s, S%d",
127 vendor, model, dev->config_rom[4] & 0x3fffff,127 vendor, model, dev->config_rom[4] & 0x3fffff,
128 dev_name(&dice->unit->device), 100 << dev->max_speed);128 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
9816 spec->dig_in = 0x09;9816 spec->dig_in = 0x09;
9817 break;9817 break;
9818 }9818 }
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;
9819}9828}
9820 9829
9821static int ca0132_prepare_verbs(struct hda_codec *codec)9830static 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
299 HDA_CODEC_ID_MODEL(0x10de002f, "Tegra194 HDMI/DP2", MODEL_TEGRA),299 HDA_CODEC_ID_MODEL(0x10de002f, "Tegra194 HDMI/DP2", MODEL_TEGRA),
300 HDA_CODEC_ID_MODEL(0x10de0030, "Tegra194 HDMI/DP3", MODEL_TEGRA),300 HDA_CODEC_ID_MODEL(0x10de0030, "Tegra194 HDMI/DP3", MODEL_TEGRA),
301 HDA_CODEC_ID_MODEL(0x10de0031, "Tegra234 HDMI/DP", MODEL_TEGRA234),301 HDA_CODEC_ID_MODEL(0x10de0031, "Tegra234 HDMI/DP", MODEL_TEGRA234),
302 HDA_CODEC_ID_MODEL(0x10de0032, "Tegra238 HDMI/DP", MODEL_TEGRA234),
302 HDA_CODEC_ID_MODEL(0x10de0033, "SoC 33 HDMI/DP", MODEL_TEGRA234),303 HDA_CODEC_ID_MODEL(0x10de0033, "SoC 33 HDMI/DP", MODEL_TEGRA234),
303 HDA_CODEC_ID_MODEL(0x10de0034, "Tegra264 HDMI/DP", MODEL_TEGRA234),304 HDA_CODEC_ID_MODEL(0x10de0034, "Tegra264 HDMI/DP", MODEL_TEGRA234),
304 HDA_CODEC_ID_MODEL(0x10de0035, "SoC 35 HDMI/DP", MODEL_TEGRA234),305 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
6904 SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),6904 SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
6905 SND_PCI_QUIRK(0x103c, 0x88b3, "HP ENVY x360 Convertible 15-es0xxx", ALC245_FIXUP_HP_ENVY_X360_MUTE_LED),6905 SND_PCI_QUIRK(0x103c, 0x88b3, "HP ENVY x360 Convertible 15-es0xxx", ALC245_FIXUP_HP_ENVY_X360_MUTE_LED),
6906 SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),6906 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),
6907 SND_PCI_QUIRK(0x103c, 0x88dd, "HP Pavilion 15z-ec200", ALC285_FIXUP_HP_MUTE_LED),6908 SND_PCI_QUIRK(0x103c, 0x88dd, "HP Pavilion 15z-ec200", ALC285_FIXUP_HP_MUTE_LED),
6908 SND_PCI_QUIRK(0x103c, 0x88eb, "HP Victus 16-e0xxx", ALC245_FIXUP_HP_MUTE_LED_V2_COEFBIT),6909 SND_PCI_QUIRK(0x103c, 0x88eb, "HP Victus 16-e0xxx", ALC245_FIXUP_HP_MUTE_LED_V2_COEFBIT),
6909 SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),6910 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
19#include "hda_jack.h"19#include "hda_jack.h"
20#include "generic.h"20#include "generic.h"
21 21
22/* GPIO node ID */
23#define SENARY_GPIO_NODE 0x01
24
25struct senary_spec {22struct senary_spec {
26 struct hda_gen_spec gen;23 struct hda_gen_spec gen;
27 24
28 /* extra EAPD pins */25 /* extra EAPD pins */
29 unsigned int num_eapds;26 unsigned int num_eapds;
30 hda_nid_t eapds[4];27 hda_nid_t eapds[4];
28 bool dynamic_eapd;
31 hda_nid_t mute_led_eapd;29 hda_nid_t mute_led_eapd;
32 30
33 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */31 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
123 unsigned int mask = spec->gpio_mute_led_mask | spec->gpio_mic_led_mask;121 unsigned int mask = spec->gpio_mute_led_mask | spec->gpio_mic_led_mask;
124 122
125 if (mask) {123 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,
127 mask);125 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,
129 mask);127 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,
131 spec->gpio_led);129 spec->gpio_led);
132 }130 }
133}131}
134 132
135static int senary_init(struct hda_codec *codec)133static int senary_init(struct hda_codec *codec)
136{134{
135 struct senary_spec *spec = codec->spec;
136
137 snd_hda_gen_init(codec);137 snd_hda_gen_init(codec);
138 senary_init_gpio_led(codec);138 senary_init_gpio_led(codec);
139 if (!spec->dynamic_eapd)
140 senary_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true);
139 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);141 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
140 142
141 return 0;143 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
60 int (*save_calibration)(struct tas2781_hda *h);60 int (*save_calibration)(struct tas2781_hda *h);
61 61
62 int hda_chip_id;62 int hda_chip_id;
63 bool skip_calibration;
64};63};
65 64
66static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data)65static 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
479 /* If calibrated data occurs error, dsp will still works with default478 /* If calibrated data occurs error, dsp will still works with default
480 * calibrated data inside algo.479 * calibrated data inside algo.
481 */480 */
482 if (!hda_priv->skip_calibration)481 hda_priv->save_calibration(tas_hda);
483 hda_priv->save_calibration(tas_hda);
484}482}
485 483
486static void tasdev_fw_ready(const struct firmware *fmw, void *context)484static 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
535 void *master_data)533 void *master_data)
536{534{
537 struct tas2781_hda *tas_hda = dev_get_drvdata(dev);535 struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
538 struct tas2781_hda_i2c_priv *hda_priv = tas_hda->hda_priv;
539 struct hda_component_parent *parent = master_data;536 struct hda_component_parent *parent = master_data;
540 struct hda_component *comp;537 struct hda_component *comp;
541 struct hda_codec *codec;538 struct hda_codec *codec;
@@ -564,14 +561,6 @@ static int tas2781_hda_bind(struct device *dev, struct device *master, · 22 unmodified lines
564 break;561 break;
565 }562 }
566 563
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
575 guard(pm_runtime_active_auto)(dev);564 guard(pm_runtime_active_auto)(dev);
576 565
577 comp->dev = dev;566 comp->dev = dev;
@@ -643,6 +632,7 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt) · 65 unmodified lines
643 */632 */
644 device_name = "TIAS2781";633 device_name = "TIAS2781";
645 hda_priv->hda_chip_id = HDA_TAS2781;634 hda_priv->hda_chip_id = HDA_TAS2781;
635 tas_hda->priv->chip_id = TAS2781;
646 hda_priv->save_calibration = tas2781_save_calibration;636 hda_priv->save_calibration = tas2781_save_calibration;
647 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR;637 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR;
648 } else if (strstarts(dev_name(&clt->dev), "i2c-TXNW2770")) {638 } 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
656 "i2c-TXNW2781:00-tas2781-hda.0")) {646 "i2c-TXNW2781:00-tas2781-hda.0")) {
657 device_name = "TXNW2781";647 device_name = "TXNW2781";
658 hda_priv->hda_chip_id = HDA_TAS2781;648 hda_priv->hda_chip_id = HDA_TAS2781;
649 tas_hda->priv->chip_id = TAS2781;
659 hda_priv->save_calibration = tas2781_save_calibration;650 hda_priv->save_calibration = tas2781_save_calibration;
660 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR;651 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR;
661 } else if (strstr(dev_name(&clt->dev), "INT8866")) {652 } 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
30 .group_id = 130 .group_id = 1
31};31};
32 32
33static 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
40static 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
33static const struct snd_soc_acpi_adr_device rt711_rt1316_group_adr[] = {47static const struct snd_soc_acpi_adr_device rt711_rt1316_group_adr[] = {
34 {48 {
35 .adr = 0x000030025D071101ull,49 .adr = 0x000030025D071101ull,
@@ -103,6 +117,345 @@ static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = { · 67 unmodified lines
103 }117 }
104};118};
105 119
120static 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
147static 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
174static 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
189static 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
204static 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
219static 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
246static 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
255static 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
264static 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
273static 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
306static 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
316static 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
326static 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
335static 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
344static 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
353static 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
362static 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
376static 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
385static 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
394static 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
408static 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
422static 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
431static 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
445static 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
106static const struct snd_soc_acpi_link_adr acp63_rt722_only[] = {459static const struct snd_soc_acpi_link_adr acp63_rt722_only[] = {
107 {460 {
108 .mask = BIT(0),461 .mask = BIT(0),
@@ -135,6 +488,66 @@ struct snd_soc_acpi_mach snd_soc_acpi_amd_acp63_sdw_machines[] = { · 26 unmodified lines
135 .links = acp63_4_in_1_sdca,488 .links = acp63_4_in_1_sdca,
136 .drv_name = "amd_sdw",489 .drv_name = "amd_sdw",
137 },490 },
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 },
138 {},551 {},
139};552};
140EXPORT_SYMBOL(snd_soc_acpi_amd_acp63_sdw_machines);553EXPORT_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
710 DMI_MATCH(DMI_PRODUCT_NAME, "ASUS EXPERTBOOK BM1503CDA"),710 DMI_MATCH(DMI_PRODUCT_NAME, "ASUS EXPERTBOOK BM1503CDA"),
711 }711 }
712 },712 },
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 },
713 {}720 {}
714};721};
715 722
sound/soc/codecs/cs35l56-shared.c+15−1
@@ -26,7 +26,7 @@ · 25 unmodified lines
26 26
27#include "cs35l56.h"27#include "cs35l56.h"
28 28
29static const struct reg_sequence cs35l56_patch[] = {29static const struct reg_sequence cs35l56_asp_patch[] = {
30 /*30 /*
31 * Firmware can change these to non-defaults to satisfy SDCA.31 * Firmware can change these to non-defaults to satisfy SDCA.
32 * Ensure that they are at known defaults.32 * Ensure that they are at known defaults.
@@ -43,6 +43,20 @@ static const struct reg_sequence cs35l56_patch[] = { · 10 unmodified lines
43 { CS35L56_ASP1TX2_INPUT, 0x00000000 },43 { CS35L56_ASP1TX2_INPUT, 0x00000000 },
44 { CS35L56_ASP1TX3_INPUT, 0x00000000 },44 { CS35L56_ASP1TX3_INPUT, 0x00000000 },
45 { CS35L56_ASP1TX4_INPUT, 0x00000000 },45 { CS35L56_ASP1TX4_INPUT, 0x00000000 },
46};
47
48int 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}
53EXPORT_SYMBOL_NS_GPL(cs35l56_set_asp_patch, "SND_SOC_CS35L56_SHARED");
54
55static 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 */
46 { CS35L56_SWIRE_DP3_CH1_INPUT, 0x00000018 },60 { CS35L56_SWIRE_DP3_CH1_INPUT, 0x00000018 },
47 { CS35L56_SWIRE_DP3_CH2_INPUT, 0x00000019 },61 { CS35L56_SWIRE_DP3_CH2_INPUT, 0x00000019 },
48 { CS35L56_SWIRE_DP3_CH3_INPUT, 0x00000029 },62 { 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
348 return wm_adsp_event(w, kcontrol, event);348 return wm_adsp_event(w, kcontrol, event);
349}349}
350 350
351static 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
351static int cs35l56_asp_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)358static int cs35l56_asp_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
352{359{
353 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component);360 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
552}559}
553 560
554static const struct snd_soc_dai_ops cs35l56_ops = {561static const struct snd_soc_dai_ops cs35l56_ops = {
562 .probe = cs35l56_asp_dai_probe,
555 .set_fmt = cs35l56_asp_dai_set_fmt,563 .set_fmt = cs35l56_asp_dai_set_fmt,
556 .set_tdm_slot = cs35l56_asp_dai_set_tdm_slot,564 .set_tdm_slot = cs35l56_asp_dai_set_tdm_slot,
557 .hw_params = cs35l56_asp_dai_hw_params,565 .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
1617 if (num_pulls < 0)1625 if (num_pulls < 0)
1618 return num_pulls;1626 return num_pulls;
1619 1627
1620 if (num_pulls != num_gpios) {1628 if (num_pulls && (num_pulls != num_gpios)) {
1621 dev_warn(cs35l56->base.dev, "%s count(%d) != %s count(%d)\n",1629 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);
1623 }1631 }
1624 1632
1625 ret = cs35l56_check_and_save_onchip_spkid_gpios(&cs35l56->base,1633 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
2629 struct sdw_port_config port_config;2629 struct sdw_port_config port_config;
2630 struct sdw_port_config dmic_port_config[2];2630 struct sdw_port_config dmic_port_config[2];
2631 struct sdw_stream_runtime *sdw_stream;2631 struct sdw_stream_runtime *sdw_stream;
2632 int retval;2632 int retval, num_channels;
2633 unsigned int sampling_rate;2633 unsigned int sampling_rate;
2634 2634
2635 dev_dbg(dai->dev, "%s %s", __func__, dai->name);2635 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
2661 dmic_port_config[1].num = 10;2661 dmic_port_config[1].num = 10;
2662 break;2662 break;
2663 case RT1321_DEV_ID:2663 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);
2665 dmic_port_config[0].num = 8;2666 dmic_port_config[0].num = 8;
2666 break;2667 break;
2667 default:2668 default:
sound/soc/codecs/tas2781-fmwlib.c+94−0
@@ -32,6 +32,10 @@ · 31 unmodified lines
32#define TAS2781_YRAM1_PAGE 4232#define TAS2781_YRAM1_PAGE 42
33#define TAS2781_YRAM1_START_REG 8833#define TAS2781_YRAM1_START_REG 88
34 34
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
35#define TAS2781_YRAM2_START_PAGE 4339#define TAS2781_YRAM2_START_PAGE 43
36#define TAS2781_YRAM2_END_PAGE 4940#define TAS2781_YRAM2_END_PAGE 49
37#define TAS2781_YRAM2_START_REG 841#define TAS2781_YRAM2_START_REG 8
@@ -98,6 +102,12 @@ struct blktyp_devidx_map { · 60 unmodified lines
98 unsigned char dev_idx;102 unsigned char dev_idx;
99};103};
100 104
105struct tas2781_cali_specific {
106 unsigned char sin_gni[4];
107 int sin_gni_reg;
108 bool is_sin_gn_flush;
109};
110
101static const char deviceNumber[TASDEVICE_DSP_TAS_MAX_DEVICE] = {111static const char deviceNumber[TASDEVICE_DSP_TAS_MAX_DEVICE] = {
102 1, 2, 1, 2, 1, 1, 0, 2, 4, 3, 1, 2, 3, 4, 1, 2112 1, 2, 1, 2, 1, 1, 0, 2, 4, 3, 1, 2, 3, 4, 1, 2
103};113};
@@ -2454,6 +2464,84 @@ static int tasdevice_load_data(struct tasdevice_priv *tas_priv, · 2350 unmodified lines
2454 return ret;2464 return ret;
2455}2465}
2456 2466
2467static 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
2457static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i)2545static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i)
2458{2546{
2459 struct calidata *cali_data = &priv->cali_data;2547 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
2469 }2557 }
2470 k++;2558 k++;
2471 2559
2560 if (priv->chip_id == TAS2781) {
2561 rc = tas2781_cali_preproc(priv, i);
2562 if (rc < 0)
2563 return;
2564 }
2565
2472 rc = tasdevice_dev_bulk_write(priv, i, p->r0_reg, &(data[k]), 4);2566 rc = tasdevice_dev_bulk_write(priv, i, p->r0_reg, &(data[k]), 4);
2473 if (rc < 0) {2567 if (rc < 0) {
2474 dev_err(priv->dev, "chn %d r0_reg bulk_wr err = %d\n", i, rc);2568 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
52 struct soc_mreg_control *mc =52 struct soc_mreg_control *mc =
53 (struct soc_mreg_control *)kcontrol->private_value;53 (struct soc_mreg_control *)kcontrol->private_value;
54 unsigned int regval = ucontrol->value.integer.value[0];54 unsigned int regval = ucontrol->value.integer.value[0];
55 int ret;
56
57 ret = (easrc_priv->bps_iec958[mc->regbase] != regval);
55 58
56 easrc_priv->bps_iec958[mc->regbase] = regval;59 easrc_priv->bps_iec958[mc->regbase] = regval;
57 60
58 return 0;61 return ret;
59}62}
60 63
61static int fsl_easrc_iec958_get_bits(struct snd_kcontrol *kcontrol,64static 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
93 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);96 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
94 struct soc_mreg_control *mc =97 struct soc_mreg_control *mc =
95 (struct soc_mreg_control *)kcontrol->private_value;98 (struct soc_mreg_control *)kcontrol->private_value;
99 struct fsl_asrc *easrc = snd_soc_component_get_drvdata(component);
96 unsigned int regval = ucontrol->value.integer.value[0];100 unsigned int regval = ucontrol->value.integer.value[0];
101 bool changed;
97 int ret;102 int ret;
98 103
99 ret = snd_soc_component_write(component, mc->regbase, regval);104 ret = regmap_update_bits_check(easrc->regmap, mc->regbase,
100 if (ret < 0)105 GENMASK(31, 0), regval, &changed);
106 if (ret != 0)
101 return ret;107 return ret;
102 108
103 return 0;109 return changed;
104}110}
105 111
106#define SOC_SINGLE_REG_RW(xname, xreg) \112#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
763 },763 },
764 .driver_data = (void *)(SOC_SDW_CODEC_SPKR),764 .driver_data = (void *)(SOC_SDW_CODEC_SPKR),
765 },765 },
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 },
766 /* Pantherlake devices*/774 /* Pantherlake devices*/
767 {775 {
768 .callback = sof_sdw_quirk_cb,776 .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
1156 if (!terminal->is_dataport) {1156 if (!terminal->is_dataport) {
1157 const char *type_name = sdca_find_terminal_name(terminal->type);1157 const char *type_name = sdca_find_terminal_name(terminal->type);
1158 1158
1159 if (type_name)1159 if (type_name) {
1160 entity->label = devm_kasprintf(dev, GFP_KERNEL, "%s %s",1160 entity->label = devm_kasprintf(dev, GFP_KERNEL, "%s %s",
1161 entity->label, type_name);1161 entity->label, type_name);
1162 if (!entity->label)
1163 return -ENOMEM;
1164 }
1162 }1165 }
1163 1166
1164 ret = fwnode_property_read_u32(entity_node,1167 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
2219 QUIRK_FLAG_ALIGN_TRANSFER),2219 QUIRK_FLAG_ALIGN_TRANSFER),
2220 DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */2220 DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */
2221 QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),2221 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),
2222 DEVICE_FLG(0x0644, 0x8043, /* TEAC UD-501/UD-501V2/UD-503/NT-503 */2224 DEVICE_FLG(0x0644, 0x8043, /* TEAC UD-501/UD-501V2/UD-503/NT-503 */
2223 QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |2225 QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
2224 QUIRK_FLAG_IFACE_DELAY),2226 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
520 return err;520 return err;
521 }521 }
522 522
523 usb_get_intf(usb_ifnum_to_if(device, 0));
524 usb_get_dev(device);
525 *cardp = card;523 *cardp = card;
526 return 0;524 return 0;
527}525}
@@ -542,11 +540,9 @@ static int snd_us122l_probe(struct usb_interface *intf, · 14 unmodified lines
542 if (intf->cur_altsetting->desc.bInterfaceNumber != 1)540 if (intf->cur_altsetting->desc.bInterfaceNumber != 1)
543 return 0;541 return 0;
544 542
545 err = us122l_usb_probe(usb_get_intf(intf), id, &card);543 err = us122l_usb_probe(intf, id, &card);
546 if (err < 0) {544 if (err < 0)
547 usb_put_intf(intf);
548 return err;545 return err;
549 }
550 546
551 usb_set_intfdata(intf, card);547 usb_set_intfdata(intf, card);
552 return 0;548 return 0;
@@ -574,10 +570,6 @@ static void snd_us122l_disconnect(struct usb_interface *intf) · 21 unmodified lines
574 snd_usbmidi_disconnect(p);570 snd_usbmidi_disconnect(p);
575 }571 }
576 572
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
581 snd_card_free_when_closed(card);573 snd_card_free_when_closed(card);
582}574}
583 575