aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-06-22 11:03:48 -0400
committerTakashi Iwai <tiwai@suse.de>2009-06-22 11:03:48 -0400
commit11a93fd9402ce47e4dc652837b1374ecdb750aba (patch)
tree87527afb0546cb914f46498bdf76af5cab8aa717 /sound
parent366890df46c2fd9492c04fe3a8775447b7b053e4 (diff)
parent8c8145b8734028f6deb487f7d64748da4c6c39ac (diff)
Merge branch 'topic/hda' into for-linus
* topic/hda: ALSA: hda - Make jack-plug notification selectable ALSA: hda - Add digital-mic support to ALC262 auto model ALSA: hda - Fix check of input source type for realtek codecs ALSA: hda - Add quirk for Sony VAIO Z21MN ALSA: hda - Get back Input Source for ALC262 toshiba-s06 model ALSA: hda - Fix unsigned comparison in patch_sigmatel.c
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/Kconfig9
-rw-r--r--sound/pci/hda/patch_conexant.c4
-rw-r--r--sound/pci/hda/patch_realtek.c109
-rw-r--r--sound/pci/hda/patch_sigmatel.c10
4 files changed, 71 insertions, 61 deletions
diff --git a/sound/pci/hda/Kconfig b/sound/pci/hda/Kconfig
index c710150d5065..04438f1d682d 100644
--- a/sound/pci/hda/Kconfig
+++ b/sound/pci/hda/Kconfig
@@ -2,7 +2,6 @@ menuconfig SND_HDA_INTEL
2 tristate "Intel HD Audio" 2 tristate "Intel HD Audio"
3 select SND_PCM 3 select SND_PCM
4 select SND_VMASTER 4 select SND_VMASTER
5 select SND_JACK if INPUT=y || INPUT=SND
6 help 5 help
7 Say Y here to include support for Intel "High Definition 6 Say Y here to include support for Intel "High Definition
8 Audio" (Azalia) and its compatible devices. 7 Audio" (Azalia) and its compatible devices.
@@ -39,6 +38,14 @@ config SND_HDA_INPUT_BEEP
39 Say Y here to build a digital beep interface for HD-audio 38 Say Y here to build a digital beep interface for HD-audio
40 driver. This interface is used to generate digital beeps. 39 driver. This interface is used to generate digital beeps.
41 40
41config SND_HDA_INPUT_JACK
42 bool "Support jack plugging notification via input layer"
43 depends on INPUT=y || INPUT=SND_HDA_INTEL
44 select SND_JACK
45 help
46 Say Y here to enable the jack plugging notification via
47 input layer.
48
42config SND_HDA_CODEC_REALTEK 49config SND_HDA_CODEC_REALTEK
43 bool "Build Realtek HD-audio codec support" 50 bool "Build Realtek HD-audio codec support"
44 default y 51 default y
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index 4fcbe21829ab..ac868c59f9e3 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -349,7 +349,7 @@ static int conexant_mux_enum_put(struct snd_kcontrol *kcontrol,
349 &spec->cur_mux[adc_idx]); 349 &spec->cur_mux[adc_idx]);
350} 350}
351 351
352#ifdef CONFIG_SND_JACK 352#ifdef CONFIG_SND_HDA_INPUT_JACK
353static void conexant_free_jack_priv(struct snd_jack *jack) 353static void conexant_free_jack_priv(struct snd_jack *jack)
354{ 354{
355 struct conexant_jack *jacks = jack->private_data; 355 struct conexant_jack *jacks = jack->private_data;
@@ -463,7 +463,7 @@ static int conexant_init(struct hda_codec *codec)
463 463
464static void conexant_free(struct hda_codec *codec) 464static void conexant_free(struct hda_codec *codec)
465{ 465{
466#ifdef CONFIG_SND_JACK 466#ifdef CONFIG_SND_HDA_INPUT_JACK
467 struct conexant_spec *spec = codec->spec; 467 struct conexant_spec *spec = codec->spec;
468 if (spec->jacks.list) { 468 if (spec->jacks.list) {
469 struct conexant_jack *jacks = spec->jacks.list; 469 struct conexant_jack *jacks = spec->jacks.list;
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index bf4b78a74a8f..334533197425 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -250,13 +250,6 @@ enum {
250 ALC883_MODEL_LAST, 250 ALC883_MODEL_LAST,
251}; 251};
252 252
253/* styles of capture selection */
254enum {
255 CAPT_MUX = 0, /* only mux based */
256 CAPT_MIX, /* only mixer based */
257 CAPT_1MUX_MIX, /* first mux and other mixers */
258};
259
260/* for GPIO Poll */ 253/* for GPIO Poll */
261#define GPIO_MASK 0x03 254#define GPIO_MASK 0x03
262 255
@@ -306,7 +299,6 @@ struct alc_spec {
306 hda_nid_t *adc_nids; 299 hda_nid_t *adc_nids;
307 hda_nid_t *capsrc_nids; 300 hda_nid_t *capsrc_nids;
308 hda_nid_t dig_in_nid; /* digital-in NID; optional */ 301 hda_nid_t dig_in_nid; /* digital-in NID; optional */
309 int capture_style; /* capture style (CAPT_*) */
310 302
311 /* capture source */ 303 /* capture source */
312 unsigned int num_mux_defs; 304 unsigned int num_mux_defs;
@@ -420,12 +412,13 @@ static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
420 unsigned int mux_idx; 412 unsigned int mux_idx;
421 hda_nid_t nid = spec->capsrc_nids ? 413 hda_nid_t nid = spec->capsrc_nids ?
422 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx]; 414 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
415 unsigned int type;
423 416
424 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; 417 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
425 imux = &spec->input_mux[mux_idx]; 418 imux = &spec->input_mux[mux_idx];
426 419
427 if (spec->capture_style && 420 type = (get_wcaps(codec, nid) & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
428 !(spec->capture_style == CAPT_1MUX_MIX && !adc_idx)) { 421 if (type == AC_WID_AUD_MIX) {
429 /* Matrix-mixer style (e.g. ALC882) */ 422 /* Matrix-mixer style (e.g. ALC882) */
430 unsigned int *cur_val = &spec->cur_mux[adc_idx]; 423 unsigned int *cur_val = &spec->cur_mux[adc_idx];
431 unsigned int i, idx; 424 unsigned int i, idx;
@@ -7557,7 +7550,6 @@ static int patch_alc882(struct hda_codec *codec)
7557 spec->stream_digital_playback = &alc882_pcm_digital_playback; 7550 spec->stream_digital_playback = &alc882_pcm_digital_playback;
7558 spec->stream_digital_capture = &alc882_pcm_digital_capture; 7551 spec->stream_digital_capture = &alc882_pcm_digital_capture;
7559 7552
7560 spec->capture_style = CAPT_MIX; /* matrix-style capture */
7561 if (!spec->adc_nids && spec->input_mux) { 7553 if (!spec->adc_nids && spec->input_mux) {
7562 /* check whether NID 0x07 is valid */ 7554 /* check whether NID 0x07 is valid */
7563 unsigned int wcap = get_wcaps(codec, 0x07); 7555 unsigned int wcap = get_wcaps(codec, 0x07);
@@ -9781,7 +9773,6 @@ static int patch_alc883(struct hda_codec *codec)
9781 } 9773 }
9782 if (!spec->capsrc_nids) 9774 if (!spec->capsrc_nids)
9783 spec->capsrc_nids = alc883_capsrc_nids; 9775 spec->capsrc_nids = alc883_capsrc_nids;
9784 spec->capture_style = CAPT_MIX; /* matrix-style capture */
9785 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ 9776 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
9786 break; 9777 break;
9787 case 0x10ec0889: 9778 case 0x10ec0889:
@@ -9791,8 +9782,6 @@ static int patch_alc883(struct hda_codec *codec)
9791 } 9782 }
9792 if (!spec->capsrc_nids) 9783 if (!spec->capsrc_nids)
9793 spec->capsrc_nids = alc889_capsrc_nids; 9784 spec->capsrc_nids = alc889_capsrc_nids;
9794 spec->capture_style = CAPT_1MUX_MIX; /* 1mux/Nmix-style
9795 capture */
9796 break; 9785 break;
9797 default: 9786 default:
9798 if (!spec->num_adc_nids) { 9787 if (!spec->num_adc_nids) {
@@ -9801,7 +9790,6 @@ static int patch_alc883(struct hda_codec *codec)
9801 } 9790 }
9802 if (!spec->capsrc_nids) 9791 if (!spec->capsrc_nids)
9803 spec->capsrc_nids = alc883_capsrc_nids; 9792 spec->capsrc_nids = alc883_capsrc_nids;
9804 spec->capture_style = CAPT_MIX; /* matrix-style capture */
9805 break; 9793 break;
9806 } 9794 }
9807 9795
@@ -10913,9 +10901,27 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
10913 return 0; 10901 return 0;
10914} 10902}
10915 10903
10916/* identical with ALC880 */ 10904static int alc262_auto_create_analog_input_ctls(struct alc_spec *spec,
10917#define alc262_auto_create_analog_input_ctls \ 10905 const struct auto_pin_cfg *cfg)
10918 alc880_auto_create_analog_input_ctls 10906{
10907 int err;
10908
10909 err = alc880_auto_create_analog_input_ctls(spec, cfg);
10910 if (err < 0)
10911 return err;
10912 /* digital-mic input pin is excluded in alc880_auto_create..()
10913 * because it's under 0x18
10914 */
10915 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
10916 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
10917 struct hda_input_mux *imux = &spec->private_imux[0];
10918 imux->items[imux->num_items].label = "Int Mic";
10919 imux->items[imux->num_items].index = 0x09;
10920 imux->num_items++;
10921 }
10922 return 0;
10923}
10924
10919 10925
10920/* 10926/*
10921 * generic initialization of ADC, input mixers and output mixers 10927 * generic initialization of ADC, input mixers and output mixers
@@ -11332,6 +11338,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
11332 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO), 11338 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11333 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD), 11339 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11334 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */ 11340 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11341 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11335 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO", 11342 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11336 ALC262_SONY_ASSAMD), 11343 ALC262_SONY_ASSAMD),
11337 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", 11344 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
@@ -11539,6 +11546,7 @@ static struct alc_config_preset alc262_presets[] = {
11539 .capsrc_nids = alc262_dmic_capsrc_nids, 11546 .capsrc_nids = alc262_dmic_capsrc_nids,
11540 .dac_nids = alc262_dac_nids, 11547 .dac_nids = alc262_dac_nids,
11541 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */ 11548 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
11549 .num_adc_nids = 1, /* single ADC */
11542 .dig_out_nid = ALC262_DIGOUT_NID, 11550 .dig_out_nid = ALC262_DIGOUT_NID,
11543 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11551 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11544 .channel_mode = alc262_modes, 11552 .channel_mode = alc262_modes,
@@ -11640,21 +11648,36 @@ static int patch_alc262(struct hda_codec *codec)
11640 spec->stream_digital_playback = &alc262_pcm_digital_playback; 11648 spec->stream_digital_playback = &alc262_pcm_digital_playback;
11641 spec->stream_digital_capture = &alc262_pcm_digital_capture; 11649 spec->stream_digital_capture = &alc262_pcm_digital_capture;
11642 11650
11643 spec->capture_style = CAPT_MIX;
11644 if (!spec->adc_nids && spec->input_mux) { 11651 if (!spec->adc_nids && spec->input_mux) {
11645 /* check whether NID 0x07 is valid */ 11652 int i;
11646 unsigned int wcap = get_wcaps(codec, 0x07); 11653 /* check whether the digital-mic has to be supported */
11647 11654 for (i = 0; i < spec->input_mux->num_items; i++) {
11648 /* get type */ 11655 if (spec->input_mux->items[i].index >= 9)
11649 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 11656 break;
11650 if (wcap != AC_WID_AUD_IN) { 11657 }
11651 spec->adc_nids = alc262_adc_nids_alt; 11658 if (i < spec->input_mux->num_items) {
11652 spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids_alt); 11659 /* use only ADC0 */
11653 spec->capsrc_nids = alc262_capsrc_nids_alt; 11660 spec->adc_nids = alc262_dmic_adc_nids;
11661 spec->num_adc_nids = 1;
11662 spec->capsrc_nids = alc262_dmic_capsrc_nids;
11654 } else { 11663 } else {
11655 spec->adc_nids = alc262_adc_nids; 11664 /* all analog inputs */
11656 spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids); 11665 /* check whether NID 0x07 is valid */
11657 spec->capsrc_nids = alc262_capsrc_nids; 11666 unsigned int wcap = get_wcaps(codec, 0x07);
11667
11668 /* get type */
11669 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
11670 if (wcap != AC_WID_AUD_IN) {
11671 spec->adc_nids = alc262_adc_nids_alt;
11672 spec->num_adc_nids =
11673 ARRAY_SIZE(alc262_adc_nids_alt);
11674 spec->capsrc_nids = alc262_capsrc_nids_alt;
11675 } else {
11676 spec->adc_nids = alc262_adc_nids;
11677 spec->num_adc_nids =
11678 ARRAY_SIZE(alc262_adc_nids);
11679 spec->capsrc_nids = alc262_capsrc_nids;
11680 }
11658 } 11681 }
11659 } 11682 }
11660 if (!spec->cap_mixer && !spec->no_analog) 11683 if (!spec->cap_mixer && !spec->no_analog)
@@ -13244,26 +13267,8 @@ static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec,
13244 return 0; 13267 return 0;
13245} 13268}
13246 13269
13247static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec, 13270#define alc269_auto_create_analog_input_ctls \
13248 const struct auto_pin_cfg *cfg) 13271 alc262_auto_create_analog_input_ctls
13249{
13250 int err;
13251
13252 err = alc880_auto_create_analog_input_ctls(spec, cfg);
13253 if (err < 0)
13254 return err;
13255 /* digital-mic input pin is excluded in alc880_auto_create..()
13256 * because it's under 0x18
13257 */
13258 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
13259 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
13260 struct hda_input_mux *imux = &spec->private_imux[0];
13261 imux->items[imux->num_items].label = "Int Mic";
13262 imux->items[imux->num_items].index = 0x05;
13263 imux->num_items++;
13264 }
13265 return 0;
13266}
13267 13272
13268#ifdef CONFIG_SND_HDA_POWER_SAVE 13273#ifdef CONFIG_SND_HDA_POWER_SAVE
13269#define alc269_loopbacks alc880_loopbacks 13274#define alc269_loopbacks alc880_loopbacks
@@ -15554,7 +15559,6 @@ static int patch_alc861vd(struct hda_codec *codec)
15554 spec->adc_nids = alc861vd_adc_nids; 15559 spec->adc_nids = alc861vd_adc_nids;
15555 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); 15560 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
15556 spec->capsrc_nids = alc861vd_capsrc_nids; 15561 spec->capsrc_nids = alc861vd_capsrc_nids;
15557 spec->capture_style = CAPT_MIX;
15558 15562
15559 set_capture_mixer(spec); 15563 set_capture_mixer(spec);
15560 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 15564 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
@@ -17474,7 +17478,6 @@ static int patch_alc662(struct hda_codec *codec)
17474 spec->adc_nids = alc662_adc_nids; 17478 spec->adc_nids = alc662_adc_nids;
17475 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); 17479 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
17476 spec->capsrc_nids = alc662_capsrc_nids; 17480 spec->capsrc_nids = alc662_capsrc_nids;
17477 spec->capture_style = CAPT_MIX;
17478 17481
17479 if (!spec->cap_mixer) 17482 if (!spec->cap_mixer)
17480 set_capture_mixer(spec); 17483 set_capture_mixer(spec);
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 93e47c96a38b..14f3c3e0f62d 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -639,7 +639,7 @@ static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
639static unsigned int stac92xx_vref_set(struct hda_codec *codec, 639static unsigned int stac92xx_vref_set(struct hda_codec *codec,
640 hda_nid_t nid, unsigned int new_vref) 640 hda_nid_t nid, unsigned int new_vref)
641{ 641{
642 unsigned int error; 642 int error;
643 unsigned int pincfg; 643 unsigned int pincfg;
644 pincfg = snd_hda_codec_read(codec, nid, 0, 644 pincfg = snd_hda_codec_read(codec, nid, 0,
645 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 645 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
@@ -2703,7 +2703,7 @@ static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol,
2703{ 2703{
2704 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2704 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2705 unsigned int new_vref = 0; 2705 unsigned int new_vref = 0;
2706 unsigned int error; 2706 int error;
2707 hda_nid_t nid = kcontrol->private_value; 2707 hda_nid_t nid = kcontrol->private_value;
2708 2708
2709 if (ucontrol->value.enumerated.item[0] == 0) 2709 if (ucontrol->value.enumerated.item[0] == 0)
@@ -4035,7 +4035,7 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
4035 AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ 4035 AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
4036} 4036}
4037 4037
4038#ifdef CONFIG_SND_JACK 4038#ifdef CONFIG_SND_HDA_INPUT_JACK
4039static void stac92xx_free_jack_priv(struct snd_jack *jack) 4039static void stac92xx_free_jack_priv(struct snd_jack *jack)
4040{ 4040{
4041 struct sigmatel_jack *jacks = jack->private_data; 4041 struct sigmatel_jack *jacks = jack->private_data;
@@ -4047,7 +4047,7 @@ static void stac92xx_free_jack_priv(struct snd_jack *jack)
4047static int stac92xx_add_jack(struct hda_codec *codec, 4047static int stac92xx_add_jack(struct hda_codec *codec,
4048 hda_nid_t nid, int type) 4048 hda_nid_t nid, int type)
4049{ 4049{
4050#ifdef CONFIG_SND_JACK 4050#ifdef CONFIG_SND_HDA_INPUT_JACK
4051 struct sigmatel_spec *spec = codec->spec; 4051 struct sigmatel_spec *spec = codec->spec;
4052 struct sigmatel_jack *jack; 4052 struct sigmatel_jack *jack;
4053 int def_conf = snd_hda_codec_get_pincfg(codec, nid); 4053 int def_conf = snd_hda_codec_get_pincfg(codec, nid);
@@ -4336,7 +4336,7 @@ static int stac92xx_init(struct hda_codec *codec)
4336 4336
4337static void stac92xx_free_jacks(struct hda_codec *codec) 4337static void stac92xx_free_jacks(struct hda_codec *codec)
4338{ 4338{
4339#ifdef CONFIG_SND_JACK 4339#ifdef CONFIG_SND_HDA_INPUT_JACK
4340 /* free jack instances manually when clearing/reconfiguring */ 4340 /* free jack instances manually when clearing/reconfiguring */
4341 struct sigmatel_spec *spec = codec->spec; 4341 struct sigmatel_spec *spec = codec->spec;
4342 if (!codec->bus->shutdown && spec->jacks.list) { 4342 if (!codec->bus->shutdown && spec->jacks.list) {