ASoC: SOF: Add system_suspend_target field to struct snd_sof_dev
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Wed, 29 Jan 2020 22:07:20 +0000 (16:07 -0600)
committerMark Brown <broonie@kernel.org>
Tue, 11 Feb 2020 11:48:03 +0000 (11:48 +0000)
Add the system_suspend_target field to struct snd_sof_dev
to track the intended system suspend power target. This will
be used as one of the criteria for determining the
final DSP power state.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200129220726.31792-4-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-dsp.c
sound/soc/sof/pcm.c
sound/soc/sof/pm.c
sound/soc/sof/sof-priv.h

index 4a4d318..fddf2c4 100644 (file)
@@ -481,7 +481,7 @@ int hda_dsp_resume(struct snd_sof_dev *sdev)
        struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
        struct pci_dev *pci = to_pci_dev(sdev->dev);
 
-       if (sdev->s0_suspend) {
+       if (sdev->system_suspend_target == SOF_SUSPEND_S0IX) {
                /* restore L1SEN bit */
                if (hda->l1_support_changed)
                        snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
@@ -530,7 +530,7 @@ int hda_dsp_suspend(struct snd_sof_dev *sdev)
        struct pci_dev *pci = to_pci_dev(sdev->dev);
        int ret;
 
-       if (sdev->s0_suspend) {
+       if (sdev->system_suspend_target == SOF_SUSPEND_S0IX) {
                /* enable L1SEN to make sure the system can enter S0Ix */
                hda->l1_support_changed =
                        snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
index 29435ba..db3df02 100644 (file)
@@ -372,7 +372,7 @@ static int sof_pcm_trigger(struct snd_soc_component *component,
                stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_START;
                break;
        case SNDRV_PCM_TRIGGER_SUSPEND:
-               if (sdev->s0_suspend &&
+               if (sdev->system_suspend_target == SOF_SUSPEND_S0IX &&
                    spcm->stream[substream->stream].d0i3_compatible) {
                        /*
                         * trap the event, not sending trigger stop to
index 5b186bc..c86ac1e 100644 (file)
@@ -323,10 +323,13 @@ int snd_sof_prepare(struct device *dev)
        struct snd_sof_dev *sdev = dev_get_drvdata(dev);
 
 #if defined(CONFIG_ACPI)
-       sdev->s0_suspend = acpi_target_system_state() == ACPI_STATE_S0;
+       if (acpi_target_system_state() == ACPI_STATE_S0)
+               sdev->system_suspend_target = SOF_SUSPEND_S0IX;
+       else
+               sdev->system_suspend_target = SOF_SUSPEND_S3;
 #else
        /* will suspend to S3 by default */
-       sdev->s0_suspend = false;
+       sdev->system_suspend_target = SOF_SUSPEND_S3;
 #endif
 
        return 0;
@@ -337,6 +340,6 @@ void snd_sof_complete(struct device *dev)
 {
        struct snd_sof_dev *sdev = dev_get_drvdata(dev);
 
-       sdev->s0_suspend = false;
+       sdev->system_suspend_target = SOF_SUSPEND_NONE;
 }
 EXPORT_SYMBOL(snd_sof_complete);
index bc2337c..1839cc5 100644 (file)
@@ -60,6 +60,13 @@ enum sof_d0_substate {
        SOF_DSP_D0I3,           /* DSP D0i3(low power) substate*/
 };
 
+/* System suspend target state */
+enum sof_system_suspend_state {
+       SOF_SUSPEND_NONE = 0,
+       SOF_SUSPEND_S0IX,
+       SOF_SUSPEND_S3,
+};
+
 struct snd_sof_dev;
 struct snd_sof_ipc_msg;
 struct snd_sof_ipc;
@@ -325,8 +332,9 @@ struct snd_sof_dev {
 
        /* power states related */
        enum sof_d0_substate d0_substate;
-       /* flag to track if the intended power target of suspend is S0ix */
-       bool s0_suspend;
+
+       /* Intended power target of system suspend */
+       enum sof_system_suspend_state system_suspend_target;
 
        /* DSP firmware boot */
        wait_queue_head_t boot_wait;