Index: uspace/drv/audio/hdaudio/codec.c
===================================================================
--- uspace/drv/audio/hdaudio/codec.c	(revision cc91ab49cd461a7fbd349cbcc54e728f08893873)
+++ uspace/drv/audio/hdaudio/codec.c	(revision a9be4d2e3f9efd191154ce9bf76d62659e2c44e0)
@@ -139,4 +139,14 @@
 }
 
+static int hda_get_eapd_btl_enable(hda_codec_t *codec, int node, uint32_t *resp)
+{
+	return hda_ccmd(codec, node, hda_eapd_btl_enable_get, 0, resp);
+}
+
+static int hda_set_eapd_btl_enable(hda_codec_t *codec, int node, uint8_t payload)
+{
+	return hda_ccmd(codec, node, hda_eapd_btl_enable_set, payload, NULL);
+}
+
 /** Get Suppported PCM Size, Rates */
 static int hda_get_supp_rates(hda_codec_t *codec, int node, uint32_t *rates)
@@ -180,4 +190,16 @@
 
 	return EOK;
+}
+
+/** Get Pin Capabilities */
+static int hda_get_pin_caps(hda_codec_t *codec, int node, uint32_t *caps)
+{
+	return hda_get_parameter(codec, node, hda_pin_caps, caps);
+}
+
+/** Get Power State */
+static int hda_get_power_state(hda_codec_t *codec, int node, uint32_t *pstate)
+{
+	return hda_ccmd(codec, node, hda_power_state_get, 0, pstate);
 }
 
@@ -347,4 +369,64 @@
 }
 
+static int hda_pin_init(hda_codec_t *codec, uint8_t aw)
+{
+	int rc;
+	uint32_t cfgdef;
+	uint32_t pcaps;
+	uint32_t eapd;
+
+	rc = hda_get_cfg_def(codec, aw, &cfgdef);
+	if (rc != EOK)
+		goto error;
+	ddf_msg(LVL_NOTE, "aw %d: PIN cdfgef=0x%x",
+	    aw, cfgdef);
+
+	rc = hda_get_pin_caps(codec, aw, &pcaps);
+	if (rc != EOK)
+		goto error;
+	ddf_msg(LVL_NOTE, "aw %d : PIN caps=0x%x",
+	    aw, pcaps);
+
+	if ((pcaps & BIT_V(uint32_t, pwc_eapd)) != 0) {
+		rc = hda_get_eapd_btl_enable(codec, aw, &eapd);
+		if (rc != EOK)
+			goto error;
+
+		ddf_msg(LVL_NOTE, "PIN %d had EAPD value=0x%x", aw, eapd);
+
+		rc = hda_set_eapd_btl_enable(codec, aw, eapd | 2);
+		if (rc != EOK)
+			goto error;
+
+		rc = hda_get_eapd_btl_enable(codec, aw, &eapd);
+		if (rc != EOK)
+			goto error;
+
+		ddf_msg(LVL_NOTE, "PIN %d now has EAPD value=0x%x", aw, eapd);
+	}
+
+	return EOK;
+error:
+	return rc;
+}
+
+/** Init power-control in wiget capable of doing so. */
+static int hda_power_ctl_init(hda_codec_t *codec, uint8_t aw)
+{
+	int rc;
+	uint32_t pwrstate;
+
+	ddf_msg(LVL_NOTE, "aw %d is power control-capable", aw);
+
+	rc = hda_get_power_state(codec, aw, &pwrstate);
+	if (rc != EOK)
+		goto error;
+	ddf_msg(LVL_NOTE, "aw %d: power state = 0x%x", aw, pwrstate);
+
+	return EOK;
+error:
+	return rc;
+}
+
 hda_codec_t *hda_codec_init(hda_t *hda, uint8_t address)
 {
@@ -358,5 +440,4 @@
 	hda_awidget_type_t awtype;
 	uint32_t awcaps;
-	uint32_t cfgdef;
 	uint32_t rates;
 	uint32_t formats;
@@ -399,4 +480,10 @@
 			ddf_msg(LVL_NOTE, "aw %d: type=0x%x caps=0x%x",
 			    aw, awtype, awcaps);
+
+			if ((awcaps & BIT_V(uint32_t, awc_power_cntrl)) != 0) {
+				rc = hda_power_ctl_init(codec, aw);
+				if (rc != EOK)
+					goto error;
+			}
 
 			switch (awtype) {
@@ -415,10 +502,7 @@
 
 			if (awtype == awt_pin_complex) {
-				rc = hda_get_cfg_def(codec, aw, &cfgdef);
+				rc = hda_pin_init(codec, aw);
 				if (rc != EOK)
 					goto error;
-				ddf_msg(LVL_NOTE, "aw %d: PIN cdfgef=0x%x",
-				    aw, cfgdef);
-
 			} else if (awtype == awt_audio_output) {
 				codec->out_aw_list[codec->out_aw_num++] = aw;
Index: uspace/drv/audio/hdaudio/spec/codec.h
===================================================================
--- uspace/drv/audio/hdaudio/spec/codec.h	(revision cc91ab49cd461a7fbd349cbcc54e728f08893873)
+++ uspace/drv/audio/hdaudio/spec/codec.h	(revision a9be4d2e3f9efd191154ce9bf76d62659e2c44e0)
@@ -324,4 +324,33 @@
 } hda_awidget_caps_bits_t;
 
+typedef enum {
+	/** High Bit Rate */
+	pwc_hbr = 27,
+	/** Display Port */
+	pwc_dp = 24,
+	/** EAPD Capable */
+	pwc_eapd = 16,
+	/** VRef Control (H) */
+	pwc_vrefctl_h = 15,
+	/** VRef Control (L) */
+	pwc_vrefctl_l = 8,
+	/** HDMI */
+	pwc_hdmi = 7,
+	/** Balanced I/O Pins */
+	pwc_bal_io = 6,
+	/** Input Capable */
+	pwc_input = 5,
+	/** Output Capable */
+	pwc_output = 4,
+	/** Headphone Drive Capable */
+	pwc_hpd = 3,
+	/** Presence Detect Capable */
+	pwc_presence = 2,
+	/** Trigger Required */
+	pwc_trigger_reqd = 1,
+	/** Impedance Sense Capable */
+	pwc_imp_sense = 0
+} hda_pin_caps_bits_t;
+
 /** Audio Widget Type */
 typedef enum {
