diff options
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 1e2d3bfe4a62..a074155dd8d5 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -139,6 +139,7 @@ struct sigmatel_spec { | |||
139 | hda_nid_t *dmic_nids; | 139 | hda_nid_t *dmic_nids; |
140 | unsigned int num_dmics; | 140 | unsigned int num_dmics; |
141 | hda_nid_t *dmux_nids; | 141 | hda_nid_t *dmux_nids; |
142 | unsigned int num_dmuxes; | ||
142 | hda_nid_t dig_in_nid; | 143 | hda_nid_t dig_in_nid; |
143 | 144 | ||
144 | /* pin widgets */ | 145 | /* pin widgets */ |
@@ -244,6 +245,10 @@ static hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = { | |||
244 | 0x15, 0 | 245 | 0x15, 0 |
245 | }; | 246 | }; |
246 | 247 | ||
248 | static hda_nid_t stac925x_dmux_nids[1] = { | ||
249 | 0x14, | ||
250 | }; | ||
251 | |||
247 | static hda_nid_t stac922x_adc_nids[2] = { | 252 | static hda_nid_t stac922x_adc_nids[2] = { |
248 | 0x06, 0x07, | 253 | 0x06, 0x07, |
249 | }; | 254 | }; |
@@ -278,7 +283,7 @@ static hda_nid_t stac9205_mux_nids[2] = { | |||
278 | }; | 283 | }; |
279 | 284 | ||
280 | static hda_nid_t stac9205_dmux_nids[1] = { | 285 | static hda_nid_t stac9205_dmux_nids[1] = { |
281 | 0x1d, | 286 | 0x1d, |
282 | }; | 287 | }; |
283 | 288 | ||
284 | #define STAC9205_NUM_DMICS 2 | 289 | #define STAC9205_NUM_DMICS 2 |
@@ -596,16 +601,6 @@ static struct hda_verb stac9205_core_init[] = { | |||
596 | {} | 601 | {} |
597 | }; | 602 | }; |
598 | 603 | ||
599 | #define STAC_DIGITAL_INPUT_SOURCE(cnt) \ | ||
600 | { \ | ||
601 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | ||
602 | .name = "Digital Input Source", \ | ||
603 | .count = cnt, \ | ||
604 | .info = stac92xx_dmux_enum_info, \ | ||
605 | .get = stac92xx_dmux_enum_get, \ | ||
606 | .put = stac92xx_dmux_enum_put,\ | ||
607 | } | ||
608 | |||
609 | #define STAC_INPUT_SOURCE(cnt) \ | 604 | #define STAC_INPUT_SOURCE(cnt) \ |
610 | { \ | 605 | { \ |
611 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ | 606 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ |
@@ -638,7 +633,6 @@ static struct snd_kcontrol_new stac9200_mixer[] = { | |||
638 | }; | 633 | }; |
639 | 634 | ||
640 | static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = { | 635 | static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = { |
641 | STAC_DIGITAL_INPUT_SOURCE(2), | ||
642 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3), | 636 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3), |
643 | 637 | ||
644 | /* hardware gain controls */ | 638 | /* hardware gain controls */ |
@@ -669,7 +663,6 @@ static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = { | |||
669 | }; | 663 | }; |
670 | 664 | ||
671 | static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | 665 | static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { |
672 | STAC_DIGITAL_INPUT_SOURCE(2), | ||
673 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4), | 666 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4), |
674 | 667 | ||
675 | /* hardware gain controls */ | 668 | /* hardware gain controls */ |
@@ -700,7 +693,6 @@ static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | |||
700 | }; | 693 | }; |
701 | 694 | ||
702 | static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { | 695 | static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { |
703 | STAC_DIGITAL_INPUT_SOURCE(2), | ||
704 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5), | 696 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5), |
705 | 697 | ||
706 | /* hardware gain controls */ | 698 | /* hardware gain controls */ |
@@ -731,7 +723,6 @@ static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { | |||
731 | }; | 723 | }; |
732 | 724 | ||
733 | static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { | 725 | static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { |
734 | STAC_DIGITAL_INPUT_SOURCE(1), | ||
735 | STAC_INPUT_SOURCE(2), | 726 | STAC_INPUT_SOURCE(2), |
736 | 727 | ||
737 | /* hardware gain controls */ | 728 | /* hardware gain controls */ |
@@ -752,7 +743,6 @@ static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { | |||
752 | }; | 743 | }; |
753 | 744 | ||
754 | static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { | 745 | static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { |
755 | STAC_DIGITAL_INPUT_SOURCE(1), | ||
756 | STAC_INPUT_SOURCE(2), | 746 | STAC_INPUT_SOURCE(2), |
757 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2), | 747 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2), |
758 | 748 | ||
@@ -779,7 +769,6 @@ static struct snd_kcontrol_new stac925x_mixer[] = { | |||
779 | }; | 769 | }; |
780 | 770 | ||
781 | static struct snd_kcontrol_new stac9205_mixer[] = { | 771 | static struct snd_kcontrol_new stac9205_mixer[] = { |
782 | STAC_DIGITAL_INPUT_SOURCE(1), | ||
783 | STAC_INPUT_SOURCE(2), | 772 | STAC_INPUT_SOURCE(2), |
784 | STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1), | 773 | STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1), |
785 | 774 | ||
@@ -809,7 +798,6 @@ static struct snd_kcontrol_new stac922x_mixer[] = { | |||
809 | 798 | ||
810 | 799 | ||
811 | static struct snd_kcontrol_new stac927x_mixer[] = { | 800 | static struct snd_kcontrol_new stac927x_mixer[] = { |
812 | STAC_DIGITAL_INPUT_SOURCE(1), | ||
813 | STAC_INPUT_SOURCE(3), | 801 | STAC_INPUT_SOURCE(3), |
814 | STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1), | 802 | STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1), |
815 | 803 | ||
@@ -827,6 +815,15 @@ static struct snd_kcontrol_new stac927x_mixer[] = { | |||
827 | { } /* end */ | 815 | { } /* end */ |
828 | }; | 816 | }; |
829 | 817 | ||
818 | static struct snd_kcontrol_new stac_dmux_mixer = { | ||
819 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
820 | .name = "Digital Input Source", | ||
821 | /* count set later */ | ||
822 | .info = stac92xx_dmux_enum_info, | ||
823 | .get = stac92xx_dmux_enum_get, | ||
824 | .put = stac92xx_dmux_enum_put, | ||
825 | }; | ||
826 | |||
830 | static int stac92xx_build_controls(struct hda_codec *codec) | 827 | static int stac92xx_build_controls(struct hda_codec *codec) |
831 | { | 828 | { |
832 | struct sigmatel_spec *spec = codec->spec; | 829 | struct sigmatel_spec *spec = codec->spec; |
@@ -842,6 +839,13 @@ static int stac92xx_build_controls(struct hda_codec *codec) | |||
842 | if (err < 0) | 839 | if (err < 0) |
843 | return err; | 840 | return err; |
844 | } | 841 | } |
842 | if (spec->num_dmuxes > 0) { | ||
843 | stac_dmux_mixer.count = spec->num_dmuxes; | ||
844 | err = snd_ctl_add(codec->bus->card, | ||
845 | snd_ctl_new1(&stac_dmux_mixer, codec)); | ||
846 | if (err < 0) | ||
847 | return err; | ||
848 | } | ||
845 | 849 | ||
846 | if (spec->multiout.dig_out_nid) { | 850 | if (spec->multiout.dig_out_nid) { |
847 | err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid); | 851 | err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid); |
@@ -2967,6 +2971,8 @@ static int patch_stac925x(struct hda_codec *codec) | |||
2967 | case 0x83847637: /* STAC9251D */ | 2971 | case 0x83847637: /* STAC9251D */ |
2968 | spec->num_dmics = STAC925X_NUM_DMICS; | 2972 | spec->num_dmics = STAC925X_NUM_DMICS; |
2969 | spec->dmic_nids = stac925x_dmic_nids; | 2973 | spec->dmic_nids = stac925x_dmic_nids; |
2974 | spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids); | ||
2975 | spec->dmux_nids = stac925x_dmux_nids; | ||
2970 | break; | 2976 | break; |
2971 | default: | 2977 | default: |
2972 | spec->num_dmics = 0; | 2978 | spec->num_dmics = 0; |
@@ -3075,6 +3081,7 @@ again: | |||
3075 | spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids); | 3081 | spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids); |
3076 | spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids); | 3082 | spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids); |
3077 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; | 3083 | spec->num_dmics = STAC92HD73XX_NUM_DMICS; |
3084 | spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids); | ||
3078 | spec->dinput_mux = &stac92hd73xx_dmux; | 3085 | spec->dinput_mux = &stac92hd73xx_dmux; |
3079 | /* GPIO0 High = Enable EAPD */ | 3086 | /* GPIO0 High = Enable EAPD */ |
3080 | spec->gpio_mask = spec->gpio_data = 0x000001; | 3087 | spec->gpio_mask = spec->gpio_data = 0x000001; |
@@ -3160,6 +3167,7 @@ again: | |||
3160 | spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids); | 3167 | spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids); |
3161 | spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids); | 3168 | spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids); |
3162 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; | 3169 | spec->num_dmics = STAC92HD71BXX_NUM_DMICS; |
3170 | spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); | ||
3163 | 3171 | ||
3164 | spec->multiout.num_dacs = 2; | 3172 | spec->multiout.num_dacs = 2; |
3165 | spec->multiout.hp_nid = 0x11; | 3173 | spec->multiout.hp_nid = 0x11; |
@@ -3345,6 +3353,7 @@ static int patch_stac927x(struct hda_codec *codec) | |||
3345 | spec->init = d965_core_init; | 3353 | spec->init = d965_core_init; |
3346 | spec->mixer = stac927x_mixer; | 3354 | spec->mixer = stac927x_mixer; |
3347 | spec->dmux_nids = stac927x_dmux_nids; | 3355 | spec->dmux_nids = stac927x_dmux_nids; |
3356 | spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids); | ||
3348 | break; | 3357 | break; |
3349 | default: | 3358 | default: |
3350 | /* GPIO0 High = Enable EAPD */ | 3359 | /* GPIO0 High = Enable EAPD */ |
@@ -3415,6 +3424,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
3415 | spec->dmic_nids = stac9205_dmic_nids; | 3424 | spec->dmic_nids = stac9205_dmic_nids; |
3416 | spec->num_dmics = STAC9205_NUM_DMICS; | 3425 | spec->num_dmics = STAC9205_NUM_DMICS; |
3417 | spec->dmux_nids = stac9205_dmux_nids; | 3426 | spec->dmux_nids = stac9205_dmux_nids; |
3427 | spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids); | ||
3418 | 3428 | ||
3419 | spec->init = stac9205_core_init; | 3429 | spec->init = stac9205_core_init; |
3420 | spec->mixer = stac9205_mixer; | 3430 | spec->mixer = stac9205_mixer; |