ALSA: HDA VIA: Add low current mode for power saving.
authorLydia Wang <lydiawang@viatech.com.cn>
Sat, 10 Oct 2009 11:07:37 +0000 (19:07 +0800)
committerTakashi Iwai <tiwai@suse.de>
Sun, 11 Oct 2009 15:55:00 +0000 (17:55 +0200)
For VT1708B, VT1708S and VT1702, enter low current mode if no analog
stream is opened and all aa path mute.

Signed-off-by: Lydia Wang <lydiawang@viatech.com.cn>
Signed-off-by: Logan Li <loganli@viatech.com.cn>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_via.c

index d6bee620ced6943840ea58d38b2021fdfbda7488..7ace0fca933d20435a2a72db354659cd0124ea27 100644 (file)
@@ -783,6 +783,10 @@ static int via_playback_pcm_open(struct hda_pcm_stream *hinfo,
                                 struct snd_pcm_substream *substream)
 {
        struct via_spec *spec = codec->spec;
+       int idle = substream->pstr->substream_opened == 1
+               && substream->ref_count == 0;
+
+       analog_low_current_mode(codec, idle);
        return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
                                             hinfo);
 }
@@ -1089,6 +1093,11 @@ static int via_build_controls(struct hda_codec *codec)
                if (err < 0)
                        return err;
        }
+
+       /* init power states */
+       set_jack_power_state(codec);
+       analog_low_current_mode(codec, 1);
+
        via_free_kctls(codec); /* no longer needed */
        return 0;
 }
@@ -2312,6 +2321,17 @@ static struct hda_verb vt1708B_uniwill_init_verbs[] = {
        { }
 };
 
+static int via_pcm_open_close(struct hda_pcm_stream *hinfo,
+                             struct hda_codec *codec,
+                             struct snd_pcm_substream *substream)
+{
+       int idle = substream->pstr->substream_opened == 1
+               && substream->ref_count == 0;
+
+       analog_low_current_mode(codec, idle);
+       return 0;
+}
+
 static struct hda_pcm_stream vt1708B_8ch_pcm_analog_playback = {
        .substreams = 2,
        .channels_min = 2,
@@ -2320,7 +2340,8 @@ static struct hda_pcm_stream vt1708B_8ch_pcm_analog_playback = {
        .ops = {
                .open = via_playback_pcm_open,
                .prepare = via_playback_multi_pcm_prepare,
-               .cleanup = via_playback_multi_pcm_cleanup
+               .cleanup = via_playback_multi_pcm_cleanup,
+               .close = via_pcm_open_close
        },
 };
 
@@ -2342,8 +2363,10 @@ static struct hda_pcm_stream vt1708B_pcm_analog_capture = {
        .channels_max = 2,
        .nid = 0x13, /* NID to query formats and rates */
        .ops = {
+               .open = via_pcm_open_close,
                .prepare = via_capture_pcm_prepare,
-               .cleanup = via_capture_pcm_cleanup
+               .cleanup = via_capture_pcm_cleanup,
+               .close = via_pcm_open_close
        },
 };
 
@@ -2800,7 +2823,8 @@ static struct hda_pcm_stream vt1708S_pcm_analog_playback = {
        .ops = {
                .open = via_playback_pcm_open,
                .prepare = via_playback_pcm_prepare,
-               .cleanup = via_playback_pcm_cleanup
+               .cleanup = via_playback_pcm_cleanup,
+               .close = via_pcm_open_close
        },
 };
 
@@ -2810,8 +2834,10 @@ static struct hda_pcm_stream vt1708S_pcm_analog_capture = {
        .channels_max = 2,
        .nid = 0x13, /* NID to query formats and rates */
        .ops = {
+               .open = via_pcm_open_close,
                .prepare = via_capture_pcm_prepare,
-               .cleanup = via_capture_pcm_cleanup
+               .cleanup = via_capture_pcm_cleanup,
+               .close = via_pcm_open_close
        },
 };
 
@@ -3236,7 +3262,8 @@ static struct hda_pcm_stream vt1702_pcm_analog_playback = {
        .ops = {
                .open = via_playback_pcm_open,
                .prepare = via_playback_multi_pcm_prepare,
-               .cleanup = via_playback_multi_pcm_cleanup
+               .cleanup = via_playback_multi_pcm_cleanup,
+               .close = via_pcm_open_close
        },
 };
 
@@ -3246,8 +3273,10 @@ static struct hda_pcm_stream vt1702_pcm_analog_capture = {
        .channels_max = 2,
        .nid = 0x12, /* NID to query formats and rates */
        .ops = {
+               .open = via_pcm_open_close,
                .prepare = via_capture_pcm_prepare,
-               .cleanup = via_capture_pcm_cleanup
+               .cleanup = via_capture_pcm_cleanup,
+               .close = via_pcm_open_close
        },
 };