mirror of
https://github.com/torvalds/linux.git
synced 2024-12-03 09:31:26 +00:00
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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user