mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
sound fixes for 6.5-rc1
A collection of small fixes that have been gathered recently: - Two code-typo fixes in the new UMP core - A fix in jack reporting to avoid the usage of mutex - A potential data race fix in HD-audio core regmap code - A potential data race fix in PCM allocation helper code - HD-audio quirks for ASUS, Clevo and Unis machines - Constifications in FireWire drivers -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmSnwToOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9b2hAAyJ0mHV74OWq1Dlt9qBODaCO85OuLAzBfkABy /EvpZXgZlrcptfaOm0q/ASWj7U7cYzqgj7svqR7Ju5oY781tUHkTJAMdK43NJdF+ dXnpPi1aXsvv+v7dodqoPVFMX3Bt8ku03AIgNhi//AaIa8MmNu89A8jR3Iy8iva3 Qv6UoxAYuAIXhD3ZL0snXAxSZqo/JLdScFgiy7RTbqj0CcdlPTZr+6NY0fcceyb5 EaG+YccxLV/SRkVXlriOf+qZvSWbl+ZT2wWnnjjKUcYiA/riMfvZCWcoKiZCKnDM MEdI8OHCi16+rrTAUvx2YCm3WVFf3CVC5Ia6rU0ieaR9i2+ER3pvok2ozvFpw8ES DKVdltU2Z36ARolN388Hmyi8k7RW7aomy55V/ZlF2HVWsOwGPOJwGrUbCqFN7rtt DprmBcnwXJBlVxSgJMAHXuiqnyVtbzIXXDUFI8ESslmoByc3ImLPo4hGSytfY4Bc MAq0sZchwOcx5ylOzRpfFgWbg0X8r8FS0lhw1xLvxaxcwnblOiQLe61oL628Zhpt Y79AdZCyn/EhnYB3yRdLQ3TDryaNaH3l3fJxYhWJdQ86fGCGK9xKQh09ibJz96R5 CiggFvSQyokfIUj7PvYY7RqS7BXcJS3Vd2lQKgQN4tviPpo0Y93LPeDflBvFqxkm tJyr48Y= =8Fqj -----END PGP SIGNATURE----- Merge tag 'sound-fix-6.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small fixes that have been gathered recently: - Two code-typo fixes in the new UMP core - A fix in jack reporting to avoid the usage of mutex - A potential data race fix in HD-audio core regmap code - A potential data race fix in PCM allocation helper code - HD-audio quirks for ASUS, Clevo and Unis machines - Constifications in FireWire drivers" * tag 'sound-fix-6.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/realtek: Add quirk for ASUS ROG GZ301V ALSA: jack: Fix mutex call in snd_jack_report() ALSA: seq: ump: fix typo in system_2p_ev_to_ump_midi1() ALSA: hda/realtek: Whitespace fix ALSA: hda/realtek: Add quirk for ASUS ROG G614Jx ALSA: hda/realtek: Amend G634 quirk to enable rear speakers ALSA: hda/realtek: Add quirk for ASUS ROG GA402X ALSA: hda/realtek: Add quirk for ASUS ROG GX650P ALSA: pcm: Fix potential data race at PCM memory allocation helpers ALSA: hda: fix a possible null-pointer dereference due to data race in snd_hdac_regmap_sync() ALSA: hda/realtek: Add quirks for Unis H3C Desktop B760 & Q760 ALSA: hda/realtek: Add quirk for Clevo NPx0SNx ALSA: ump: Correct wrong byte size at converting a UMP System message ALSA: fireface: make read-only const array for model names static ALSA: oxfw: make read-only const array models static
This commit is contained in:
commit
4c8ab068be
@ -654,6 +654,7 @@ void snd_jack_report(struct snd_jack *jack, int status)
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
unsigned int mask_bits = 0;
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
struct input_dev *idev;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
@ -670,17 +671,15 @@ void snd_jack_report(struct snd_jack *jack, int status)
|
||||
status & jack_kctl->mask_bits);
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
mutex_lock(&jack->input_dev_lock);
|
||||
if (!jack->input_dev) {
|
||||
mutex_unlock(&jack->input_dev_lock);
|
||||
idev = input_get_device(jack->input_dev);
|
||||
if (!idev)
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
|
||||
int testbit = ((SND_JACK_BTN_0 >> i) & ~mask_bits);
|
||||
|
||||
if (jack->type & testbit)
|
||||
input_report_key(jack->input_dev, jack->key[i],
|
||||
input_report_key(idev, jack->key[i],
|
||||
status & testbit);
|
||||
}
|
||||
|
||||
@ -688,13 +687,13 @@ void snd_jack_report(struct snd_jack *jack, int status)
|
||||
int testbit = ((1 << i) & ~mask_bits);
|
||||
|
||||
if (jack->type & testbit)
|
||||
input_report_switch(jack->input_dev,
|
||||
input_report_switch(idev,
|
||||
jack_switch_types[i],
|
||||
status & testbit);
|
||||
}
|
||||
|
||||
input_sync(jack->input_dev);
|
||||
mutex_unlock(&jack->input_dev_lock);
|
||||
input_sync(idev);
|
||||
input_put_device(idev);
|
||||
#endif /* CONFIG_SND_JACK_INPUT_DEV */
|
||||
}
|
||||
EXPORT_SYMBOL(snd_jack_report);
|
||||
|
@ -31,15 +31,41 @@ static unsigned long max_alloc_per_card = 32UL * 1024UL * 1024UL;
|
||||
module_param(max_alloc_per_card, ulong, 0644);
|
||||
MODULE_PARM_DESC(max_alloc_per_card, "Max total allocation bytes per card.");
|
||||
|
||||
static void __update_allocated_size(struct snd_card *card, ssize_t bytes)
|
||||
{
|
||||
card->total_pcm_alloc_bytes += bytes;
|
||||
}
|
||||
|
||||
static void update_allocated_size(struct snd_card *card, ssize_t bytes)
|
||||
{
|
||||
mutex_lock(&card->memory_mutex);
|
||||
__update_allocated_size(card, bytes);
|
||||
mutex_unlock(&card->memory_mutex);
|
||||
}
|
||||
|
||||
static void decrease_allocated_size(struct snd_card *card, size_t bytes)
|
||||
{
|
||||
mutex_lock(&card->memory_mutex);
|
||||
WARN_ON(card->total_pcm_alloc_bytes < bytes);
|
||||
__update_allocated_size(card, -(ssize_t)bytes);
|
||||
mutex_unlock(&card->memory_mutex);
|
||||
}
|
||||
|
||||
static int do_alloc_pages(struct snd_card *card, int type, struct device *dev,
|
||||
int str, size_t size, struct snd_dma_buffer *dmab)
|
||||
{
|
||||
enum dma_data_direction dir;
|
||||
int err;
|
||||
|
||||
/* check and reserve the requested size */
|
||||
mutex_lock(&card->memory_mutex);
|
||||
if (max_alloc_per_card &&
|
||||
card->total_pcm_alloc_bytes + size > max_alloc_per_card)
|
||||
card->total_pcm_alloc_bytes + size > max_alloc_per_card) {
|
||||
mutex_unlock(&card->memory_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
__update_allocated_size(card, size);
|
||||
mutex_unlock(&card->memory_mutex);
|
||||
|
||||
if (str == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
dir = DMA_TO_DEVICE;
|
||||
@ -47,9 +73,14 @@ static int do_alloc_pages(struct snd_card *card, int type, struct device *dev,
|
||||
dir = DMA_FROM_DEVICE;
|
||||
err = snd_dma_alloc_dir_pages(type, dev, dir, size, dmab);
|
||||
if (!err) {
|
||||
mutex_lock(&card->memory_mutex);
|
||||
card->total_pcm_alloc_bytes += dmab->bytes;
|
||||
mutex_unlock(&card->memory_mutex);
|
||||
/* the actual allocation size might be bigger than requested,
|
||||
* and we need to correct the account
|
||||
*/
|
||||
if (dmab->bytes != size)
|
||||
update_allocated_size(card, dmab->bytes - size);
|
||||
} else {
|
||||
/* take back on allocation failure */
|
||||
decrease_allocated_size(card, size);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@ -58,10 +89,7 @@ static void do_free_pages(struct snd_card *card, struct snd_dma_buffer *dmab)
|
||||
{
|
||||
if (!dmab->area)
|
||||
return;
|
||||
mutex_lock(&card->memory_mutex);
|
||||
WARN_ON(card->total_pcm_alloc_bytes < dmab->bytes);
|
||||
card->total_pcm_alloc_bytes -= dmab->bytes;
|
||||
mutex_unlock(&card->memory_mutex);
|
||||
decrease_allocated_size(card, dmab->bytes);
|
||||
snd_dma_free_pages(dmab);
|
||||
dmab->area = NULL;
|
||||
}
|
||||
|
@ -714,7 +714,7 @@ static int system_2p_ev_to_ump_midi1(const struct snd_seq_event *event,
|
||||
{
|
||||
data->system.status = status;
|
||||
data->system.parm1 = (event->data.control.value >> 7) & 0x7f;
|
||||
data->system.parm1 = event->data.control.value & 0x7f;
|
||||
data->system.parm2 = event->data.control.value & 0x7f;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ static int cvt_ump_system_to_legacy(u32 data, unsigned char *buf)
|
||||
case UMP_SYSTEM_STATUS_MIDI_TIME_CODE:
|
||||
case UMP_SYSTEM_STATUS_SONG_SELECT:
|
||||
buf[1] = (data >> 8) & 0x7f;
|
||||
return 1;
|
||||
return 2;
|
||||
case UMP_SYSTEM_STATUS_SONG_POSITION:
|
||||
buf[1] = (data >> 8) & 0x7f;
|
||||
buf[2] = data & 0x7f;
|
||||
|
@ -16,7 +16,7 @@ MODULE_LICENSE("GPL");
|
||||
static void name_card(struct snd_ff *ff)
|
||||
{
|
||||
struct fw_device *fw_dev = fw_parent_device(ff->unit);
|
||||
const char *const names[] = {
|
||||
static const char *const names[] = {
|
||||
[SND_FF_UNIT_VERSION_FF800] = "Fireface800",
|
||||
[SND_FF_UNIT_VERSION_FF400] = "Fireface400",
|
||||
[SND_FF_UNIT_VERSION_UFX] = "FirefaceUFX",
|
||||
|
@ -44,7 +44,7 @@ struct compat_info {
|
||||
|
||||
static bool detect_loud_models(struct fw_unit *unit)
|
||||
{
|
||||
const char *const models[] = {
|
||||
static const char *const models[] = {
|
||||
"Onyxi",
|
||||
"Onyx-i",
|
||||
"Onyx 1640i",
|
||||
|
@ -596,10 +596,9 @@ EXPORT_SYMBOL_GPL(snd_hdac_regmap_update_raw_once);
|
||||
*/
|
||||
void snd_hdac_regmap_sync(struct hdac_device *codec)
|
||||
{
|
||||
if (codec->regmap) {
|
||||
mutex_lock(&codec->regmap_lock);
|
||||
mutex_lock(&codec->regmap_lock);
|
||||
if (codec->regmap)
|
||||
regcache_sync(codec->regmap);
|
||||
mutex_unlock(&codec->regmap_lock);
|
||||
}
|
||||
mutex_unlock(&codec->regmap_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_regmap_sync);
|
||||
|
@ -5883,7 +5883,7 @@ static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
|
||||
struct alc_spec *spec = codec->spec;
|
||||
spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
|
||||
alc255_set_default_jack_type(codec);
|
||||
}
|
||||
}
|
||||
else
|
||||
alc_fixup_headset_mode(codec, fix, action);
|
||||
}
|
||||
@ -7068,6 +7068,9 @@ enum {
|
||||
ALC285_FIXUP_SPEAKER2_TO_DAC1,
|
||||
ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
|
||||
ALC285_FIXUP_ASUS_HEADSET_MIC,
|
||||
ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
|
||||
ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
|
||||
ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
|
||||
ALC280_FIXUP_HP_HEADSET_MIC,
|
||||
ALC221_FIXUP_HP_FRONT_MIC,
|
||||
ALC292_FIXUP_TPT460,
|
||||
@ -8058,6 +8061,31 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
|
||||
},
|
||||
[ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x14, 0x90170120 },
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
|
||||
},
|
||||
[ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_speaker2_to_dac1,
|
||||
.chained = true,
|
||||
.chain_id = ALC287_FIXUP_CS35L41_I2C_2
|
||||
},
|
||||
[ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x03a11050 },
|
||||
{ 0x1b, 0x03a11c30 },
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
|
||||
},
|
||||
[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
@ -9573,10 +9601,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||
SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650P", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
|
||||
SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
|
||||
SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
|
||||
@ -9602,7 +9633,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
|
||||
@ -9731,6 +9763,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
@ -11286,6 +11319,7 @@ enum {
|
||||
ALC897_FIXUP_HP_HSMIC_VERB,
|
||||
ALC897_FIXUP_LENOVO_HEADSET_MODE,
|
||||
ALC897_FIXUP_HEADSET_MIC_PIN2,
|
||||
ALC897_FIXUP_UNIS_H3C_X500S,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc662_fixups[] = {
|
||||
@ -11725,6 +11759,13 @@ static const struct hda_fixup alc662_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
|
||||
},
|
||||
[ALC897_FIXUP_UNIS_H3C_X500S] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
{ 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
|
||||
{}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc662_fixup_tbl[] = {
|
||||
@ -11886,6 +11927,7 @@ static const struct hda_model_fixup alc662_fixup_models[] = {
|
||||
{.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
|
||||
{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
|
||||
{.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
|
||||
{.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
|
||||
{}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user