Commit 35a39f98 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda/realtek - Use a common helper for hp pin reference

Replace the open-codes in many places with a new common helper for
performing the same thing: referring to the primary headphone pin.

This eventually fixes the potentially missing headphone pin on some
weird devices, too.

Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d561aa0a
...@@ -515,6 +515,15 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type) ...@@ -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 * Realtek SSID verification
...@@ -725,9 +734,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports) ...@@ -725,9 +734,7 @@ static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
* 15 : 1 --> enable the function "Mute internal speaker * 15 : 1 --> enable the function "Mute internal speaker
* when the external headphone out jack is plugged" * when the external headphone out jack is plugged"
*/ */
if (!spec->gen.autocfg.hp_pins[0] && if (!alc_get_hp_pin(spec)) {
!(spec->gen.autocfg.line_out_pins[0] &&
spec->gen.autocfg.line_out_type == AUTO_PIN_HP_OUT)) {
hda_nid_t nid; hda_nid_t nid;
tmp = (ass >> 11) & 0x3; /* HP to chassis */ tmp = (ass >> 11) & 0x3; /* HP to chassis */
nid = ports[tmp]; nid = ports[tmp];
...@@ -2959,15 +2966,10 @@ static void alc282_restore_default_value(struct hda_codec *codec) ...@@ -2959,15 +2966,10 @@ static void alc282_restore_default_value(struct hda_codec *codec)
static void alc282_init(struct hda_codec *codec) static void alc282_init(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp_pin_sense;
int coef78; int coef78;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
alc282_restore_default_value(codec); alc282_restore_default_value(codec);
if (!hp_pin) if (!hp_pin)
...@@ -3001,15 +3003,10 @@ static void alc282_init(struct hda_codec *codec) ...@@ -3001,15 +3003,10 @@ static void alc282_init(struct hda_codec *codec)
static void alc282_shutup(struct hda_codec *codec) static void alc282_shutup(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp_pin_sense;
int coef78; int coef78;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) { if (!hp_pin) {
alc269_shutup(codec); alc269_shutup(codec);
return; return;
...@@ -3084,14 +3081,9 @@ static void alc283_restore_default_value(struct hda_codec *codec) ...@@ -3084,14 +3081,9 @@ static void alc283_restore_default_value(struct hda_codec *codec)
static void alc283_init(struct hda_codec *codec) static void alc283_init(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; 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); alc283_restore_default_value(codec);
if (!hp_pin) if (!hp_pin)
...@@ -3125,14 +3117,9 @@ static void alc283_init(struct hda_codec *codec) ...@@ -3125,14 +3117,9 @@ static void alc283_init(struct hda_codec *codec)
static void alc283_shutup(struct hda_codec *codec) static void alc283_shutup(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; 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) { if (!hp_pin) {
alc269_shutup(codec); alc269_shutup(codec);
return; return;
...@@ -3166,14 +3153,9 @@ static void alc283_shutup(struct hda_codec *codec) ...@@ -3166,14 +3153,9 @@ static void alc283_shutup(struct hda_codec *codec)
static void alc256_init(struct hda_codec *codec) static void alc256_init(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp_pin_sense;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) if (!hp_pin)
return; return;
...@@ -3207,14 +3189,9 @@ static void alc256_init(struct hda_codec *codec) ...@@ -3207,14 +3189,9 @@ static void alc256_init(struct hda_codec *codec)
static void alc256_shutup(struct hda_codec *codec) static void alc256_shutup(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp_pin_sense;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) { if (!hp_pin) {
alc269_shutup(codec); alc269_shutup(codec);
return; return;
...@@ -3248,14 +3225,9 @@ static void alc256_shutup(struct hda_codec *codec) ...@@ -3248,14 +3225,9 @@ static void alc256_shutup(struct hda_codec *codec)
static void alc225_init(struct hda_codec *codec) static void alc225_init(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp1_pin_sense, hp2_pin_sense;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) if (!hp_pin)
return; return;
...@@ -3296,14 +3268,9 @@ static void alc225_init(struct hda_codec *codec) ...@@ -3296,14 +3268,9 @@ static void alc225_init(struct hda_codec *codec)
static void alc225_shutup(struct hda_codec *codec) static void alc225_shutup(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp1_pin_sense, hp2_pin_sense;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) { if (!hp_pin) {
alc269_shutup(codec); alc269_shutup(codec);
return; return;
...@@ -3345,14 +3312,9 @@ static void alc225_shutup(struct hda_codec *codec) ...@@ -3345,14 +3312,9 @@ static void alc225_shutup(struct hda_codec *codec)
static void alc_default_init(struct hda_codec *codec) static void alc_default_init(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp_pin_sense;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) if (!hp_pin)
return; return;
...@@ -3379,14 +3341,9 @@ static void alc_default_init(struct hda_codec *codec) ...@@ -3379,14 +3341,9 @@ static void alc_default_init(struct hda_codec *codec)
static void alc_default_shutup(struct hda_codec *codec) static void alc_default_shutup(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; bool hp_pin_sense;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) { if (!hp_pin) {
alc269_shutup(codec); alc269_shutup(codec);
return; return;
...@@ -3416,14 +3373,9 @@ static void alc_default_shutup(struct hda_codec *codec) ...@@ -3416,14 +3373,9 @@ static void alc_default_shutup(struct hda_codec *codec)
static void alc294_hp_init(struct hda_codec *codec) static void alc294_hp_init(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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; int i, val;
if (!spec->gen.autocfg.hp_outs && spec->gen.suppress_auto_mute) {
if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
hp_pin = spec->gen.autocfg.line_out_pins[0];
}
if (!hp_pin) if (!hp_pin)
return; return;
...@@ -4825,7 +4777,7 @@ static void alc_update_headset_mode(struct hda_codec *codec) ...@@ -4825,7 +4777,7 @@ static void alc_update_headset_mode(struct hda_codec *codec)
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]]; 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; int new_headset_mode;
...@@ -5104,7 +5056,7 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec, ...@@ -5104,7 +5056,7 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,
static void alc_shutup_dell_xps13(struct hda_codec *codec) static void alc_shutup_dell_xps13(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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 */ /* Prevent pop noises when headphones are plugged in */
snd_hda_codec_write(codec, hp_pin, 0, snd_hda_codec_write(codec, hp_pin, 0,
...@@ -5197,7 +5149,7 @@ static void alc271_hp_gate_mic_jack(struct hda_codec *codec, ...@@ -5197,7 +5149,7 @@ static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
if (action == HDA_FIXUP_ACT_PROBE) { if (action == HDA_FIXUP_ACT_PROBE) {
int mic_pin = find_ext_mic_pin(codec); 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)) if (snd_BUG_ON(!mic_pin || !hp_pin))
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment