diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/au88x0/au88x0_pcm.c | 24 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.c | 8 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.h | 1 | ||||
-rw-r--r-- | sound/pci/hda/hda_eld.c | 22 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 27 | ||||
-rw-r--r-- | sound/pci/hda/patch_analog.c | 7 | ||||
-rw-r--r-- | sound/pci/hda/patch_ca0110.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 13 | ||||
-rw-r--r-- | sound/pci/hda/patch_hdmi.c | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 53 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 16 | ||||
-rw-r--r-- | sound/pci/intel8x0.c | 6 |
12 files changed, 144 insertions, 36 deletions
diff --git a/sound/pci/au88x0/au88x0_pcm.c b/sound/pci/au88x0/au88x0_pcm.c index b9d2f202cf9b..5439d662d104 100644 --- a/sound/pci/au88x0/au88x0_pcm.c +++ b/sound/pci/au88x0/au88x0_pcm.c | |||
@@ -42,11 +42,7 @@ static struct snd_pcm_hardware snd_vortex_playback_hw_adb = { | |||
42 | .rate_min = 5000, | 42 | .rate_min = 5000, |
43 | .rate_max = 48000, | 43 | .rate_max = 48000, |
44 | .channels_min = 1, | 44 | .channels_min = 1, |
45 | #ifdef CHIP_AU8830 | ||
46 | .channels_max = 4, | ||
47 | #else | ||
48 | .channels_max = 2, | 45 | .channels_max = 2, |
49 | #endif | ||
50 | .buffer_bytes_max = 0x10000, | 46 | .buffer_bytes_max = 0x10000, |
51 | .period_bytes_min = 0x1, | 47 | .period_bytes_min = 0x1, |
52 | .period_bytes_max = 0x1000, | 48 | .period_bytes_max = 0x1000, |
@@ -115,6 +111,17 @@ static struct snd_pcm_hardware snd_vortex_playback_hw_wt = { | |||
115 | .periods_max = 64, | 111 | .periods_max = 64, |
116 | }; | 112 | }; |
117 | #endif | 113 | #endif |
114 | #ifdef CHIP_AU8830 | ||
115 | static unsigned int au8830_channels[3] = { | ||
116 | 1, 2, 4, | ||
117 | }; | ||
118 | |||
119 | static struct snd_pcm_hw_constraint_list hw_constraints_au8830_channels = { | ||
120 | .count = ARRAY_SIZE(au8830_channels), | ||
121 | .list = au8830_channels, | ||
122 | .mask = 0, | ||
123 | }; | ||
124 | #endif | ||
118 | /* open callback */ | 125 | /* open callback */ |
119 | static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) | 126 | static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) |
120 | { | 127 | { |
@@ -156,6 +163,15 @@ static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) | |||
156 | if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB | 163 | if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB |
157 | || VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_I2S) | 164 | || VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_I2S) |
158 | runtime->hw = snd_vortex_playback_hw_adb; | 165 | runtime->hw = snd_vortex_playback_hw_adb; |
166 | #ifdef CHIP_AU8830 | ||
167 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && | ||
168 | VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB) { | ||
169 | runtime->hw.channels_max = 4; | ||
170 | snd_pcm_hw_constraint_list(runtime, 0, | ||
171 | SNDRV_PCM_HW_PARAM_CHANNELS, | ||
172 | &hw_constraints_au8830_channels); | ||
173 | } | ||
174 | #endif | ||
159 | substream->runtime->private_data = NULL; | 175 | substream->runtime->private_data = NULL; |
160 | } | 176 | } |
161 | #ifndef CHIP_AU8810 | 177 | #ifndef CHIP_AU8810 |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 14829210ef0b..b959c9f1e6fb 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1216,6 +1216,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
1216 | struct hda_codec *c; | 1216 | struct hda_codec *c; |
1217 | struct hda_cvt_setup *p; | 1217 | struct hda_cvt_setup *p; |
1218 | unsigned int oldval, newval; | 1218 | unsigned int oldval, newval; |
1219 | int type; | ||
1219 | int i; | 1220 | int i; |
1220 | 1221 | ||
1221 | if (!nid) | 1222 | if (!nid) |
@@ -1254,10 +1255,12 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
1254 | p->dirty = 0; | 1255 | p->dirty = 0; |
1255 | 1256 | ||
1256 | /* make other inactive cvts with the same stream-tag dirty */ | 1257 | /* make other inactive cvts with the same stream-tag dirty */ |
1258 | type = get_wcaps_type(get_wcaps(codec, nid)); | ||
1257 | list_for_each_entry(c, &codec->bus->codec_list, list) { | 1259 | list_for_each_entry(c, &codec->bus->codec_list, list) { |
1258 | for (i = 0; i < c->cvt_setups.used; i++) { | 1260 | for (i = 0; i < c->cvt_setups.used; i++) { |
1259 | p = snd_array_elem(&c->cvt_setups, i); | 1261 | p = snd_array_elem(&c->cvt_setups, i); |
1260 | if (!p->active && p->stream_tag == stream_tag) | 1262 | if (!p->active && p->stream_tag == stream_tag && |
1263 | get_wcaps_type(get_wcaps(codec, p->nid)) == type) | ||
1261 | p->dirty = 1; | 1264 | p->dirty = 1; |
1262 | } | 1265 | } |
1263 | } | 1266 | } |
@@ -1281,6 +1284,9 @@ void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
1281 | if (!nid) | 1284 | if (!nid) |
1282 | return; | 1285 | return; |
1283 | 1286 | ||
1287 | if (codec->no_sticky_stream) | ||
1288 | do_now = 1; | ||
1289 | |||
1284 | snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid); | 1290 | snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid); |
1285 | p = get_hda_cvt_setup(codec, nid); | 1291 | p = get_hda_cvt_setup(codec, nid); |
1286 | if (p) { | 1292 | if (p) { |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 62c702240108..c3ad37470f8f 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -850,6 +850,7 @@ struct hda_codec { | |||
850 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index | 850 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index |
851 | * (e.g. Conexant codecs) | 851 | * (e.g. Conexant codecs) |
852 | */ | 852 | */ |
853 | unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */ | ||
853 | unsigned int pins_shutup:1; /* pins are shut up */ | 854 | unsigned int pins_shutup:1; /* pins are shut up */ |
854 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ | 855 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ |
855 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 856 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index 26c3ade73583..3c17a0a5ea81 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c | |||
@@ -381,7 +381,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a) | |||
381 | snd_print_pcm_rates(a->rates, buf, sizeof(buf)); | 381 | snd_print_pcm_rates(a->rates, buf, sizeof(buf)); |
382 | 382 | ||
383 | if (a->format == AUDIO_CODING_TYPE_LPCM) | 383 | if (a->format == AUDIO_CODING_TYPE_LPCM) |
384 | snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2 - 8)); | 384 | snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2) - 8); |
385 | else if (a->max_bitrate) | 385 | else if (a->max_bitrate) |
386 | snprintf(buf2, sizeof(buf2), | 386 | snprintf(buf2, sizeof(buf2), |
387 | ", max bitrate = %d", a->max_bitrate); | 387 | ", max bitrate = %d", a->max_bitrate); |
@@ -604,24 +604,19 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | |||
604 | { | 604 | { |
605 | int i; | 605 | int i; |
606 | 606 | ||
607 | pcm->rates = 0; | 607 | /* assume basic audio support (the basic audio flag is not in ELD; |
608 | pcm->formats = 0; | 608 | * however, all audio capable sinks are required to support basic |
609 | pcm->maxbps = 0; | 609 | * audio) */ |
610 | pcm->channels_min = -1; | 610 | pcm->rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000; |
611 | pcm->channels_max = 0; | 611 | pcm->formats = SNDRV_PCM_FMTBIT_S16_LE; |
612 | pcm->maxbps = 16; | ||
613 | pcm->channels_max = 2; | ||
612 | for (i = 0; i < eld->sad_count; i++) { | 614 | for (i = 0; i < eld->sad_count; i++) { |
613 | struct cea_sad *a = &eld->sad[i]; | 615 | struct cea_sad *a = &eld->sad[i]; |
614 | pcm->rates |= a->rates; | 616 | pcm->rates |= a->rates; |
615 | if (a->channels < pcm->channels_min) | ||
616 | pcm->channels_min = a->channels; | ||
617 | if (a->channels > pcm->channels_max) | 617 | if (a->channels > pcm->channels_max) |
618 | pcm->channels_max = a->channels; | 618 | pcm->channels_max = a->channels; |
619 | if (a->format == AUDIO_CODING_TYPE_LPCM) { | 619 | if (a->format == AUDIO_CODING_TYPE_LPCM) { |
620 | if (a->sample_bits & AC_SUPPCM_BITS_16) { | ||
621 | pcm->formats |= SNDRV_PCM_FMTBIT_S16_LE; | ||
622 | if (pcm->maxbps < 16) | ||
623 | pcm->maxbps = 16; | ||
624 | } | ||
625 | if (a->sample_bits & AC_SUPPCM_BITS_20) { | 620 | if (a->sample_bits & AC_SUPPCM_BITS_20) { |
626 | pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; | 621 | pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; |
627 | if (pcm->maxbps < 20) | 622 | if (pcm->maxbps < 20) |
@@ -641,7 +636,6 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | |||
641 | /* restrict the parameters by the values the codec provides */ | 636 | /* restrict the parameters by the values the codec provides */ |
642 | pcm->rates &= codec_pars->rates; | 637 | pcm->rates &= codec_pars->rates; |
643 | pcm->formats &= codec_pars->formats; | 638 | pcm->formats &= codec_pars->formats; |
644 | pcm->channels_min = max(pcm->channels_min, codec_pars->channels_min); | ||
645 | pcm->channels_max = min(pcm->channels_max, codec_pars->channels_max); | 639 | pcm->channels_max = min(pcm->channels_max, codec_pars->channels_max); |
646 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); | 640 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); |
647 | } | 641 | } |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 34940a079051..a8c6f3420344 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -458,6 +458,7 @@ enum { | |||
458 | AZX_DRIVER_ULI, | 458 | AZX_DRIVER_ULI, |
459 | AZX_DRIVER_NVIDIA, | 459 | AZX_DRIVER_NVIDIA, |
460 | AZX_DRIVER_TERA, | 460 | AZX_DRIVER_TERA, |
461 | AZX_DRIVER_CTX, | ||
461 | AZX_DRIVER_GENERIC, | 462 | AZX_DRIVER_GENERIC, |
462 | AZX_NUM_DRIVERS, /* keep this as last entry */ | 463 | AZX_NUM_DRIVERS, /* keep this as last entry */ |
463 | }; | 464 | }; |
@@ -473,6 +474,7 @@ static char *driver_short_names[] __devinitdata = { | |||
473 | [AZX_DRIVER_ULI] = "HDA ULI M5461", | 474 | [AZX_DRIVER_ULI] = "HDA ULI M5461", |
474 | [AZX_DRIVER_NVIDIA] = "HDA NVidia", | 475 | [AZX_DRIVER_NVIDIA] = "HDA NVidia", |
475 | [AZX_DRIVER_TERA] = "HDA Teradici", | 476 | [AZX_DRIVER_TERA] = "HDA Teradici", |
477 | [AZX_DRIVER_CTX] = "HDA Creative", | ||
476 | [AZX_DRIVER_GENERIC] = "HD-Audio Generic", | 478 | [AZX_DRIVER_GENERIC] = "HD-Audio Generic", |
477 | }; | 479 | }; |
478 | 480 | ||
@@ -563,7 +565,10 @@ static void azx_init_cmd_io(struct azx *chip) | |||
563 | /* reset the rirb hw write pointer */ | 565 | /* reset the rirb hw write pointer */ |
564 | azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); | 566 | azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); |
565 | /* set N=1, get RIRB response interrupt for new entry */ | 567 | /* set N=1, get RIRB response interrupt for new entry */ |
566 | azx_writew(chip, RINTCNT, 1); | 568 | if (chip->driver_type == AZX_DRIVER_CTX) |
569 | azx_writew(chip, RINTCNT, 0xc0); | ||
570 | else | ||
571 | azx_writew(chip, RINTCNT, 1); | ||
567 | /* enable rirb dma and response irq */ | 572 | /* enable rirb dma and response irq */ |
568 | azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN); | 573 | azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN); |
569 | spin_unlock_irq(&chip->reg_lock); | 574 | spin_unlock_irq(&chip->reg_lock); |
@@ -1136,8 +1141,11 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) | |||
1136 | /* clear rirb int */ | 1141 | /* clear rirb int */ |
1137 | status = azx_readb(chip, RIRBSTS); | 1142 | status = azx_readb(chip, RIRBSTS); |
1138 | if (status & RIRB_INT_MASK) { | 1143 | if (status & RIRB_INT_MASK) { |
1139 | if (status & RIRB_INT_RESPONSE) | 1144 | if (status & RIRB_INT_RESPONSE) { |
1145 | if (chip->driver_type == AZX_DRIVER_CTX) | ||
1146 | udelay(80); | ||
1140 | azx_update_rirb(chip); | 1147 | azx_update_rirb(chip); |
1148 | } | ||
1141 | azx_writeb(chip, RIRBSTS, RIRB_INT_MASK); | 1149 | azx_writeb(chip, RIRBSTS, RIRB_INT_MASK); |
1142 | } | 1150 | } |
1143 | 1151 | ||
@@ -1647,7 +1655,7 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
1647 | struct azx_dev *azx_dev = get_azx_dev(substream); | 1655 | struct azx_dev *azx_dev = get_azx_dev(substream); |
1648 | struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; | 1656 | struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; |
1649 | struct snd_pcm_runtime *runtime = substream->runtime; | 1657 | struct snd_pcm_runtime *runtime = substream->runtime; |
1650 | unsigned int bufsize, period_bytes, format_val; | 1658 | unsigned int bufsize, period_bytes, format_val, stream_tag; |
1651 | int err; | 1659 | int err; |
1652 | 1660 | ||
1653 | azx_stream_reset(chip, azx_dev); | 1661 | azx_stream_reset(chip, azx_dev); |
@@ -1689,7 +1697,12 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
1689 | else | 1697 | else |
1690 | azx_dev->fifo_size = 0; | 1698 | azx_dev->fifo_size = 0; |
1691 | 1699 | ||
1692 | return snd_hda_codec_prepare(apcm->codec, hinfo, azx_dev->stream_tag, | 1700 | stream_tag = azx_dev->stream_tag; |
1701 | /* CA-IBG chips need the playback stream starting from 1 */ | ||
1702 | if (chip->driver_type == AZX_DRIVER_CTX && | ||
1703 | stream_tag > chip->capture_streams) | ||
1704 | stream_tag -= chip->capture_streams; | ||
1705 | return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag, | ||
1693 | azx_dev->format_val, substream); | 1706 | azx_dev->format_val, substream); |
1694 | } | 1707 | } |
1695 | 1708 | ||
@@ -2285,9 +2298,11 @@ static int azx_dev_free(struct snd_device *device) | |||
2285 | */ | 2298 | */ |
2286 | static struct snd_pci_quirk position_fix_list[] __devinitdata = { | 2299 | static struct snd_pci_quirk position_fix_list[] __devinitdata = { |
2287 | SND_PCI_QUIRK(0x1025, 0x009f, "Acer Aspire 5110", POS_FIX_LPIB), | 2300 | SND_PCI_QUIRK(0x1025, 0x009f, "Acer Aspire 5110", POS_FIX_LPIB), |
2301 | SND_PCI_QUIRK(0x1025, 0x026f, "Acer Aspire 5538", POS_FIX_LPIB), | ||
2288 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), | 2302 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), |
2289 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), | 2303 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), |
2290 | SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), | 2304 | SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), |
2305 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell Inspiron 1120", POS_FIX_LPIB), | ||
2291 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), | 2306 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), |
2292 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), | 2307 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
2293 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), | 2308 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), |
@@ -2794,10 +2809,10 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
2794 | { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), | 2809 | { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), |
2795 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2810 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
2796 | .class_mask = 0xffffff, | 2811 | .class_mask = 0xffffff, |
2797 | .driver_data = AZX_DRIVER_GENERIC }, | 2812 | .driver_data = AZX_DRIVER_CTX }, |
2798 | #else | 2813 | #else |
2799 | /* this entry seems still valid -- i.e. without emu20kx chip */ | 2814 | /* this entry seems still valid -- i.e. without emu20kx chip */ |
2800 | { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_GENERIC }, | 2815 | { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_CTX }, |
2801 | #endif | 2816 | #endif |
2802 | /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */ | 2817 | /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */ |
2803 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), | 2818 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 10bbbaf6ebc3..0da636d28fb4 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -1276,6 +1276,7 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
1276 | spec->multiout.no_share_stream = 1; | 1276 | spec->multiout.no_share_stream = 1; |
1277 | 1277 | ||
1278 | codec->no_trigger_sense = 1; | 1278 | codec->no_trigger_sense = 1; |
1279 | codec->no_sticky_stream = 1; | ||
1279 | 1280 | ||
1280 | return 0; | 1281 | return 0; |
1281 | } | 1282 | } |
@@ -1463,6 +1464,7 @@ static int patch_ad1983(struct hda_codec *codec) | |||
1463 | codec->patch_ops = ad198x_patch_ops; | 1464 | codec->patch_ops = ad198x_patch_ops; |
1464 | 1465 | ||
1465 | codec->no_trigger_sense = 1; | 1466 | codec->no_trigger_sense = 1; |
1467 | codec->no_sticky_stream = 1; | ||
1466 | 1468 | ||
1467 | return 0; | 1469 | return 0; |
1468 | } | 1470 | } |
@@ -1917,6 +1919,7 @@ static int patch_ad1981(struct hda_codec *codec) | |||
1917 | } | 1919 | } |
1918 | 1920 | ||
1919 | codec->no_trigger_sense = 1; | 1921 | codec->no_trigger_sense = 1; |
1922 | codec->no_sticky_stream = 1; | ||
1920 | 1923 | ||
1921 | return 0; | 1924 | return 0; |
1922 | } | 1925 | } |
@@ -3235,6 +3238,7 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3235 | spec->vmaster_nid = 0x04; | 3238 | spec->vmaster_nid = 0x04; |
3236 | 3239 | ||
3237 | codec->no_trigger_sense = 1; | 3240 | codec->no_trigger_sense = 1; |
3241 | codec->no_sticky_stream = 1; | ||
3238 | 3242 | ||
3239 | return 0; | 3243 | return 0; |
3240 | } | 3244 | } |
@@ -3449,6 +3453,7 @@ static int patch_ad1884(struct hda_codec *codec) | |||
3449 | codec->patch_ops = ad198x_patch_ops; | 3453 | codec->patch_ops = ad198x_patch_ops; |
3450 | 3454 | ||
3451 | codec->no_trigger_sense = 1; | 3455 | codec->no_trigger_sense = 1; |
3456 | codec->no_sticky_stream = 1; | ||
3452 | 3457 | ||
3453 | return 0; | 3458 | return 0; |
3454 | } | 3459 | } |
@@ -4422,6 +4427,7 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
4422 | } | 4427 | } |
4423 | 4428 | ||
4424 | codec->no_trigger_sense = 1; | 4429 | codec->no_trigger_sense = 1; |
4430 | codec->no_sticky_stream = 1; | ||
4425 | 4431 | ||
4426 | return 0; | 4432 | return 0; |
4427 | } | 4433 | } |
@@ -4761,6 +4767,7 @@ static int patch_ad1882(struct hda_codec *codec) | |||
4761 | } | 4767 | } |
4762 | 4768 | ||
4763 | codec->no_trigger_sense = 1; | 4769 | codec->no_trigger_sense = 1; |
4770 | codec->no_sticky_stream = 1; | ||
4764 | 4771 | ||
4765 | return 0; | 4772 | return 0; |
4766 | } | 4773 | } |
diff --git a/sound/pci/hda/patch_ca0110.c b/sound/pci/hda/patch_ca0110.c index af478019088e..9544463cf862 100644 --- a/sound/pci/hda/patch_ca0110.c +++ b/sound/pci/hda/patch_ca0110.c | |||
@@ -489,7 +489,7 @@ static void parse_digital(struct hda_codec *codec) | |||
489 | if (cfg->dig_outs && | 489 | if (cfg->dig_outs && |
490 | snd_hda_get_connections(codec, cfg->dig_out_pins[0], | 490 | snd_hda_get_connections(codec, cfg->dig_out_pins[0], |
491 | &spec->dig_out, 1) == 1) | 491 | &spec->dig_out, 1) == 1) |
492 | spec->multiout.dig_out_nid = cfg->dig_out_pins[0]; | 492 | spec->multiout.dig_out_nid = spec->dig_out; |
493 | } | 493 | } |
494 | 494 | ||
495 | static int ca0110_parse_auto_config(struct hda_codec *codec) | 495 | static int ca0110_parse_auto_config(struct hda_codec *codec) |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 972e7c453b3d..5dbff4507a93 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -393,10 +393,16 @@ static int conexant_add_jack(struct hda_codec *codec, | |||
393 | struct conexant_spec *spec; | 393 | struct conexant_spec *spec; |
394 | struct conexant_jack *jack; | 394 | struct conexant_jack *jack; |
395 | const char *name; | 395 | const char *name; |
396 | int err; | 396 | int i, err; |
397 | 397 | ||
398 | spec = codec->spec; | 398 | spec = codec->spec; |
399 | snd_array_init(&spec->jacks, sizeof(*jack), 32); | 399 | snd_array_init(&spec->jacks, sizeof(*jack), 32); |
400 | |||
401 | jack = spec->jacks.list; | ||
402 | for (i = 0; i < spec->jacks.used; i++, jack++) | ||
403 | if (jack->nid == nid) | ||
404 | return 0 ; /* already present */ | ||
405 | |||
400 | jack = snd_array_new(&spec->jacks); | 406 | jack = snd_array_new(&spec->jacks); |
401 | name = (type == SND_JACK_HEADPHONE) ? "Headphone" : "Mic" ; | 407 | name = (type == SND_JACK_HEADPHONE) ? "Headphone" : "Mic" ; |
402 | 408 | ||
@@ -3085,13 +3091,13 @@ static const char *cxt5066_models[CXT5066_MODELS] = { | |||
3085 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | 3091 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
3086 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", | 3092 | SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", |
3087 | CXT5066_LAPTOP), | 3093 | CXT5066_LAPTOP), |
3088 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", | 3094 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell Vostro 320", CXT5066_IDEAPAD), |
3089 | CXT5066_DELL_LAPTOP), | ||
3090 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 3095 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
3091 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), | 3096 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), |
3092 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), | 3097 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
3093 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | 3098 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
3094 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), | 3099 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), |
3100 | SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_HP_LAPTOP), | ||
3095 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), | 3101 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), |
3096 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 3102 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
3097 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | 3103 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
@@ -3099,6 +3105,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
3099 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), | 3105 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), |
3100 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), | 3106 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), |
3101 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), | 3107 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), |
3108 | SND_PCI_QUIRK(0x17aa, 0x21c8, "Thinkpad Edge 11", CXT5066_IDEAPAD), | ||
3102 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), | 3109 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), |
3103 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), | 3110 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), |
3104 | SND_PCI_QUIRK(0x17aa, 0x390a, "Lenovo S10-3t", CXT5066_IDEAPAD), | 3111 | SND_PCI_QUIRK(0x17aa, 0x390a, "Lenovo S10-3t", CXT5066_IDEAPAD), |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index afd6022a96a7..4ab7c5c80838 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -779,7 +779,6 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | |||
779 | return -ENODEV; | 779 | return -ENODEV; |
780 | } else { | 780 | } else { |
781 | /* fallback to the codec default */ | 781 | /* fallback to the codec default */ |
782 | hinfo->channels_min = codec_pars->channels_min; | ||
783 | hinfo->channels_max = codec_pars->channels_max; | 782 | hinfo->channels_max = codec_pars->channels_max; |
784 | hinfo->rates = codec_pars->rates; | 783 | hinfo->rates = codec_pars->rates; |
785 | hinfo->formats = codec_pars->formats; | 784 | hinfo->formats = codec_pars->formats; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index a432e6efd19b..52b07fb942d4 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -1438,6 +1438,7 @@ do_sku: | |||
1438 | spec->init_amp = ALC_INIT_GPIO3; | 1438 | spec->init_amp = ALC_INIT_GPIO3; |
1439 | break; | 1439 | break; |
1440 | case 5: | 1440 | case 5: |
1441 | default: | ||
1441 | spec->init_amp = ALC_INIT_DEFAULT; | 1442 | spec->init_amp = ALC_INIT_DEFAULT; |
1442 | break; | 1443 | break; |
1443 | } | 1444 | } |
@@ -4388,6 +4389,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { | |||
4388 | SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), | 4389 | SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), |
4389 | SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), | 4390 | SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), |
4390 | SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), | 4391 | SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), |
4392 | SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_LG), | ||
4391 | SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), | 4393 | SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), |
4392 | SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), | 4394 | SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), |
4393 | SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), | 4395 | SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), |
@@ -9664,7 +9666,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { | |||
9664 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), | 9666 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
9665 | SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), | 9667 | SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
9666 | SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), | 9668 | SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), |
9667 | SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), | ||
9668 | SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), | 9669 | SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), |
9669 | SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), | 9670 | SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), |
9670 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), | 9671 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), |
@@ -16557,7 +16558,7 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
16557 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, | 16558 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, |
16558 | const struct auto_pin_cfg *cfg) | 16559 | const struct auto_pin_cfg *cfg) |
16559 | { | 16560 | { |
16560 | return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0); | 16561 | return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x22, 0); |
16561 | } | 16562 | } |
16562 | 16563 | ||
16563 | 16564 | ||
@@ -18612,6 +18613,8 @@ static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) | |||
18612 | return 0x02; | 18613 | return 0x02; |
18613 | else if (nid >= 0x0c && nid <= 0x0e) | 18614 | else if (nid >= 0x0c && nid <= 0x0e) |
18614 | return nid - 0x0c + 0x02; | 18615 | return nid - 0x0c + 0x02; |
18616 | else if (nid == 0x26) /* ALC887-VD has this DAC too */ | ||
18617 | return 0x25; | ||
18615 | else | 18618 | else |
18616 | return 0; | 18619 | return 0; |
18617 | } | 18620 | } |
@@ -18620,7 +18623,7 @@ static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) | |||
18620 | static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, | 18623 | static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, |
18621 | hda_nid_t dac) | 18624 | hda_nid_t dac) |
18622 | { | 18625 | { |
18623 | hda_nid_t mix[4]; | 18626 | hda_nid_t mix[5]; |
18624 | int i, num; | 18627 | int i, num; |
18625 | 18628 | ||
18626 | num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); | 18629 | num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); |
@@ -18935,6 +18938,37 @@ static void alc662_auto_init(struct hda_codec *codec) | |||
18935 | alc_inithook(codec); | 18938 | alc_inithook(codec); |
18936 | } | 18939 | } |
18937 | 18940 | ||
18941 | enum { | ||
18942 | ALC662_FIXUP_ASPIRE, | ||
18943 | ALC662_FIXUP_IDEAPAD, | ||
18944 | }; | ||
18945 | |||
18946 | static const struct alc_fixup alc662_fixups[] = { | ||
18947 | [ALC662_FIXUP_ASPIRE] = { | ||
18948 | .pins = (const struct alc_pincfg[]) { | ||
18949 | { 0x15, 0x99130112 }, /* subwoofer */ | ||
18950 | { } | ||
18951 | } | ||
18952 | }, | ||
18953 | [ALC662_FIXUP_IDEAPAD] = { | ||
18954 | .pins = (const struct alc_pincfg[]) { | ||
18955 | { 0x17, 0x99130112 }, /* subwoofer */ | ||
18956 | { } | ||
18957 | } | ||
18958 | }, | ||
18959 | }; | ||
18960 | |||
18961 | static struct snd_pci_quirk alc662_fixup_tbl[] = { | ||
18962 | SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), | ||
18963 | SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), | ||
18964 | SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), | ||
18965 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), | ||
18966 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), | ||
18967 | {} | ||
18968 | }; | ||
18969 | |||
18970 | |||
18971 | |||
18938 | static int patch_alc662(struct hda_codec *codec) | 18972 | static int patch_alc662(struct hda_codec *codec) |
18939 | { | 18973 | { |
18940 | struct alc_spec *spec; | 18974 | struct alc_spec *spec; |
@@ -18967,6 +19001,7 @@ static int patch_alc662(struct hda_codec *codec) | |||
18967 | } | 19001 | } |
18968 | 19002 | ||
18969 | if (board_config == ALC662_AUTO) { | 19003 | if (board_config == ALC662_AUTO) { |
19004 | alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 1); | ||
18970 | /* automatic parse from the BIOS config */ | 19005 | /* automatic parse from the BIOS config */ |
18971 | err = alc662_parse_auto_config(codec); | 19006 | err = alc662_parse_auto_config(codec); |
18972 | if (err < 0) { | 19007 | if (err < 0) { |
@@ -19025,8 +19060,11 @@ static int patch_alc662(struct hda_codec *codec) | |||
19025 | spec->vmaster_nid = 0x02; | 19060 | spec->vmaster_nid = 0x02; |
19026 | 19061 | ||
19027 | codec->patch_ops = alc_patch_ops; | 19062 | codec->patch_ops = alc_patch_ops; |
19028 | if (board_config == ALC662_AUTO) | 19063 | if (board_config == ALC662_AUTO) { |
19029 | spec->init_hook = alc662_auto_init; | 19064 | spec->init_hook = alc662_auto_init; |
19065 | alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 0); | ||
19066 | } | ||
19067 | |||
19030 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 19068 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
19031 | if (!spec->loopback.amplist) | 19069 | if (!spec->loopback.amplist) |
19032 | spec->loopback.amplist = alc662_loopbacks; | 19070 | spec->loopback.amplist = alc662_loopbacks; |
@@ -19039,7 +19077,10 @@ static int patch_alc888(struct hda_codec *codec) | |||
19039 | { | 19077 | { |
19040 | if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){ | 19078 | if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){ |
19041 | kfree(codec->chip_name); | 19079 | kfree(codec->chip_name); |
19042 | codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL); | 19080 | if (codec->vendor_id == 0x10ec0887) |
19081 | codec->chip_name = kstrdup("ALC887-VD", GFP_KERNEL); | ||
19082 | else | ||
19083 | codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL); | ||
19043 | if (!codec->chip_name) { | 19084 | if (!codec->chip_name) { |
19044 | alc_free(codec); | 19085 | alc_free(codec); |
19045 | return -ENOMEM; | 19086 | return -ENOMEM; |
@@ -19521,7 +19562,7 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = { | |||
19521 | { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", | 19562 | { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", |
19522 | .patch = patch_alc882 }, | 19563 | .patch = patch_alc882 }, |
19523 | { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, | 19564 | { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, |
19524 | { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 }, | 19565 | { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc888 }, |
19525 | { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", | 19566 | { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", |
19526 | .patch = patch_alc882 }, | 19567 | .patch = patch_alc882 }, |
19527 | { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 }, | 19568 | { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 }, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index c16c5ba0fda0..78f12064b2bf 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -93,6 +93,7 @@ enum { | |||
93 | STAC_92HD83XXX_REF, | 93 | STAC_92HD83XXX_REF, |
94 | STAC_92HD83XXX_PWR_REF, | 94 | STAC_92HD83XXX_PWR_REF, |
95 | STAC_DELL_S14, | 95 | STAC_DELL_S14, |
96 | STAC_DELL_E6410, | ||
96 | STAC_92HD83XXX_HP, | 97 | STAC_92HD83XXX_HP, |
97 | STAC_HP_DV7_4000, | 98 | STAC_HP_DV7_4000, |
98 | STAC_92HD83XXX_MODELS | 99 | STAC_92HD83XXX_MODELS |
@@ -1618,6 +1619,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
1618 | static struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = { | 1619 | static struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = { |
1619 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1, | 1620 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1, |
1620 | "Alienware M17x", STAC_ALIENWARE_M17X), | 1621 | "Alienware M17x", STAC_ALIENWARE_M17X), |
1622 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a, | ||
1623 | "Alienware M17x", STAC_ALIENWARE_M17X), | ||
1621 | {} /* terminator */ | 1624 | {} /* terminator */ |
1622 | }; | 1625 | }; |
1623 | 1626 | ||
@@ -1633,6 +1636,13 @@ static unsigned int dell_s14_pin_configs[10] = { | |||
1633 | 0x40f000f0, 0x40f000f0, | 1636 | 0x40f000f0, 0x40f000f0, |
1634 | }; | 1637 | }; |
1635 | 1638 | ||
1639 | /* Deliberately turn off 0x0f (Dock Mic) to make it choose Int Mic instead */ | ||
1640 | static unsigned int dell_e6410_pin_configs[10] = { | ||
1641 | 0x04a11020, 0x0421101f, 0x400000f0, 0x90170110, | ||
1642 | 0x23011050, 0x40f000f0, 0x400000f0, 0x90a60130, | ||
1643 | 0x40f000f0, 0x40f000f0, | ||
1644 | }; | ||
1645 | |||
1636 | static unsigned int hp_dv7_4000_pin_configs[10] = { | 1646 | static unsigned int hp_dv7_4000_pin_configs[10] = { |
1637 | 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, | 1647 | 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, |
1638 | 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, | 1648 | 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, |
@@ -1643,6 +1653,7 @@ static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { | |||
1643 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, | 1653 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, |
1644 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, | 1654 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, |
1645 | [STAC_DELL_S14] = dell_s14_pin_configs, | 1655 | [STAC_DELL_S14] = dell_s14_pin_configs, |
1656 | [STAC_DELL_E6410] = dell_e6410_pin_configs, | ||
1646 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, | 1657 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, |
1647 | }; | 1658 | }; |
1648 | 1659 | ||
@@ -1651,6 +1662,7 @@ static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { | |||
1651 | [STAC_92HD83XXX_REF] = "ref", | 1662 | [STAC_92HD83XXX_REF] = "ref", |
1652 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", | 1663 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", |
1653 | [STAC_DELL_S14] = "dell-s14", | 1664 | [STAC_DELL_S14] = "dell-s14", |
1665 | [STAC_DELL_E6410] = "dell-e6410", | ||
1654 | [STAC_92HD83XXX_HP] = "hp", | 1666 | [STAC_92HD83XXX_HP] = "hp", |
1655 | [STAC_HP_DV7_4000] = "hp-dv7-4000", | 1667 | [STAC_HP_DV7_4000] = "hp-dv7-4000", |
1656 | }; | 1668 | }; |
@@ -1663,6 +1675,10 @@ static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { | |||
1663 | "DFI LanParty", STAC_92HD83XXX_REF), | 1675 | "DFI LanParty", STAC_92HD83XXX_REF), |
1664 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, | 1676 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, |
1665 | "unknown Dell", STAC_DELL_S14), | 1677 | "unknown Dell", STAC_DELL_S14), |
1678 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x040a, | ||
1679 | "Dell E6410", STAC_DELL_E6410), | ||
1680 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x040b, | ||
1681 | "Dell E6510", STAC_DELL_E6410), | ||
1666 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, | 1682 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, |
1667 | "HP", STAC_92HD83XXX_HP), | 1683 | "HP", STAC_92HD83XXX_HP), |
1668 | {} /* terminator */ | 1684 | {} /* terminator */ |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 467749249576..ebfa1f8b70c1 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
@@ -1866,6 +1866,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
1866 | }, | 1866 | }, |
1867 | { | 1867 | { |
1868 | .subvendor = 0x1028, | 1868 | .subvendor = 0x1028, |
1869 | .subdevice = 0x0182, | ||
1870 | .name = "Dell Latitude D610", /* STAC9750/51 */ | ||
1871 | .type = AC97_TUNE_HP_ONLY | ||
1872 | }, | ||
1873 | { | ||
1874 | .subvendor = 0x1028, | ||
1869 | .subdevice = 0x0186, | 1875 | .subdevice = 0x0186, |
1870 | .name = "Dell Latitude D810", /* cf. Malone #41015 */ | 1876 | .name = "Dell Latitude D810", /* cf. Malone #41015 */ |
1871 | .type = AC97_TUNE_HP_MUTE_LED | 1877 | .type = AC97_TUNE_HP_MUTE_LED |