sound fixes for 5.0-rc6
A collection of a few small fixes. The most significant one is the fix for the possible race at loading HD-audio drivers. This has been present for long time and surfaced only in a rare occasion, but finally spotted out. The rest are usual device-specific fixes for HD-audio and USB-audio. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAlxb2goOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/X6Q//S6CGJ1UEL545R6kExhIkQDgpB6a0mu6nagpt i72cKvrqdns6sdQWaRa4NE4p9OG6Epuk/6GzWSJQ0coGe65VvtJI3MSYlcla4C0X 4oPQs9ApTVmxFhb4dYxjc9j4xWP5AVQZnh/f8KuRxH7Wa9DP4stCBp9Ueo3PBshg 9T12lQ2bYmjXvqjjJE6CbRObe5CuqVC5y9OtD6SEkbVdQuVSmLOfJx8W+UZdBk1/ A6BQat+3YGlc2zgIc/ZZzlUIQoOo2PnjslCRZYPS6bxBJ4jcGqSqVnMoqZ50IqDt udmTdL/9oJPNMt5ZGXabaTMx2RaTzenC69mm+FfpjJDrlxfwn3aoyg+Sgf2Dqj9x 4tt2lPIkv49CuXsZIoySx07KyH5P9Y33zLOgikf76Ju6IpXfU4rQ+HpjliyQ8jeG F9z1L5Dks+8Xmk8QR0qbsN74fMs9vbHwp/QAQEVywWReNnHvtdrY9OEbwtaM3HBA lYNKLFcpdtjek4Ap7i5xZ5JOOY5IP1HaVpNyB1yoRIVxXGjDS4accAzaCmnp/61S 5fofnwIyFdsAP30Iy0XJOyOVA+Eni5sUpljBKEFZmrtgbG0Rhy+YncAda44e6L/b IsVWLLWfNwMznFKa/EADP0s0QNhp0HVZU6t4pVbSCMeUq/U8CEz0Z313hOITH0tS AaTlfR0= =aD7u -----END PGP SIGNATURE----- Merge tag 'sound-5.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of a few small fixes. The most significant one is the fix for the possible race at loading HD-audio drivers. This has been present for long time and surfaced only in a rare occasion, but finally spotted out" * tag 'sound-5.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/ca0132 - Fix build error without CONFIG_PCI ALSA: compress: Fix stop handling on compressed capture streams ALSA: usb-audio: Add support for new T+A USB DAC ALSA: hda - Serialize codec registrations ALSA: hda/realtek - Use a common helper for hp pin reference ALSA: hda/realtek - Fix lose hp_pins for disable auto mute ALSA: hda/realtek - Headset microphone support for System76 darp5
This commit is contained in:
Коммит
6f64e3a4de
|
@ -173,7 +173,11 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)
|
|||
if (snd_BUG_ON(!stream))
|
||||
return;
|
||||
|
||||
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
|
||||
if (stream->direction == SND_COMPRESS_PLAYBACK)
|
||||
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
|
||||
else
|
||||
stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
|
||||
|
||||
wake_up(&stream->runtime->sleep);
|
||||
}
|
||||
|
||||
|
|
|
@ -68,6 +68,7 @@ struct hda_bus {
|
|||
unsigned int response_reset:1; /* controller was reset */
|
||||
unsigned int in_reset:1; /* during reset operation */
|
||||
unsigned int no_response_fallback:1; /* don't fallback at RIRB error */
|
||||
unsigned int bus_probing :1; /* during probing process */
|
||||
|
||||
int primary_dig_out_type; /* primary digital out PCM type */
|
||||
unsigned int mixer_assigned; /* codec addr for mixer name */
|
||||
|
|
|
@ -115,7 +115,8 @@ static int hda_codec_driver_probe(struct device *dev)
|
|||
err = snd_hda_codec_build_controls(codec);
|
||||
if (err < 0)
|
||||
goto error_module;
|
||||
if (codec->card->registered) {
|
||||
/* only register after the bus probe finished; otherwise it's racy */
|
||||
if (!codec->bus->bus_probing && codec->card->registered) {
|
||||
err = snd_card_register(codec->card);
|
||||
if (err < 0)
|
||||
goto error_module;
|
||||
|
|
|
@ -2185,6 +2185,7 @@ static int azx_probe_continue(struct azx *chip)
|
|||
int dev = chip->dev_index;
|
||||
int err;
|
||||
|
||||
to_hda_bus(bus)->bus_probing = 1;
|
||||
hda->probe_continued = 1;
|
||||
|
||||
/* bind with i915 if needed */
|
||||
|
@ -2269,6 +2270,7 @@ out_free:
|
|||
if (err < 0)
|
||||
hda->init_failed = 1;
|
||||
complete_all(&hda->probe_wait);
|
||||
to_hda_bus(bus)->bus_probing = 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -8451,8 +8451,10 @@ static void ca0132_free(struct hda_codec *codec)
|
|||
ca0132_exit_chip(codec);
|
||||
|
||||
snd_hda_power_down(codec);
|
||||
if (IS_ENABLED(CONFIG_PCI) && spec->mem_base)
|
||||
#ifdef CONFIG_PCI
|
||||
if (spec->mem_base)
|
||||
pci_iounmap(codec->bus->pci, spec->mem_base);
|
||||
#endif
|
||||
kfree(spec->spec_init_verbs);
|
||||
kfree(codec->spec);
|
||||
}
|
||||
|
|
|
@ -515,6 +515,15 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)
|
|||
}
|
||||
}
|
||||
|
||||
/* get a primary headphone pin if available */
|
||||
static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
|
||||
{
|
||||
if (spec->gen.autocfg.hp_pins[0])
|
||||
return spec->gen.autocfg.hp_pins[0];
|
||||
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
|
||||
return spec->gen.autocfg.line_out_pins[0];
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Realtek SSID verification
|
||||
|
@ -725,9 +734,7 @@ do_sku:
|
|||
* 15 : 1 --> enable the function "Mute internal speaker
|
||||
* when the external headphone out jack is plugged"
|
||||
*/
|
||||
if (!spec->gen.autocfg.hp_pins[0] &&
|
||||
!(spec->gen.autocfg.line_out_pins[0] &&
|
||||
spec->gen.autocfg.line_out_type == AUTO_PIN_HP_OUT)) {
|
||||
if (!alc_get_hp_pin(spec)) {
|
||||
hda_nid_t nid;
|
||||
tmp = (ass >> 11) & 0x3; /* HP to chassis */
|
||||
nid = ports[tmp];
|
||||
|
@ -2959,7 +2966,7 @@ static void alc282_restore_default_value(struct hda_codec *codec)
|
|||
static void alc282_init(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
int coef78;
|
||||
|
||||
|
@ -2996,7 +3003,7 @@ static void alc282_init(struct hda_codec *codec)
|
|||
static void alc282_shutup(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
int coef78;
|
||||
|
||||
|
@ -3074,14 +3081,9 @@ static void alc283_restore_default_value(struct hda_codec *codec)
|
|||
static void alc283_init(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
|
||||
if (!spec->gen.autocfg.hp_outs) {
|
||||
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
|
||||
hp_pin = spec->gen.autocfg.line_out_pins[0];
|
||||
}
|
||||
|
||||
alc283_restore_default_value(codec);
|
||||
|
||||
if (!hp_pin)
|
||||
|
@ -3115,14 +3117,9 @@ static void alc283_init(struct hda_codec *codec)
|
|||
static void alc283_shutup(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
|
||||
if (!spec->gen.autocfg.hp_outs) {
|
||||
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
|
||||
hp_pin = spec->gen.autocfg.line_out_pins[0];
|
||||
}
|
||||
|
||||
if (!hp_pin) {
|
||||
alc269_shutup(codec);
|
||||
return;
|
||||
|
@ -3156,7 +3153,7 @@ static void alc283_shutup(struct hda_codec *codec)
|
|||
static void alc256_init(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
|
||||
if (!hp_pin)
|
||||
|
@ -3192,7 +3189,7 @@ static void alc256_init(struct hda_codec *codec)
|
|||
static void alc256_shutup(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
|
||||
if (!hp_pin) {
|
||||
|
@ -3228,7 +3225,7 @@ static void alc256_shutup(struct hda_codec *codec)
|
|||
static void alc225_init(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp1_pin_sense, hp2_pin_sense;
|
||||
|
||||
if (!hp_pin)
|
||||
|
@ -3271,7 +3268,7 @@ static void alc225_init(struct hda_codec *codec)
|
|||
static void alc225_shutup(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp1_pin_sense, hp2_pin_sense;
|
||||
|
||||
if (!hp_pin) {
|
||||
|
@ -3315,7 +3312,7 @@ static void alc225_shutup(struct hda_codec *codec)
|
|||
static void alc_default_init(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
|
||||
if (!hp_pin)
|
||||
|
@ -3344,7 +3341,7 @@ static void alc_default_init(struct hda_codec *codec)
|
|||
static void alc_default_shutup(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
bool hp_pin_sense;
|
||||
|
||||
if (!hp_pin) {
|
||||
|
@ -3376,7 +3373,7 @@ static void alc_default_shutup(struct hda_codec *codec)
|
|||
static void alc294_hp_init(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
int i, val;
|
||||
|
||||
if (!hp_pin)
|
||||
|
@ -4780,7 +4777,7 @@ static void alc_update_headset_mode(struct hda_codec *codec)
|
|||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
hda_nid_t hp_pin = alc_get_hp_pin(spec);
|
||||
|
||||
int new_headset_mode;
|
||||
|
||||
|
@ -5059,7 +5056,7 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,
|
|||
static void alc_shutup_dell_xps13(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
int hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
int hp_pin = alc_get_hp_pin(spec);
|
||||
|
||||
/* Prevent pop noises when headphones are plugged in */
|
||||
snd_hda_codec_write(codec, hp_pin, 0,
|
||||
|
@ -5152,7 +5149,7 @@ static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
|
|||
|
||||
if (action == HDA_FIXUP_ACT_PROBE) {
|
||||
int mic_pin = find_ext_mic_pin(codec);
|
||||
int hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
int hp_pin = alc_get_hp_pin(spec);
|
||||
|
||||
if (snd_BUG_ON(!mic_pin || !hp_pin))
|
||||
return;
|
||||
|
@ -5634,6 +5631,7 @@ enum {
|
|||
ALC294_FIXUP_ASUS_HEADSET_MIC,
|
||||
ALC294_FIXUP_ASUS_SPK,
|
||||
ALC225_FIXUP_HEADSET_JACK,
|
||||
ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
|
@ -6580,6 +6578,15 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_headset_jack,
|
||||
},
|
||||
[ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
|
@ -6758,6 +6765,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
|
||||
|
|
|
@ -1567,6 +1567,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
|||
case 0x20b1: /* XMOS based devices */
|
||||
case 0x152a: /* Thesycon devices */
|
||||
case 0x25ce: /* Mytek devices */
|
||||
case 0x2ab6: /* T+A devices */
|
||||
if (fp->dsd_raw)
|
||||
return SNDRV_PCM_FMTBIT_DSD_U32_BE;
|
||||
break;
|
||||
|
|
Загрузка…
Ссылка в новой задаче