dect
/
linux-2.6
Archived
13
0
Fork 0

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:
Linus Torvalds 2012-01-24 10:25:29 -08:00
commit 3496d9d6e6
6 changed files with 63 additions and 34 deletions

View File

@ -762,16 +762,22 @@ static void alc880_uniwill_unsol_event(struct hda_codec *codec,
/* Looks like the unsol event is incompatible with the standard /* Looks like the unsol event is incompatible with the standard
* definition. 4bit tag is placed at 28 bit! * definition. 4bit tag is placed at 28 bit!
*/ */
switch (res >> 28) { res >>= 28;
switch (res) {
case ALC_MIC_EVENT: case ALC_MIC_EVENT:
alc88x_simple_mic_automute(codec); alc88x_simple_mic_automute(codec);
break; break;
default: default:
alc_sku_unsol_event(codec, res); alc_exec_unsol_event(codec, res);
break; 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) static void alc880_uniwill_p53_setup(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; 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 /* Looks like the unsol event is incompatible with the standard
* definition. 4bit tag is placed at 28 bit! * 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); alc880_uniwill_p53_dcvol_automute(codec);
else 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, .channel_mode = alc880_lg_ch_modes,
.need_dac_fix = 1, .need_dac_fix = 1,
.input_mux = &alc880_lg_capture_source, .input_mux = &alc880_lg_capture_source,
.unsol_event = alc_sku_unsol_event, .unsol_event = alc880_unsol_event,
.setup = alc880_lg_setup, .setup = alc880_lg_setup,
.init_hook = alc_hp_automute, .init_hook = alc_hp_automute,
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE

View File

@ -730,6 +730,11 @@ static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
alc889A_mb31_automute(codec); 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 * configuration and preset
*/ */
@ -775,7 +780,7 @@ static const struct alc_config_preset alc882_presets[] = {
.channel_mode = alc885_mba21_ch_modes, .channel_mode = alc885_mba21_ch_modes,
.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes), .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
.input_mux = &alc882_capture_source, .input_mux = &alc882_capture_source,
.unsol_event = alc_sku_unsol_event, .unsol_event = alc882_unsol_event,
.setup = alc885_mba21_setup, .setup = alc885_mba21_setup,
.init_hook = alc_hp_automute, .init_hook = alc_hp_automute,
}, },
@ -791,7 +796,7 @@ static const struct alc_config_preset alc882_presets[] = {
.input_mux = &alc882_capture_source, .input_mux = &alc882_capture_source,
.dig_out_nid = ALC882_DIGOUT_NID, .dig_out_nid = ALC882_DIGOUT_NID,
.dig_in_nid = ALC882_DIGIN_NID, .dig_in_nid = ALC882_DIGIN_NID,
.unsol_event = alc_sku_unsol_event, .unsol_event = alc882_unsol_event,
.setup = alc885_mbp3_setup, .setup = alc885_mbp3_setup,
.init_hook = alc_hp_automute, .init_hook = alc_hp_automute,
}, },
@ -806,7 +811,7 @@ static const struct alc_config_preset alc882_presets[] = {
.input_mux = &mb5_capture_source, .input_mux = &mb5_capture_source,
.dig_out_nid = ALC882_DIGOUT_NID, .dig_out_nid = ALC882_DIGOUT_NID,
.dig_in_nid = ALC882_DIGIN_NID, .dig_in_nid = ALC882_DIGIN_NID,
.unsol_event = alc_sku_unsol_event, .unsol_event = alc882_unsol_event,
.setup = alc885_mb5_setup, .setup = alc885_mb5_setup,
.init_hook = alc_hp_automute, .init_hook = alc_hp_automute,
}, },
@ -821,7 +826,7 @@ static const struct alc_config_preset alc882_presets[] = {
.input_mux = &macmini3_capture_source, .input_mux = &macmini3_capture_source,
.dig_out_nid = ALC882_DIGOUT_NID, .dig_out_nid = ALC882_DIGOUT_NID,
.dig_in_nid = ALC882_DIGIN_NID, .dig_in_nid = ALC882_DIGIN_NID,
.unsol_event = alc_sku_unsol_event, .unsol_event = alc882_unsol_event,
.setup = alc885_macmini3_setup, .setup = alc885_macmini3_setup,
.init_hook = alc_hp_automute, .init_hook = alc_hp_automute,
}, },
@ -836,7 +841,7 @@ static const struct alc_config_preset alc882_presets[] = {
.input_mux = &alc889A_imac91_capture_source, .input_mux = &alc889A_imac91_capture_source,
.dig_out_nid = ALC882_DIGOUT_NID, .dig_out_nid = ALC882_DIGOUT_NID,
.dig_in_nid = ALC882_DIGIN_NID, .dig_in_nid = ALC882_DIGIN_NID,
.unsol_event = alc_sku_unsol_event, .unsol_event = alc882_unsol_event,
.setup = alc885_imac91_setup, .setup = alc885_imac91_setup,
.init_hook = alc_hp_automute, .init_hook = alc_hp_automute,
}, },

View File

@ -469,6 +469,7 @@ struct azx {
unsigned int irq_pending_warned :1; unsigned int irq_pending_warned :1;
unsigned int probing :1; /* codec probing phase */ unsigned int probing :1; /* codec probing phase */
unsigned int snoop:1; unsigned int snoop:1;
unsigned int align_buffer_size:1;
/* for debugging */ /* for debugging */
unsigned int last_cmd[AZX_MAX_CODECS]; 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; runtime->hw.rates = hinfo->rates;
snd_pcm_limit_hw_rates(runtime); snd_pcm_limit_hw_rates(runtime);
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); 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 /* constrain buffer sizes to be multiple of 128
bytes. This is more efficient in terms of memory bytes. This is more efficient in terms of memory
access but isn't required by the HDA spec and 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 */ /* disable buffer size rounding to 128-byte multiples if supported */
chip->align_buffer_size = align_buffer_size;
if (chip->driver_caps & AZX_DCAPS_BUFSIZE) 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 */ /* allow 64bit DMA address if supported by H/W */
if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))

View File

@ -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, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD),
SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", 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, 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, 0x21cf, "Lenovo T520 & W520", CXT5066_AUTO),
SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT5066_THINKPAD), SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT5066_THINKPAD),
SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT5066_THINKPAD), SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT5066_THINKPAD),

View File

@ -185,7 +185,6 @@ struct alc_spec {
unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */ 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 parse_flags; /* passed to snd_hda_parse_pin_defcfg() */
unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */ unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */
unsigned int use_jack_tbl:1; /* 1 for model=auto */
/* auto-mute control */ /* auto-mute control */
int automute_mode; 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); alc_mux_select(codec, 0, spec->int_mic_idx, false);
} }
/* unsolicited event for HP jack sensing */ /* handle the specified unsol action (ALC_XXX_EVENT) */
static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) static void alc_exec_unsol_event(struct hda_codec *codec, int action)
{ {
struct alc_spec *spec = codec->spec; switch (action) {
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) {
case ALC_HP_EVENT: case ALC_HP_EVENT:
alc_hp_automute(codec); alc_hp_automute(codec);
break; break;
@ -645,6 +637,17 @@ static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
snd_hda_jack_report_sync(codec); 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 */ /* call init functions of standard auto-mute helpers */
static void alc_inithook(struct hda_codec *codec) static void alc_inithook(struct hda_codec *codec)
{ {
@ -1883,7 +1886,7 @@ static const struct snd_kcontrol_new alc_beep_mixer[] = {
}; };
#endif #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 alc_spec *spec = codec->spec;
struct snd_kcontrol *kctl = NULL; 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 */ 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) if (err < 0)
return err; return err;
return snd_hda_jack_add_kctls(codec, &spec->autocfg);
return 0;
} }
@ -3233,7 +3241,7 @@ static int alc_auto_create_multi_out_ctls(struct hda_codec *codec,
int i, err, noutputs; int i, err, noutputs;
noutputs = cfg->line_outs; noutputs = cfg->line_outs;
if (spec->multi_ios > 0) if (spec->multi_ios > 0 && cfg->line_outs < 3)
noutputs += spec->multi_ios; noutputs += spec->multi_ios;
for (i = 0; i < noutputs; i++) { 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) static void alc_auto_init_std(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
spec->use_jack_tbl = 1;
alc_auto_init_multi_out(codec); alc_auto_init_multi_out(codec);
alc_auto_init_extra_out(codec); alc_auto_init_extra_out(codec);
alc_auto_init_analog_input(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; codec->patch_ops = alc_patch_ops;
if (board_config == ALC_MODEL_AUTO) if (board_config == ALC_MODEL_AUTO)
spec->init_hook = alc_auto_init_std; spec->init_hook = alc_auto_init_std;
else
codec->patch_ops.build_controls = __alc_build_controls;
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
if (!spec->loopback.amplist) if (!spec->loopback.amplist)
spec->loopback.amplist = alc880_loopbacks; spec->loopback.amplist = alc880_loopbacks;
@ -4297,6 +4306,8 @@ static int patch_alc260(struct hda_codec *codec)
codec->patch_ops = alc_patch_ops; codec->patch_ops = alc_patch_ops;
if (board_config == ALC_MODEL_AUTO) if (board_config == ALC_MODEL_AUTO)
spec->init_hook = alc_auto_init_std; spec->init_hook = alc_auto_init_std;
else
codec->patch_ops.build_controls = __alc_build_controls;
spec->shutup = alc_eapd_shutup; spec->shutup = alc_eapd_shutup;
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
if (!spec->loopback.amplist) if (!spec->loopback.amplist)
@ -4691,6 +4702,8 @@ static int patch_alc882(struct hda_codec *codec)
codec->patch_ops = alc_patch_ops; codec->patch_ops = alc_patch_ops;
if (board_config == ALC_MODEL_AUTO) if (board_config == ALC_MODEL_AUTO)
spec->init_hook = alc_auto_init_std; spec->init_hook = alc_auto_init_std;
else
codec->patch_ops.build_controls = __alc_build_controls;
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
if (!spec->loopback.amplist) if (!spec->loopback.amplist)

View File

@ -1608,7 +1608,7 @@ static const struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a, SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a,
"Alienware M17x", STAC_ALIENWARE_M17X), "Alienware M17x", STAC_ALIENWARE_M17X),
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490, SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490,
"Alienware M17x", STAC_ALIENWARE_M17X), "Alienware M17x R3", STAC_DELL_EQ),
{} /* terminator */ {} /* terminator */
}; };
@ -4163,13 +4163,15 @@ static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
return 1; 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; int i;
for (i = 0; i < cfg->hp_outs; i++) for (i = 0; i < cfg->hp_outs; i++)
if (cfg->hp_pins[i] == nid) if (cfg->hp_pins[i] == nid)
return 1; /* nid is a HP-Out */ 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 */ return 0; /* nid is not a HP-Out */
}; };
@ -4375,7 +4377,7 @@ static int stac92xx_init(struct hda_codec *codec)
continue; continue;
} }
if (is_nid_hp_pin(cfg, nid)) if (is_nid_out_jack_pin(cfg, nid))
continue; /* already has an unsol event */ continue; /* already has an unsol event */
pinctl = snd_hda_codec_read(codec, nid, 0, pinctl = snd_hda_codec_read(codec, nid, 0,