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:
parent
307282c899
commit
bb6ac72fb1
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
goto error;
|
||||||
|
err = snd_card_register(codec->bus->card);
|
||||||
|
error:
|
||||||
|
snd_hda_power_down(codec);
|
||||||
return err;
|
return err;
|
||||||
return snd_card_register(codec->bus->card);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue