diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-01-10 04:49:13 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-01-10 04:49:13 -0500 |
commit | 70c673a48072ff73425b82800479e66f918b8718 (patch) | |
tree | b8a98710f97ff69c51fa5ba158f403059fd30632 /sound/pci | |
parent | 10528020d7323778b60c2de04754a2615a88d002 (diff) | |
parent | e03fa055bc126e536c7f65862e08a9b143138ea9 (diff) |
Merge branch 'fix/hda' into topic/hda
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 57 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 57 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 5 |
4 files changed, 72 insertions, 48 deletions
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_intel.c b/sound/pci/hda/hda_intel.c index b030c8eba21f..a1c4008af891 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -2300,6 +2300,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { | |||
2300 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), | 2300 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), |
2301 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), | 2301 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), |
2302 | 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), | ||
2303 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), | 2304 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), |
2304 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), | 2305 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
2305 | 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_realtek.c b/sound/pci/hda/patch_realtek.c index cad88f476acc..f39efa440c0f 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -14795,6 +14795,7 @@ static int alc269_resume(struct hda_codec *codec) | |||
14795 | 14795 | ||
14796 | enum { | 14796 | enum { |
14797 | ALC269_FIXUP_SONY_VAIO, | 14797 | ALC269_FIXUP_SONY_VAIO, |
14798 | ALC275_FIX_SONY_VAIO_GPIO2, | ||
14798 | ALC269_FIXUP_DELL_M101Z, | 14799 | ALC269_FIXUP_DELL_M101Z, |
14799 | ALC269_FIXUP_SKU_IGNORE, | 14800 | ALC269_FIXUP_SKU_IGNORE, |
14800 | ALC269_FIXUP_ASUS_G73JW, | 14801 | ALC269_FIXUP_ASUS_G73JW, |
@@ -14807,6 +14808,14 @@ static const struct alc_fixup alc269_fixups[] = { | |||
14807 | {} | 14808 | {} |
14808 | } | 14809 | } |
14809 | }, | 14810 | }, |
14811 | [ALC275_FIX_SONY_VAIO_GPIO2] = { | ||
14812 | .verbs = (const struct hda_verb[]) { | ||
14813 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, | ||
14814 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, | ||
14815 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, | ||
14816 | { } | ||
14817 | } | ||
14818 | }, | ||
14810 | [ALC269_FIXUP_DELL_M101Z] = { | 14819 | [ALC269_FIXUP_DELL_M101Z] = { |
14811 | .verbs = (const struct hda_verb[]) { | 14820 | .verbs = (const struct hda_verb[]) { |
14812 | /* Enables internal speaker */ | 14821 | /* Enables internal speaker */ |
@@ -14827,6 +14836,9 @@ static const struct alc_fixup alc269_fixups[] = { | |||
14827 | }; | 14836 | }; |
14828 | 14837 | ||
14829 | static struct snd_pci_quirk alc269_fixup_tbl[] = { | 14838 | static struct snd_pci_quirk alc269_fixup_tbl[] = { |
14839 | SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), | ||
14840 | SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), | ||
14841 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), | ||
14830 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | 14842 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
14831 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), | 14843 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), |
14832 | SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), | 14844 | SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), |
@@ -15081,28 +15093,29 @@ static int patch_alc269(struct hda_codec *codec) | |||
15081 | 15093 | ||
15082 | alc_auto_parse_customize_define(codec); | 15094 | alc_auto_parse_customize_define(codec); |
15083 | 15095 | ||
15084 | coef = alc_read_coef_idx(codec, 0); | 15096 | if (codec->vendor_id == 0x10ec0269) { |
15085 | if ((coef & 0x00f0) == 0x0010) { | 15097 | coef = alc_read_coef_idx(codec, 0); |
15086 | if (codec->bus->pci->subsystem_vendor == 0x1025 && | 15098 | if ((coef & 0x00f0) == 0x0010) { |
15087 | spec->cdefine.platform_type == 1) { | 15099 | if (codec->bus->pci->subsystem_vendor == 0x1025 && |
15088 | alc_codec_rename(codec, "ALC271X"); | 15100 | spec->cdefine.platform_type == 1) { |
15089 | spec->codec_variant = ALC269_TYPE_ALC271X; | 15101 | alc_codec_rename(codec, "ALC271X"); |
15090 | } else if ((coef & 0xf000) == 0x1000) { | 15102 | spec->codec_variant = ALC269_TYPE_ALC271X; |
15091 | spec->codec_variant = ALC269_TYPE_ALC270; | 15103 | } else if ((coef & 0xf000) == 0x1000) { |
15092 | } else if ((coef & 0xf000) == 0x2000) { | 15104 | spec->codec_variant = ALC269_TYPE_ALC270; |
15093 | alc_codec_rename(codec, "ALC259"); | 15105 | } else if ((coef & 0xf000) == 0x2000) { |
15094 | spec->codec_variant = ALC269_TYPE_ALC259; | 15106 | alc_codec_rename(codec, "ALC259"); |
15095 | } else if ((coef & 0xf000) == 0x3000) { | 15107 | spec->codec_variant = ALC269_TYPE_ALC259; |
15096 | alc_codec_rename(codec, "ALC258"); | 15108 | } else if ((coef & 0xf000) == 0x3000) { |
15097 | spec->codec_variant = ALC269_TYPE_ALC258; | 15109 | alc_codec_rename(codec, "ALC258"); |
15098 | } else { | 15110 | spec->codec_variant = ALC269_TYPE_ALC258; |
15099 | alc_codec_rename(codec, "ALC269VB"); | 15111 | } else { |
15100 | spec->codec_variant = ALC269_TYPE_ALC269VB; | 15112 | alc_codec_rename(codec, "ALC269VB"); |
15101 | } | 15113 | spec->codec_variant = ALC269_TYPE_ALC269VB; |
15102 | } else | 15114 | } |
15103 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | 15115 | } else |
15104 | 15116 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | |
15105 | alc269_fill_coef(codec); | 15117 | alc269_fill_coef(codec); |
15118 | } | ||
15106 | 15119 | ||
15107 | board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, | 15120 | board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, |
15108 | alc269_models, | 15121 | alc269_models, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 8e2bb0aad0ae..6131a92f0898 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -3481,6 +3481,8 @@ static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, | |||
3481 | 3481 | ||
3482 | label = hda_get_input_pin_label(codec, nid, 1); | 3482 | label = hda_get_input_pin_label(codec, nid, 1); |
3483 | 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); | ||
3484 | 3486 | ||
3485 | err = create_elem_capture_vol(codec, nid, label, type_idx, | 3487 | err = create_elem_capture_vol(codec, nid, label, type_idx, |
3486 | HDA_INPUT); | 3488 | HDA_INPUT); |
@@ -3492,9 +3494,6 @@ static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, | |||
3492 | if (err < 0) | 3494 | if (err < 0) |
3493 | return err; | 3495 | return err; |
3494 | } | 3496 | } |
3495 | |||
3496 | if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1) | ||
3497 | snd_hda_add_imux_item(imux, label, index, NULL); | ||
3498 | } | 3497 | } |
3499 | 3498 | ||
3500 | return 0; | 3499 | return 0; |