aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda
diff options
context:
space:
mode:
authorJeremy Erickson <jerickso@cs.unc.edu>2014-04-18 17:06:00 -0400
committerJeremy Erickson <jerickso@cs.unc.edu>2014-04-18 17:06:00 -0400
commita215aa7b9ab3759c047201199fba64d3042d7f13 (patch)
treebca37493d9b2233450e6d3ffced1261d0e4f71fe /sound/pci/hda
parentd31199a77ef606f1d06894385f1852181ba6136b (diff)
Update 2.6.36 to 2.6.36.4wip-dissipation2-jerickso
Diffstat (limited to 'sound/pci/hda')
-rw-r--r--sound/pci/hda/hda_codec.c8
-rw-r--r--sound/pci/hda/hda_codec.h1
-rw-r--r--sound/pci/hda/hda_eld.c22
-rw-r--r--sound/pci/hda/hda_intel.c27
-rw-r--r--sound/pci/hda/patch_analog.c7
-rw-r--r--sound/pci/hda/patch_ca0110.c2
-rw-r--r--sound/pci/hda/patch_conexant.c13
-rw-r--r--sound/pci/hda/patch_hdmi.c1
-rw-r--r--sound/pci/hda/patch_realtek.c53
-rw-r--r--sound/pci/hda/patch_sigmatel.c16
10 files changed, 118 insertions, 32 deletions
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 */
2286static struct snd_pci_quirk position_fix_list[] __devinitdata = { 2299static 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
495static int ca0110_parse_auto_config(struct hda_codec *codec) 495static 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] = {
3085static struct snd_pci_quirk cxt5066_cfg_tbl[] = { 3091static 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[] = {
16557static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, 16558static 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)
18620static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, 18623static 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
18941enum {
18942 ALC662_FIXUP_ASPIRE,
18943 ALC662_FIXUP_IDEAPAD,
18944};
18945
18946static 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
18961static 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
18938static int patch_alc662(struct hda_codec *codec) 18972static 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[] = {
1618static struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = { 1619static 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 */
1640static unsigned int dell_e6410_pin_configs[10] = {
1641 0x04a11020, 0x0421101f, 0x400000f0, 0x90170110,
1642 0x23011050, 0x40f000f0, 0x400000f0, 0x90a60130,
1643 0x40f000f0, 0x40f000f0,
1644};
1645
1636static unsigned int hp_dv7_4000_pin_configs[10] = { 1646static 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 */