Index: uspace/drv/audio/hdaudio/codec.c
===================================================================
--- uspace/drv/audio/hdaudio/codec.c	(revision 1e92bc3cc88d4455847afe91816a6ee1d5e5c7a0)
+++ uspace/drv/audio/hdaudio/codec.c	(revision 9bae8b8467b01e234f398239ea6e3b85d3062042)
@@ -49,7 +49,18 @@
 {
 	uint32_t verb;
+	uint32_t myresp;
+
+	if (resp == NULL)
+		resp = &myresp;
 
 	verb = (codec->address << 28) | (node << 20) | (vid << 8) | payload;
-	return hda_cmd(codec->hda, verb, resp);
+	int rc = hda_cmd(codec->hda, verb, resp);
+	if (resp != NULL) {
+		ddf_msg(LVL_NOTE, "verb 0x%" PRIx32 " -> 0x%" PRIx32, verb,
+		    *resp);
+	} else {
+		ddf_msg(LVL_NOTE, "verb 0x%" PRIx32, verb);
+	}
+	return rc;
 }
 
@@ -95,4 +106,25 @@
 }
 
+static int hda_get_clist_len(hda_codec_t *codec, int node, bool *longform,
+    int *items)
+{
+	int rc;
+	uint32_t resp;
+
+	rc = hda_get_parameter(codec, node, hda_clist_len, &resp);
+	if (rc != EOK)
+		return rc;
+
+//	ddf_msg(LVL_NOTE, "hda_get_clist_len: resp=0x%x", resp);
+	*longform = resp & BIT_V(uint32_t, cll_longform);
+	*items = resp & BIT_RANGE_EXTRACT(uint32_t, cll_len_h, cll_len_l, resp);
+	return EOK;
+}
+
+static int hda_get_clist_entry(hda_codec_t *codec, int node, int n, uint32_t *resp)
+{
+	return hda_ccmd(codec, node, hda_clist_entry_get, n, resp);
+}
+
 /** Get Suppported PCM Size, Rates */
 static int hda_get_supp_rates(hda_codec_t *codec, int node, uint32_t *rates)
@@ -144,13 +176,25 @@
 }
 
+static int hda_get_conn_sel(hda_codec_t *codec, int node, uint32_t *conn)
+{
+	return hda_ccmd(codec, node, hda_conn_sel_get, 0, conn);
+}
+
 /** Get Amplifier Gain / Mute  */
 static int hda_get_amp_gain_mute(hda_codec_t *codec, int node, uint16_t payload,
     uint32_t *resp)
 {
-	return hda_ccmd(codec, node, hda_amp_gain_mute_get, payload, resp);
+//	ddf_msg(LVL_NOTE, "hda_get_amp_gain_mute(codec, %d, %x)",
+//	    node, payload);
+	int rc = hda_ccmd(codec, node, hda_amp_gain_mute_get, payload, resp);
+//	ddf_msg(LVL_NOTE, "hda_get_amp_gain_mute(codec, %d, %x, resp=%x)",
+//	    node, payload, *resp);
+	return rc;
 }
 
 static int hda_set_amp_gain_mute(hda_codec_t *codec, int node, uint16_t payload)
 {
+//	ddf_msg(LVL_NOTE, "hda_set_amp_gain_mute(codec, %d, %x)",
+//	    node, payload);
 	return hda_ccmd(codec, node, hda_amp_gain_mute_set, payload, NULL);
 }
@@ -176,8 +220,8 @@
 		goto error;
 
-	ddf_msg(LVL_NOTE, "out amp caps 0x%x "
+	offset = ampcaps & 0x7f;
+	ddf_msg(LVL_NOTE, "out amp caps 0x%x (offset=0x%x)"
 	    "gain/mute: L:0x%x R:0x%x",
-	    ampcaps, gmleft, gmright);
-	offset = ampcaps & 0x7f;
+	    ampcaps, offset, gmleft, gmright);
 
 	rc = hda_set_amp_gain_mute(codec, aw, 0xb000 + offset);
@@ -203,6 +247,6 @@
 		goto error;
 
-	ddf_msg(LVL_NOTE, "in amp caps 0x%x ", ampcaps);
 	offset = ampcaps & 0x7f;
+	ddf_msg(LVL_NOTE, "in amp caps 0x%x (offset=0x%x)", ampcaps, offset);
 
 	for (i = 0; i < 15; i++) {
@@ -225,4 +269,66 @@
 	return EOK;
 error:
+	return rc;
+}
+
+static int hda_clist_dump(hda_codec_t *codec, uint8_t aw)
+{
+	int rc;
+	bool longform;
+	int len;
+	uint32_t resp;
+	uint32_t mask;
+	uint32_t cidx;
+	int shift;
+	int epresp;
+	int i, j;
+
+	ddf_msg(LVL_NOTE, "Connections for widget %d:", aw);
+
+	rc = hda_get_clist_len(codec, aw, &longform, &len);
+	if (rc != EOK) {
+		ddf_msg(LVL_ERROR, "Failed getting connection list length.");
+		return rc;
+	}
+
+	if (len > 1) {
+		rc = hda_get_conn_sel(codec, aw, &cidx);
+		if (rc != EOK) {
+			ddf_msg(LVL_ERROR, "Failed getting connection select");
+			return rc;
+		}
+	} else {
+		cidx = 0;
+	}
+
+//	ddf_msg(LVL_NOTE, "longform:%d len:%d", longform, len);
+
+	if (longform) {
+		epresp = 2;
+		mask = 0xffff;
+		shift = 16;
+	} else {
+		epresp = 4;
+		mask = 0xff;
+		shift = 8;
+	}
+
+	i = 0;
+	while (i < len) {
+		rc = hda_get_clist_entry(codec, aw, i, &resp);
+		if (rc != EOK) {
+			ddf_msg(LVL_ERROR, "Failed getting connection list entry.");
+			return rc;
+		}
+
+		for (j = 0; j < epresp && i < len; j++) {
+			ddf_msg(LVL_NOTE, "<- %d%s", resp & mask,
+			    (int)cidx == i ? " *** current *** " : "");
+			resp = resp << shift;
+			++i;
+		}
+
+	}
+
 	return rc;
 }
@@ -281,4 +387,18 @@
 			    aw, awtype, awcaps);
 
+			switch (awtype) {
+			case awt_audio_input:
+			case awt_audio_mixer:
+			case awt_audio_selector:
+			case awt_pin_complex:
+			case awt_power_widget:
+				rc = hda_clist_dump(codec, aw);
+				if (rc != EOK)
+					goto error;
+				break;
+			default:
+				break;
+			}
+
 			if (awtype == awt_pin_complex) {
 				rc = hda_get_cfg_def(codec, aw, &cfgdef);
@@ -293,4 +413,5 @@
 			}
 
+if (0) {
 			if ((awcaps & BIT_V(uint32_t, awc_out_amp_present)) != 0)
 				hda_set_out_amp_max(codec, aw);
@@ -298,4 +419,5 @@
 			if ((awcaps & BIT_V(uint32_t, awc_in_amp_present)) != 0)
 				hda_set_in_amp_max(codec, aw);
+}
 		}
 	}
Index: uspace/drv/audio/hdaudio/hdaudio.ma
===================================================================
--- uspace/drv/audio/hdaudio/hdaudio.ma	(revision 1e92bc3cc88d4455847afe91816a6ee1d5e5c7a0)
+++ uspace/drv/audio/hdaudio/hdaudio.ma	(revision 9bae8b8467b01e234f398239ea6e3b85d3062042)
@@ -2,2 +2,5 @@
 10 pci/ven=8086&dev=1e20
 10 pci/ven=8086&dev=2668
+10 pci/ven=8086&dev=284b
+10 pci/ven=8086&dev=1c20
+10 pci/ven=8086&dev=293e
Index: uspace/drv/audio/hdaudio/spec/codec.h
===================================================================
--- uspace/drv/audio/hdaudio/spec/codec.h	(revision 1e92bc3cc88d4455847afe91816a6ee1d5e5c7a0)
+++ uspace/drv/audio/hdaudio/spec/codec.h	(revision 9bae8b8467b01e234f398239ea6e3b85d3062042)
@@ -235,5 +235,5 @@
 	hda_out_amp_caps = 0x12,
 	/** Connection List Length */
-	hda_clist_len = 0xe,
+	hda_clist_len = 0x0e,
 	/** Supported Power States */
 	hda_supp_pwr_states = 0x0f,
@@ -275,4 +275,14 @@
 	fgrp_vdmfg = 0x02
 } hda_fgrp_type_t;
+
+/** Connection List Length Response bits */
+typedef enum {
+	/** Long Form */
+	cll_longform = 7,
+	/** Connection List Length (H) */
+	cll_len_h = 6,
+	/** Connection List Length (L) */
+	cll_len_l = 0
+} hda_clist_len_bits_t;
 
 /** Audio Widget Capabilities Bits */
