[alsa-devel] [PATCH] hda: STAC927x power down inactive DACs

Matthew Ranostay mranostay at embeddedalley.com
Wed Jan 30 15:14:02 CET 2008


On several laptops that have STAC9228 codecs have unused DACs, this powers them down to a D3 state.

Signed-off-by: Matthew Ranostay <mranostay at embeddedalley.com>
---
diff -r 86c8c0a82bb9 pci/hda/patch_sigmatel.c
--- a/pci/hda/patch_sigmatel.c	Wed Jan 30 11:52:33 2008 +0100
+++ b/pci/hda/patch_sigmatel.c	Wed Jan 30 08:58:37 2008 -0500
@@ -288,6 +288,10 @@ static hda_nid_t stac927x_adc_nids[3] = 
 
 static hda_nid_t stac927x_mux_nids[3] = {
         0x15, 0x16, 0x17
+};
+
+static hda_nid_t stac927x_dac_nids[5] = {
+	0x02, 0x03, 0x04, 0x05, 0x06
 };
 
 static hda_nid_t stac927x_dmux_nids[1] = {
@@ -3537,7 +3541,7 @@ static int patch_stac927x(struct hda_cod
 static int patch_stac927x(struct hda_codec *codec)
 {
 	struct sigmatel_spec *spec;
-	int err;
+	int err, i;
 
 	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
 	if (spec == NULL)
@@ -3628,6 +3632,14 @@ static int patch_stac927x(struct hda_cod
 		stac92xx_free(codec);
 		return err;
 	}
+
+	/* on some 3-stack systems not all the DACs are used
+ 	 * this powers down ones that aren't used
+ 	 */
+	for (i = 0; i < ARRAY_SIZE(stac927x_dac_nids); i++)
+		if (!is_in_dac_nids(spec, stac927x_dac_nids[i]))
+			snd_hda_codec_write_cache(codec, stac927x_dac_nids[i],
+				0, AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
 
 	codec->patch_ops = stac92xx_patch_ops;


More information about the Alsa-devel mailing list