Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit bf270262 authored by Sriram Periyasamy's avatar Sriram Periyasamy Committed by Mark Brown
Browse files

ASoC: hdac_hdmi: Add documentation for power management



Add documentation for power management of HDAC HDMI codec device for
various scenarios such as S0/S3, probe and playback use case.

Signed-off-by: default avatarSriram Periyasamy <sriramx.periyasamy@intel.com>
Signed-off-by: default avatarSanyog Kale <sanyog.r.kale@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 90ae7105
Loading
Loading
Loading
Loading
+69 −0
Original line number Diff line number Diff line
@@ -2103,6 +2103,75 @@ static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev)
}

#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)
{
	struct hdac_ext_device *edev = to_hda_ext_device(dev);