ALSA: hda - Move runtime PM check to runtime_idle callback
The runtime_idle callback is the right place to check the suspend capability, but currently we do it wrongly in the runtime_suspend callback. This leads to a kernel error message like: pci_pm_runtime_suspend(): azx_runtime_suspend+0x0/0x50 [snd_hda_intel] returns -11 and the runtime PM core would even repeat the attempts. Reported-and-tested-by: Borislav Petkov <bp@alien8.de> Cc: <stable@vger.kernel.org> [v3.7] Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
63a077e276
commit
6eb827d235
1 changed files with 14 additions and 5 deletions
|
@ -2691,10 +2691,6 @@ static int azx_runtime_suspend(struct device *dev)
|
|||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct azx *chip = card->private_data;
|
||||
|
||||
if (!power_save_controller ||
|
||||
!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
|
||||
return -EAGAIN;
|
||||
|
||||
azx_stop_chip(chip);
|
||||
azx_clear_irq_pending(chip);
|
||||
return 0;
|
||||
|
@ -2709,12 +2705,25 @@ static int azx_runtime_resume(struct device *dev)
|
|||
azx_init_chip(chip, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int azx_runtime_idle(struct device *dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct azx *chip = card->private_data;
|
||||
|
||||
if (!power_save_controller ||
|
||||
!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
|
||||
return -EBUSY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM_RUNTIME */
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct dev_pm_ops azx_pm = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
|
||||
SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, NULL)
|
||||
SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
|
||||
};
|
||||
|
||||
#define AZX_PM_OPS &azx_pm
|
||||
|
|
Loading…
Reference in a new issue