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: Sriram Periyasamy <sriramx.periyasamy@intel.com>
Signed-off-by: Sanyog Kale <sanyog.r.kale@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Sriram Periyasamy 2018-07-16 15:32:34 +05:30 committed by Mark Brown
parent 90ae7105ea
commit bf270262b7
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -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);