aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_cmedia.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2005-04-20 07:45:55 -0400
committerJaroslav Kysela <perex@suse.cz>2005-05-29 04:04:58 -0400
commitd21b37ea134921f807ebdbd19ae3cd00bb8bf2fc (patch)
tree741a393951e7ec2767dec695cb0d9f665f28e287 /sound/pci/hda/patch_cmedia.c
parentb0c95f514a4057720958c9ea0113229468c94b2b (diff)
[ALSA] Fix and cleanup of CM9880 auto-configuration
HDA Codec driver Fix and cleanup of CM9880 automatic PIN configuration. snd_hda_codec_setup_stream() doesn't do anything when NID is 0. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/patch_cmedia.c')
-rw-r--r--sound/pci/hda/patch_cmedia.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/sound/pci/hda/patch_cmedia.c b/sound/pci/hda/patch_cmedia.c
index e64e29dac82..087230ca20a 100644
--- a/sound/pci/hda/patch_cmedia.c
+++ b/sound/pci/hda/patch_cmedia.c
@@ -365,7 +365,6 @@ static int cmi9880_build_controls(struct hda_codec *codec)
365 return 0; 365 return 0;
366} 366}
367 367
368#define AC_DEFCFG_ASSOC_SHIFT 4
369#define get_defcfg_connect(cfg) ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT) 368#define get_defcfg_connect(cfg) ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
370#define get_defcfg_association(cfg) ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT) 369#define get_defcfg_association(cfg) ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT)
371#define get_defcfg_sequence(cfg) (cfg & AC_DEFCFG_SEQUENCE) 370#define get_defcfg_sequence(cfg) (cfg & AC_DEFCFG_SEQUENCE)
@@ -796,6 +795,7 @@ static int patch_cmi9880(struct hda_codec *codec)
796 { 795 {
797 unsigned int port_e, port_f, port_g, port_h; 796 unsigned int port_e, port_f, port_g, port_h;
798 unsigned int port_spdifi, port_spdifo; 797 unsigned int port_spdifi, port_spdifo;
798 int max_channels;
799 /* collect pin default configuration */ 799 /* collect pin default configuration */
800 cmi9880_get_pin_def_config(codec); 800 cmi9880_get_pin_def_config(codec);
801 port_e = cmi9880_get_def_config(codec, 0x0f); 801 port_e = cmi9880_get_def_config(codec, 0x0f);
@@ -805,33 +805,40 @@ static int patch_cmi9880(struct hda_codec *codec)
805 port_spdifi = cmi9880_get_def_config(codec, 0x13); 805 port_spdifi = cmi9880_get_def_config(codec, 0x13);
806 port_spdifo = cmi9880_get_def_config(codec, 0x12); 806 port_spdifo = cmi9880_get_def_config(codec, 0x12);
807 spec->front_panel = 1; 807 spec->front_panel = 1;
808 if ((get_defcfg_connect(port_e) == AC_JACK_PORT_NONE) 808 if (get_defcfg_connect(port_e) == AC_JACK_PORT_NONE ||
809 || (get_defcfg_connect(port_f) == AC_JACK_PORT_NONE)) { 809 get_defcfg_connect(port_f) == AC_JACK_PORT_NONE) {
810 spec->surr_switch = 1; 810 spec->surr_switch = 1;
811 /* no front panel */ 811 /* no front panel */
812 if ((get_defcfg_connect(port_g) == AC_JACK_PORT_NONE) 812 if (get_defcfg_connect(port_g) == AC_JACK_PORT_NONE ||
813 || (get_defcfg_connect(port_h) == AC_JACK_PORT_NONE)) { 813 get_defcfg_connect(port_h) == AC_JACK_PORT_NONE) {
814 /* no optional rear panel */ 814 /* no optional rear panel */
815 spec->board_config = CMI_MINIMAL; 815 spec->board_config = CMI_MINIMAL;
816 spec->front_panel = 0; 816 spec->front_panel = 0;
817 spec->num_ch_modes = 2; 817 spec->num_ch_modes = 2;
818 } else 818 } else {
819 spec->board_config = CMI_MIN_FP; 819 spec->board_config = CMI_MIN_FP;
820 spec->num_ch_modes = 3; 820 spec->num_ch_modes = 3;
821 }
821 spec->channel_modes = cmi9880_channel_modes; 822 spec->channel_modes = cmi9880_channel_modes;
822 spec->input_mux = &cmi9880_basic_mux; 823 spec->input_mux = &cmi9880_basic_mux;
824 spec->multiout.max_channels = cmi9880_channel_modes[0].channels;
823 } else { 825 } else {
824 spec->input_mux = &cmi9880_basic_mux; 826 spec->input_mux = &cmi9880_basic_mux;
825 if (get_defcfg_connect(port_spdifo) != 1) 827 if (get_defcfg_connect(port_spdifo) != AC_JACK_PORT_NONE)
826 spec->multiout.dig_out_nid = CMI_DIG_OUT_NID; 828 spec->multiout.dig_out_nid = CMI_DIG_OUT_NID;
827 if (get_defcfg_connect(port_spdifi) != 1) 829 if (get_defcfg_connect(port_spdifi) != AC_JACK_PORT_NONE)
828 spec->dig_in_nid = CMI_DIG_IN_NID; 830 spec->dig_in_nid = CMI_DIG_IN_NID;
831 spec->multiout.max_channels = 8;
829 } 832 }
830 spec->multiout.max_channels = cmi9880_get_multich_pins(codec); 833 max_channels = cmi9880_get_multich_pins(codec);
831 cmi9880_fill_multi_dac_nids(codec); 834 if (max_channels > 0) {
832 cmi9880_fill_multi_init(codec); 835 spec->multiout.max_channels = max_channels;
833 } 836 cmi9880_fill_multi_dac_nids(codec);
837 cmi9880_fill_multi_init(codec);
838 } else
839 snd_printd("patch_cmedia: cannot detect association in defcfg\n");
834 break; 840 break;
841 }
835 } 842 }
836 843
837 spec->multiout.num_dacs = 4; 844 spec->multiout.num_dacs = 4;