ASoC: hdac_hdmi: Use i915 component framework for PM
authorSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Tue, 10 Nov 2015 13:12:10 +0000 (18:42 +0530)
committerMark Brown <broonie@kernel.org>
Sat, 21 Nov 2015 13:58:19 +0000 (13:58 +0000)
Use the component framework to keep the display on till the
playback in progress.

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/hdac_hdmi.c

index c02e6d3a6314c54b6172a563fc884b007f9c22c2..d1552620257f1c838f2cc9c1d81e0274c360d1f4 100644 (file)
@@ -25,6 +25,7 @@
 #include <sound/pcm_params.h>
 #include <sound/soc.h>
 #include <sound/hdaudio_ext.h>
+#include <sound/hda_i915.h>
 #include "../../hda/local.h"
 
 #define AMP_OUT_MUTE           0xb080
@@ -559,14 +560,26 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
 {
        struct hdac_ext_device *edev = to_hda_ext_device(dev);
        struct hdac_device *hdac = &edev->hdac;
+       struct hdac_bus *bus = hdac->bus;
+       int err;
 
        dev_dbg(dev, "Enter: %s\n", __func__);
 
+       /* controller may not have been initialized for the first time */
+       if (!bus)
+               return 0;
+
        /* Power down afg */
        if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3))
                snd_hdac_codec_write(hdac, hdac->afg, 0,
                        AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
 
+       err = snd_hdac_display_power(bus, false);
+       if (err < 0) {
+               dev_err(bus->dev, "Cannot turn on display power on i915\n");
+               return err;
+       }
+
        return 0;
 }
 
@@ -574,9 +587,21 @@ static int hdac_hdmi_runtime_resume(struct device *dev)
 {
        struct hdac_ext_device *edev = to_hda_ext_device(dev);
        struct hdac_device *hdac = &edev->hdac;
+       struct hdac_bus *bus = hdac->bus;
+       int err;
 
        dev_dbg(dev, "Enter: %s\n", __func__);
 
+       /* controller may not have been initialized for the first time */
+       if (!bus)
+               return 0;
+
+       err = snd_hdac_display_power(bus, true);
+       if (err < 0) {
+               dev_err(bus->dev, "Cannot turn on display power on i915\n");
+               return err;
+       }
+
        /* Power up afg */
        if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D0))
                snd_hdac_codec_write(hdac, hdac->afg, 0,