diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/asihpi/hpioctl.c | 2 | ||||
-rw-r--r-- | sound/pci/azt3328.c | 26 | ||||
-rw-r--r-- | sound/pci/ctxfi/ctpcm.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.c | 57 | ||||
-rw-r--r-- | sound/pci/hda/hda_eld.c | 24 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 37 | ||||
-rw-r--r-- | sound/pci/hda/patch_hdmi.c | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 146 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 23 | ||||
-rw-r--r-- | sound/pci/intel8x0.c | 6 | ||||
-rw-r--r-- | sound/pci/mixart/mixart_hwdep.h | 10 |
12 files changed, 243 insertions, 107 deletions
diff --git a/sound/pci/asihpi/hpioctl.c b/sound/pci/asihpi/hpioctl.c index 62895a719fcb..22dbd91811a4 100644 --- a/sound/pci/asihpi/hpioctl.c +++ b/sound/pci/asihpi/hpioctl.c | |||
@@ -435,7 +435,7 @@ void __devexit asihpi_adapter_remove(struct pci_dev *pci_dev) | |||
435 | struct hpi_message hm; | 435 | struct hpi_message hm; |
436 | struct hpi_response hr; | 436 | struct hpi_response hr; |
437 | struct hpi_adapter *pa; | 437 | struct hpi_adapter *pa; |
438 | pa = (struct hpi_adapter *)pci_get_drvdata(pci_dev); | 438 | pa = pci_get_drvdata(pci_dev); |
439 | 439 | ||
440 | hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, | 440 | hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, |
441 | HPI_SUBSYS_DELETE_ADAPTER); | 441 | HPI_SUBSYS_DELETE_ADAPTER); |
diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index 4679ed83a43b..2f3cacbd5528 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c | |||
@@ -1129,10 +1129,11 @@ snd_azf3328_codec_setdmaa(struct snd_azf3328 *chip, | |||
1129 | 1129 | ||
1130 | count_areas = size/2; | 1130 | count_areas = size/2; |
1131 | addr_area2 = addr+count_areas; | 1131 | addr_area2 = addr+count_areas; |
1132 | count_areas--; /* max. index */ | ||
1133 | snd_azf3328_dbgcodec("setdma: buffers %08lx[%u] / %08lx[%u]\n", | 1132 | snd_azf3328_dbgcodec("setdma: buffers %08lx[%u] / %08lx[%u]\n", |
1134 | addr, count_areas, addr_area2, count_areas); | 1133 | addr, count_areas, addr_area2, count_areas); |
1135 | 1134 | ||
1135 | count_areas--; /* max. index */ | ||
1136 | |||
1136 | /* build combined I/O buffer length word */ | 1137 | /* build combined I/O buffer length word */ |
1137 | lengths = (count_areas << 16) | (count_areas); | 1138 | lengths = (count_areas << 16) | (count_areas); |
1138 | spin_lock_irqsave(&chip->reg_lock, flags); | 1139 | spin_lock_irqsave(&chip->reg_lock, flags); |
@@ -1740,11 +1741,15 @@ static const struct snd_pcm_hardware snd_azf3328_hardware = | |||
1740 | .rate_max = AZF_FREQ_66200, | 1741 | .rate_max = AZF_FREQ_66200, |
1741 | .channels_min = 1, | 1742 | .channels_min = 1, |
1742 | .channels_max = 2, | 1743 | .channels_max = 2, |
1743 | .buffer_bytes_max = 65536, | 1744 | .buffer_bytes_max = (64*1024), |
1744 | .period_bytes_min = 64, | 1745 | .period_bytes_min = 1024, |
1745 | .period_bytes_max = 65536, | 1746 | .period_bytes_max = (32*1024), |
1746 | .periods_min = 1, | 1747 | /* We simply have two DMA areas (instead of a list of descriptors |
1747 | .periods_max = 1024, | 1748 | such as other cards); I believe that this is a fixed hardware |
1749 | attribute and there isn't much driver magic to be done to expand it. | ||
1750 | Thus indicate that we have at least and at most 2 periods. */ | ||
1751 | .periods_min = 2, | ||
1752 | .periods_max = 2, | ||
1748 | /* FIXME: maybe that card actually has a FIFO? | 1753 | /* FIXME: maybe that card actually has a FIFO? |
1749 | * Hmm, it seems newer revisions do have one, but we still don't know | 1754 | * Hmm, it seems newer revisions do have one, but we still don't know |
1750 | * its size... */ | 1755 | * its size... */ |
@@ -1980,8 +1985,13 @@ snd_azf3328_timer_stop(struct snd_timer *timer) | |||
1980 | chip = snd_timer_chip(timer); | 1985 | chip = snd_timer_chip(timer); |
1981 | spin_lock_irqsave(&chip->reg_lock, flags); | 1986 | spin_lock_irqsave(&chip->reg_lock, flags); |
1982 | /* disable timer countdown and interrupt */ | 1987 | /* disable timer countdown and interrupt */ |
1983 | /* FIXME: should we write TIMER_IRQ_ACK here? */ | 1988 | /* Hmm, should we write TIMER_IRQ_ACK here? |
1984 | snd_azf3328_ctrl_outb(chip, IDX_IO_TIMER_VALUE + 3, 0); | 1989 | YES indeed, otherwise a rogue timer operation - which prompts |
1990 | ALSA(?) to call repeated stop() in vain, but NOT start() - | ||
1991 | will never end (value 0x03 is kept shown in control byte). | ||
1992 | Simply manually poking 0x04 _once_ immediately successfully stops | ||
1993 | the hardware/ALSA interrupt activity. */ | ||
1994 | snd_azf3328_ctrl_outb(chip, IDX_IO_TIMER_VALUE + 3, 0x04); | ||
1985 | spin_unlock_irqrestore(&chip->reg_lock, flags); | 1995 | spin_unlock_irqrestore(&chip->reg_lock, flags); |
1986 | snd_azf3328_dbgcallleave(); | 1996 | snd_azf3328_dbgcallleave(); |
1987 | return 0; | 1997 | return 0; |
diff --git a/sound/pci/ctxfi/ctpcm.c b/sound/pci/ctxfi/ctpcm.c index 85ab43e89212..457d21189b0d 100644 --- a/sound/pci/ctxfi/ctpcm.c +++ b/sound/pci/ctxfi/ctpcm.c | |||
@@ -129,8 +129,6 @@ static int ct_pcm_playback_open(struct snd_pcm_substream *substream) | |||
129 | 129 | ||
130 | apcm->substream = substream; | 130 | apcm->substream = substream; |
131 | apcm->interrupt = ct_atc_pcm_interrupt; | 131 | apcm->interrupt = ct_atc_pcm_interrupt; |
132 | runtime->private_data = apcm; | ||
133 | runtime->private_free = ct_atc_pcm_free_substream; | ||
134 | if (IEC958 == substream->pcm->device) { | 132 | if (IEC958 == substream->pcm->device) { |
135 | runtime->hw = ct_spdif_passthru_playback_hw; | 133 | runtime->hw = ct_spdif_passthru_playback_hw; |
136 | atc->spdif_out_passthru(atc, 1); | 134 | atc->spdif_out_passthru(atc, 1); |
@@ -155,8 +153,12 @@ static int ct_pcm_playback_open(struct snd_pcm_substream *substream) | |||
155 | } | 153 | } |
156 | 154 | ||
157 | apcm->timer = ct_timer_instance_new(atc->timer, apcm); | 155 | apcm->timer = ct_timer_instance_new(atc->timer, apcm); |
158 | if (!apcm->timer) | 156 | if (!apcm->timer) { |
157 | kfree(apcm); | ||
159 | return -ENOMEM; | 158 | return -ENOMEM; |
159 | } | ||
160 | runtime->private_data = apcm; | ||
161 | runtime->private_free = ct_atc_pcm_free_substream; | ||
160 | 162 | ||
161 | return 0; | 163 | return 0; |
162 | } | 164 | } |
@@ -278,8 +280,6 @@ static int ct_pcm_capture_open(struct snd_pcm_substream *substream) | |||
278 | apcm->started = 0; | 280 | apcm->started = 0; |
279 | apcm->substream = substream; | 281 | apcm->substream = substream; |
280 | apcm->interrupt = ct_atc_pcm_interrupt; | 282 | apcm->interrupt = ct_atc_pcm_interrupt; |
281 | runtime->private_data = apcm; | ||
282 | runtime->private_free = ct_atc_pcm_free_substream; | ||
283 | runtime->hw = ct_pcm_capture_hw; | 283 | runtime->hw = ct_pcm_capture_hw; |
284 | runtime->hw.rate_max = atc->rsr * atc->msr; | 284 | runtime->hw.rate_max = atc->rsr * atc->msr; |
285 | 285 | ||
@@ -298,8 +298,12 @@ static int ct_pcm_capture_open(struct snd_pcm_substream *substream) | |||
298 | } | 298 | } |
299 | 299 | ||
300 | apcm->timer = ct_timer_instance_new(atc->timer, apcm); | 300 | apcm->timer = ct_timer_instance_new(atc->timer, apcm); |
301 | if (!apcm->timer) | 301 | if (!apcm->timer) { |
302 | kfree(apcm); | ||
302 | return -ENOMEM; | 303 | return -ENOMEM; |
304 | } | ||
305 | runtime->private_data = apcm; | ||
306 | runtime->private_free = ct_atc_pcm_free_substream; | ||
303 | 307 | ||
304 | return 0; | 308 | return 0; |
305 | } | 309 | } |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 644e3f14f8ca..98b6d02a36c9 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -1919,6 +1919,16 @@ struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, | |||
1919 | } | 1919 | } |
1920 | EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl); | 1920 | EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl); |
1921 | 1921 | ||
1922 | static int find_empty_mixer_ctl_idx(struct hda_codec *codec, const char *name) | ||
1923 | { | ||
1924 | int idx; | ||
1925 | for (idx = 0; idx < 16; idx++) { /* 16 ctlrs should be large enough */ | ||
1926 | if (!_snd_hda_find_mixer_ctl(codec, name, idx)) | ||
1927 | return idx; | ||
1928 | } | ||
1929 | return -EBUSY; | ||
1930 | } | ||
1931 | |||
1922 | /** | 1932 | /** |
1923 | * snd_hda_ctl_add - Add a control element and assign to the codec | 1933 | * snd_hda_ctl_add - Add a control element and assign to the codec |
1924 | * @codec: HD-audio codec | 1934 | * @codec: HD-audio codec |
@@ -2654,8 +2664,6 @@ static struct snd_kcontrol_new dig_mixes[] = { | |||
2654 | { } /* end */ | 2664 | { } /* end */ |
2655 | }; | 2665 | }; |
2656 | 2666 | ||
2657 | #define SPDIF_MAX_IDX 4 /* 4 instances should be enough to probe */ | ||
2658 | |||
2659 | /** | 2667 | /** |
2660 | * snd_hda_create_spdif_out_ctls - create Output SPDIF-related controls | 2668 | * snd_hda_create_spdif_out_ctls - create Output SPDIF-related controls |
2661 | * @codec: the HDA codec | 2669 | * @codec: the HDA codec |
@@ -2673,12 +2681,8 @@ int snd_hda_create_spdif_out_ctls(struct hda_codec *codec, hda_nid_t nid) | |||
2673 | struct snd_kcontrol_new *dig_mix; | 2681 | struct snd_kcontrol_new *dig_mix; |
2674 | int idx; | 2682 | int idx; |
2675 | 2683 | ||
2676 | for (idx = 0; idx < SPDIF_MAX_IDX; idx++) { | 2684 | idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch"); |
2677 | if (!_snd_hda_find_mixer_ctl(codec, "IEC958 Playback Switch", | 2685 | if (idx < 0) { |
2678 | idx)) | ||
2679 | break; | ||
2680 | } | ||
2681 | if (idx >= SPDIF_MAX_IDX) { | ||
2682 | printk(KERN_ERR "hda_codec: too many IEC958 outputs\n"); | 2686 | printk(KERN_ERR "hda_codec: too many IEC958 outputs\n"); |
2683 | return -EBUSY; | 2687 | return -EBUSY; |
2684 | } | 2688 | } |
@@ -2829,12 +2833,8 @@ int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid) | |||
2829 | struct snd_kcontrol_new *dig_mix; | 2833 | struct snd_kcontrol_new *dig_mix; |
2830 | int idx; | 2834 | int idx; |
2831 | 2835 | ||
2832 | for (idx = 0; idx < SPDIF_MAX_IDX; idx++) { | 2836 | idx = find_empty_mixer_ctl_idx(codec, "IEC958 Capture Switch"); |
2833 | if (!_snd_hda_find_mixer_ctl(codec, "IEC958 Capture Switch", | 2837 | if (idx < 0) { |
2834 | idx)) | ||
2835 | break; | ||
2836 | } | ||
2837 | if (idx >= SPDIF_MAX_IDX) { | ||
2838 | printk(KERN_ERR "hda_codec: too many IEC958 inputs\n"); | 2838 | printk(KERN_ERR "hda_codec: too many IEC958 inputs\n"); |
2839 | return -EBUSY; | 2839 | return -EBUSY; |
2840 | } | 2840 | } |
@@ -3808,21 +3808,32 @@ int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew) | |||
3808 | 3808 | ||
3809 | for (; knew->name; knew++) { | 3809 | for (; knew->name; knew++) { |
3810 | struct snd_kcontrol *kctl; | 3810 | struct snd_kcontrol *kctl; |
3811 | int addr = 0, idx = 0; | ||
3811 | if (knew->iface == -1) /* skip this codec private value */ | 3812 | if (knew->iface == -1) /* skip this codec private value */ |
3812 | continue; | 3813 | continue; |
3813 | kctl = snd_ctl_new1(knew, codec); | 3814 | for (;;) { |
3814 | if (!kctl) | ||
3815 | return -ENOMEM; | ||
3816 | err = snd_hda_ctl_add(codec, 0, kctl); | ||
3817 | if (err < 0) { | ||
3818 | if (!codec->addr) | ||
3819 | return err; | ||
3820 | kctl = snd_ctl_new1(knew, codec); | 3815 | kctl = snd_ctl_new1(knew, codec); |
3821 | if (!kctl) | 3816 | if (!kctl) |
3822 | return -ENOMEM; | 3817 | return -ENOMEM; |
3823 | kctl->id.device = codec->addr; | 3818 | if (addr > 0) |
3819 | kctl->id.device = addr; | ||
3820 | if (idx > 0) | ||
3821 | kctl->id.index = idx; | ||
3824 | err = snd_hda_ctl_add(codec, 0, kctl); | 3822 | err = snd_hda_ctl_add(codec, 0, kctl); |
3825 | if (err < 0) | 3823 | if (!err) |
3824 | break; | ||
3825 | /* try first with another device index corresponding to | ||
3826 | * the codec addr; if it still fails (or it's the | ||
3827 | * primary codec), then try another control index | ||
3828 | */ | ||
3829 | if (!addr && codec->addr) | ||
3830 | addr = codec->addr; | ||
3831 | else if (!idx && !knew->index) { | ||
3832 | idx = find_empty_mixer_ctl_idx(codec, | ||
3833 | knew->name); | ||
3834 | if (idx <= 0) | ||
3835 | return err; | ||
3836 | } else | ||
3826 | return err; | 3837 | return err; |
3827 | } | 3838 | } |
3828 | } | 3839 | } |
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index cb0c23a6b473..4a663471dadc 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c | |||
@@ -189,6 +189,9 @@ static void hdmi_update_short_audio_desc(struct cea_sad *a, | |||
189 | a->channels = GRAB_BITS(buf, 0, 0, 3); | 189 | a->channels = GRAB_BITS(buf, 0, 0, 3); |
190 | a->channels++; | 190 | a->channels++; |
191 | 191 | ||
192 | a->sample_bits = 0; | ||
193 | a->max_bitrate = 0; | ||
194 | |||
192 | a->format = GRAB_BITS(buf, 0, 3, 4); | 195 | a->format = GRAB_BITS(buf, 0, 3, 4); |
193 | switch (a->format) { | 196 | switch (a->format) { |
194 | case AUDIO_CODING_TYPE_REF_STREAM_HEADER: | 197 | case AUDIO_CODING_TYPE_REF_STREAM_HEADER: |
@@ -198,7 +201,6 @@ static void hdmi_update_short_audio_desc(struct cea_sad *a, | |||
198 | 201 | ||
199 | case AUDIO_CODING_TYPE_LPCM: | 202 | case AUDIO_CODING_TYPE_LPCM: |
200 | val = GRAB_BITS(buf, 2, 0, 3); | 203 | val = GRAB_BITS(buf, 2, 0, 3); |
201 | a->sample_bits = 0; | ||
202 | for (i = 0; i < 3; i++) | 204 | for (i = 0; i < 3; i++) |
203 | if (val & (1 << i)) | 205 | if (val & (1 << i)) |
204 | a->sample_bits |= cea_sample_sizes[i + 1]; | 206 | a->sample_bits |= cea_sample_sizes[i + 1]; |
@@ -598,24 +600,19 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | |||
598 | { | 600 | { |
599 | int i; | 601 | int i; |
600 | 602 | ||
601 | pcm->rates = 0; | 603 | /* assume basic audio support (the basic audio flag is not in ELD; |
602 | pcm->formats = 0; | 604 | * however, all audio capable sinks are required to support basic |
603 | pcm->maxbps = 0; | 605 | * audio) */ |
604 | pcm->channels_min = -1; | 606 | pcm->rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000; |
605 | pcm->channels_max = 0; | 607 | pcm->formats = SNDRV_PCM_FMTBIT_S16_LE; |
608 | pcm->maxbps = 16; | ||
609 | pcm->channels_max = 2; | ||
606 | for (i = 0; i < eld->sad_count; i++) { | 610 | for (i = 0; i < eld->sad_count; i++) { |
607 | struct cea_sad *a = &eld->sad[i]; | 611 | struct cea_sad *a = &eld->sad[i]; |
608 | pcm->rates |= a->rates; | 612 | pcm->rates |= a->rates; |
609 | if (a->channels < pcm->channels_min) | ||
610 | pcm->channels_min = a->channels; | ||
611 | if (a->channels > pcm->channels_max) | 613 | if (a->channels > pcm->channels_max) |
612 | pcm->channels_max = a->channels; | 614 | pcm->channels_max = a->channels; |
613 | if (a->format == AUDIO_CODING_TYPE_LPCM) { | 615 | if (a->format == AUDIO_CODING_TYPE_LPCM) { |
614 | if (a->sample_bits & AC_SUPPCM_BITS_16) { | ||
615 | pcm->formats |= SNDRV_PCM_FMTBIT_S16_LE; | ||
616 | if (pcm->maxbps < 16) | ||
617 | pcm->maxbps = 16; | ||
618 | } | ||
619 | if (a->sample_bits & AC_SUPPCM_BITS_20) { | 616 | if (a->sample_bits & AC_SUPPCM_BITS_20) { |
620 | pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; | 617 | pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; |
621 | if (pcm->maxbps < 20) | 618 | if (pcm->maxbps < 20) |
@@ -635,7 +632,6 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | |||
635 | /* restrict the parameters by the values the codec provides */ | 632 | /* restrict the parameters by the values the codec provides */ |
636 | pcm->rates &= codec_pars->rates; | 633 | pcm->rates &= codec_pars->rates; |
637 | pcm->formats &= codec_pars->formats; | 634 | pcm->formats &= codec_pars->formats; |
638 | pcm->channels_min = max(pcm->channels_min, codec_pars->channels_min); | ||
639 | pcm->channels_max = min(pcm->channels_max, codec_pars->channels_max); | 635 | pcm->channels_max = min(pcm->channels_max, codec_pars->channels_max); |
640 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); | 636 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); |
641 | } | 637 | } |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 21aa9b0e28f6..a1c4008af891 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -2296,9 +2296,11 @@ static int azx_dev_free(struct snd_device *device) | |||
2296 | */ | 2296 | */ |
2297 | static struct snd_pci_quirk position_fix_list[] __devinitdata = { | 2297 | static struct snd_pci_quirk position_fix_list[] __devinitdata = { |
2298 | SND_PCI_QUIRK(0x1025, 0x009f, "Acer Aspire 5110", POS_FIX_LPIB), | 2298 | SND_PCI_QUIRK(0x1025, 0x009f, "Acer Aspire 5110", POS_FIX_LPIB), |
2299 | SND_PCI_QUIRK(0x1025, 0x026f, "Acer Aspire 5538", POS_FIX_LPIB), | ||
2299 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), | 2300 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), |
2300 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), | 2301 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), |
2301 | SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), | 2302 | SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), |
2303 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell Inspiron 1120", POS_FIX_LPIB), | ||
2302 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), | 2304 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), |
2303 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), | 2305 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
2304 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), | 2306 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 6361f752b5f3..76bd58a0e2b6 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -2116,8 +2116,8 @@ static void cxt5066_update_speaker(struct hda_codec *codec) | |||
2116 | struct conexant_spec *spec = codec->spec; | 2116 | struct conexant_spec *spec = codec->spec; |
2117 | unsigned int pinctl; | 2117 | unsigned int pinctl; |
2118 | 2118 | ||
2119 | snd_printdd("CXT5066: update speaker, hp_present=%d\n", | 2119 | snd_printdd("CXT5066: update speaker, hp_present=%d, cur_eapd=%d\n", |
2120 | spec->hp_present); | 2120 | spec->hp_present, spec->cur_eapd); |
2121 | 2121 | ||
2122 | /* Port A (HP) */ | 2122 | /* Port A (HP) */ |
2123 | pinctl = ((spec->hp_present & 1) && spec->cur_eapd) ? PIN_HP : 0; | 2123 | pinctl = ((spec->hp_present & 1) && spec->cur_eapd) ? PIN_HP : 0; |
@@ -2125,11 +2125,20 @@ static void cxt5066_update_speaker(struct hda_codec *codec) | |||
2125 | pinctl); | 2125 | pinctl); |
2126 | 2126 | ||
2127 | /* Port D (HP/LO) */ | 2127 | /* Port D (HP/LO) */ |
2128 | pinctl = ((spec->hp_present & 2) && spec->cur_eapd) | 2128 | if (spec->dell_automute) { |
2129 | ? spec->port_d_mode : 0; | 2129 | /* DELL AIO Port Rule: PortA> PortD> IntSpk */ |
2130 | /* Mute if Port A is connected on Thinkpad */ | 2130 | pinctl = (!(spec->hp_present & 1) && spec->cur_eapd) |
2131 | if (spec->thinkpad && (spec->hp_present & 1)) | 2131 | ? PIN_OUT : 0; |
2132 | pinctl = 0; | 2132 | } else if (spec->thinkpad) { |
2133 | if (spec->cur_eapd) | ||
2134 | pinctl = spec->port_d_mode; | ||
2135 | /* Mute dock line-out if Port A (laptop HP) is present */ | ||
2136 | if (spec->hp_present& 1) | ||
2137 | pinctl = 0; | ||
2138 | } else { | ||
2139 | pinctl = ((spec->hp_present & 2) && spec->cur_eapd) | ||
2140 | ? spec->port_d_mode : 0; | ||
2141 | } | ||
2133 | snd_hda_codec_write(codec, 0x1c, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | 2142 | snd_hda_codec_write(codec, 0x1c, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, |
2134 | pinctl); | 2143 | pinctl); |
2135 | 2144 | ||
@@ -2137,14 +2146,6 @@ static void cxt5066_update_speaker(struct hda_codec *codec) | |||
2137 | pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0; | 2146 | pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0; |
2138 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | 2147 | snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, |
2139 | pinctl); | 2148 | pinctl); |
2140 | |||
2141 | if (spec->dell_automute) { | ||
2142 | /* DELL AIO Port Rule: PortA > PortD > IntSpk */ | ||
2143 | pinctl = (!(spec->hp_present & 1) && spec->cur_eapd) | ||
2144 | ? PIN_OUT : 0; | ||
2145 | snd_hda_codec_write(codec, 0x1c, 0, | ||
2146 | AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl); | ||
2147 | } | ||
2148 | } | 2149 | } |
2149 | 2150 | ||
2150 | /* turn on/off EAPD (+ mute HP) as a master switch */ | 2151 | /* turn on/off EAPD (+ mute HP) as a master switch */ |
@@ -3095,11 +3096,11 @@ static const char *cxt5066_models[CXT5066_MODELS] = { | |||
3095 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | 3096 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
3096 | SND_PCI_QUIRK_MASK(0x1025, 0xff00, 0x0400, "Acer", CXT5066_IDEAPAD), | 3097 | SND_PCI_QUIRK_MASK(0x1025, 0xff00, 0x0400, "Acer", CXT5066_IDEAPAD), |
3097 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTRO), | 3098 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTRO), |
3098 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", | 3099 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell Vostro 320", CXT5066_IDEAPAD), |
3099 | CXT5066_DELL_LAPTOP), | ||
3100 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO), | 3100 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO), |
3101 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | 3101 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
3102 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), | 3102 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), |
3103 | SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_HP_LAPTOP), | ||
3103 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), | 3104 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), |
3104 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 3105 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
3105 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | 3106 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
@@ -3108,8 +3109,10 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
3108 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 3109 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
3109 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), | 3110 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), |
3110 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), | 3111 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), |
3112 | SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD), | ||
3111 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), | 3113 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), |
3112 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), | 3114 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), |
3115 | SND_PCI_QUIRK(0x17aa, 0x21c8, "Thinkpad Edge 11", CXT5066_IDEAPAD), | ||
3113 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), | 3116 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), |
3114 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), | 3117 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), |
3115 | SND_PCI_QUIRK(0x17aa, 0x390a, "Lenovo S10-3t", CXT5066_IDEAPAD), | 3118 | 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 d3e49aa5b9ec..31df7747990d 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -834,7 +834,6 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | |||
834 | return -ENODEV; | 834 | return -ENODEV; |
835 | } else { | 835 | } else { |
836 | /* fallback to the codec default */ | 836 | /* fallback to the codec default */ |
837 | hinfo->channels_min = codec_pars->channels_min; | ||
838 | hinfo->channels_max = codec_pars->channels_max; | 837 | hinfo->channels_max = codec_pars->channels_max; |
839 | hinfo->rates = codec_pars->rates; | 838 | hinfo->rates = codec_pars->rates; |
840 | hinfo->formats = codec_pars->formats; | 839 | hinfo->formats = codec_pars->formats; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 5f00589cb791..552a09e9211f 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -1614,6 +1614,7 @@ do_sku: | |||
1614 | spec->init_amp = ALC_INIT_GPIO3; | 1614 | spec->init_amp = ALC_INIT_GPIO3; |
1615 | break; | 1615 | break; |
1616 | case 5: | 1616 | case 5: |
1617 | default: | ||
1617 | spec->init_amp = ALC_INIT_DEFAULT; | 1618 | spec->init_amp = ALC_INIT_DEFAULT; |
1618 | break; | 1619 | break; |
1619 | } | 1620 | } |
@@ -2014,6 +2015,36 @@ static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { | |||
2014 | }; | 2015 | }; |
2015 | 2016 | ||
2016 | /* | 2017 | /* |
2018 | *ALC888 Acer Aspire 7730G model | ||
2019 | */ | ||
2020 | |||
2021 | static struct hda_verb alc888_acer_aspire_7730G_verbs[] = { | ||
2022 | /* Bias voltage on for external mic port */ | ||
2023 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, | ||
2024 | /* Front Mic: set to PIN_IN (empty by default) */ | ||
2025 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
2026 | /* Unselect Front Mic by default in input mixer 3 */ | ||
2027 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, | ||
2028 | /* Enable unsolicited event for HP jack */ | ||
2029 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
2030 | /* Enable speaker output */ | ||
2031 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2032 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2033 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
2034 | /* Enable headphone output */ | ||
2035 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, | ||
2036 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2037 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
2038 | {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
2039 | /*Enable internal subwoofer */ | ||
2040 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2041 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2042 | {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
2043 | {0x17, AC_VERB_SET_EAPD_BTLENABLE, 2}, | ||
2044 | { } | ||
2045 | }; | ||
2046 | |||
2047 | /* | ||
2017 | * ALC889 Acer Aspire 8930G model | 2048 | * ALC889 Acer Aspire 8930G model |
2018 | */ | 2049 | */ |
2019 | 2050 | ||
@@ -2200,6 +2231,16 @@ static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) | |||
2200 | spec->autocfg.speaker_pins[2] = 0x17; | 2231 | spec->autocfg.speaker_pins[2] = 0x17; |
2201 | } | 2232 | } |
2202 | 2233 | ||
2234 | static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec) | ||
2235 | { | ||
2236 | struct alc_spec *spec = codec->spec; | ||
2237 | |||
2238 | spec->autocfg.hp_pins[0] = 0x15; | ||
2239 | spec->autocfg.speaker_pins[0] = 0x14; | ||
2240 | spec->autocfg.speaker_pins[1] = 0x16; | ||
2241 | spec->autocfg.speaker_pins[2] = 0x17; | ||
2242 | } | ||
2243 | |||
2203 | static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) | 2244 | static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) |
2204 | { | 2245 | { |
2205 | struct alc_spec *spec = codec->spec; | 2246 | struct alc_spec *spec = codec->spec; |
@@ -4554,6 +4595,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { | |||
4554 | SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), | 4595 | SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), |
4555 | SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), | 4596 | SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), |
4556 | SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), | 4597 | SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), |
4598 | SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_LG), | ||
4557 | SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), | 4599 | SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), |
4558 | SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), | 4600 | SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), |
4559 | SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), | 4601 | SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), |
@@ -9524,13 +9566,6 @@ static struct hda_verb alc883_acer_eapd_verbs[] = { | |||
9524 | { } | 9566 | { } |
9525 | }; | 9567 | }; |
9526 | 9568 | ||
9527 | static struct hda_verb alc888_acer_aspire_7730G_verbs[] = { | ||
9528 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
9529 | {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, | ||
9530 | {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
9531 | { } /* end */ | ||
9532 | }; | ||
9533 | |||
9534 | static void alc888_6st_dell_setup(struct hda_codec *codec) | 9569 | static void alc888_6st_dell_setup(struct hda_codec *codec) |
9535 | { | 9570 | { |
9536 | struct alc_spec *spec = codec->spec; | 9571 | struct alc_spec *spec = codec->spec; |
@@ -9831,7 +9866,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { | |||
9831 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), | 9866 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
9832 | SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), | 9867 | SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
9833 | SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), | 9868 | SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), |
9834 | SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), | ||
9835 | SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), | 9869 | SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), |
9836 | SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), | 9870 | SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), |
9837 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), | 9871 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), |
@@ -10328,7 +10362,7 @@ static struct alc_config_preset alc882_presets[] = { | |||
10328 | .const_channel_count = 6, | 10362 | .const_channel_count = 6, |
10329 | .input_mux = &alc883_capture_source, | 10363 | .input_mux = &alc883_capture_source, |
10330 | .unsol_event = alc_automute_amp_unsol_event, | 10364 | .unsol_event = alc_automute_amp_unsol_event, |
10331 | .setup = alc888_acer_aspire_6530g_setup, | 10365 | .setup = alc888_acer_aspire_7730g_setup, |
10332 | .init_hook = alc_automute_amp, | 10366 | .init_hook = alc_automute_amp, |
10333 | }, | 10367 | }, |
10334 | [ALC883_MEDION] = { | 10368 | [ALC883_MEDION] = { |
@@ -10796,7 +10830,8 @@ static int alc_auto_add_mic_boost(struct hda_codec *codec) | |||
10796 | { | 10830 | { |
10797 | struct alc_spec *spec = codec->spec; | 10831 | struct alc_spec *spec = codec->spec; |
10798 | struct auto_pin_cfg *cfg = &spec->autocfg; | 10832 | struct auto_pin_cfg *cfg = &spec->autocfg; |
10799 | int i, err; | 10833 | int i, err, type; |
10834 | int type_idx = 0; | ||
10800 | hda_nid_t nid; | 10835 | hda_nid_t nid; |
10801 | 10836 | ||
10802 | for (i = 0; i < cfg->num_inputs; i++) { | 10837 | for (i = 0; i < cfg->num_inputs; i++) { |
@@ -10805,9 +10840,15 @@ static int alc_auto_add_mic_boost(struct hda_codec *codec) | |||
10805 | nid = cfg->inputs[i].pin; | 10840 | nid = cfg->inputs[i].pin; |
10806 | if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) { | 10841 | if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) { |
10807 | char label[32]; | 10842 | char label[32]; |
10843 | type = cfg->inputs[i].type; | ||
10844 | if (i > 0 && type == cfg->inputs[i - 1].type) | ||
10845 | type_idx++; | ||
10846 | else | ||
10847 | type_idx = 0; | ||
10808 | snprintf(label, sizeof(label), "%s Boost", | 10848 | snprintf(label, sizeof(label), "%s Boost", |
10809 | hda_get_autocfg_input_label(codec, cfg, i)); | 10849 | hda_get_autocfg_input_label(codec, cfg, i)); |
10810 | err = add_control(spec, ALC_CTL_WIDGET_VOL, label, 0, | 10850 | err = add_control(spec, ALC_CTL_WIDGET_VOL, label, |
10851 | type_idx, | ||
10811 | HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); | 10852 | HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); |
10812 | if (err < 0) | 10853 | if (err < 0) |
10813 | return err; | 10854 | return err; |
@@ -14623,7 +14664,10 @@ static int alc275_setup_dual_adc(struct hda_codec *codec) | |||
14623 | /* different alc269-variants */ | 14664 | /* different alc269-variants */ |
14624 | enum { | 14665 | enum { |
14625 | ALC269_TYPE_NORMAL, | 14666 | ALC269_TYPE_NORMAL, |
14667 | ALC269_TYPE_ALC258, | ||
14626 | ALC269_TYPE_ALC259, | 14668 | ALC269_TYPE_ALC259, |
14669 | ALC269_TYPE_ALC269VB, | ||
14670 | ALC269_TYPE_ALC270, | ||
14627 | ALC269_TYPE_ALC271X, | 14671 | ALC269_TYPE_ALC271X, |
14628 | }; | 14672 | }; |
14629 | 14673 | ||
@@ -14762,7 +14806,10 @@ static int alc269_resume(struct hda_codec *codec) | |||
14762 | 14806 | ||
14763 | enum { | 14807 | enum { |
14764 | ALC269_FIXUP_SONY_VAIO, | 14808 | ALC269_FIXUP_SONY_VAIO, |
14809 | ALC275_FIX_SONY_VAIO_GPIO2, | ||
14765 | ALC269_FIXUP_DELL_M101Z, | 14810 | ALC269_FIXUP_DELL_M101Z, |
14811 | ALC269_FIXUP_SKU_IGNORE, | ||
14812 | ALC269_FIXUP_ASUS_G73JW, | ||
14766 | }; | 14813 | }; |
14767 | 14814 | ||
14768 | static const struct alc_fixup alc269_fixups[] = { | 14815 | static const struct alc_fixup alc269_fixups[] = { |
@@ -14772,6 +14819,14 @@ static const struct alc_fixup alc269_fixups[] = { | |||
14772 | {} | 14819 | {} |
14773 | } | 14820 | } |
14774 | }, | 14821 | }, |
14822 | [ALC275_FIX_SONY_VAIO_GPIO2] = { | ||
14823 | .verbs = (const struct hda_verb[]) { | ||
14824 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, | ||
14825 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, | ||
14826 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, | ||
14827 | { } | ||
14828 | } | ||
14829 | }, | ||
14775 | [ALC269_FIXUP_DELL_M101Z] = { | 14830 | [ALC269_FIXUP_DELL_M101Z] = { |
14776 | .verbs = (const struct hda_verb[]) { | 14831 | .verbs = (const struct hda_verb[]) { |
14777 | /* Enables internal speaker */ | 14832 | /* Enables internal speaker */ |
@@ -14780,11 +14835,26 @@ static const struct alc_fixup alc269_fixups[] = { | |||
14780 | {} | 14835 | {} |
14781 | } | 14836 | } |
14782 | }, | 14837 | }, |
14838 | [ALC269_FIXUP_SKU_IGNORE] = { | ||
14839 | .sku = ALC_FIXUP_SKU_IGNORE, | ||
14840 | }, | ||
14841 | [ALC269_FIXUP_ASUS_G73JW] = { | ||
14842 | .pins = (const struct alc_pincfg[]) { | ||
14843 | { 0x17, 0x99130111 }, /* subwoofer */ | ||
14844 | { } | ||
14845 | } | ||
14846 | }, | ||
14783 | }; | 14847 | }; |
14784 | 14848 | ||
14785 | static struct snd_pci_quirk alc269_fixup_tbl[] = { | 14849 | static struct snd_pci_quirk alc269_fixup_tbl[] = { |
14850 | SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), | ||
14851 | SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), | ||
14852 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), | ||
14786 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | 14853 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
14787 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), | 14854 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), |
14855 | SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), | ||
14856 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE), | ||
14857 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), | ||
14788 | {} | 14858 | {} |
14789 | }; | 14859 | }; |
14790 | 14860 | ||
@@ -15023,7 +15093,7 @@ static int alc269_fill_coef(struct hda_codec *codec) | |||
15023 | static int patch_alc269(struct hda_codec *codec) | 15093 | static int patch_alc269(struct hda_codec *codec) |
15024 | { | 15094 | { |
15025 | struct alc_spec *spec; | 15095 | struct alc_spec *spec; |
15026 | int board_config; | 15096 | int board_config, coef; |
15027 | int err; | 15097 | int err; |
15028 | 15098 | ||
15029 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 15099 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
@@ -15034,19 +15104,29 @@ static int patch_alc269(struct hda_codec *codec) | |||
15034 | 15104 | ||
15035 | alc_auto_parse_customize_define(codec); | 15105 | alc_auto_parse_customize_define(codec); |
15036 | 15106 | ||
15037 | if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){ | 15107 | if (codec->vendor_id == 0x10ec0269) { |
15038 | if (codec->bus->pci->subsystem_vendor == 0x1025 && | 15108 | coef = alc_read_coef_idx(codec, 0); |
15039 | spec->cdefine.platform_type == 1) { | 15109 | if ((coef & 0x00f0) == 0x0010) { |
15040 | alc_codec_rename(codec, "ALC271X"); | 15110 | if (codec->bus->pci->subsystem_vendor == 0x1025 && |
15041 | spec->codec_variant = ALC269_TYPE_ALC271X; | 15111 | spec->cdefine.platform_type == 1) { |
15042 | } else { | 15112 | alc_codec_rename(codec, "ALC271X"); |
15043 | alc_codec_rename(codec, "ALC259"); | 15113 | spec->codec_variant = ALC269_TYPE_ALC271X; |
15044 | spec->codec_variant = ALC269_TYPE_ALC259; | 15114 | } else if ((coef & 0xf000) == 0x1000) { |
15045 | } | 15115 | spec->codec_variant = ALC269_TYPE_ALC270; |
15046 | } else | 15116 | } else if ((coef & 0xf000) == 0x2000) { |
15047 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | 15117 | alc_codec_rename(codec, "ALC259"); |
15048 | 15118 | spec->codec_variant = ALC269_TYPE_ALC259; | |
15049 | alc269_fill_coef(codec); | 15119 | } else if ((coef & 0xf000) == 0x3000) { |
15120 | alc_codec_rename(codec, "ALC258"); | ||
15121 | spec->codec_variant = ALC269_TYPE_ALC258; | ||
15122 | } else { | ||
15123 | alc_codec_rename(codec, "ALC269VB"); | ||
15124 | spec->codec_variant = ALC269_TYPE_ALC269VB; | ||
15125 | } | ||
15126 | } else | ||
15127 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | ||
15128 | alc269_fill_coef(codec); | ||
15129 | } | ||
15050 | 15130 | ||
15051 | board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, | 15131 | board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, |
15052 | alc269_models, | 15132 | alc269_models, |
@@ -15104,7 +15184,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
15104 | spec->stream_digital_capture = &alc269_pcm_digital_capture; | 15184 | spec->stream_digital_capture = &alc269_pcm_digital_capture; |
15105 | 15185 | ||
15106 | if (!spec->adc_nids) { /* wasn't filled automatically? use default */ | 15186 | if (!spec->adc_nids) { /* wasn't filled automatically? use default */ |
15107 | if (spec->codec_variant != ALC269_TYPE_NORMAL) { | 15187 | if (spec->codec_variant == ALC269_TYPE_NORMAL) { |
15108 | spec->adc_nids = alc269_adc_nids; | 15188 | spec->adc_nids = alc269_adc_nids; |
15109 | spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); | 15189 | spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); |
15110 | spec->capsrc_nids = alc269_capsrc_nids; | 15190 | spec->capsrc_nids = alc269_capsrc_nids; |
@@ -16898,7 +16978,7 @@ static struct alc_config_preset alc861vd_presets[] = { | |||
16898 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, | 16978 | static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, |
16899 | const struct auto_pin_cfg *cfg) | 16979 | const struct auto_pin_cfg *cfg) |
16900 | { | 16980 | { |
16901 | return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0); | 16981 | return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x22, 0); |
16902 | } | 16982 | } |
16903 | 16983 | ||
16904 | 16984 | ||
@@ -18952,6 +19032,8 @@ static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) | |||
18952 | return 0x02; | 19032 | return 0x02; |
18953 | else if (nid >= 0x0c && nid <= 0x0e) | 19033 | else if (nid >= 0x0c && nid <= 0x0e) |
18954 | return nid - 0x0c + 0x02; | 19034 | return nid - 0x0c + 0x02; |
19035 | else if (nid == 0x26) /* ALC887-VD has this DAC too */ | ||
19036 | return 0x25; | ||
18955 | else | 19037 | else |
18956 | return 0; | 19038 | return 0; |
18957 | } | 19039 | } |
@@ -18960,7 +19042,7 @@ static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) | |||
18960 | static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, | 19042 | static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, |
18961 | hda_nid_t dac) | 19043 | hda_nid_t dac) |
18962 | { | 19044 | { |
18963 | hda_nid_t mix[4]; | 19045 | hda_nid_t mix[5]; |
18964 | int i, num; | 19046 | int i, num; |
18965 | 19047 | ||
18966 | num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); | 19048 | num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); |
@@ -19298,6 +19380,7 @@ static const struct alc_fixup alc662_fixups[] = { | |||
19298 | 19380 | ||
19299 | static struct snd_pci_quirk alc662_fixup_tbl[] = { | 19381 | static struct snd_pci_quirk alc662_fixup_tbl[] = { |
19300 | SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), | 19382 | SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), |
19383 | SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), | ||
19301 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), | 19384 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), |
19302 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), | 19385 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), |
19303 | {} | 19386 | {} |
@@ -19419,7 +19502,10 @@ static int patch_alc888(struct hda_codec *codec) | |||
19419 | { | 19502 | { |
19420 | if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){ | 19503 | if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){ |
19421 | kfree(codec->chip_name); | 19504 | kfree(codec->chip_name); |
19422 | codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL); | 19505 | if (codec->vendor_id == 0x10ec0887) |
19506 | codec->chip_name = kstrdup("ALC887-VD", GFP_KERNEL); | ||
19507 | else | ||
19508 | codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL); | ||
19423 | if (!codec->chip_name) { | 19509 | if (!codec->chip_name) { |
19424 | alc_free(codec); | 19510 | alc_free(codec); |
19425 | return -ENOMEM; | 19511 | return -ENOMEM; |
@@ -19909,7 +19995,7 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = { | |||
19909 | { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", | 19995 | { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", |
19910 | .patch = patch_alc882 }, | 19996 | .patch = patch_alc882 }, |
19911 | { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, | 19997 | { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, |
19912 | { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 }, | 19998 | { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc888 }, |
19913 | { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", | 19999 | { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", |
19914 | .patch = patch_alc882 }, | 20000 | .patch = patch_alc882 }, |
19915 | { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 }, | 20001 | { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 }, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 93fa59cc60ef..f03b2ff90496 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -389,6 +389,11 @@ static hda_nid_t stac92hd83xxx_dmic_nids[STAC92HD83XXX_NUM_DMICS + 1] = { | |||
389 | 0x11, 0x20, 0 | 389 | 0x11, 0x20, 0 |
390 | }; | 390 | }; |
391 | 391 | ||
392 | #define STAC92HD87B_NUM_DMICS 1 | ||
393 | static hda_nid_t stac92hd87b_dmic_nids[STAC92HD87B_NUM_DMICS + 1] = { | ||
394 | 0x11, 0 | ||
395 | }; | ||
396 | |||
392 | #define STAC92HD83XXX_NUM_CAPS 2 | 397 | #define STAC92HD83XXX_NUM_CAPS 2 |
393 | static unsigned long stac92hd83xxx_capvols[] = { | 398 | static unsigned long stac92hd83xxx_capvols[] = { |
394 | HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT), | 399 | HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT), |
@@ -1622,6 +1627,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
1622 | static struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = { | 1627 | static struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = { |
1623 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1, | 1628 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1, |
1624 | "Alienware M17x", STAC_ALIENWARE_M17X), | 1629 | "Alienware M17x", STAC_ALIENWARE_M17X), |
1630 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a, | ||
1631 | "Alienware M17x", STAC_ALIENWARE_M17X), | ||
1625 | {} /* terminator */ | 1632 | {} /* terminator */ |
1626 | }; | 1633 | }; |
1627 | 1634 | ||
@@ -3474,6 +3481,8 @@ static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, | |||
3474 | 3481 | ||
3475 | label = hda_get_input_pin_label(codec, nid, 1); | 3482 | label = hda_get_input_pin_label(codec, nid, 1); |
3476 | snd_hda_add_imux_item(dimux, label, index, &type_idx); | 3483 | snd_hda_add_imux_item(dimux, label, index, &type_idx); |
3484 | if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1) | ||
3485 | snd_hda_add_imux_item(imux, label, index, &type_idx); | ||
3477 | 3486 | ||
3478 | err = create_elem_capture_vol(codec, nid, label, type_idx, | 3487 | err = create_elem_capture_vol(codec, nid, label, type_idx, |
3479 | HDA_INPUT); | 3488 | HDA_INPUT); |
@@ -3485,11 +3494,6 @@ static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, | |||
3485 | if (err < 0) | 3494 | if (err < 0) |
3486 | return err; | 3495 | return err; |
3487 | } | 3496 | } |
3488 | |||
3489 | if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1) { | ||
3490 | snd_hda_add_imux_item(imux, label, index, NULL); | ||
3491 | spec->num_analog_muxes++; | ||
3492 | } | ||
3493 | } | 3497 | } |
3494 | 3498 | ||
3495 | return 0; | 3499 | return 0; |
@@ -5452,12 +5456,17 @@ again: | |||
5452 | stac92hd83xxx_brd_tbl[spec->board_config]); | 5456 | stac92hd83xxx_brd_tbl[spec->board_config]); |
5453 | 5457 | ||
5454 | switch (codec->vendor_id) { | 5458 | switch (codec->vendor_id) { |
5459 | case 0x111d76d1: | ||
5460 | case 0x111d76d9: | ||
5461 | spec->dmic_nids = stac92hd87b_dmic_nids; | ||
5462 | spec->num_dmics = stac92xx_connected_ports(codec, | ||
5463 | stac92hd87b_dmic_nids, | ||
5464 | STAC92HD87B_NUM_DMICS); | ||
5465 | /* Fall through */ | ||
5455 | case 0x111d7666: | 5466 | case 0x111d7666: |
5456 | case 0x111d7667: | 5467 | case 0x111d7667: |
5457 | case 0x111d7668: | 5468 | case 0x111d7668: |
5458 | case 0x111d7669: | 5469 | case 0x111d7669: |
5459 | case 0x111d76d1: | ||
5460 | case 0x111d76d9: | ||
5461 | spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids); | 5470 | spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids); |
5462 | spec->pin_nids = stac92hd88xxx_pin_nids; | 5471 | spec->pin_nids = stac92hd88xxx_pin_nids; |
5463 | spec->mono_nid = 0; | 5472 | spec->mono_nid = 0; |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 400f9ebd243e..629a5494347a 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 |
diff --git a/sound/pci/mixart/mixart_hwdep.h b/sound/pci/mixart/mixart_hwdep.h index a46f5083db99..812e288ef2e7 100644 --- a/sound/pci/mixart/mixart_hwdep.h +++ b/sound/pci/mixart/mixart_hwdep.h | |||
@@ -25,11 +25,21 @@ | |||
25 | 25 | ||
26 | #include <sound/hwdep.h> | 26 | #include <sound/hwdep.h> |
27 | 27 | ||
28 | #ifndef readl_be | ||
28 | #define readl_be(x) be32_to_cpu(__raw_readl(x)) | 29 | #define readl_be(x) be32_to_cpu(__raw_readl(x)) |
30 | #endif | ||
31 | |||
32 | #ifndef writel_be | ||
29 | #define writel_be(data,addr) __raw_writel(cpu_to_be32(data),addr) | 33 | #define writel_be(data,addr) __raw_writel(cpu_to_be32(data),addr) |
34 | #endif | ||
30 | 35 | ||
36 | #ifndef readl_le | ||
31 | #define readl_le(x) le32_to_cpu(__raw_readl(x)) | 37 | #define readl_le(x) le32_to_cpu(__raw_readl(x)) |
38 | #endif | ||
39 | |||
40 | #ifndef writel_le | ||
32 | #define writel_le(data,addr) __raw_writel(cpu_to_le32(data),addr) | 41 | #define writel_le(data,addr) __raw_writel(cpu_to_le32(data),addr) |
42 | #endif | ||
33 | 43 | ||
34 | #define MIXART_MEM(mgr,x) ((mgr)->mem[0].virt + (x)) | 44 | #define MIXART_MEM(mgr,x) ((mgr)->mem[0].virt + (x)) |
35 | #define MIXART_REG(mgr,x) ((mgr)->mem[1].virt + (x)) | 45 | #define MIXART_REG(mgr,x) ((mgr)->mem[1].virt + (x)) |