sound fixes for 6.16-rc1

A collection of fix patches for 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.
 -----BEGIN PGP SIGNATURE-----
 
 iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmhD9KAOHHRpd2FpQHN1
 c2UuZGUACgkQLtJE4w1nLE9N+g/+OmjHUQ4coYPAdb5NOoH/9n92N8Tq6xZXwlFq
 ISgTjcpojCiNH2qj6/0i9TBDMTUbt/QOghTfpCy2ikLIRLsym50ZUMvI5JkpH5P7
 Z8lWnf0vQGJDbCdrPaWsn7mUEAd3mWSnsEb39Dr+wQ6fv3TASXFb8DvO6p+YD3aU
 EaTnYDDBm3OCZpLMQfahynqiTA5f8AcbGHsrvsUM6xZ3FiZUIgvW8XTKm21XvYUQ
 nxLl0xzygpu+iSA10hTI/aP9c3tOT7B0Wq7BA8UtQBkLUgtqkaSXKmgqJpcF3QSk
 yKLyZP0zBW3bo8Q+jEvnpBzfUuMdWR0uBlNKxXDsWNJZxwnXfGsjK0nJ+qXuCMLT
 YWEVsLhm/L/fWObZkn7kivY8NMxJFqsgYoj7e1CYIsHTlW/rDkzoPVI0zATuZOOp
 fR65VxVb+b0Q/E14xKjXfczS3jUUPpGMVC86lW8pa3la2G71tyCdtOUKOkoJRKEj
 1YqYtkyu5JlQ5FeKG6tz05CiUALKeaC0KoVpf44/tGAdxxk8+vwNXxxPfJhVJgeY
 5A9eof5xPdTv5vGBpAHTUCyP3uhLLfBWyptpoQYilkij0yaKSj1tBhSdHirjSdNn
 uHGeEq8zN/h7RGZcAZE0r7VQEIeJJAqlUvKmczuns+74aVB9ZD2bbEVLFQrlMz3w
 u+BN26Y=
 =T+Ix
 -----END PGP SIGNATURE-----

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
  ...
This commit is contained in:
Linus Torvalds 2025-06-07 09:40:08 -07:00
commit af477f4d5a
25 changed files with 192 additions and 70 deletions

View File

@ -133,10 +133,11 @@ void cs_dsp_mock_wmfw_add_info(struct cs_dsp_mock_wmfw_builder *builder,
if (info_len % 4) {
/* Create a padded string with length a multiple of 4 */
size_t copy_len = info_len;
info_len = round_up(info_len, 4);
tmp = kunit_kzalloc(builder->test_priv->test, info_len, GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(builder->test_priv->test, tmp);
memcpy(tmp, info, info_len);
memcpy(tmp, info, copy_len);
info = tmp;
}

View File

@ -776,7 +776,6 @@ static void cs_dsp_ctl_cache_init_multiple_offsets(struct kunit *test)
"dummyalg", NULL);
/* Create controls identical except for offset */
def.length_bytes = 8;
def.offset_dsp_words = 0;
def.shortname = "CtlA";
cs_dsp_mock_wmfw_add_coeff_desc(local->wmfw_builder, &def);

View File

@ -1603,7 +1603,7 @@ static const struct regmap_irq cs35l41_reg_irqs[] = {
CS35L41_REG_IRQ(IRQ1_STATUS1, AMP_SHORT_ERR),
};
static struct regmap_irq_chip cs35l41_regmap_irq_chip = {
static const struct regmap_irq_chip cs35l41_regmap_irq_chip = {
.name = "cs35l41 IRQ1 Controller",
.status_base = CS35L41_IRQ1_STATUS1,
.mask_base = CS35L41_IRQ1_MASK1,

View File

@ -44,7 +44,7 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev)
struct hda_codec *codec = container_of(dev, struct hda_codec, core);
/* ignore unsol events during shutdown */
if (codec->bus->shutdown)
if (codec->card->shutdown || codec->bus->shutdown)
return;
/* ignore unsol events during system suspend/resume */

View File

@ -2724,6 +2724,9 @@ static const struct pci_device_id azx_ids[] = {
{ PCI_VDEVICE(ATI, 0xab38),
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
AZX_DCAPS_PM_RUNTIME },
{ PCI_VDEVICE(ATI, 0xab40),
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS |
AZX_DCAPS_PM_RUNTIME },
/* GLENFLY */
{ PCI_DEVICE(PCI_VENDOR_ID_GLENFLY, PCI_ANY_ID),
.class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,

View File

@ -311,6 +311,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "83AS"),
}
},
{
.driver_data = &acp6x_card,
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_NAME, "83BS"),
}
},
{
.driver_data = &acp6x_card,
.matches = {

View File

@ -319,6 +319,7 @@ static int es8375_hw_params(struct snd_pcm_substream *substream,
coeff = get_coeff(es8375->vddd, dmic_enable, es8375->mclk_freq, params_rate(params));
if (coeff < 0) {
dev_warn(component->dev, "Clock coefficients do not match");
return coeff;
}
regmap_write(es8375->regmap, ES8375_CLK_MGR4,
coeff_div[coeff].Reg0x04);

View File

@ -152,7 +152,7 @@ int hda_codec_probe_complete(struct hda_codec *codec)
ret = snd_hda_codec_build_controls(codec);
if (ret < 0) {
dev_err(&hdev->dev, "unable to create controls %d\n", ret);
goto out;
return ret;
}
/* Bus suspended codecs as it does not manage their pm */
@ -160,7 +160,7 @@ int hda_codec_probe_complete(struct hda_codec *codec)
/* rpm was forbidden in snd_hda_codec_device_new() */
snd_hda_codec_set_power_save(codec, 2000);
snd_hda_codec_register(codec);
out:
/* Complement pm_runtime_get_sync(bus) in probe */
pm_runtime_mark_last_busy(bus->dev);
pm_runtime_put_autosuspend(bus->dev);

View File

@ -204,7 +204,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
{ 0x3fc2bfc0, 0x03 },
{ 0x0000d486, 0x43 },
{ SDW_SDCA_CTL(FUNC_NUM_AMP, RT1320_SDCA_ENT_PDE23, RT1320_SDCA_CTL_REQ_POWER_STATE, 0), 0x00 },
{ 0x1000db00, 0x04 },
{ 0x1000db00, 0x07 },
{ 0x1000db01, 0x00 },
{ 0x1000db02, 0x11 },
{ 0x1000db03, 0x00 },
@ -225,6 +225,21 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
{ 0x1000db12, 0x00 },
{ 0x1000db13, 0x00 },
{ 0x1000db14, 0x45 },
{ 0x1000db15, 0x0d },
{ 0x1000db16, 0x01 },
{ 0x1000db17, 0x00 },
{ 0x1000db18, 0x00 },
{ 0x1000db19, 0xbf },
{ 0x1000db1a, 0x13 },
{ 0x1000db1b, 0x09 },
{ 0x1000db1c, 0x00 },
{ 0x1000db1d, 0x00 },
{ 0x1000db1e, 0x00 },
{ 0x1000db1f, 0x12 },
{ 0x1000db20, 0x09 },
{ 0x1000db21, 0x00 },
{ 0x1000db22, 0x00 },
{ 0x1000db23, 0x00 },
{ 0x0000d540, 0x01 },
{ 0x0000c081, 0xfc },
{ 0x0000f01e, 0x80 },

View File

@ -718,6 +718,69 @@ static const struct regmap_config tas5721_regmap_config = {
.volatile_table = &tas571x_volatile_regs,
};
static const struct snd_kcontrol_new tas5733_controls[] = {
/* MVOL LSB is ignored - see comments in tas571x_i2c_probe() */
SOC_SINGLE_TLV("Master Volume",
TAS571X_MVOL_REG, 1, 0x1ff, 1,
tas5717_volume_tlv),
SOC_DOUBLE_R_TLV("Speaker Volume",
TAS571X_CH1_VOL_REG, TAS571X_CH2_VOL_REG,
1, 0x1ff, 1, tas5717_volume_tlv),
SOC_DOUBLE("Speaker Switch",
TAS571X_SOFT_MUTE_REG,
TAS571X_SOFT_MUTE_CH1_SHIFT, TAS571X_SOFT_MUTE_CH2_SHIFT,
1, 1),
SOC_DOUBLE_R_RANGE("CH1 Mixer Volume",
TAS5717_CH1_LEFT_CH_MIX_REG,
TAS5717_CH1_RIGHT_CH_MIX_REG,
16, 0, 0x80, 0),
SOC_DOUBLE_R_RANGE("CH2 Mixer Volume",
TAS5717_CH2_LEFT_CH_MIX_REG,
TAS5717_CH2_RIGHT_CH_MIX_REG,
16, 0, 0x80, 0),
/*
* The biquads are named according to the register names.
* Please note that TI's TAS57xx Graphical Development Environment
* tool names them different.
*/
BIQUAD_COEFS("CH1 - Biquad 0", TAS5733_CH1_BQ0_REG),
BIQUAD_COEFS("CH1 - Biquad 1", TAS5733_CH1_BQ1_REG),
BIQUAD_COEFS("CH1 - Biquad 2", TAS5733_CH1_BQ2_REG),
BIQUAD_COEFS("CH1 - Biquad 3", TAS5733_CH1_BQ3_REG),
BIQUAD_COEFS("CH1 - Biquad 4", TAS5733_CH1_BQ4_REG),
BIQUAD_COEFS("CH1 - Biquad 5", TAS5733_CH1_BQ5_REG),
BIQUAD_COEFS("CH1 - Biquad 6", TAS5733_CH1_BQ6_REG),
BIQUAD_COEFS("CH1 - Biquad 7", TAS5733_CH1_BQ7_REG),
BIQUAD_COEFS("CH1 - Biquad 8", TAS5733_CH1_BQ8_REG),
BIQUAD_COEFS("CH1 - Biquad 9", TAS5733_CH1_BQ9_REG),
BIQUAD_COEFS("CH1 - Biquad 10", TAS5733_CH1_BQ10_REG),
BIQUAD_COEFS("CH2 - Biquad 0", TAS5733_CH2_BQ0_REG),
BIQUAD_COEFS("CH2 - Biquad 1", TAS5733_CH2_BQ1_REG),
BIQUAD_COEFS("CH2 - Biquad 2", TAS5733_CH2_BQ2_REG),
BIQUAD_COEFS("CH2 - Biquad 3", TAS5733_CH2_BQ3_REG),
BIQUAD_COEFS("CH2 - Biquad 4", TAS5733_CH2_BQ4_REG),
BIQUAD_COEFS("CH2 - Biquad 5", TAS5733_CH2_BQ5_REG),
BIQUAD_COEFS("CH2 - Biquad 6", TAS5733_CH2_BQ6_REG),
BIQUAD_COEFS("CH2 - Biquad 7", TAS5733_CH2_BQ7_REG),
BIQUAD_COEFS("CH2 - Biquad 8", TAS5733_CH2_BQ8_REG),
BIQUAD_COEFS("CH2 - Biquad 9", TAS5733_CH2_BQ9_REG),
BIQUAD_COEFS("CH2 - Biquad 10", TAS5733_CH2_BQ10_REG),
BIQUAD_COEFS("CH1 - Cross Biquad 0", TAS5733_CH1_CBQ0_REG),
BIQUAD_COEFS("CH1 - Cross Biquad 1", TAS5733_CH1_CBQ1_REG),
BIQUAD_COEFS("CH1 - Cross Biquad 2", TAS5733_CH1_CBQ2_REG),
BIQUAD_COEFS("CH1 - Cross Biquad 3", TAS5733_CH1_CBQ3_REG),
BIQUAD_COEFS("CH2 - Cross Biquad 0", TAS5733_CH2_CBQ0_REG),
BIQUAD_COEFS("CH2 - Cross Biquad 1", TAS5733_CH2_CBQ1_REG),
BIQUAD_COEFS("CH2 - Cross Biquad 2", TAS5733_CH2_CBQ2_REG),
BIQUAD_COEFS("CH2 - Cross Biquad 3", TAS5733_CH2_CBQ3_REG),
};
static const char *const tas5733_supply_names[] = {
"AVDD",
"DVDD",
@ -770,8 +833,8 @@ static const struct regmap_config tas5733_regmap_config = {
static const struct tas571x_chip tas5733_chip = {
.supply_names = tas5733_supply_names,
.num_supply_names = ARRAY_SIZE(tas5733_supply_names),
.controls = tas5717_controls,
.num_controls = ARRAY_SIZE(tas5717_controls),
.controls = tas5733_controls,
.num_controls = ARRAY_SIZE(tas5733_controls),
.regmap_config = &tas5733_regmap_config,
.vol_reg_size = 2,
};

View File

@ -104,4 +104,38 @@
#define TAS5717_CH2_LEFT_CH_MIX_REG 0x76
#define TAS5717_CH2_RIGHT_CH_MIX_REG 0x77
#define TAS5733_CH1_BQ0_REG 0x26
#define TAS5733_CH1_BQ1_REG 0x27
#define TAS5733_CH1_BQ2_REG 0x28
#define TAS5733_CH1_BQ3_REG 0x29
#define TAS5733_CH1_BQ4_REG 0x2a
#define TAS5733_CH1_BQ5_REG 0x2b
#define TAS5733_CH1_BQ6_REG 0x2c
#define TAS5733_CH1_BQ7_REG 0x2d
#define TAS5733_CH1_BQ8_REG 0x2e
#define TAS5733_CH1_BQ9_REG 0x2f
#define TAS5733_CH2_BQ0_REG 0x30
#define TAS5733_CH2_BQ1_REG 0x31
#define TAS5733_CH2_BQ2_REG 0x32
#define TAS5733_CH2_BQ3_REG 0x33
#define TAS5733_CH2_BQ4_REG 0x34
#define TAS5733_CH2_BQ5_REG 0x35
#define TAS5733_CH2_BQ6_REG 0x36
#define TAS5733_CH2_BQ7_REG 0x37
#define TAS5733_CH2_BQ8_REG 0x38
#define TAS5733_CH2_BQ9_REG 0x39
#define TAS5733_CH1_BQ10_REG 0x58
#define TAS5733_CH1_CBQ0_REG 0x59
#define TAS5733_CH1_CBQ1_REG 0x5a
#define TAS5733_CH1_CBQ2_REG 0x5b
#define TAS5733_CH1_CBQ3_REG 0x5c
#define TAS5733_CH2_BQ10_REG 0x5d
#define TAS5733_CH2_CBQ0_REG 0x5e
#define TAS5733_CH2_CBQ1_REG 0x5f
#define TAS5733_CH2_CBQ2_REG 0x60
#define TAS5733_CH2_CBQ3_REG 0x61
#endif /* _TAS571X_H */

View File

@ -332,7 +332,6 @@ struct wcd9335_codec {
int intr1;
struct gpio_desc *reset_gpio;
struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY];
unsigned int rx_port_value[WCD9335_RX_MAX];
unsigned int tx_port_value[WCD9335_TX_MAX];
@ -355,6 +354,10 @@ struct wcd9335_irq {
char *name;
};
static const char * const wcd9335_supplies[] = {
"vdd-buck", "vdd-buck-sido", "vdd-tx", "vdd-rx", "vdd-io",
};
static const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = {
WCD9335_SLIM_TX_CH(0),
WCD9335_SLIM_TX_CH(1),
@ -4989,30 +4992,16 @@ static int wcd9335_parse_dt(struct wcd9335_codec *wcd)
if (IS_ERR(wcd->native_clk))
return dev_err_probe(dev, PTR_ERR(wcd->native_clk), "slimbus clock not found\n");
wcd->supplies[0].supply = "vdd-buck";
wcd->supplies[1].supply = "vdd-buck-sido";
wcd->supplies[2].supply = "vdd-tx";
wcd->supplies[3].supply = "vdd-rx";
wcd->supplies[4].supply = "vdd-io";
ret = regulator_bulk_get(dev, WCD9335_MAX_SUPPLY, wcd->supplies);
ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(wcd9335_supplies),
wcd9335_supplies);
if (ret)
return dev_err_probe(dev, ret, "Failed to get supplies\n");
return dev_err_probe(dev, ret, "Failed to get and enable supplies\n");
return 0;
}
static int wcd9335_power_on_reset(struct wcd9335_codec *wcd)
{
struct device *dev = wcd->dev;
int ret;
ret = regulator_bulk_enable(WCD9335_MAX_SUPPLY, wcd->supplies);
if (ret) {
dev_err(dev, "Failed to get supplies: err = %d\n", ret);
return ret;
}
/*
* For WCD9335, it takes about 600us for the Vout_A and
* Vout_D to be ready after BUCK_SIDO is powered up.

View File

@ -91,7 +91,6 @@ struct wcd937x_priv {
struct regmap_irq_chip *wcd_regmap_irq_chip;
struct regmap_irq_chip_data *irq_chip;
struct regulator_bulk_data supplies[WCD937X_MAX_BULK_SUPPLY];
struct regulator *buck_supply;
struct snd_soc_jack *jack;
unsigned long status_mask;
s32 micb_ref[WCD937X_MAX_MICBIAS];
@ -2945,10 +2944,8 @@ static int wcd937x_probe(struct platform_device *pdev)
return dev_err_probe(dev, ret, "Failed to get supplies\n");
ret = regulator_bulk_enable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies);
if (ret) {
regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies);
if (ret)
return dev_err_probe(dev, ret, "Failed to enable supplies\n");
}
wcd937x_dt_parse_micbias_info(dev, wcd937x);
@ -2984,7 +2981,6 @@ static int wcd937x_probe(struct platform_device *pdev)
err_disable_regulators:
regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies);
regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies);
return ret;
}
@ -3001,7 +2997,6 @@ static void wcd937x_remove(struct platform_device *pdev)
pm_runtime_dont_use_autosuspend(dev);
regulator_bulk_disable(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies);
regulator_bulk_free(WCD937X_MAX_BULK_SUPPLY, wcd937x->supplies);
}
#if defined(CONFIG_OF)

View File

@ -548,7 +548,7 @@ static int avs_register_i2s_test_boards(struct avs_dev *adev)
u32 *array, num_elems;
ret = parse_int_array(i2s_test, strlen(i2s_test), (int **)&array);
if (ret < 0) {
if (ret) {
dev_err(adev->dev, "failed to parse i2s_test parameter\n");
return ret;
}

View File

@ -228,7 +228,7 @@ static int avs_rt5663_probe(struct platform_device *pdev)
card->name = "avs_rt5663";
} else {
card->driver_name = "avs_rt5663";
card->long_name = card->name = "AVS I2S ALC5640";
card->long_name = card->name = "AVS I2S ALC5663";
}
card->dev = dev;
card->owner = THIS_MODULE;

View File

@ -945,14 +945,14 @@ MODULE_AUTHOR("Cezary Rojewski <cezary.rojewski@intel.com>");
MODULE_AUTHOR("Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>");
MODULE_DESCRIPTION("Intel cAVS sound driver");
MODULE_LICENSE("GPL");
MODULE_FIRMWARE("intel/skl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/apl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/cnl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/icl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/jsl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/lkf/dsp_basefw.bin");
MODULE_FIRMWARE("intel/tgl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/ehl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/adl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/adl_n/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/skl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/apl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/cnl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/icl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/jsl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/lkf/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/tgl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/ehl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/adl/dsp_basefw.bin");
MODULE_FIRMWARE("intel/avs/adl_n/dsp_basefw.bin");
MODULE_FIRMWARE("intel/fcl/dsp_basefw.bin");

View File

@ -144,7 +144,7 @@ static ssize_t probe_points_write(struct file *file, const char __user *from, si
int ret;
ret = parse_int_array_user(from, count, (int **)&array);
if (ret < 0)
if (ret)
return ret;
num_elems = *array;
@ -181,7 +181,7 @@ static ssize_t probe_points_disconnect_write(struct file *file, const char __use
int ret;
ret = parse_int_array_user(from, count, (int **)&array);
if (ret < 0)
if (ret)
return ret;
num_elems = *array;
@ -369,11 +369,14 @@ static ssize_t trace_control_write(struct file *file, const char __user *from, s
int ret;
ret = parse_int_array_user(from, count, (int **)&array);
if (ret < 0)
if (ret)
return ret;
num_elems = *array;
resource_mask = array[1];
if (!num_elems) {
ret = -EINVAL;
goto free_array;
}
/*
* Disable if just resource mask is provided - no log priority flags.
@ -381,6 +384,7 @@ static ssize_t trace_control_write(struct file *file, const char __user *from, s
* Enable input format: mask, prio1, .., prioN
* Where 'N' equals number of bits set in the 'mask'.
*/
resource_mask = array[1];
if (num_elems == 1) {
ret = disable_logs(adev, resource_mask);
} else {

View File

@ -169,7 +169,9 @@ static void avs_dsp_exception_caught(struct avs_dev *adev, union avs_notify_msg
dev_crit(adev->dev, "communication severed, rebooting dsp..\n");
cancel_delayed_work_sync(&ipc->d0ix_work);
/* Avoid deadlock as the exception may be the response to SET_D0IX. */
if (current_work() != &ipc->d0ix_work.work)
cancel_delayed_work_sync(&ipc->d0ix_work);
ipc->in_d0ix = false;
/* Re-enabled on recovery completion. */
pm_runtime_disable(adev->dev);

View File

@ -9,6 +9,7 @@
#include <linux/firmware.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <sound/hdaudio.h>
#include <sound/hdaudio_ext.h>
#include "avs.h"

View File

@ -134,6 +134,8 @@ int avs_path_set_constraint(struct avs_dev *adev, struct avs_tplg_path_template
rlist = kcalloc(i, sizeof(*rlist), GFP_KERNEL);
clist = kcalloc(i, sizeof(*clist), GFP_KERNEL);
slist = kcalloc(i, sizeof(*slist), GFP_KERNEL);
if (!rlist || !clist || !slist)
return -ENOMEM;
i = 0;
list_for_each_entry(path_template, &template->path_list, node) {

View File

@ -83,10 +83,8 @@ void avs_period_elapsed(struct snd_pcm_substream *substream)
static int hw_rule_param_size(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule);
static int avs_hw_constraints_init(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_pcm_hw_constraint_list *r, *c, *s;
struct avs_tplg_path_template *template;
struct avs_dma_data *data;
int ret;
@ -99,8 +97,7 @@ static int avs_hw_constraints_init(struct snd_pcm_substream *substream, struct s
c = &(data->channels_list);
s = &(data->sample_bits_list);
template = avs_dai_find_path_template(dai, !rtd->dai_link->no_pcm, substream->stream);
ret = avs_path_set_constraint(data->adev, template, r, c, s);
ret = avs_path_set_constraint(data->adev, data->template, r, c, s);
if (ret <= 0)
return ret;
@ -450,9 +447,10 @@ static int avs_dai_hda_be_hw_free(struct snd_pcm_substream *substream, struct sn
static int avs_dai_hda_be_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_soc_pcm_runtime *be = snd_soc_substream_to_rtd(substream);
const struct snd_soc_pcm_stream *stream_info;
struct hdac_ext_stream *link_stream;
const struct snd_pcm_hw_params *p;
struct avs_dma_data *data;
unsigned int format_val;
unsigned int bits;
@ -460,14 +458,15 @@ static int avs_dai_hda_be_prepare(struct snd_pcm_substream *substream, struct sn
data = snd_soc_dai_get_dma_data(dai, substream);
link_stream = data->link_stream;
p = &be->dpcm[substream->stream].hw_params;
if (link_stream->link_prepared)
return 0;
stream_info = snd_soc_dai_get_pcm_stream(dai, substream->stream);
bits = snd_hdac_stream_format_bits(runtime->format, runtime->subformat,
bits = snd_hdac_stream_format_bits(params_format(p), params_subformat(p),
stream_info->sig_bits);
format_val = snd_hdac_stream_format(runtime->channels, bits, runtime->rate);
format_val = snd_hdac_stream_format(params_channels(p), bits, params_rate(p));
snd_hdac_ext_stream_decouple(&data->adev->base.core, link_stream, true);
snd_hdac_ext_stream_reset(link_stream);

View File

@ -2510,17 +2510,6 @@ static int dpcm_fe_dai_prepare(struct snd_pcm_substream *substream)
dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_FE);
/* there is no point preparing this FE if there are no BEs */
if (list_empty(&fe->dpcm[stream].be_clients)) {
/* dev_err_once() for visibility, dev_dbg() for debugging UCM profiles */
dev_err_once(fe->dev, "ASoC: no backend DAIs enabled for %s, possibly missing ALSA mixer-based routing or UCM profile\n",
fe->dai_link->name);
dev_dbg(fe->dev, "ASoC: no backend DAIs enabled for %s\n",
fe->dai_link->name);
ret = -EINVAL;
goto out;
}
ret = dpcm_be_dai_prepare(fe, stream);
if (ret < 0)
goto out;
@ -2776,11 +2765,23 @@ static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream)
/* calculate valid and active FE <-> BE dpcms */
dpcm_add_paths(fe, stream, &list);
/* There is no point starting up this FE if there are no BEs. */
if (list_empty(&fe->dpcm[stream].be_clients)) {
/* dev_err_once() for visibility, dev_dbg() for debugging UCM profiles. */
dev_err_once(fe->dev, "ASoC: no backend DAIs enabled for %s, possibly missing ALSA mixer-based routing or UCM profile\n",
fe->dai_link->name);
dev_dbg(fe->dev, "ASoC: no backend DAIs enabled for %s\n", fe->dai_link->name);
ret = -EINVAL;
goto put_path;
}
ret = dpcm_fe_dai_startup(fe_substream);
if (ret < 0)
dpcm_fe_dai_cleanup(fe_substream);
dpcm_clear_pending_state(fe, stream);
put_path:
dpcm_path_put(&list);
open_end:
snd_soc_dpcm_mutex_unlock(fe);

View File

@ -361,17 +361,20 @@ static int omap_hdmi_audio_probe(struct platform_device *pdev)
if (!card->dai_link)
return -ENOMEM;
compnent = devm_kzalloc(dev, sizeof(*compnent), GFP_KERNEL);
compnent = devm_kzalloc(dev, 2 * sizeof(*compnent), GFP_KERNEL);
if (!compnent)
return -ENOMEM;
card->dai_link->cpus = compnent;
card->dai_link->cpus = &compnent[0];
card->dai_link->num_cpus = 1;
card->dai_link->codecs = &snd_soc_dummy_dlc;
card->dai_link->num_codecs = 1;
card->dai_link->platforms = &compnent[1];
card->dai_link->num_platforms = 1;
card->dai_link->name = card->name;
card->dai_link->stream_name = card->name;
card->dai_link->cpus->dai_name = dev_name(ad->dssdev);
card->dai_link->platforms->name = dev_name(ad->dssdev);
card->num_links = 1;
card->dev = dev;

View File

@ -57,6 +57,7 @@ static const struct snd_usb_implicit_fb_match playback_implicit_fb_quirks[] = {
IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0002, 0x81, 2), /* Solid State Logic SSL2+ */
IMPLICIT_FB_FIXED_DEV(0x0499, 0x172f, 0x81, 2), /* Steinberg UR22C */
IMPLICIT_FB_FIXED_DEV(0x0d9a, 0x00df, 0x81, 2), /* RTX6001 */
IMPLICIT_FB_FIXED_DEV(0x19f7, 0x000a, 0x84, 3), /* RODE AI-1 */
IMPLICIT_FB_FIXED_DEV(0x22f0, 0x0006, 0x81, 3), /* Allen&Heath Qu-16 */
IMPLICIT_FB_FIXED_DEV(0x1686, 0xf029, 0x82, 2), /* Zoom UAC-2 */
IMPLICIT_FB_FIXED_DEV(0x2466, 0x8003, 0x86, 2), /* Fractal Audio Axe-Fx II */

View File

@ -2285,6 +2285,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
QUIRK_FLAG_DISABLE_AUTOSUSPEND),
DEVICE_FLG(0x17aa, 0x104d, /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */
QUIRK_FLAG_DISABLE_AUTOSUSPEND),
DEVICE_FLG(0x17ef, 0x3083, /* Lenovo TBT3 dock */
QUIRK_FLAG_GET_SAMPLE_RATE),
DEVICE_FLG(0x1852, 0x5062, /* Luxman D-08u */
QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
DEVICE_FLG(0x1852, 0x5065, /* Luxman DA-06 */