|
@@ -2103,6 +2103,75 @@ static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev)
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
#ifdef CONFIG_PM
|
|
|
|
+/*
|
|
|
|
+ * Power management sequences
|
|
|
|
+ * ==========================
|
|
|
|
+ *
|
|
|
|
+ * The following explains the PM handling of HDAC HDMI with its parent
|
|
|
|
+ * device SKL and display power usage
|
|
|
|
+ *
|
|
|
|
+ * Probe
|
|
|
|
+ * -----
|
|
|
|
+ * In SKL probe,
|
|
|
|
+ * 1. skl_probe_work() powers up the display (refcount++ -> 1)
|
|
|
|
+ * 2. enumerates the codecs on the link
|
|
|
|
+ * 3. powers down the display (refcount-- -> 0)
|
|
|
|
+ *
|
|
|
|
+ * In HDAC HDMI probe,
|
|
|
|
+ * 1. hdac_hdmi_dev_probe() powers up the display (refcount++ -> 1)
|
|
|
|
+ * 2. probe the codec
|
|
|
|
+ * 3. put the HDAC HDMI device to runtime suspend
|
|
|
|
+ * 4. hdac_hdmi_runtime_suspend() powers down the display (refcount-- -> 0)
|
|
|
|
+ *
|
|
|
|
+ * Once children are runtime suspended, SKL device also goes to runtime
|
|
|
|
+ * suspend
|
|
|
|
+ *
|
|
|
|
+ * HDMI Playback
|
|
|
|
+ * -------------
|
|
|
|
+ * Open HDMI device,
|
|
|
|
+ * 1. skl_runtime_resume() invoked
|
|
|
|
+ * 2. hdac_hdmi_runtime_resume() powers up the display (refcount++ -> 1)
|
|
|
|
+ *
|
|
|
|
+ * Close HDMI device,
|
|
|
|
+ * 1. hdac_hdmi_runtime_suspend() powers down the display (refcount-- -> 0)
|
|
|
|
+ * 2. skl_runtime_suspend() invoked
|
|
|
|
+ *
|
|
|
|
+ * S0/S3 Cycle with playback in progress
|
|
|
|
+ * -------------------------------------
|
|
|
|
+ * When the device is opened for playback, the device is runtime active
|
|
|
|
+ * already and the display refcount is 1 as explained above.
|
|
|
|
+ *
|
|
|
|
+ * Entering to S3,
|
|
|
|
+ * 1. hdmi_codec_prepare() invoke the runtime resume of codec which just
|
|
|
|
+ * increments the PM runtime usage count of the codec since the device
|
|
|
|
+ * is in use already
|
|
|
|
+ * 2. skl_suspend() powers down the display (refcount-- -> 0)
|
|
|
|
+ *
|
|
|
|
+ * Wakeup from S3,
|
|
|
|
+ * 1. skl_resume() powers up the display (refcount++ -> 1)
|
|
|
|
+ * 2. hdmi_codec_complete() invokes the runtime suspend of codec which just
|
|
|
|
+ * decrements the PM runtime usage count of the codec since the device
|
|
|
|
+ * is in use already
|
|
|
|
+ *
|
|
|
|
+ * Once playback is stopped, the display refcount is set to 0 as explained
|
|
|
|
+ * above in the HDMI playback sequence. The PM handlings are designed in
|
|
|
|
+ * such way that to balance the refcount of display power when the codec
|
|
|
|
+ * device put to S3 while playback is going on.
|
|
|
|
+ *
|
|
|
|
+ * S0/S3 Cycle without playback in progress
|
|
|
|
+ * ----------------------------------------
|
|
|
|
+ * Entering to S3,
|
|
|
|
+ * 1. hdmi_codec_prepare() invoke the runtime resume of codec
|
|
|
|
+ * 2. skl_runtime_resume() invoked
|
|
|
|
+ * 3. hdac_hdmi_runtime_resume() powers up the display (refcount++ -> 1)
|
|
|
|
+ * 4. skl_suspend() powers down the display (refcount-- -> 0)
|
|
|
|
+ *
|
|
|
|
+ * Wakeup from S3,
|
|
|
|
+ * 1. skl_resume() powers up the display (refcount++ -> 1)
|
|
|
|
+ * 2. hdmi_codec_complete() invokes the runtime suspend of codec
|
|
|
|
+ * 3. hdac_hdmi_runtime_suspend() powers down the display (refcount-- -> 0)
|
|
|
|
+ * 4. skl_runtime_suspend() invoked
|
|
|
|
+ */
|
|
static int hdac_hdmi_runtime_suspend(struct device *dev)
|
|
static int hdac_hdmi_runtime_suspend(struct device *dev)
|
|
{
|
|
{
|
|
struct hdac_ext_device *edev = to_hda_ext_device(dev);
|
|
struct hdac_ext_device *edev = to_hda_ext_device(dev);
|