[alsa-devel] [PATCH] hda: STAC927x power down inactive DACs
Takashi Iwai
tiwai at suse.de
Thu Jan 31 12:49:12 CET 2008
At Wed, 30 Jan 2008 17:33:57 -0500,
Matthew Ranostay wrote:
>
> Takashi Iwai wrote:
> > At Wed, 30 Jan 2008 09:14:02 -0500,
> > Matthew Ranostay wrote:
> >> 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>
> >
> > I think they will be eventually powered up again in
> > hda_set_power_state() in hda_codec.c. As a temporary solution, we can
> > have a sort of blacklist in struct hda_codec for always turning the
> > power off for such widgets.
> >
> > As a long-term solution, the automatic detection of such widgets would
> > be nice...
> >
> >
> > Takashi
> >
> >
> >> ---
> >> 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;
> >>
> >
>
> I think this what you had in mind.
> Also is putting the function call in stac92xx_resume correct?
Yeah, thanks, I forgot it.
I applied it to my tree.
Takashi
More information about the Alsa-devel
mailing list