Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Fix silent outputs from docking-station jacks of Dell laptops ALSA: HDA: Use model=auto for Thinkpad T510 ALSA: hda - Fix buffer-alignment regression with Nvidia HDMI ALSA: hda - Fix a unused variable warning snd-hda-intel: better Alienware M17x R3 quirk ALSA: hda/realtek - Remove use_jack_tbl field ALSA: hda/realtek - Avoid conflict of unsol-events with static quirks ALSA: hda/realtek - Avoid multi-ios conflicting with multi-speakers
This commit is contained in:
commit
3496d9d6e6
6 changed files with 63 additions and 34 deletions
|
@ -762,16 +762,22 @@ static void alc880_uniwill_unsol_event(struct hda_codec *codec,
|
|||
/* Looks like the unsol event is incompatible with the standard
|
||||
* definition. 4bit tag is placed at 28 bit!
|
||||
*/
|
||||
switch (res >> 28) {
|
||||
res >>= 28;
|
||||
switch (res) {
|
||||
case ALC_MIC_EVENT:
|
||||
alc88x_simple_mic_automute(codec);
|
||||
break;
|
||||
default:
|
||||
alc_sku_unsol_event(codec, res);
|
||||
alc_exec_unsol_event(codec, res);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
alc_exec_unsol_event(codec, res >> 28);
|
||||
}
|
||||
|
||||
static void alc880_uniwill_p53_setup(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
@ -800,10 +806,11 @@ static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
|
|||
/* Looks like the unsol event is incompatible with the standard
|
||||
* definition. 4bit tag is placed at 28 bit!
|
||||
*/
|
||||
if ((res >> 28) == ALC_DCVOL_EVENT)
|
||||
res >>= 28;
|
||||
if (res == ALC_DCVOL_EVENT)
|
||||
alc880_uniwill_p53_dcvol_automute(codec);
|
||||
else
|
||||
alc_sku_unsol_event(codec, res);
|
||||
alc_exec_unsol_event(codec, res);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1677,7 +1684,7 @@ static const struct alc_config_preset alc880_presets[] = {
|
|||
.channel_mode = alc880_lg_ch_modes,
|
||||
.need_dac_fix = 1,
|
||||
.input_mux = &alc880_lg_capture_source,
|
||||
.unsol_event = alc_sku_unsol_event,
|
||||
.unsol_event = alc880_unsol_event,
|
||||
.setup = alc880_lg_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
|
|
|
@ -730,6 +730,11 @@ static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
|
|||
alc889A_mb31_automute(codec);
|
||||
}
|
||||
|
||||
static void alc882_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
alc_exec_unsol_event(codec, res >> 26);
|
||||
}
|
||||
|
||||
/*
|
||||
* configuration and preset
|
||||
*/
|
||||
|
@ -775,7 +780,7 @@ static const struct alc_config_preset alc882_presets[] = {
|
|||
.channel_mode = alc885_mba21_ch_modes,
|
||||
.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
|
||||
.input_mux = &alc882_capture_source,
|
||||
.unsol_event = alc_sku_unsol_event,
|
||||
.unsol_event = alc882_unsol_event,
|
||||
.setup = alc885_mba21_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
},
|
||||
|
@ -791,7 +796,7 @@ static const struct alc_config_preset alc882_presets[] = {
|
|||
.input_mux = &alc882_capture_source,
|
||||
.dig_out_nid = ALC882_DIGOUT_NID,
|
||||
.dig_in_nid = ALC882_DIGIN_NID,
|
||||
.unsol_event = alc_sku_unsol_event,
|
||||
.unsol_event = alc882_unsol_event,
|
||||
.setup = alc885_mbp3_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
},
|
||||
|
@ -806,7 +811,7 @@ static const struct alc_config_preset alc882_presets[] = {
|
|||
.input_mux = &mb5_capture_source,
|
||||
.dig_out_nid = ALC882_DIGOUT_NID,
|
||||
.dig_in_nid = ALC882_DIGIN_NID,
|
||||
.unsol_event = alc_sku_unsol_event,
|
||||
.unsol_event = alc882_unsol_event,
|
||||
.setup = alc885_mb5_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
},
|
||||
|
@ -821,7 +826,7 @@ static const struct alc_config_preset alc882_presets[] = {
|
|||
.input_mux = &macmini3_capture_source,
|
||||
.dig_out_nid = ALC882_DIGOUT_NID,
|
||||
.dig_in_nid = ALC882_DIGIN_NID,
|
||||
.unsol_event = alc_sku_unsol_event,
|
||||
.unsol_event = alc882_unsol_event,
|
||||
.setup = alc885_macmini3_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
},
|
||||
|
@ -836,7 +841,7 @@ static const struct alc_config_preset alc882_presets[] = {
|
|||
.input_mux = &alc889A_imac91_capture_source,
|
||||
.dig_out_nid = ALC882_DIGOUT_NID,
|
||||
.dig_in_nid = ALC882_DIGIN_NID,
|
||||
.unsol_event = alc_sku_unsol_event,
|
||||
.unsol_event = alc882_unsol_event,
|
||||
.setup = alc885_imac91_setup,
|
||||
.init_hook = alc_hp_automute,
|
||||
},
|
||||
|
|
|
@ -469,6 +469,7 @@ struct azx {
|
|||
unsigned int irq_pending_warned :1;
|
||||
unsigned int probing :1; /* codec probing phase */
|
||||
unsigned int snoop:1;
|
||||
unsigned int align_buffer_size:1;
|
||||
|
||||
/* for debugging */
|
||||
unsigned int last_cmd[AZX_MAX_CODECS];
|
||||
|
@ -1690,7 +1691,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
|
|||
runtime->hw.rates = hinfo->rates;
|
||||
snd_pcm_limit_hw_rates(runtime);
|
||||
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
|
||||
if (align_buffer_size)
|
||||
if (chip->align_buffer_size)
|
||||
/* constrain buffer sizes to be multiple of 128
|
||||
bytes. This is more efficient in terms of memory
|
||||
access but isn't required by the HDA spec and
|
||||
|
@ -2773,8 +2774,9 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
|
|||
}
|
||||
|
||||
/* disable buffer size rounding to 128-byte multiples if supported */
|
||||
chip->align_buffer_size = align_buffer_size;
|
||||
if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
|
||||
align_buffer_size = 0;
|
||||
chip->align_buffer_size = 0;
|
||||
|
||||
/* allow 64bit DMA address if supported by H/W */
|
||||
if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
|
||||
|
|
|
@ -3027,7 +3027,7 @@ static const struct snd_pci_quirk cxt5066_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21c6, "Thinkpad Edge 13", CXT5066_ASUS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T510", CXT5066_AUTO),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520 & W520", CXT5066_AUTO),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT5066_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT5066_THINKPAD),
|
||||
|
|
|
@ -185,7 +185,6 @@ struct alc_spec {
|
|||
unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */
|
||||
unsigned int parse_flags; /* passed to snd_hda_parse_pin_defcfg() */
|
||||
unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */
|
||||
unsigned int use_jack_tbl:1; /* 1 for model=auto */
|
||||
|
||||
/* auto-mute control */
|
||||
int automute_mode;
|
||||
|
@ -621,17 +620,10 @@ static void alc_mic_automute(struct hda_codec *codec)
|
|||
alc_mux_select(codec, 0, spec->int_mic_idx, false);
|
||||
}
|
||||
|
||||
/* unsolicited event for HP jack sensing */
|
||||
static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
/* handle the specified unsol action (ALC_XXX_EVENT) */
|
||||
static void alc_exec_unsol_event(struct hda_codec *codec, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
if (codec->vendor_id == 0x10ec0880)
|
||||
res >>= 28;
|
||||
else
|
||||
res >>= 26;
|
||||
if (spec->use_jack_tbl)
|
||||
res = snd_hda_jack_get_action(codec, res);
|
||||
switch (res) {
|
||||
switch (action) {
|
||||
case ALC_HP_EVENT:
|
||||
alc_hp_automute(codec);
|
||||
break;
|
||||
|
@ -645,6 +637,17 @@ static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
|
|||
snd_hda_jack_report_sync(codec);
|
||||
}
|
||||
|
||||
/* unsolicited event for HP jack sensing */
|
||||
static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
if (codec->vendor_id == 0x10ec0880)
|
||||
res >>= 28;
|
||||
else
|
||||
res >>= 26;
|
||||
res = snd_hda_jack_get_action(codec, res);
|
||||
alc_exec_unsol_event(codec, res);
|
||||
}
|
||||
|
||||
/* call init functions of standard auto-mute helpers */
|
||||
static void alc_inithook(struct hda_codec *codec)
|
||||
{
|
||||
|
@ -1883,7 +1886,7 @@ static const struct snd_kcontrol_new alc_beep_mixer[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static int alc_build_controls(struct hda_codec *codec)
|
||||
static int __alc_build_controls(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
struct snd_kcontrol *kctl = NULL;
|
||||
|
@ -2029,11 +2032,16 @@ static int alc_build_controls(struct hda_codec *codec)
|
|||
|
||||
alc_free_kctls(codec); /* no longer needed */
|
||||
|
||||
err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alc_build_controls(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
int err = __alc_build_controls(codec);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
return snd_hda_jack_add_kctls(codec, &spec->autocfg);
|
||||
}
|
||||
|
||||
|
||||
|
@ -3233,7 +3241,7 @@ static int alc_auto_create_multi_out_ctls(struct hda_codec *codec,
|
|||
int i, err, noutputs;
|
||||
|
||||
noutputs = cfg->line_outs;
|
||||
if (spec->multi_ios > 0)
|
||||
if (spec->multi_ios > 0 && cfg->line_outs < 3)
|
||||
noutputs += spec->multi_ios;
|
||||
|
||||
for (i = 0; i < noutputs; i++) {
|
||||
|
@ -3904,7 +3912,6 @@ static void set_capture_mixer(struct hda_codec *codec)
|
|||
static void alc_auto_init_std(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
spec->use_jack_tbl = 1;
|
||||
alc_auto_init_multi_out(codec);
|
||||
alc_auto_init_extra_out(codec);
|
||||
alc_auto_init_analog_input(codec);
|
||||
|
@ -4168,6 +4175,8 @@ static int patch_alc880(struct hda_codec *codec)
|
|||
codec->patch_ops = alc_patch_ops;
|
||||
if (board_config == ALC_MODEL_AUTO)
|
||||
spec->init_hook = alc_auto_init_std;
|
||||
else
|
||||
codec->patch_ops.build_controls = __alc_build_controls;
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
if (!spec->loopback.amplist)
|
||||
spec->loopback.amplist = alc880_loopbacks;
|
||||
|
@ -4297,6 +4306,8 @@ static int patch_alc260(struct hda_codec *codec)
|
|||
codec->patch_ops = alc_patch_ops;
|
||||
if (board_config == ALC_MODEL_AUTO)
|
||||
spec->init_hook = alc_auto_init_std;
|
||||
else
|
||||
codec->patch_ops.build_controls = __alc_build_controls;
|
||||
spec->shutup = alc_eapd_shutup;
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
if (!spec->loopback.amplist)
|
||||
|
@ -4691,6 +4702,8 @@ static int patch_alc882(struct hda_codec *codec)
|
|||
codec->patch_ops = alc_patch_ops;
|
||||
if (board_config == ALC_MODEL_AUTO)
|
||||
spec->init_hook = alc_auto_init_std;
|
||||
else
|
||||
codec->patch_ops.build_controls = __alc_build_controls;
|
||||
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
if (!spec->loopback.amplist)
|
||||
|
|
|
@ -1608,7 +1608,7 @@ static const struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a,
|
||||
"Alienware M17x", STAC_ALIENWARE_M17X),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490,
|
||||
"Alienware M17x", STAC_ALIENWARE_M17X),
|
||||
"Alienware M17x R3", STAC_DELL_EQ),
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
|
@ -4163,13 +4163,15 @@ static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
|
||||
static int is_nid_out_jack_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < cfg->hp_outs; i++)
|
||||
if (cfg->hp_pins[i] == nid)
|
||||
return 1; /* nid is a HP-Out */
|
||||
|
||||
for (i = 0; i < cfg->line_outs; i++)
|
||||
if (cfg->line_out_pins[i] == nid)
|
||||
return 1; /* nid is a line-Out */
|
||||
return 0; /* nid is not a HP-Out */
|
||||
};
|
||||
|
||||
|
@ -4375,7 +4377,7 @@ static int stac92xx_init(struct hda_codec *codec)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (is_nid_hp_pin(cfg, nid))
|
||||
if (is_nid_out_jack_pin(cfg, nid))
|
||||
continue; /* already has an unsol event */
|
||||
|
||||
pinctl = snd_hda_codec_read(codec, nid, 0,
|
||||
|
|
Loading…
Reference in a new issue