ALSA: hda - power up before codec initialization

Change the power state of each widget before starting the initialization
work so that all verbs are executed properly.

Also, keep power-up during hwdep reconfiguration.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2009-03-13 09:02:42 +01:00
parent 307282c899
commit bb6ac72fb1
2 changed files with 17 additions and 12 deletions

View File

@ -842,6 +842,9 @@ static void snd_hda_codec_free(struct hda_codec *codec)
kfree(codec);
}
static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
unsigned int power_state);
/**
* snd_hda_codec_new - create a HDA codec
* @bus: the bus to assign
@ -941,6 +944,11 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
if (bus->modelname)
codec->modelname = kstrdup(bus->modelname, GFP_KERNEL);
/* power-up all before initialization */
hda_set_power_state(codec,
codec->afg ? codec->afg : codec->mfg,
AC_PWRST_D0);
if (do_init) {
err = snd_hda_codec_configure(codec);
if (err < 0)
@ -2413,19 +2421,12 @@ EXPORT_SYMBOL_HDA(snd_hda_build_controls);
int snd_hda_codec_build_controls(struct hda_codec *codec)
{
int err = 0;
/* fake as if already powered-on */
hda_keep_power_on(codec);
/* then fire up */
hda_set_power_state(codec,
codec->afg ? codec->afg : codec->mfg,
AC_PWRST_D0);
hda_exec_init_verbs(codec);
/* continue to initialize... */
if (codec->patch_ops.init)
err = codec->patch_ops.init(codec);
if (!err && codec->patch_ops.build_controls)
err = codec->patch_ops.build_controls(codec);
snd_hda_power_down(codec);
if (err < 0)
return err;
return 0;

View File

@ -176,25 +176,29 @@ static int reconfig_codec(struct hda_codec *codec)
{
int err;
snd_hda_power_up(codec);
snd_printk(KERN_INFO "hda-codec: reconfiguring\n");
err = snd_hda_codec_reset(codec);
if (err < 0) {
snd_printk(KERN_ERR
"The codec is being used, can't reconfigure.\n");
return err;
goto error;
}
err = snd_hda_codec_configure(codec);
if (err < 0)
return err;
goto error;
/* rebuild PCMs */
err = snd_hda_codec_build_pcms(codec);
if (err < 0)
return err;
goto error;
/* rebuild mixers */
err = snd_hda_codec_build_controls(codec);
if (err < 0)
return err;
return snd_card_register(codec->bus->card);
goto error;
err = snd_card_register(codec->bus->card);
error:
snd_hda_power_down(codec);
return err;
}
/*