Merge tag 'sound-fix-6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
"A collection of fix patches for the 6.16-rc1 merge window.

Most of changes are about ASoC, especially lots of AVS driver fixes.
Larger LOCs are seen in TAS571x codec drivers, but the changes are
trivial and safe. The rest are all device-specific small fixes"

* tag 'sound-fix-6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (27 commits)
ASoC: Intel: avs: boards: Fix rt5663 front end name
ASoC: Intel: avs: Simplify verification of parse_int_array() result
ALSA: usb-audio: Add implicit feedback quirk for RODE AI-1
ALSA: hda: Ignore unsol events for cards being shut down
ALSA: hda: Add new pci id for AMD GPU display HD audio controller
ALSA: hda: cs35l41: Constify regmap_irq_chip
ALSA: usb-audio: Add a quirk for Lenovo Thinkpad Thunderbolt 3 dock
ASoC: ti: omap-hdmi: Re-add dai_link->platform to fix card init
ASoC: pcm: Do not open FEs with no BEs connected
ASoC: rt1320: fix speaker noise when volume bar is 100%
ASoC: Intel: avs: Include missing string.h
ASoC: Intel: avs: Verify content returned by parse_int_array()
ASoC: Intel: avs: Verify kcalloc() status when setting constraints
ASoC: Intel: avs: Fix paths in MODULE_FIRMWARE hints
ASoC: Intel: avs: Fix possible null-ptr-deref when initing hw
ASoC: Intel: avs: Fix PPLCxFMT calculation
ASoC: Intel: avs: Fix deadlock when the failing IPC is SET_D0IX
ASoC: codecs: hda: Fix RPM usage count underflow
ASoC: amd: yc: Add support for Lenovo Yoga 7 16ARP8
ASoC: tas571x: fix tas5733 num_controls
...

+192 -70
+2 -1
drivers/firmware/cirrus/test/cs_dsp_mock_wmfw.c
··· 133 134 if (info_len % 4) { 135 /* Create a padded string with length a multiple of 4 */ 136 info_len = round_up(info_len, 4); 137 tmp = kunit_kzalloc(builder->test_priv->test, info_len, GFP_KERNEL); 138 KUNIT_ASSERT_NOT_ERR_OR_NULL(builder->test_priv->test, tmp); 139 - memcpy(tmp, info, info_len); 140 info = tmp; 141 } 142
··· 133 134 if (info_len % 4) { 135 /* Create a padded string with length a multiple of 4 */ 136 + size_t copy_len = info_len; 137 info_len = round_up(info_len, 4); 138 tmp = kunit_kzalloc(builder->test_priv->test, info_len, GFP_KERNEL); 139 KUNIT_ASSERT_NOT_ERR_OR_NULL(builder->test_priv->test, tmp); 140 + memcpy(tmp, info, copy_len); 141 info = tmp; 142 } 143
-1
drivers/firmware/cirrus/test/cs_dsp_test_control_cache.c
··· 776 "dummyalg", NULL); 777 778 /* Create controls identical except for offset */ 779 - def.length_bytes = 8; 780 def.offset_dsp_words = 0; 781 def.shortname = "CtlA"; 782 cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);
··· 776 "dummyalg", NULL); 777 778 /* Create controls identical except for offset */ 779 def.offset_dsp_words = 0; 780 def.shortname = "CtlA"; 781 cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);
+1 -1
sound/pci/hda/cs35l41_hda.c
··· 1603 CS35L41_REG_IRQ(IRQ1_STATUS1, AMP_SHORT_ERR), 1604 }; 1605 1606 - static struct regmap_irq_chip cs35l41_regmap_irq_chip = { 1607 .name = "cs35l41 IRQ1 Controller", 1608 .status_base = CS35L41_IRQ1_STATUS1, 1609 .mask_base = CS35L41_IRQ1_MASK1,
··· 1603 CS35L41_REG_IRQ(IRQ1_STATUS1, AMP_SHORT_ERR), 1604 }; 1605 1606 + static const struct regmap_irq_chip cs35l41_regmap_irq_chip = { 1607 .name = "cs35l41 IRQ1 Controller", 1608 .status_base = CS35L41_IRQ1_STATUS1, 1609 .mask_base = CS35L41_IRQ1_MASK1,
+1 -1
sound/pci/hda/hda_bind.c
··· 44 struct hda_codec *codec = container_of(dev, struct hda_codec, core); 45 46 /* ignore unsol events during shutdown */ 47 - if (codec->bus->shutdown) 48 return; 49 50 /* ignore unsol events during system suspend/resume */
··· 44 struct hda_codec *codec = container_of(dev, struct hda_codec, core); 45 46 /* ignore unsol events during shutdown */ 47 + if (codec->card->shutdown || codec->bus->shutdown) 48 return; 49 50 /* ignore unsol events during system suspend/resume */
+3
sound/pci/hda/hda_intel.c
··· 2724 { PCI_VDEVICE(ATI, 0xab38), 2725 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2726 AZX_DCAPS_PM_RUNTIME }, 2727 /* GLENFLY */ 2728 { PCI_DEVICE(PCI_VENDOR_ID_GLENFLY, PCI_ANY_ID), 2729 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
··· 2724 { PCI_VDEVICE(ATI, 0xab38), 2725 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2726 AZX_DCAPS_PM_RUNTIME }, 2727 + { PCI_VDEVICE(ATI, 0xab40), 2728 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2729 + AZX_DCAPS_PM_RUNTIME }, 2730 /* GLENFLY */ 2731 { PCI_DEVICE(PCI_VENDOR_ID_GLENFLY, PCI_ANY_ID), 2732 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
+7
sound/soc/amd/yc/acp6x-mach.c
··· 315 .driver_data = &acp6x_card, 316 .matches = { 317 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), 318 DMI_MATCH(DMI_PRODUCT_NAME, "83HN"), 319 } 320 },
··· 315 .driver_data = &acp6x_card, 316 .matches = { 317 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), 318 + DMI_MATCH(DMI_PRODUCT_NAME, "83BS"), 319 + } 320 + }, 321 + { 322 + .driver_data = &acp6x_card, 323 + .matches = { 324 + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), 325 DMI_MATCH(DMI_PRODUCT_NAME, "83HN"), 326 } 327 },
+1
sound/soc/codecs/es8375.c
··· 319 coeff = get_coeff(es8375->vddd, dmic_enable, es8375->mclk_freq, params_rate(params)); 320 if (coeff < 0) { 321 dev_warn(component->dev, "Clock coefficients do not match"); 322 } 323 regmap_write(es8375->regmap, ES8375_CLK_MGR4, 324 coeff_div[coeff].Reg0x04);
··· 319 coeff = get_coeff(es8375->vddd, dmic_enable, es8375->mclk_freq, params_rate(params)); 320 if (coeff < 0) { 321 dev_warn(component->dev, "Clock coefficients do not match"); 322 + return coeff; 323 } 324 regmap_write(es8375->regmap, ES8375_CLK_MGR4, 325 coeff_div[coeff].Reg0x04);
+2 -2
sound/soc/codecs/hda.c
··· 152 ret = snd_hda_codec_build_controls(codec); 153 if (ret < 0) { 154 dev_err(&hdev->dev, "unable to create controls %d\n", ret); 155 - goto out; 156 } 157 158 /* Bus suspended codecs as it does not manage their pm */ ··· 160 /* rpm was forbidden in snd_hda_codec_device_new() */ 161 snd_hda_codec_set_power_save(codec, 2000); 162 snd_hda_codec_register(codec); 163 - out: 164 /* Complement pm_runtime_get_sync(bus) in probe */ 165 pm_runtime_mark_last_busy(bus->dev); 166 pm_runtime_put_autosuspend(bus->dev);
··· 152 ret = snd_hda_codec_build_controls(codec); 153 if (ret < 0) { 154 dev_err(&hdev->dev, "unable to create controls %d\n", ret); 155 + return ret; 156 } 157 158 /* Bus suspended codecs as it does not manage their pm */ ··· 160 /* rpm was forbidden in snd_hda_codec_device_new() */ 161 snd_hda_codec_set_power_save(codec, 2000); 162 snd_hda_codec_register(codec); 163 + 164 /* Complement pm_runtime_get_sync(bus) in probe */ 165 pm_runtime_mark_last_busy(bus->dev); 166 pm_runtime_put_autosuspend(bus->dev);
+16 -1
sound/soc/codecs/rt1320-sdw.c
··· 204 { 0x3fc2bfc0, 0x03 }, 205 { 0x0000d486, 0x43 }, 206 { SDW_SDCA_CTL(FUNC_NUM_AMP, RT1320_SDCA_ENT_PDE23, RT1320_SDCA_CTL_REQ_POWER_STATE, 0), 0x00 }, 207 - { 0x1000db00, 0x04 }, 208 { 0x1000db01, 0x00 }, 209 { 0x1000db02, 0x11 }, 210 { 0x1000db03, 0x00 }, ··· 225 { 0x1000db12, 0x00 }, 226 { 0x1000db13, 0x00 }, 227 { 0x1000db14, 0x45 }, 228 { 0x0000d540, 0x01 }, 229 { 0x0000c081, 0xfc }, 230 { 0x0000f01e, 0x80 },
··· 204 { 0x3fc2bfc0, 0x03 }, 205 { 0x0000d486, 0x43 }, 206 { SDW_SDCA_CTL(FUNC_NUM_AMP, RT1320_SDCA_ENT_PDE23, RT1320_SDCA_CTL_REQ_POWER_STATE, 0), 0x00 }, 207 + { 0x1000db00, 0x07 }, 208 { 0x1000db01, 0x00 }, 209 { 0x1000db02, 0x11 }, 210 { 0x1000db03, 0x00 }, ··· 225 { 0x1000db12, 0x00 }, 226 { 0x1000db13, 0x00 }, 227 { 0x1000db14, 0x45 }, 228 + { 0x1000db15, 0x0d }, 229 + { 0x1000db16, 0x01 }, 230 + { 0x1000db17, 0x00 }, 231 + { 0x1000db18, 0x00 }, 232 + { 0x1000db19, 0xbf }, 233 + { 0x1000db1a, 0x13 }, 234 + { 0x1000db1b, 0x09 }, 235 + { 0x1000db1c, 0x00 }, 236 + { 0x1000db1d, 0x00 }, 237 + { 0x1000db1e, 0x00 }, 238 + { 0x1000db1f, 0x12 }, 239 + { 0x1000db20, 0x09 }, 240 + { 0x1000db21, 0x00 }, 241 + { 0x1000db22, 0x00 }, 242 + { 0x1000db23, 0x00 }, 243 { 0x0000d540, 0x01 }, 244 { 0x0000c081, 0xfc }, 245 { 0x0000f01e, 0x80 },
+65 -2
sound/soc/codecs/tas571x.c
··· 718 .volatile_table = &tas571x_volatile_regs, 719 }; 720 721 static const char *const tas5733_supply_names[] = { 722 "AVDD", 723 "DVDD", ··· 833 static const struct tas571x_chip tas5733_chip = { 834 .supply_names = tas5733_supply_names, 835 .num_supply_names = ARRAY_SIZE(tas5733_supply_names), 836 - .controls = tas5717_controls, 837 - .num_controls = ARRAY_SIZE(tas5717_controls), 838 .regmap_config = &tas5733_regmap_config, 839 .vol_reg_size = 2, 840 };
··· 718 .volatile_table = &tas571x_volatile_regs, 719 }; 720 721 + static const struct snd_kcontrol_new tas5733_controls[] = { 722 + /* MVOL LSB is ignored - see comments in tas571x_i2c_probe() */ 723 + SOC_SINGLE_TLV("Master Volume", 724 + TAS571X_MVOL_REG, 1, 0x1ff, 1, 725 + tas5717_volume_tlv), 726 + SOC_DOUBLE_R_TLV("Speaker Volume", 727 + TAS571X_CH1_VOL_REG, TAS571X_CH2_VOL_REG, 728 + 1, 0x1ff, 1, tas5717_volume_tlv), 729 + SOC_DOUBLE("Speaker Switch", 730 + TAS571X_SOFT_MUTE_REG, 731 + TAS571X_SOFT_MUTE_CH1_SHIFT, TAS571X_SOFT_MUTE_CH2_SHIFT, 732 + 1, 1), 733 + 734 + SOC_DOUBLE_R_RANGE("CH1 Mixer Volume", 735 + TAS5717_CH1_LEFT_CH_MIX_REG, 736 + TAS5717_CH1_RIGHT_CH_MIX_REG, 737 + 16, 0, 0x80, 0), 738 + 739 + SOC_DOUBLE_R_RANGE("CH2 Mixer Volume", 740 + TAS5717_CH2_LEFT_CH_MIX_REG, 741 + TAS5717_CH2_RIGHT_CH_MIX_REG, 742 + 16, 0, 0x80, 0), 743 + 744 + /* 745 + * The biquads are named according to the register names. 746 + * Please note that TI's TAS57xx Graphical Development Environment 747 + * tool names them different. 748 + */ 749 + BIQUAD_COEFS("CH1 - Biquad 0", TAS5733_CH1_BQ0_REG), 750 + BIQUAD_COEFS("CH1 - Biquad 1", TAS5733_CH1_BQ1_REG), 751 + BIQUAD_COEFS("CH1 - Biquad 2", TAS5733_CH1_BQ2_REG), 752 + BIQUAD_COEFS("CH1 - Biquad 3", TAS5733_CH1_BQ3_REG), 753 + BIQUAD_COEFS("CH1 - Biquad 4", TAS5733_CH1_BQ4_REG), 754 + BIQUAD_COEFS("CH1 - Biquad 5", TAS5733_CH1_BQ5_REG), 755 + BIQUAD_COEFS("CH1 - Biquad 6", TAS5733_CH1_BQ6_REG), 756 + BIQUAD_COEFS("CH1 - Biquad 7", TAS5733_CH1_BQ7_REG), 757 + BIQUAD_COEFS("CH1 - Biquad 8", TAS5733_CH1_BQ8_REG), 758 + BIQUAD_COEFS("CH1 - Biquad 9", TAS5733_CH1_BQ9_REG), 759 + BIQUAD_COEFS("CH1 - Biquad 10", TAS5733_CH1_BQ10_REG), 760 + 761 + BIQUAD_COEFS("CH2 - Biquad 0", TAS5733_CH2_BQ0_REG), 762 + BIQUAD_COEFS("CH2 - Biquad 1", TAS5733_CH2_BQ1_REG), 763 + BIQUAD_COEFS("CH2 - Biquad 2", TAS5733_CH2_BQ2_REG), 764 + BIQUAD_COEFS("CH2 - Biquad 3", TAS5733_CH2_BQ3_REG), 765 + BIQUAD_COEFS("CH2 - Biquad 4", TAS5733_CH2_BQ4_REG), 766 + BIQUAD_COEFS("CH2 - Biquad 5", TAS5733_CH2_BQ5_REG), 767 + BIQUAD_COEFS("CH2 - Biquad 6", TAS5733_CH2_BQ6_REG), 768 + BIQUAD_COEFS("CH2 - Biquad 7", TAS5733_CH2_BQ7_REG), 769 + BIQUAD_COEFS("CH2 - Biquad 8", TAS5733_CH2_BQ8_REG), 770 + BIQUAD_COEFS("CH2 - Biquad 9", TAS5733_CH2_BQ9_REG), 771 + BIQUAD_COEFS("CH2 - Biquad 10", TAS5733_CH2_BQ10_REG), 772 + 773 + BIQUAD_COEFS("CH1 - Cross Biquad 0", TAS5733_CH1_CBQ0_REG), 774 + BIQUAD_COEFS("CH1 - Cross Biquad 1", TAS5733_CH1_CBQ1_REG), 775 + BIQUAD_COEFS("CH1 - Cross Biquad 2", TAS5733_CH1_CBQ2_REG), 776 + BIQUAD_COEFS("CH1 - Cross Biquad 3", TAS5733_CH1_CBQ3_REG), 777 + 778 + BIQUAD_COEFS("CH2 - Cross Biquad 0", TAS5733_CH2_CBQ0_REG), 779 + BIQUAD_COEFS("CH2 - Cross Biquad 1", TAS5733_CH2_CBQ1_REG), 780 + BIQUAD_COEFS("CH2 - Cross Biquad 2", TAS5733_CH2_CBQ2_REG), 781 + BIQUAD_COEFS("CH2 - Cross Biquad 3", TAS5733_CH2_CBQ3_REG), 782 + }; 783 + 784 static const char *const tas5733_supply_names[] = { 785 "AVDD", 786 "DVDD", ··· 770 static const struct tas571x_chip tas5733_chip = { 771 .supply_names = tas5733_supply_names, 772 .num_supply_names = ARRAY_SIZE(tas5733_supply_names), 773 + .controls = tas5733_controls, 774 + .num_controls = ARRAY_SIZE(tas5733_controls), 775 .regmap_config = &tas5733_regmap_config, 776 .vol_reg_size = 2, 777 };
+34
sound/soc/codecs/tas571x.h
··· 104 #define TAS5717_CH2_LEFT_CH_MIX_REG 0x76 105 #define TAS5717_CH2_RIGHT_CH_MIX_REG 0x77 106 107 #endif /* _TAS571X_H */
··· 104 #define TAS5717_CH2_LEFT_CH_MIX_REG 0x76 105 #define TAS5717_CH2_RIGHT_CH_MIX_REG 0x77 106 107 + #define TAS5733_CH1_BQ0_REG 0x26 108 + #define TAS5733_CH1_BQ1_REG 0x27 109 + #define TAS5733_CH1_BQ2_REG 0x28 110 + #define TAS5733_CH1_BQ3_REG 0x29 111 + #define TAS5733_CH1_BQ4_REG 0x2a 112 + #define TAS5733_CH1_BQ5_REG 0x2b 113 + #define TAS5733_CH1_BQ6_REG 0x2c 114 + #define TAS5733_CH1_BQ7_REG 0x2d 115 + #define TAS5733_CH1_BQ8_REG 0x2e 116 + #define TAS5733_CH1_BQ9_REG 0x2f 117 + 118 + #define TAS5733_CH2_BQ0_REG 0x30 119 + #define TAS5733_CH2_BQ1_REG 0x31 120 + #define TAS5733_CH2_BQ2_REG 0x32 121 + #define TAS5733_CH2_BQ3_REG 0x33 122 + #define TAS5733_CH2_BQ4_REG 0x34 123 + #define TAS5733_CH2_BQ5_REG 0x35 124 + #define TAS5733_CH2_BQ6_REG 0x36 125 + #define TAS5733_CH2_BQ7_REG 0x37 126 + #define TAS5733_CH2_BQ8_REG 0x38 127 + #define TAS5733_CH2_BQ9_REG 0x39 128 + 129 + #define TAS5733_CH1_BQ10_REG 0x58 130 + #define TAS5733_CH1_CBQ0_REG 0x59 131 + #define TAS5733_CH1_CBQ1_REG 0x5a 132 + #define TAS5733_CH1_CBQ2_REG 0x5b 133 + #define TAS5733_CH1_CBQ3_REG 0x5c 134 + 135 + #define TAS5733_CH2_BQ10_REG 0x5d 136 + #define TAS5733_CH2_CBQ0_REG 0x5e 137 + #define TAS5733_CH2_CBQ1_REG 0x5f 138 + #define TAS5733_CH2_CBQ2_REG 0x60 139 + #define TAS5733_CH2_CBQ3_REG 0x61 140 + 141 #endif /* _TAS571X_H */
+7 -18
sound/soc/codecs/wcd9335.c
··· 332 333 int intr1; 334 struct gpio_desc *reset_gpio; 335 - struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY]; 336 337 unsigned int rx_port_value[WCD9335_RX_MAX]; 338 unsigned int tx_port_value[WCD9335_TX_MAX]; ··· 352 int irq; 353 irqreturn_t (*handler)(int irq, void *data); 354 char *name; 355 }; 356 357 static const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = { ··· 4992 if (IS_ERR(wcd->native_clk)) 4993 return dev_err_probe(dev, PTR_ERR(wcd->native_clk), "slimbus clock not found\n"); 4994 4995 - wcd->supplies[0].supply = "vdd-buck"; 4996 - wcd->supplies[1].supply = "vdd-buck-sido"; 4997 - wcd->supplies[2].supply = "vdd-tx"; 4998 - wcd->supplies[3].supply = "vdd-rx"; 4999 - wcd->supplies[4].supply = "vdd-io"; 5000 - 5001 - ret = regulator_bulk_get(dev, WCD9335_MAX_SUPPLY, wcd->supplies); 5002 if (ret) 5003 - return dev_err_probe(dev, ret, "Failed to get supplies\n"); 5004 5005 return 0; 5006 } 5007 5008 static int wcd9335_power_on_reset(struct wcd9335_codec *wcd) 5009 { 5010 - struct device *dev = wcd->dev; 5011 - int ret; 5012 - 5013 - ret = regulator_bulk_enable(WCD9335_MAX_SUPPLY, wcd->supplies); 5014 - if (ret) { 5015 - dev_err(dev, "Failed to get supplies: err = %d\n", ret); 5016 - return ret; 5017 - } 5018 - 5019 /* 5020 * For WCD9335, it takes about 600us for the Vout_A and 5021 * Vout_D to be ready after BUCK_SIDO is powered up.
··· 332 333 int intr1; 334 struct gpio_desc *reset_gpio; 335 336 unsigned int rx_port_value[WCD9335_RX_MAX]; 337 unsigned int tx_port_value[WCD9335_TX_MAX]; ··· 353 int irq; 354 irqreturn_t (*handler)(int irq, void *data); 355 char *name; 356 + }; 357 + 358 + static const char * const wcd9335_supplies[] = { 359 + "vdd-buck", "vdd-buck-sido", "vdd-tx", "vdd-rx", "vdd-io", 360 }; 361 362 static const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = { ··· 4989 if (IS_ERR(wcd->native_clk)) 4990 return dev_err_probe(dev, PTR_ERR(wcd->native_clk), "slimbus clock not found\n"); 4991 4992 + ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(wcd9335_supplies), 4993 + wcd9335_supplies); 4994 if (ret) 4995 + return dev_err_probe(dev, ret, "Failed to get and enable supplies\n"); 4996 4997 return 0; 4998 } 4999 5000 static int wcd9335_power_on_reset(struct wcd9335_codec *wcd) 5001 { 5002 /* 5003 * For WCD9335, it takes about 600us for the Vout_A and 5004 * Vout_D to be ready after BUCK_SIDO is powered up.
+1 -6
sound/soc/codecs/wcd937x.c
··· 91 struct regmap_irq_chip *wcd_regmap_irq_chip; 92 struct regmap_irq_chip_data *irq_chip; 93 struct regulator_bulk_data supplies[WCD937X_MAX_BULK_SUPPLY]; 94 - struct regulator *buck_supply; 95 struct snd_soc_jack *jack; 96 unsigned long status_mask; 97 s32 micb_ref[WCD937X_MAX_MICBIAS]; ··· 2944 return dev_err_probe(dev, ret, "Failed to get supplies\n"); 2945 2946 ret = regulator_bulk_enable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 2947 - if (ret) { 2948 - regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 2949 return dev_err_probe(dev, ret, "Failed to enable supplies\n"); 2950 - } 2951 2952 wcd937x_dt_parse_micbias_info(dev, wcd937x); 2953 ··· 2981 2982 err_disable_regulators: 2983 regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 2984 - regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 2985 2986 return ret; 2987 } ··· 2997 pm_runtime_dont_use_autosuspend(dev); 2998 2999 regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 3000 - regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 3001 } 3002 3003 #if defined(CONFIG_OF)
··· 91 struct regmap_irq_chip *wcd_regmap_irq_chip; 92 struct regmap_irq_chip_data *irq_chip; 93 struct regulator_bulk_data supplies[WCD937X_MAX_BULK_SUPPLY]; 94 struct snd_soc_jack *jack; 95 unsigned long status_mask; 96 s32 micb_ref[WCD937X_MAX_MICBIAS]; ··· 2945 return dev_err_probe(dev, ret, "Failed to get supplies\n"); 2946 2947 ret = regulator_bulk_enable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 2948 + if (ret) 2949 return dev_err_probe(dev, ret, "Failed to enable supplies\n"); 2950 2951 wcd937x_dt_parse_micbias_info(dev, wcd937x); 2952 ··· 2984 2985 err_disable_regulators: 2986 regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 2987 2988 return ret; 2989 } ··· 3001 pm_runtime_dont_use_autosuspend(dev); 3002 3003 regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies); 3004 } 3005 3006 #if defined(CONFIG_OF)
+1 -1
sound/soc/intel/avs/board_selection.c
··· 548 u32 *array, num_elems; 549 550 ret = parse_int_array(i2s_test, strlen(i2s_test), (int **)&array); 551 - if (ret < 0) { 552 dev_err(adev->dev, "failed to parse i2s_test parameter\n"); 553 return ret; 554 }
··· 548 u32 *array, num_elems; 549 550 ret = parse_int_array(i2s_test, strlen(i2s_test), (int **)&array); 551 + if (ret) { 552 dev_err(adev->dev, "failed to parse i2s_test parameter\n"); 553 return ret; 554 }
+1 -1
sound/soc/intel/avs/boards/rt5663.c
··· 228 card->name = "avs_rt5663"; 229 } else { 230 card->driver_name = "avs_rt5663"; 231 - card->long_name = card->name = "AVS I2S ALC5640"; 232 } 233 card->dev = dev; 234 card->owner = THIS_MODULE;
··· 228 card->name = "avs_rt5663"; 229 } else { 230 card->driver_name = "avs_rt5663"; 231 + card->long_name = card->name = "AVS I2S ALC5663"; 232 } 233 card->dev = dev; 234 card->owner = THIS_MODULE;
+10 -10
sound/soc/intel/avs/core.c
··· 945 MODULE_AUTHOR("Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>"); 946 MODULE_DESCRIPTION("Intel cAVS sound driver"); 947 MODULE_LICENSE("GPL"); 948 - MODULE_FIRMWARE("intel/skl/dsp_basefw.bin"); 949 - MODULE_FIRMWARE("intel/apl/dsp_basefw.bin"); 950 - MODULE_FIRMWARE("intel/cnl/dsp_basefw.bin"); 951 - MODULE_FIRMWARE("intel/icl/dsp_basefw.bin"); 952 - MODULE_FIRMWARE("intel/jsl/dsp_basefw.bin"); 953 - MODULE_FIRMWARE("intel/lkf/dsp_basefw.bin"); 954 - MODULE_FIRMWARE("intel/tgl/dsp_basefw.bin"); 955 - MODULE_FIRMWARE("intel/ehl/dsp_basefw.bin"); 956 - MODULE_FIRMWARE("intel/adl/dsp_basefw.bin"); 957 - MODULE_FIRMWARE("intel/adl_n/dsp_basefw.bin"); 958 MODULE_FIRMWARE("intel/fcl/dsp_basefw.bin");
··· 945 MODULE_AUTHOR("Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>"); 946 MODULE_DESCRIPTION("Intel cAVS sound driver"); 947 MODULE_LICENSE("GPL"); 948 + MODULE_FIRMWARE("intel/avs/skl/dsp_basefw.bin"); 949 + MODULE_FIRMWARE("intel/avs/apl/dsp_basefw.bin"); 950 + MODULE_FIRMWARE("intel/avs/cnl/dsp_basefw.bin"); 951 + MODULE_FIRMWARE("intel/avs/icl/dsp_basefw.bin"); 952 + MODULE_FIRMWARE("intel/avs/jsl/dsp_basefw.bin"); 953 + MODULE_FIRMWARE("intel/avs/lkf/dsp_basefw.bin"); 954 + MODULE_FIRMWARE("intel/avs/tgl/dsp_basefw.bin"); 955 + MODULE_FIRMWARE("intel/avs/ehl/dsp_basefw.bin"); 956 + MODULE_FIRMWARE("intel/avs/adl/dsp_basefw.bin"); 957 + MODULE_FIRMWARE("intel/avs/adl_n/dsp_basefw.bin"); 958 MODULE_FIRMWARE("intel/fcl/dsp_basefw.bin");
+8 -4
sound/soc/intel/avs/debugfs.c
··· 144 int ret; 145 146 ret = parse_int_array_user(from, count, (int **)&array); 147 - if (ret < 0) 148 return ret; 149 150 num_elems = *array; ··· 181 int ret; 182 183 ret = parse_int_array_user(from, count, (int **)&array); 184 - if (ret < 0) 185 return ret; 186 187 num_elems = *array; ··· 369 int ret; 370 371 ret = parse_int_array_user(from, count, (int **)&array); 372 - if (ret < 0) 373 return ret; 374 375 num_elems = *array; 376 - resource_mask = array[1]; 377 378 /* 379 * Disable if just resource mask is provided - no log priority flags. ··· 384 * Enable input format: mask, prio1, .., prioN 385 * Where 'N' equals number of bits set in the 'mask'. 386 */ 387 if (num_elems == 1) { 388 ret = disable_logs(adev, resource_mask); 389 } else {
··· 144 int ret; 145 146 ret = parse_int_array_user(from, count, (int **)&array); 147 + if (ret) 148 return ret; 149 150 num_elems = *array; ··· 181 int ret; 182 183 ret = parse_int_array_user(from, count, (int **)&array); 184 + if (ret) 185 return ret; 186 187 num_elems = *array; ··· 369 int ret; 370 371 ret = parse_int_array_user(from, count, (int **)&array); 372 + if (ret) 373 return ret; 374 375 num_elems = *array; 376 + if (!num_elems) { 377 + ret = -EINVAL; 378 + goto free_array; 379 + } 380 381 /* 382 * Disable if just resource mask is provided - no log priority flags. ··· 381 * Enable input format: mask, prio1, .., prioN 382 * Where 'N' equals number of bits set in the 'mask'. 383 */ 384 + resource_mask = array[1]; 385 if (num_elems == 1) { 386 ret = disable_logs(adev, resource_mask); 387 } else {
+3 -1
sound/soc/intel/avs/ipc.c
··· 169 170 dev_crit(adev->dev, "communication severed, rebooting dsp..\n"); 171 172 - cancel_delayed_work_sync(&ipc->d0ix_work); 173 ipc->in_d0ix = false; 174 /* Re-enabled on recovery completion. */ 175 pm_runtime_disable(adev->dev);
··· 169 170 dev_crit(adev->dev, "communication severed, rebooting dsp..\n"); 171 172 + /* Avoid deadlock as the exception may be the response to SET_D0IX. */ 173 + if (current_work() != &ipc->d0ix_work.work) 174 + cancel_delayed_work_sync(&ipc->d0ix_work); 175 ipc->in_d0ix = false; 176 /* Re-enabled on recovery completion. */ 177 pm_runtime_disable(adev->dev);
+1
sound/soc/intel/avs/loader.c
··· 9 #include <linux/firmware.h> 10 #include <linux/module.h> 11 #include <linux/slab.h> 12 #include <sound/hdaudio.h> 13 #include <sound/hdaudio_ext.h> 14 #include "avs.h"
··· 9 #include <linux/firmware.h> 10 #include <linux/module.h> 11 #include <linux/slab.h> 12 + #include <linux/string.h> 13 #include <sound/hdaudio.h> 14 #include <sound/hdaudio_ext.h> 15 #include "avs.h"
+2
sound/soc/intel/avs/path.c
··· 134 rlist = kcalloc(i, sizeof(*rlist), GFP_KERNEL); 135 clist = kcalloc(i, sizeof(*clist), GFP_KERNEL); 136 slist = kcalloc(i, sizeof(*slist), GFP_KERNEL); 137 138 i = 0; 139 list_for_each_entry(path_template, &template->path_list, node) {
··· 134 rlist = kcalloc(i, sizeof(*rlist), GFP_KERNEL); 135 clist = kcalloc(i, sizeof(*clist), GFP_KERNEL); 136 slist = kcalloc(i, sizeof(*slist), GFP_KERNEL); 137 + if (!rlist || !clist || !slist) 138 + return -ENOMEM; 139 140 i = 0; 141 list_for_each_entry(path_template, &template->path_list, node) {
+6 -7
sound/soc/intel/avs/pcm.c
··· 83 static int hw_rule_param_size(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule); 84 static int avs_hw_constraints_init(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 85 { 86 - struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 87 struct snd_pcm_runtime *runtime = substream->runtime; 88 struct snd_pcm_hw_constraint_list *r, *c, *s; 89 - struct avs_tplg_path_template *template; 90 struct avs_dma_data *data; 91 int ret; 92 ··· 97 c = &(data->channels_list); 98 s = &(data->sample_bits_list); 99 100 - template = avs_dai_find_path_template(dai, !rtd->dai_link->no_pcm, substream->stream); 101 - ret = avs_path_set_constraint(data->adev, template, r, c, s); 102 if (ret <= 0) 103 return ret; 104 ··· 447 448 static int avs_dai_hda_be_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 449 { 450 - struct snd_pcm_runtime *runtime = substream->runtime; 451 const struct snd_soc_pcm_stream *stream_info; 452 struct hdac_ext_stream *link_stream; 453 struct avs_dma_data *data; 454 unsigned int format_val; 455 unsigned int bits; ··· 458 459 data = snd_soc_dai_get_dma_data(dai, substream); 460 link_stream = data->link_stream; 461 462 if (link_stream->link_prepared) 463 return 0; 464 465 stream_info = snd_soc_dai_get_pcm_stream(dai, substream->stream); 466 - bits = snd_hdac_stream_format_bits(runtime->format, runtime->subformat, 467 stream_info->sig_bits); 468 - format_val = snd_hdac_stream_format(runtime->channels, bits, runtime->rate); 469 470 snd_hdac_ext_stream_decouple(&data->adev->base.core, link_stream, true); 471 snd_hdac_ext_stream_reset(link_stream);
··· 83 static int hw_rule_param_size(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule); 84 static int avs_hw_constraints_init(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 85 { 86 struct snd_pcm_runtime *runtime = substream->runtime; 87 struct snd_pcm_hw_constraint_list *r, *c, *s; 88 struct avs_dma_data *data; 89 int ret; 90 ··· 99 c = &(data->channels_list); 100 s = &(data->sample_bits_list); 101 102 + ret = avs_path_set_constraint(data->adev, data->template, r, c, s); 103 if (ret <= 0) 104 return ret; 105 ··· 450 451 static int avs_dai_hda_be_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 452 { 453 + struct snd_soc_pcm_runtime *be = snd_soc_substream_to_rtd(substream); 454 const struct snd_soc_pcm_stream *stream_info; 455 struct hdac_ext_stream *link_stream; 456 + const struct snd_pcm_hw_params *p; 457 struct avs_dma_data *data; 458 unsigned int format_val; 459 unsigned int bits; ··· 460 461 data = snd_soc_dai_get_dma_data(dai, substream); 462 link_stream = data->link_stream; 463 + p = &be->dpcm[substream->stream].hw_params; 464 465 if (link_stream->link_prepared) 466 return 0; 467 468 stream_info = snd_soc_dai_get_pcm_stream(dai, substream->stream); 469 + bits = snd_hdac_stream_format_bits(params_format(p), params_subformat(p), 470 stream_info->sig_bits); 471 + format_val = snd_hdac_stream_format(params_channels(p), bits, params_rate(p)); 472 473 snd_hdac_ext_stream_decouple(&data->adev->base.core, link_stream, true); 474 snd_hdac_ext_stream_reset(link_stream);
+12 -11
sound/soc/soc-pcm.c
··· 2510 2511 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE); 2512 2513 - /* there is no point preparing this FE if there are no BEs */ 2514 - if (list_empty(&fe->dpcm[stream].be_clients)) { 2515 - /* dev_err_once() for visibility, dev_dbg() for debugging UCM profiles */ 2516 - dev_err_once(fe->dev, "ASoC: no backend DAIs enabled for %s, possibly missing ALSA mixer-based routing or UCM profile\n", 2517 - fe->dai_link->name); 2518 - dev_dbg(fe->dev, "ASoC: no backend DAIs enabled for %s\n", 2519 - fe->dai_link->name); 2520 - ret = -EINVAL; 2521 - goto out; 2522 - } 2523 - 2524 ret = dpcm_be_dai_prepare(fe, stream); 2525 if (ret < 0) 2526 goto out; ··· 2765 /* calculate valid and active FE <-> BE dpcms */ 2766 dpcm_add_paths(fe, stream, &list); 2767 2768 ret = dpcm_fe_dai_startup(fe_substream); 2769 if (ret < 0) 2770 dpcm_fe_dai_cleanup(fe_substream); 2771 2772 dpcm_clear_pending_state(fe, stream); 2773 dpcm_path_put(&list); 2774 open_end: 2775 snd_soc_dpcm_mutex_unlock(fe);
··· 2510 2511 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE); 2512 2513 ret = dpcm_be_dai_prepare(fe, stream); 2514 if (ret < 0) 2515 goto out; ··· 2776 /* calculate valid and active FE <-> BE dpcms */ 2777 dpcm_add_paths(fe, stream, &list); 2778 2779 + /* There is no point starting up this FE if there are no BEs. */ 2780 + if (list_empty(&fe->dpcm[stream].be_clients)) { 2781 + /* dev_err_once() for visibility, dev_dbg() for debugging UCM profiles. */ 2782 + dev_err_once(fe->dev, "ASoC: no backend DAIs enabled for %s, possibly missing ALSA mixer-based routing or UCM profile\n", 2783 + fe->dai_link->name); 2784 + dev_dbg(fe->dev, "ASoC: no backend DAIs enabled for %s\n", fe->dai_link->name); 2785 + 2786 + ret = -EINVAL; 2787 + goto put_path; 2788 + } 2789 + 2790 ret = dpcm_fe_dai_startup(fe_substream); 2791 if (ret < 0) 2792 dpcm_fe_dai_cleanup(fe_substream); 2793 2794 dpcm_clear_pending_state(fe, stream); 2795 + put_path: 2796 dpcm_path_put(&list); 2797 open_end: 2798 snd_soc_dpcm_mutex_unlock(fe);
+5 -2
sound/soc/ti/omap-hdmi.c
··· 361 if (!card->dai_link) 362 return -ENOMEM; 363 364 - compnent = devm_kzalloc(dev, sizeof(*compnent), GFP_KERNEL); 365 if (!compnent) 366 return -ENOMEM; 367 - card->dai_link->cpus = compnent; 368 card->dai_link->num_cpus = 1; 369 card->dai_link->codecs = &snd_soc_dummy_dlc; 370 card->dai_link->num_codecs = 1; 371 372 card->dai_link->name = card->name; 373 card->dai_link->stream_name = card->name; 374 card->dai_link->cpus->dai_name = dev_name(ad->dssdev); 375 card->num_links = 1; 376 card->dev = dev; 377
··· 361 if (!card->dai_link) 362 return -ENOMEM; 363 364 + compnent = devm_kzalloc(dev, 2 * sizeof(*compnent), GFP_KERNEL); 365 if (!compnent) 366 return -ENOMEM; 367 + card->dai_link->cpus = &compnent[0]; 368 card->dai_link->num_cpus = 1; 369 card->dai_link->codecs = &snd_soc_dummy_dlc; 370 card->dai_link->num_codecs = 1; 371 + card->dai_link->platforms = &compnent[1]; 372 + card->dai_link->num_platforms = 1; 373 374 card->dai_link->name = card->name; 375 card->dai_link->stream_name = card->name; 376 card->dai_link->cpus->dai_name = dev_name(ad->dssdev); 377 + card->dai_link->platforms->name = dev_name(ad->dssdev); 378 card->num_links = 1; 379 card->dev = dev; 380
+1
sound/usb/implicit.c
··· 57 IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0002, 0x81, 2), /* Solid State Logic SSL2+ */ 58 IMPLICIT_FB_FIXED_DEV(0x0499, 0x172f, 0x81, 2), /* Steinberg UR22C */ 59 IMPLICIT_FB_FIXED_DEV(0x0d9a, 0x00df, 0x81, 2), /* RTX6001 */ 60 IMPLICIT_FB_FIXED_DEV(0x22f0, 0x0006, 0x81, 3), /* Allen&Heath Qu-16 */ 61 IMPLICIT_FB_FIXED_DEV(0x1686, 0xf029, 0x82, 2), /* Zoom UAC-2 */ 62 IMPLICIT_FB_FIXED_DEV(0x2466, 0x8003, 0x86, 2), /* Fractal Audio Axe-Fx II */
··· 57 IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0002, 0x81, 2), /* Solid State Logic SSL2+ */ 58 IMPLICIT_FB_FIXED_DEV(0x0499, 0x172f, 0x81, 2), /* Steinberg UR22C */ 59 IMPLICIT_FB_FIXED_DEV(0x0d9a, 0x00df, 0x81, 2), /* RTX6001 */ 60 + IMPLICIT_FB_FIXED_DEV(0x19f7, 0x000a, 0x84, 3), /* RODE AI-1 */ 61 IMPLICIT_FB_FIXED_DEV(0x22f0, 0x0006, 0x81, 3), /* Allen&Heath Qu-16 */ 62 IMPLICIT_FB_FIXED_DEV(0x1686, 0xf029, 0x82, 2), /* Zoom UAC-2 */ 63 IMPLICIT_FB_FIXED_DEV(0x2466, 0x8003, 0x86, 2), /* Fractal Audio Axe-Fx II */
+2
sound/usb/quirks.c
··· 2285 QUIRK_FLAG_DISABLE_AUTOSUSPEND), 2286 DEVICE_FLG(0x17aa, 0x104d, /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */ 2287 QUIRK_FLAG_DISABLE_AUTOSUSPEND), 2288 DEVICE_FLG(0x1852, 0x5062, /* Luxman D-08u */ 2289 QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY), 2290 DEVICE_FLG(0x1852, 0x5065, /* Luxman DA-06 */
··· 2285 QUIRK_FLAG_DISABLE_AUTOSUSPEND), 2286 DEVICE_FLG(0x17aa, 0x104d, /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */ 2287 QUIRK_FLAG_DISABLE_AUTOSUSPEND), 2288 + DEVICE_FLG(0x17ef, 0x3083, /* Lenovo TBT3 dock */ 2289 + QUIRK_FLAG_GET_SAMPLE_RATE), 2290 DEVICE_FLG(0x1852, 0x5062, /* Luxman D-08u */ 2291 QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY), 2292 DEVICE_FLG(0x1852, 0x5065, /* Luxman DA-06 */