diff options
Diffstat (limited to 'sound/pci/hda/hda_codec.c')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 41ca803a1fff..7504e62188d6 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -4393,20 +4393,19 @@ void snd_hda_update_power_acct(struct hda_codec *codec) | |||
4393 | codec->power_jiffies += delta; | 4393 | codec->power_jiffies += delta; |
4394 | } | 4394 | } |
4395 | 4395 | ||
4396 | /** | 4396 | /* Transition to powered up, if wait_power_down then wait for a pending |
4397 | * snd_hda_power_up - Power-up the codec | 4397 | * transition to D3 to complete. A pending D3 transition is indicated |
4398 | * @codec: HD-audio codec | 4398 | * with power_transition == -1. */ |
4399 | * | 4399 | static void __snd_hda_power_up(struct hda_codec *codec, bool wait_power_down) |
4400 | * Increment the power-up counter and power up the hardware really when | ||
4401 | * not turned on yet. | ||
4402 | */ | ||
4403 | void snd_hda_power_up(struct hda_codec *codec) | ||
4404 | { | 4400 | { |
4405 | struct hda_bus *bus = codec->bus; | 4401 | struct hda_bus *bus = codec->bus; |
4406 | 4402 | ||
4407 | spin_lock(&codec->power_lock); | 4403 | spin_lock(&codec->power_lock); |
4408 | codec->power_count++; | 4404 | codec->power_count++; |
4409 | if (codec->power_on || codec->power_transition > 0) { | 4405 | /* Return if power_on or transitioning to power_on, unless currently |
4406 | * powering down. */ | ||
4407 | if ((codec->power_on || codec->power_transition > 0) && | ||
4408 | !(wait_power_down && codec->power_transition < 0)) { | ||
4410 | spin_unlock(&codec->power_lock); | 4409 | spin_unlock(&codec->power_lock); |
4411 | return; | 4410 | return; |
4412 | } | 4411 | } |
@@ -4430,8 +4429,37 @@ void snd_hda_power_up(struct hda_codec *codec) | |||
4430 | codec->power_transition = 0; | 4429 | codec->power_transition = 0; |
4431 | spin_unlock(&codec->power_lock); | 4430 | spin_unlock(&codec->power_lock); |
4432 | } | 4431 | } |
4432 | |||
4433 | /** | ||
4434 | * snd_hda_power_up - Power-up the codec | ||
4435 | * @codec: HD-audio codec | ||
4436 | * | ||
4437 | * Increment the power-up counter and power up the hardware really when | ||
4438 | * not turned on yet. | ||
4439 | */ | ||
4440 | void snd_hda_power_up(struct hda_codec *codec) | ||
4441 | { | ||
4442 | __snd_hda_power_up(codec, false); | ||
4443 | } | ||
4433 | EXPORT_SYMBOL_HDA(snd_hda_power_up); | 4444 | EXPORT_SYMBOL_HDA(snd_hda_power_up); |
4434 | 4445 | ||
4446 | /** | ||
4447 | * snd_hda_power_up_d3wait - Power-up the codec after waiting for any pending | ||
4448 | * D3 transition to complete. This differs from snd_hda_power_up() when | ||
4449 | * power_transition == -1. snd_hda_power_up sees this case as a nop, | ||
4450 | * snd_hda_power_up_d3wait waits for the D3 transition to complete then powers | ||
4451 | * back up. | ||
4452 | * @codec: HD-audio codec | ||
4453 | * | ||
4454 | * Cancel any power down operation hapenning on the work queue, then power up. | ||
4455 | */ | ||
4456 | void snd_hda_power_up_d3wait(struct hda_codec *codec) | ||
4457 | { | ||
4458 | /* This will cancel and wait for pending power_work to complete. */ | ||
4459 | __snd_hda_power_up(codec, true); | ||
4460 | } | ||
4461 | EXPORT_SYMBOL_HDA(snd_hda_power_up_d3wait); | ||
4462 | |||
4435 | #define power_save(codec) \ | 4463 | #define power_save(codec) \ |
4436 | ((codec)->bus->power_save ? *(codec)->bus->power_save : 0) | 4464 | ((codec)->bus->power_save ? *(codec)->bus->power_save : 0) |
4437 | 4465 | ||