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); 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 * snd_hda_codec_new - create a HDA codec
* @bus: the bus to assign * @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) if (bus->modelname)
codec->modelname = kstrdup(bus->modelname, GFP_KERNEL); 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) { if (do_init) {
err = snd_hda_codec_configure(codec); err = snd_hda_codec_configure(codec);
if (err < 0) 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 snd_hda_codec_build_controls(struct hda_codec *codec)
{ {
int err = 0; 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); hda_exec_init_verbs(codec);
/* continue to initialize... */ /* continue to initialize... */
if (codec->patch_ops.init) if (codec->patch_ops.init)
err = codec->patch_ops.init(codec); err = codec->patch_ops.init(codec);
if (!err && codec->patch_ops.build_controls) if (!err && codec->patch_ops.build_controls)
err = codec->patch_ops.build_controls(codec); err = codec->patch_ops.build_controls(codec);
snd_hda_power_down(codec);
if (err < 0) if (err < 0)
return err; return err;
return 0; return 0;

View file

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