[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>
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 890b756..44fac21 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -549,6 +549,9 @@
 void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag,
 				int channel_id, int format)
 {
+	if (! nid)
+		return;
+
 	snd_printdd("hda_codec_setup_stream: NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n",
 		    nid, stream_tag, channel_id, format);
 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID,
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
index 263f5b6..43fc245 100644
--- a/sound/pci/hda/hda_codec.h
+++ b/sound/pci/hda/hda_codec.h
@@ -259,7 +259,9 @@
 /* configuration default - 32bit */
 #define AC_DEFCFG_SEQUENCE		(0xf<<0)
 #define AC_DEFCFG_DEF_ASSOC		(0xf<<4)
+#define AC_DEFCFG_ASSOC_SHIFT		4
 #define AC_DEFCFG_MISC			(0xf<<8)
+#define AC_DEFCFG_MISC_SHIFT		8
 #define AC_DEFCFG_COLOR			(0xf<<12)
 #define AC_DEFCFG_COLOR_SHIFT		12
 #define AC_DEFCFG_CONN_TYPE		(0xf<<16)
diff --git a/sound/pci/hda/patch_cmedia.c b/sound/pci/hda/patch_cmedia.c
index e64e29d..087230c 100644
--- a/sound/pci/hda/patch_cmedia.c
+++ b/sound/pci/hda/patch_cmedia.c
@@ -365,7 +365,6 @@
 	return 0;
 }
 
-#define AC_DEFCFG_ASSOC_SHIFT		4
 #define get_defcfg_connect(cfg) ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
 #define get_defcfg_association(cfg) ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT)
 #define get_defcfg_sequence(cfg) (cfg & AC_DEFCFG_SEQUENCE)
@@ -796,6 +795,7 @@
 		{
 		unsigned int port_e, port_f, port_g, port_h;
 		unsigned int port_spdifi, port_spdifo;
+		int max_channels;
 		/* collect pin default configuration */
 		cmi9880_get_pin_def_config(codec);
 		port_e = cmi9880_get_def_config(codec, 0x0f);
@@ -805,33 +805,40 @@
 		port_spdifi = cmi9880_get_def_config(codec, 0x13);
 		port_spdifo = cmi9880_get_def_config(codec, 0x12);
 		spec->front_panel = 1;
-		if ((get_defcfg_connect(port_e) == AC_JACK_PORT_NONE)
-		|| (get_defcfg_connect(port_f) == AC_JACK_PORT_NONE)) {
+		if (get_defcfg_connect(port_e) == AC_JACK_PORT_NONE ||
+		    get_defcfg_connect(port_f) == AC_JACK_PORT_NONE) {
 			spec->surr_switch = 1;
 			/* no front panel */
-			if ((get_defcfg_connect(port_g) == AC_JACK_PORT_NONE)
-			|| (get_defcfg_connect(port_h) == AC_JACK_PORT_NONE)) {
+			if (get_defcfg_connect(port_g) == AC_JACK_PORT_NONE ||
+			    get_defcfg_connect(port_h) == AC_JACK_PORT_NONE) {
 				/* no optional rear panel */
 				spec->board_config = CMI_MINIMAL;
 				spec->front_panel = 0;
 				spec->num_ch_modes = 2;
-			} else
+			} else {
 				spec->board_config = CMI_MIN_FP;
 				spec->num_ch_modes = 3;
+			}
 			spec->channel_modes = cmi9880_channel_modes;
 			spec->input_mux = &cmi9880_basic_mux;
+			spec->multiout.max_channels = cmi9880_channel_modes[0].channels;
 		} else {
 			spec->input_mux = &cmi9880_basic_mux;
-			if (get_defcfg_connect(port_spdifo) != 1)
+			if (get_defcfg_connect(port_spdifo) != AC_JACK_PORT_NONE)
 				spec->multiout.dig_out_nid = CMI_DIG_OUT_NID;
-			if (get_defcfg_connect(port_spdifi) != 1)
+			if (get_defcfg_connect(port_spdifi) != AC_JACK_PORT_NONE)
 				spec->dig_in_nid = CMI_DIG_IN_NID;
+			spec->multiout.max_channels = 8;
 		}
-		spec->multiout.max_channels = cmi9880_get_multich_pins(codec);
-		cmi9880_fill_multi_dac_nids(codec);
-		cmi9880_fill_multi_init(codec);
-		}
+		max_channels = cmi9880_get_multich_pins(codec);
+		if (max_channels > 0) {
+			spec->multiout.max_channels = max_channels;
+			cmi9880_fill_multi_dac_nids(codec);
+			cmi9880_fill_multi_init(codec);
+		} else
+			snd_printd("patch_cmedia: cannot detect association in defcfg\n");
 		break;
+		}
 	}
 
 	spec->multiout.num_dacs = 4;