Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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
...

+599 -39
+1
Documentation/devicetree/bindings/sound/nvidia,tegra-audio-graph-card.yaml
··· 23 enum: 24 - nvidia,tegra210-audio-graph-card 25 - nvidia,tegra186-audio-graph-card 26 - nvidia,tegra264-audio-graph-card 27 28 clocks:
··· 23 enum: 24 - nvidia,tegra210-audio-graph-card 25 - nvidia,tegra186-audio-graph-card 26 + - nvidia,tegra238-audio-graph-card 27 - nvidia,tegra264-audio-graph-card 28 29 clocks:
+1
Documentation/devicetree/bindings/sound/renesas,rz-ssi.yaml
··· 20 - renesas,r9a07g044-ssi # RZ/G2{L,LC} 21 - renesas,r9a07g054-ssi # RZ/V2L 22 - renesas,r9a08g045-ssi # RZ/G3S 23 - const: renesas,rz-ssi 24 25 reg:
··· 20 - renesas,r9a07g044-ssi # RZ/G2{L,LC} 21 - renesas,r9a07g054-ssi # RZ/V2L 22 - renesas,r9a08g045-ssi # RZ/G3S 23 + - renesas,r9a08g046-ssi # RZ/G3L 24 - const: renesas,rz-ssi 25 26 reg:
+4
Documentation/sound/alsa-configuration.rst
··· 2372 audible volume 2373 * bit 25: ``mixer_capture_min_mute`` 2374 Similar to bit 24 but for capture streams 2375 2376 This module supports multiple devices, autoprobe and hotplugging. 2377
··· 2372 audible volume 2373 * bit 25: ``mixer_capture_min_mute`` 2374 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 2379 2380 This module supports multiple devices, autoprobe and hotplugging. 2381
+1
include/sound/cs35l56.h
··· 406 extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC]; 407 extern const unsigned int cs35l56_tx_input_values[CS35L56_NUM_INPUT_SRC]; 408 409 int cs35l56_set_patch(struct cs35l56_base *cs35l56_base); 410 int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command); 411 int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base);
··· 406 extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC]; 407 extern const unsigned int cs35l56_tx_input_values[CS35L56_NUM_INPUT_SRC]; 408 409 + int cs35l56_set_asp_patch(struct cs35l56_base *cs35l56_base); 410 int cs35l56_set_patch(struct cs35l56_base *cs35l56_base); 411 int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command); 412 int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base);
+1
include/sound/tas2781.h
··· 151 struct bulk_reg_val *cali_data_backup; 152 struct bulk_reg_val alp_cali_bckp; 153 struct tasdevice_fw *cali_data_fmw; 154 unsigned int dev_addr; 155 unsigned int err_code; 156 unsigned char cur_book;
··· 151 struct bulk_reg_val *cali_data_backup; 152 struct bulk_reg_val alp_cali_bckp; 153 struct tasdevice_fw *cali_data_fmw; 154 + void *cali_specific; 155 unsigned int dev_addr; 156 unsigned int err_code; 157 unsigned char cur_book;
+1 -1
sound/firewire/dice/dice.c
··· 122 fw_csr_string(dev->config_rom + 5, CSR_VENDOR, vendor, sizeof(vendor)); 123 strscpy(model, "?"); 124 fw_csr_string(dice->unit->directory, CSR_MODEL, model, sizeof(model)); 125 - snprintf(card->longname, sizeof(card->longname), 126 "%s %s (serial %u) at %s, S%d", 127 vendor, model, dev->config_rom[4] & 0x3fffff, 128 dev_name(&dice->unit->device), 100 << dev->max_speed);
··· 122 fw_csr_string(dev->config_rom + 5, CSR_VENDOR, vendor, sizeof(vendor)); 123 strscpy(model, "?"); 124 fw_csr_string(dice->unit->directory, CSR_MODEL, model, sizeof(model)); 125 + scnprintf(card->longname, sizeof(card->longname), 126 "%s %s (serial %u) at %s, S%d", 127 vendor, model, dev->config_rom[4] & 0x3fffff, 128 dev_name(&dice->unit->device), 100 << dev->max_speed);
+9
sound/hda/codecs/ca0132.c
··· 9816 spec->dig_in = 0x09; 9817 break; 9818 } 9819 } 9820 9821 static int ca0132_prepare_verbs(struct hda_codec *codec)
··· 9816 spec->dig_in = 0x09; 9817 break; 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; 9828 } 9829 9830 static int ca0132_prepare_verbs(struct hda_codec *codec)
+1
sound/hda/codecs/hdmi/tegrahdmi.c
··· 299 HDA_CODEC_ID_MODEL(0x10de002f, "Tegra194 HDMI/DP2", MODEL_TEGRA), 300 HDA_CODEC_ID_MODEL(0x10de0030, "Tegra194 HDMI/DP3", MODEL_TEGRA), 301 HDA_CODEC_ID_MODEL(0x10de0031, "Tegra234 HDMI/DP", MODEL_TEGRA234), 302 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(0x10de0035, "SoC 35 HDMI/DP", MODEL_TEGRA234),
··· 299 HDA_CODEC_ID_MODEL(0x10de002f, "Tegra194 HDMI/DP2", MODEL_TEGRA), 300 HDA_CODEC_ID_MODEL(0x10de0030, "Tegra194 HDMI/DP3", MODEL_TEGRA), 301 HDA_CODEC_ID_MODEL(0x10de0031, "Tegra234 HDMI/DP", MODEL_TEGRA234), 302 + HDA_CODEC_ID_MODEL(0x10de0032, "Tegra238 HDMI/DP", MODEL_TEGRA234), 303 HDA_CODEC_ID_MODEL(0x10de0033, "SoC 33 HDMI/DP", MODEL_TEGRA234), 304 HDA_CODEC_ID_MODEL(0x10de0034, "Tegra264 HDMI/DP", MODEL_TEGRA234), 305 HDA_CODEC_ID_MODEL(0x10de0035, "SoC 35 HDMI/DP", MODEL_TEGRA234),
+1
sound/hda/codecs/realtek/alc269.c
··· 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), 6906 SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED), 6907 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, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
··· 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), 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), 6908 SND_PCI_QUIRK(0x103c, 0x88dd, "HP Pavilion 15z-ec200", ALC285_FIXUP_HP_MUTE_LED), 6909 SND_PCI_QUIRK(0x103c, 0x88eb, "HP Victus 16-e0xxx", ALC245_FIXUP_HP_MUTE_LED_V2_COEFBIT), 6910 SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
+8 -6
sound/hda/codecs/senarytech.c
··· 19 #include "hda_jack.h" 20 #include "generic.h" 21 22 - /* GPIO node ID */ 23 - #define SENARY_GPIO_NODE 0x01 24 - 25 struct senary_spec { 26 struct hda_gen_spec gen; 27 28 /* extra EAPD pins */ 29 unsigned int num_eapds; 30 hda_nid_t eapds[4]; 31 hda_nid_t mute_led_eapd; 32 33 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */ ··· 121 unsigned int mask = spec->gpio_mute_led_mask | spec->gpio_mic_led_mask; 122 123 if (mask) { 124 - snd_hda_codec_write(codec, SENARY_GPIO_NODE, 0, AC_VERB_SET_GPIO_MASK, 125 mask); 126 - snd_hda_codec_write(codec, SENARY_GPIO_NODE, 0, AC_VERB_SET_GPIO_DIRECTION, 127 mask); 128 - snd_hda_codec_write(codec, SENARY_GPIO_NODE, 0, AC_VERB_SET_GPIO_DATA, 129 spec->gpio_led); 130 } 131 } 132 133 static int senary_init(struct hda_codec *codec) 134 { 135 snd_hda_gen_init(codec); 136 senary_init_gpio_led(codec); 137 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT); 138 139 return 0;
··· 19 #include "hda_jack.h" 20 #include "generic.h" 21 22 struct senary_spec { 23 struct hda_gen_spec gen; 24 25 /* extra EAPD pins */ 26 unsigned int num_eapds; 27 hda_nid_t eapds[4]; 28 + bool dynamic_eapd; 29 hda_nid_t mute_led_eapd; 30 31 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */ ··· 123 unsigned int mask = spec->gpio_mute_led_mask | spec->gpio_mic_led_mask; 124 125 if (mask) { 126 + snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_MASK, 127 mask); 128 + snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_DIRECTION, 129 mask); 130 + snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_DATA, 131 spec->gpio_led); 132 } 133 } 134 135 static int senary_init(struct hda_codec *codec) 136 { 137 + struct senary_spec *spec = codec->spec; 138 + 139 snd_hda_gen_init(codec); 140 senary_init_gpio_led(codec); 141 + if (!spec->dynamic_eapd) 142 + senary_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, true); 143 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT); 144 145 return 0;
+3 -12
sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
··· 60 int (*save_calibration)(struct tas2781_hda *h); 61 62 int hda_chip_id; 63 - bool skip_calibration; 64 }; 65 66 static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data) ··· 478 /* If calibrated data occurs error, dsp will still works with default 479 * calibrated data inside algo. 480 */ 481 - if (!hda_priv->skip_calibration) 482 - hda_priv->save_calibration(tas_hda); 483 } 484 485 static void tasdev_fw_ready(const struct firmware *fmw, void *context) ··· 533 void *master_data) 534 { 535 struct tas2781_hda *tas_hda = dev_get_drvdata(dev); 536 - struct tas2781_hda_i2c_priv *hda_priv = tas_hda->hda_priv; 537 struct hda_component_parent *parent = master_data; 538 struct hda_component *comp; 539 struct hda_codec *codec; ··· 560 tas_hda->catlog_id = LENOVO; 561 break; 562 } 563 - 564 - /* 565 - * Using ASUS ROG Xbox Ally X (RC73XA) UEFI calibration data 566 - * causes audio dropouts during playback, use fallback data 567 - * from DSP firmware as a workaround. 568 - */ 569 - if (codec->core.subsystem_id == 0x10431384) 570 - hda_priv->skip_calibration = true; 571 572 guard(pm_runtime_active_auto)(dev); 573 ··· 632 */ 633 device_name = "TIAS2781"; 634 hda_priv->hda_chip_id = HDA_TAS2781; 635 hda_priv->save_calibration = tas2781_save_calibration; 636 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR; 637 } else if (strstarts(dev_name(&clt->dev), "i2c-TXNW2770")) { ··· 646 "i2c-TXNW2781:00-tas2781-hda.0")) { 647 device_name = "TXNW2781"; 648 hda_priv->hda_chip_id = HDA_TAS2781; 649 hda_priv->save_calibration = tas2781_save_calibration; 650 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR; 651 } else if (strstr(dev_name(&clt->dev), "INT8866")) {
··· 60 int (*save_calibration)(struct tas2781_hda *h); 61 62 int hda_chip_id; 63 }; 64 65 static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data) ··· 479 /* If calibrated data occurs error, dsp will still works with default 480 * calibrated data inside algo. 481 */ 482 + hda_priv->save_calibration(tas_hda); 483 } 484 485 static void tasdev_fw_ready(const struct firmware *fmw, void *context) ··· 535 void *master_data) 536 { 537 struct tas2781_hda *tas_hda = dev_get_drvdata(dev); 538 struct hda_component_parent *parent = master_data; 539 struct hda_component *comp; 540 struct hda_codec *codec; ··· 563 tas_hda->catlog_id = LENOVO; 564 break; 565 } 566 567 guard(pm_runtime_active_auto)(dev); 568 ··· 643 */ 644 device_name = "TIAS2781"; 645 hda_priv->hda_chip_id = HDA_TAS2781; 646 + tas_hda->priv->chip_id = TAS2781; 647 hda_priv->save_calibration = tas2781_save_calibration; 648 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR; 649 } else if (strstarts(dev_name(&clt->dev), "i2c-TXNW2770")) { ··· 656 "i2c-TXNW2781:00-tas2781-hda.0")) { 657 device_name = "TXNW2781"; 658 hda_priv->hda_chip_id = HDA_TAS2781; 659 + tas_hda->priv->chip_id = TAS2781; 660 hda_priv->save_calibration = tas2781_save_calibration; 661 tas_hda->priv->global_addr = TAS2781_GLOBAL_ADDR; 662 } else if (strstr(dev_name(&clt->dev), "INT8866")) {
+413
sound/soc/amd/acp/amd-acp63-acpi-match.c
··· 30 .group_id = 1 31 }; 32 33 static const struct snd_soc_acpi_adr_device rt711_rt1316_group_adr[] = { 34 { 35 .adr = 0x000030025D071101ull, ··· 117 } 118 }; 119 120 static const struct snd_soc_acpi_link_adr acp63_rt722_only[] = { 121 { 122 .mask = BIT(0), ··· 486 { 487 .link_mask = BIT(0) | BIT(1), 488 .links = acp63_4_in_1_sdca, 489 .drv_name = "amd_sdw", 490 }, 491 {},
··· 30 .group_id = 1 31 }; 32 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 + 47 static const struct snd_soc_acpi_adr_device rt711_rt1316_group_adr[] = { 48 { 49 .adr = 0x000030025D071101ull, ··· 103 } 104 }; 105 106 + static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = { 107 + { /* Jack Playback Endpoint */ 108 + .num = 0, 109 + .aggregated = 0, 110 + .group_position = 0, 111 + .group_id = 0, 112 + }, 113 + { /* DMIC Capture Endpoint */ 114 + .num = 1, 115 + .aggregated = 0, 116 + .group_position = 0, 117 + .group_id = 0, 118 + }, 119 + { /* Jack Capture Endpoint */ 120 + .num = 2, 121 + .aggregated = 0, 122 + .group_position = 0, 123 + .group_id = 0, 124 + }, 125 + { /* Speaker Playback Endpoint */ 126 + .num = 3, 127 + .aggregated = 0, 128 + .group_position = 0, 129 + .group_id = 0, 130 + }, 131 + }; 132 + 133 + static const struct snd_soc_acpi_adr_device cs35l56x4_l1u3210_adr[] = { 134 + { 135 + .adr = 0x00013301FA355601ull, 136 + .num_endpoints = 1, 137 + .endpoints = &spk_l_endpoint, 138 + .name_prefix = "AMP1" 139 + }, 140 + { 141 + .adr = 0x00013201FA355601ull, 142 + .num_endpoints = 1, 143 + .endpoints = &spk_r_endpoint, 144 + .name_prefix = "AMP2" 145 + }, 146 + { 147 + .adr = 0x00013101FA355601ull, 148 + .num_endpoints = 1, 149 + .endpoints = &spk_2_endpoint, 150 + .name_prefix = "AMP3" 151 + }, 152 + { 153 + .adr = 0x00013001FA355601ull, 154 + .num_endpoints = 1, 155 + .endpoints = &spk_3_endpoint, 156 + .name_prefix = "AMP4" 157 + }, 158 + }; 159 + 160 + static const struct snd_soc_acpi_adr_device cs35l63x2_l0u01_adr[] = { 161 + { 162 + .adr = 0x00003001FA356301ull, 163 + .num_endpoints = 1, 164 + .endpoints = &spk_l_endpoint, 165 + .name_prefix = "AMP1" 166 + }, 167 + { 168 + .adr = 0x00003101FA356301ull, 169 + .num_endpoints = 1, 170 + .endpoints = &spk_r_endpoint, 171 + .name_prefix = "AMP2" 172 + }, 173 + }; 174 + 175 + static const struct snd_soc_acpi_adr_device cs35l63x2_l1u01_adr[] = { 176 + { 177 + .adr = 0x00013001FA356301ull, 178 + .num_endpoints = 1, 179 + .endpoints = &spk_l_endpoint, 180 + .name_prefix = "AMP1" 181 + }, 182 + { 183 + .adr = 0x00013101FA356301ull, 184 + .num_endpoints = 1, 185 + .endpoints = &spk_r_endpoint, 186 + .name_prefix = "AMP2" 187 + }, 188 + }; 189 + 190 + static const struct snd_soc_acpi_adr_device cs35l63x2_l1u13_adr[] = { 191 + { 192 + .adr = 0x00013101FA356301ull, 193 + .num_endpoints = 1, 194 + .endpoints = &spk_l_endpoint, 195 + .name_prefix = "AMP1" 196 + }, 197 + { 198 + .adr = 0x00013301FA356301ull, 199 + .num_endpoints = 1, 200 + .endpoints = &spk_r_endpoint, 201 + .name_prefix = "AMP2" 202 + }, 203 + }; 204 + 205 + static const struct snd_soc_acpi_adr_device cs35l63x4_l0u0246_adr[] = { 206 + { 207 + .adr = 0x00003001FA356301ull, 208 + .num_endpoints = 1, 209 + .endpoints = &spk_l_endpoint, 210 + .name_prefix = "AMP1" 211 + }, 212 + { 213 + .adr = 0x00003201FA356301ull, 214 + .num_endpoints = 1, 215 + .endpoints = &spk_r_endpoint, 216 + .name_prefix = "AMP2" 217 + }, 218 + { 219 + .adr = 0x00003401FA356301ull, 220 + .num_endpoints = 1, 221 + .endpoints = &spk_2_endpoint, 222 + .name_prefix = "AMP3" 223 + }, 224 + { 225 + .adr = 0x00003601FA356301ull, 226 + .num_endpoints = 1, 227 + .endpoints = &spk_3_endpoint, 228 + .name_prefix = "AMP4" 229 + }, 230 + }; 231 + 232 + static const struct snd_soc_acpi_adr_device cs42l43_l0u0_adr[] = { 233 + { 234 + .adr = 0x00003001FA424301ull, 235 + .num_endpoints = ARRAY_SIZE(cs42l43_endpoints), 236 + .endpoints = cs42l43_endpoints, 237 + .name_prefix = "cs42l43" 238 + } 239 + }; 240 + 241 + static const struct snd_soc_acpi_adr_device cs42l43_l0u1_adr[] = { 242 + { 243 + .adr = 0x00003101FA424301ull, 244 + .num_endpoints = ARRAY_SIZE(cs42l43_endpoints), 245 + .endpoints = cs42l43_endpoints, 246 + .name_prefix = "cs42l43" 247 + } 248 + }; 249 + 250 + static const struct snd_soc_acpi_adr_device cs42l43b_l0u1_adr[] = { 251 + { 252 + .adr = 0x00003101FA2A3B01ull, 253 + .num_endpoints = ARRAY_SIZE(cs42l43_endpoints), 254 + .endpoints = cs42l43_endpoints, 255 + .name_prefix = "cs42l43" 256 + } 257 + }; 258 + 259 + static const struct snd_soc_acpi_adr_device cs42l43_l1u0_cs35l56x4_l1u0123_adr[] = { 260 + { 261 + .adr = 0x00013001FA424301ull, 262 + .num_endpoints = ARRAY_SIZE(cs42l43_endpoints), 263 + .endpoints = cs42l43_endpoints, 264 + .name_prefix = "cs42l43" 265 + }, 266 + { 267 + .adr = 0x00013001FA355601ull, 268 + .num_endpoints = 1, 269 + .endpoints = &spk_l_endpoint, 270 + .name_prefix = "AMP1" 271 + }, 272 + { 273 + .adr = 0x00013101FA355601ull, 274 + .num_endpoints = 1, 275 + .endpoints = &spk_r_endpoint, 276 + .name_prefix = "AMP2" 277 + }, 278 + { 279 + .adr = 0x00013201FA355601ull, 280 + .num_endpoints = 1, 281 + .endpoints = &spk_2_endpoint, 282 + .name_prefix = "AMP3" 283 + }, 284 + { 285 + .adr = 0x00013301FA355601ull, 286 + .num_endpoints = 1, 287 + .endpoints = &spk_3_endpoint, 288 + .name_prefix = "AMP4" 289 + }, 290 + }; 291 + 292 + static const struct snd_soc_acpi_adr_device cs42l45_l0u0_adr[] = { 293 + { 294 + .adr = 0x00003001FA424501ull, 295 + /* Re-use endpoints, but cs42l45 has no speaker */ 296 + .num_endpoints = ARRAY_SIZE(cs42l43_endpoints) - 1, 297 + .endpoints = cs42l43_endpoints, 298 + .name_prefix = "cs42l45" 299 + } 300 + }; 301 + 302 + static const struct snd_soc_acpi_adr_device cs42l45_l1u0_adr[] = { 303 + { 304 + .adr = 0x00013001FA424501ull, 305 + /* Re-use endpoints, but cs42l45 has no speaker */ 306 + .num_endpoints = ARRAY_SIZE(cs42l43_endpoints) - 1, 307 + .endpoints = cs42l43_endpoints, 308 + .name_prefix = "cs42l45" 309 + } 310 + }; 311 + 312 + static const struct snd_soc_acpi_link_adr acp63_cs35l56x4_l1u3210[] = { 313 + { 314 + .mask = BIT(1), 315 + .num_adr = ARRAY_SIZE(cs35l56x4_l1u3210_adr), 316 + .adr_d = cs35l56x4_l1u3210_adr, 317 + }, 318 + {} 319 + }; 320 + 321 + static const struct snd_soc_acpi_link_adr acp63_cs35l63x4_l0u0246[] = { 322 + { 323 + .mask = BIT(0), 324 + .num_adr = ARRAY_SIZE(cs35l63x4_l0u0246_adr), 325 + .adr_d = cs35l63x4_l0u0246_adr, 326 + }, 327 + {} 328 + }; 329 + 330 + static const struct snd_soc_acpi_link_adr acp63_cs42l43_l0u1[] = { 331 + { 332 + .mask = BIT(0), 333 + .num_adr = ARRAY_SIZE(cs42l43_l0u1_adr), 334 + .adr_d = cs42l43_l0u1_adr, 335 + }, 336 + {} 337 + }; 338 + 339 + static const struct snd_soc_acpi_link_adr acp63_cs42l43b_l0u1[] = { 340 + { 341 + .mask = BIT(0), 342 + .num_adr = ARRAY_SIZE(cs42l43b_l0u1_adr), 343 + .adr_d = cs42l43b_l0u1_adr, 344 + }, 345 + {} 346 + }; 347 + 348 + static const struct snd_soc_acpi_link_adr acp63_cs42l43_l0u0_cs35l56x4_l1u3210[] = { 349 + { 350 + .mask = BIT(0), 351 + .num_adr = ARRAY_SIZE(cs42l43_l0u0_adr), 352 + .adr_d = cs42l43_l0u0_adr, 353 + }, 354 + { 355 + .mask = BIT(1), 356 + .num_adr = ARRAY_SIZE(cs35l56x4_l1u3210_adr), 357 + .adr_d = cs35l56x4_l1u3210_adr, 358 + }, 359 + {} 360 + }; 361 + 362 + static const struct snd_soc_acpi_link_adr acp63_cs42l43_l1u0_cs35l56x4_l1u0123[] = { 363 + { 364 + .mask = BIT(1), 365 + .num_adr = ARRAY_SIZE(cs42l43_l1u0_cs35l56x4_l1u0123_adr), 366 + .adr_d = cs42l43_l1u0_cs35l56x4_l1u0123_adr, 367 + }, 368 + {} 369 + }; 370 + 371 + static const struct snd_soc_acpi_link_adr acp63_cs42l45_l0u0[] = { 372 + { 373 + .mask = BIT(0), 374 + .num_adr = ARRAY_SIZE(cs42l45_l0u0_adr), 375 + .adr_d = cs42l45_l0u0_adr, 376 + }, 377 + {} 378 + }; 379 + 380 + static const struct snd_soc_acpi_link_adr acp63_cs42l45_l0u0_cs35l63x2_l1u01[] = { 381 + { 382 + .mask = BIT(0), 383 + .num_adr = ARRAY_SIZE(cs42l45_l0u0_adr), 384 + .adr_d = cs42l45_l0u0_adr, 385 + }, 386 + { 387 + .mask = BIT(1), 388 + .num_adr = ARRAY_SIZE(cs35l63x2_l1u01_adr), 389 + .adr_d = cs35l63x2_l1u01_adr, 390 + }, 391 + {} 392 + }; 393 + 394 + static const struct snd_soc_acpi_link_adr acp63_cs42l45_l0u0_cs35l63x2_l1u13[] = { 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_l1u13_adr), 403 + .adr_d = cs35l63x2_l1u13_adr, 404 + }, 405 + {} 406 + }; 407 + 408 + static const struct snd_soc_acpi_link_adr acp63_cs42l45_l1u0[] = { 409 + { 410 + .mask = BIT(1), 411 + .num_adr = ARRAY_SIZE(cs42l45_l1u0_adr), 412 + .adr_d = cs42l45_l1u0_adr, 413 + }, 414 + {} 415 + }; 416 + 417 + static const struct snd_soc_acpi_link_adr acp63_cs42l45_l1u0_cs35l63x2_l0u01[] = { 418 + { 419 + .mask = BIT(1), 420 + .num_adr = ARRAY_SIZE(cs42l45_l1u0_adr), 421 + .adr_d = cs42l45_l1u0_adr, 422 + }, 423 + { 424 + .mask = BIT(0), 425 + .num_adr = ARRAY_SIZE(cs35l63x2_l0u01_adr), 426 + .adr_d = cs35l63x2_l0u01_adr, 427 + }, 428 + {} 429 + }; 430 + 431 + static const struct snd_soc_acpi_link_adr acp63_cs42l45_l1u0_cs35l63x4_l0u0246[] = { 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(cs35l63x4_l0u0246_adr), 440 + .adr_d = cs35l63x4_l0u0246_adr, 441 + }, 442 + {} 443 + }; 444 + 445 static const struct snd_soc_acpi_link_adr acp63_rt722_only[] = { 446 { 447 .mask = BIT(0), ··· 133 { 134 .link_mask = BIT(0) | BIT(1), 135 .links = acp63_4_in_1_sdca, 136 + .drv_name = "amd_sdw", 137 + }, 138 + { 139 + .link_mask = BIT(0) | BIT(1), 140 + .links = acp63_cs42l43_l0u0_cs35l56x4_l1u3210, 141 + .drv_name = "amd_sdw", 142 + }, 143 + { 144 + .link_mask = BIT(0) | BIT(1), 145 + .links = acp63_cs42l45_l1u0_cs35l63x4_l0u0246, 146 + .drv_name = "amd_sdw", 147 + }, 148 + { 149 + .link_mask = BIT(0) | BIT(1), 150 + .links = acp63_cs42l45_l0u0_cs35l63x2_l1u01, 151 + .drv_name = "amd_sdw", 152 + }, 153 + { 154 + .link_mask = BIT(0) | BIT(1), 155 + .links = acp63_cs42l45_l0u0_cs35l63x2_l1u13, 156 + .drv_name = "amd_sdw", 157 + }, 158 + { 159 + .link_mask = BIT(0) | BIT(1), 160 + .links = acp63_cs42l45_l1u0_cs35l63x2_l0u01, 161 + .drv_name = "amd_sdw", 162 + }, 163 + { 164 + .link_mask = BIT(1), 165 + .links = acp63_cs42l43_l1u0_cs35l56x4_l1u0123, 166 + .drv_name = "amd_sdw", 167 + }, 168 + { 169 + .link_mask = BIT(1), 170 + .links = acp63_cs35l56x4_l1u3210, 171 + .drv_name = "amd_sdw", 172 + }, 173 + { 174 + .link_mask = BIT(0), 175 + .links = acp63_cs35l63x4_l0u0246, 176 + .drv_name = "amd_sdw", 177 + }, 178 + { 179 + .link_mask = BIT(0), 180 + .links = acp63_cs42l43_l0u1, 181 + .drv_name = "amd_sdw", 182 + }, 183 + { 184 + .link_mask = BIT(0), 185 + .links = acp63_cs42l43b_l0u1, 186 + .drv_name = "amd_sdw", 187 + }, 188 + { 189 + .link_mask = BIT(0), 190 + .links = acp63_cs42l45_l0u0, 191 + .drv_name = "amd_sdw", 192 + }, 193 + { 194 + .link_mask = BIT(1), 195 + .links = acp63_cs42l45_l1u0, 196 .drv_name = "amd_sdw", 197 }, 198 {},
+7
sound/soc/amd/yc/acp6x-mach.c
··· 710 DMI_MATCH(DMI_PRODUCT_NAME, "ASUS EXPERTBOOK BM1503CDA"), 711 } 712 }, 713 {} 714 }; 715
··· 710 DMI_MATCH(DMI_PRODUCT_NAME, "ASUS EXPERTBOOK BM1503CDA"), 711 } 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 + }, 720 {} 721 }; 722
+15 -1
sound/soc/codecs/cs35l56-shared.c
··· 26 27 #include "cs35l56.h" 28 29 - static const struct reg_sequence cs35l56_patch[] = { 30 /* 31 * Firmware can change these to non-defaults to satisfy SDCA. 32 * Ensure that they are at known defaults. ··· 43 { CS35L56_ASP1TX2_INPUT, 0x00000000 }, 44 { CS35L56_ASP1TX3_INPUT, 0x00000000 }, 45 { CS35L56_ASP1TX4_INPUT, 0x00000000 }, 46 { CS35L56_SWIRE_DP3_CH1_INPUT, 0x00000018 }, 47 { CS35L56_SWIRE_DP3_CH2_INPUT, 0x00000019 }, 48 { CS35L56_SWIRE_DP3_CH3_INPUT, 0x00000029 },
··· 26 27 #include "cs35l56.h" 28 29 + static const struct reg_sequence cs35l56_asp_patch[] = { 30 /* 31 * Firmware can change these to non-defaults to satisfy SDCA. 32 * Ensure that they are at known defaults. ··· 43 { CS35L56_ASP1TX2_INPUT, 0x00000000 }, 44 { CS35L56_ASP1TX3_INPUT, 0x00000000 }, 45 { 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 + */ 60 { CS35L56_SWIRE_DP3_CH1_INPUT, 0x00000018 }, 61 { CS35L56_SWIRE_DP3_CH2_INPUT, 0x00000019 }, 62 { CS35L56_SWIRE_DP3_CH3_INPUT, 0x00000029 },
+10 -2
sound/soc/codecs/cs35l56.c
··· 348 return wm_adsp_event(w, kcontrol, event); 349 } 350 351 static int cs35l56_asp_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 352 { 353 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component); ··· 559 } 560 561 static const struct snd_soc_dai_ops cs35l56_ops = { 562 .set_fmt = cs35l56_asp_dai_set_fmt, 563 .set_tdm_slot = cs35l56_asp_dai_set_tdm_slot, 564 .hw_params = cs35l56_asp_dai_hw_params, ··· 1625 if (num_pulls < 0) 1626 return num_pulls; 1627 1628 - if (num_pulls != num_gpios) { 1629 dev_warn(cs35l56->base.dev, "%s count(%d) != %s count(%d)\n", 1630 - pull_name, num_pulls, gpio_name, num_gpios); 1631 } 1632 1633 ret = cs35l56_check_and_save_onchip_spkid_gpios(&cs35l56->base,
··· 348 return wm_adsp_event(w, kcontrol, event); 349 } 350 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 + 358 static int cs35l56_asp_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 359 { 360 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component); ··· 552 } 553 554 static const struct snd_soc_dai_ops cs35l56_ops = { 555 + .probe = cs35l56_asp_dai_probe, 556 .set_fmt = cs35l56_asp_dai_set_fmt, 557 .set_tdm_slot = cs35l56_asp_dai_set_tdm_slot, 558 .hw_params = cs35l56_asp_dai_hw_params, ··· 1617 if (num_pulls < 0) 1618 return num_pulls; 1619 1620 + if (num_pulls && (num_pulls != num_gpios)) { 1621 dev_warn(cs35l56->base.dev, "%s count(%d) != %s count(%d)\n", 1622 + pull_name, num_pulls, gpio_name, num_gpios); 1623 } 1624 1625 ret = cs35l56_check_and_save_onchip_spkid_gpios(&cs35l56->base,
+3 -2
sound/soc/codecs/rt1320-sdw.c
··· 2629 struct sdw_port_config port_config; 2630 struct sdw_port_config dmic_port_config[2]; 2631 struct sdw_stream_runtime *sdw_stream; 2632 - int retval; 2633 unsigned int sampling_rate; 2634 2635 dev_dbg(dai->dev, "%s %s", __func__, dai->name); ··· 2661 dmic_port_config[1].num = 10; 2662 break; 2663 case RT1321_DEV_ID: 2664 - dmic_port_config[0].ch_mask = BIT(0) | BIT(1); 2665 dmic_port_config[0].num = 8; 2666 break; 2667 default:
··· 2629 struct sdw_port_config port_config; 2630 struct sdw_port_config dmic_port_config[2]; 2631 struct sdw_stream_runtime *sdw_stream; 2632 + int retval, num_channels; 2633 unsigned int sampling_rate; 2634 2635 dev_dbg(dai->dev, "%s %s", __func__, dai->name); ··· 2661 dmic_port_config[1].num = 10; 2662 break; 2663 case RT1321_DEV_ID: 2664 + num_channels = params_channels(params); 2665 + dmic_port_config[0].ch_mask = GENMASK(num_channels - 1, 0); 2666 dmic_port_config[0].num = 8; 2667 break; 2668 default:
+94
sound/soc/codecs/tas2781-fmwlib.c
··· 32 #define TAS2781_YRAM1_PAGE 42 33 #define TAS2781_YRAM1_START_REG 88 34 35 #define TAS2781_YRAM2_START_PAGE 43 36 #define TAS2781_YRAM2_END_PAGE 49 37 #define TAS2781_YRAM2_START_REG 8 ··· 100 struct blktyp_devidx_map { 101 unsigned char blktyp; 102 unsigned char dev_idx; 103 }; 104 105 static const char deviceNumber[TASDEVICE_DSP_TAS_MAX_DEVICE] = { ··· 2464 return ret; 2465 } 2466 2467 static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i) 2468 { 2469 struct calidata *cali_data = &priv->cali_data; ··· 2556 return; 2557 } 2558 k++; 2559 2560 rc = tasdevice_dev_bulk_write(priv, i, p->r0_reg, &(data[k]), 4); 2561 if (rc < 0) {
··· 32 #define TAS2781_YRAM1_PAGE 42 33 #define TAS2781_YRAM1_START_REG 88 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 + 39 #define TAS2781_YRAM2_START_PAGE 43 40 #define TAS2781_YRAM2_END_PAGE 49 41 #define TAS2781_YRAM2_START_REG 8 ··· 96 struct blktyp_devidx_map { 97 unsigned char blktyp; 98 unsigned char dev_idx; 99 + }; 100 + 101 + struct tas2781_cali_specific { 102 + unsigned char sin_gni[4]; 103 + int sin_gni_reg; 104 + bool is_sin_gn_flush; 105 }; 106 107 static const char deviceNumber[TASDEVICE_DSP_TAS_MAX_DEVICE] = { ··· 2454 return ret; 2455 } 2456 2457 + static int tas2781_cali_preproc(struct tasdevice_priv *priv, int i) 2458 + { 2459 + struct tas2781_cali_specific *spec = priv->tasdevice[i].cali_specific; 2460 + struct calidata *cali_data = &priv->cali_data; 2461 + struct cali_reg *p = &cali_data->cali_reg_array; 2462 + unsigned char *data = cali_data->data; 2463 + int rc; 2464 + 2465 + /* 2466 + * On TAS2781, if the Speaker calibrated impedance is lower than 2467 + * default value hard-coded inside the TAS2781, it will cuase vol 2468 + * lower than normal. In order to fix this issue, the parameter of 2469 + * SineGainI need updating. 2470 + */ 2471 + if (spec == NULL) { 2472 + int k = i * (cali_data->cali_dat_sz_per_dev + 1); 2473 + int re_org, re_cal, corrected_sin_gn, pg_id; 2474 + unsigned char r0_deflt[4]; 2475 + 2476 + spec = devm_kzalloc(priv->dev, sizeof(*spec), GFP_KERNEL); 2477 + if (spec == NULL) 2478 + return -ENOMEM; 2479 + priv->tasdevice[i].cali_specific = spec; 2480 + rc = tasdevice_dev_bulk_read(priv, i, p->r0_reg, r0_deflt, 4); 2481 + if (rc < 0) { 2482 + dev_err(priv->dev, "invalid RE from %d = %d\n", i, rc); 2483 + return rc; 2484 + } 2485 + /* 2486 + * SineGainI need to be re-calculated, calculate the high 16 2487 + * bits. 2488 + */ 2489 + re_org = r0_deflt[0] << 8 | r0_deflt[1]; 2490 + re_cal = data[k + 1] << 8 | data[k + 2]; 2491 + if (re_org > re_cal) { 2492 + rc = tasdevice_dev_read(priv, i, TAS2781_PG_REG, 2493 + &pg_id); 2494 + if (rc < 0) { 2495 + dev_err(priv->dev, "invalid PG id %d = %d\n", 2496 + i, rc); 2497 + return rc; 2498 + } 2499 + 2500 + spec->sin_gni_reg = (pg_id == TAS2781_PG_1_0) ? 2501 + TASDEVICE_REG(0, 0x1b, 0x34) : 2502 + TASDEVICE_REG(0, 0x18, 0x1c); 2503 + 2504 + rc = tasdevice_dev_bulk_read(priv, i, 2505 + spec->sin_gni_reg, 2506 + spec->sin_gni, 4); 2507 + if (rc < 0) { 2508 + dev_err(priv->dev, "wrong sinegaini %d = %d\n", 2509 + i, rc); 2510 + return rc; 2511 + } 2512 + corrected_sin_gn = re_org * ((spec->sin_gni[0] << 8) + 2513 + spec->sin_gni[1]); 2514 + corrected_sin_gn /= re_cal; 2515 + spec->sin_gni[0] = corrected_sin_gn >> 8; 2516 + spec->sin_gni[1] = corrected_sin_gn & 0xff; 2517 + 2518 + spec->is_sin_gn_flush = true; 2519 + } 2520 + } 2521 + 2522 + if (spec->is_sin_gn_flush) { 2523 + rc = tasdevice_dev_bulk_write(priv, i, spec->sin_gni_reg, 2524 + spec->sin_gni, 4); 2525 + if (rc < 0) { 2526 + dev_err(priv->dev, "update failed %d = %d\n", 2527 + i, rc); 2528 + return rc; 2529 + } 2530 + } 2531 + 2532 + return 0; 2533 + } 2534 + 2535 static void tasdev_load_calibrated_data(struct tasdevice_priv *priv, int i) 2536 { 2537 struct calidata *cali_data = &priv->cali_data; ··· 2468 return; 2469 } 2470 k++; 2471 + 2472 + if (priv->chip_id == TAS2781) { 2473 + rc = tas2781_cali_preproc(priv, i); 2474 + if (rc < 0) 2475 + return; 2476 + } 2477 2478 rc = tasdevice_dev_bulk_write(priv, i, p->r0_reg, &(data[k]), 4); 2479 if (rc < 0) {
+10 -4
sound/soc/fsl/fsl_easrc.c
··· 52 struct soc_mreg_control *mc = 53 (struct soc_mreg_control *)kcontrol->private_value; 54 unsigned int regval = ucontrol->value.integer.value[0]; 55 56 easrc_priv->bps_iec958[mc->regbase] = regval; 57 58 - return 0; 59 } 60 61 static int fsl_easrc_iec958_get_bits(struct snd_kcontrol *kcontrol, ··· 96 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 97 struct soc_mreg_control *mc = 98 (struct soc_mreg_control *)kcontrol->private_value; 99 unsigned int regval = ucontrol->value.integer.value[0]; 100 int ret; 101 102 - ret = snd_soc_component_write(component, mc->regbase, regval); 103 - if (ret < 0) 104 return ret; 105 106 - return 0; 107 } 108 109 #define SOC_SINGLE_REG_RW(xname, xreg) \
··· 52 struct soc_mreg_control *mc = 53 (struct soc_mreg_control *)kcontrol->private_value; 54 unsigned int regval = ucontrol->value.integer.value[0]; 55 + int ret; 56 + 57 + ret = (easrc_priv->bps_iec958[mc->regbase] != regval); 58 59 easrc_priv->bps_iec958[mc->regbase] = regval; 60 61 + return ret; 62 } 63 64 static int fsl_easrc_iec958_get_bits(struct snd_kcontrol *kcontrol, ··· 93 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 94 struct soc_mreg_control *mc = 95 (struct soc_mreg_control *)kcontrol->private_value; 96 + struct fsl_asrc *easrc = snd_soc_component_get_drvdata(component); 97 unsigned int regval = ucontrol->value.integer.value[0]; 98 + bool changed; 99 int ret; 100 101 + ret = regmap_update_bits_check(easrc->regmap, mc->regbase, 102 + GENMASK(31, 0), regval, &changed); 103 + if (ret != 0) 104 return ret; 105 106 + return changed; 107 } 108 109 #define SOC_SINGLE_REG_RW(xname, xreg) \
+8
sound/soc/intel/boards/sof_sdw.c
··· 763 }, 764 .driver_data = (void *)(SOC_SDW_CODEC_SPKR), 765 }, 766 /* Pantherlake devices*/ 767 { 768 .callback = sof_sdw_quirk_cb,
··· 763 }, 764 .driver_data = (void *)(SOC_SDW_CODEC_SPKR), 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 + }, 774 /* Pantherlake devices*/ 775 { 776 .callback = sof_sdw_quirk_cb,
+4 -1
sound/soc/sdca/sdca_functions.c
··· 1156 if (!terminal->is_dataport) { 1157 const char *type_name = sdca_find_terminal_name(terminal->type); 1158 1159 - if (type_name) 1160 entity->label = devm_kasprintf(dev, GFP_KERNEL, "%s %s", 1161 entity->label, type_name); 1162 } 1163 1164 ret = fwnode_property_read_u32(entity_node,
··· 1156 if (!terminal->is_dataport) { 1157 const char *type_name = sdca_find_terminal_name(terminal->type); 1158 1159 + if (type_name) { 1160 entity->label = devm_kasprintf(dev, GFP_KERNEL, "%s %s", 1161 entity->label, type_name); 1162 + if (!entity->label) 1163 + return -ENOMEM; 1164 + } 1165 } 1166 1167 ret = fwnode_property_read_u32(entity_node,
+2
sound/usb/quirks.c
··· 2219 QUIRK_FLAG_ALIGN_TRANSFER), 2220 DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */ 2221 QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER), 2222 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 | 2224 QUIRK_FLAG_IFACE_DELAY),
··· 2219 QUIRK_FLAG_ALIGN_TRANSFER), 2220 DEVICE_FLG(0x05e1, 0x0480, /* Hauppauge Woodbury */ 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), 2224 DEVICE_FLG(0x0644, 0x8043, /* TEAC UD-501/UD-501V2/UD-503/NT-503 */ 2225 QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY | 2226 QUIRK_FLAG_IFACE_DELAY),
+2 -10
sound/usb/usx2y/us122l.c
··· 520 return err; 521 } 522 523 - usb_get_intf(usb_ifnum_to_if(device, 0)); 524 - usb_get_dev(device); 525 *cardp = card; 526 return 0; 527 } ··· 540 if (intf->cur_altsetting->desc.bInterfaceNumber != 1) 541 return 0; 542 543 - err = us122l_usb_probe(usb_get_intf(intf), id, &card); 544 - if (err < 0) { 545 - usb_put_intf(intf); 546 return err; 547 - } 548 549 usb_set_intfdata(intf, card); 550 return 0; ··· 569 list_for_each(p, &us122l->midi_list) { 570 snd_usbmidi_disconnect(p); 571 } 572 - 573 - usb_put_intf(usb_ifnum_to_if(us122l->dev, 0)); 574 - usb_put_intf(usb_ifnum_to_if(us122l->dev, 1)); 575 - usb_put_dev(us122l->dev); 576 577 snd_card_free_when_closed(card); 578 }
··· 520 return err; 521 } 522 523 *cardp = card; 524 return 0; 525 } ··· 542 if (intf->cur_altsetting->desc.bInterfaceNumber != 1) 543 return 0; 544 545 + err = us122l_usb_probe(intf, id, &card); 546 + if (err < 0) 547 return err; 548 549 usb_set_intfdata(intf, card); 550 return 0; ··· 573 list_for_each(p, &us122l->midi_list) { 574 snd_usbmidi_disconnect(p); 575 } 576 577 snd_card_free_when_closed(card); 578 }