OSDN Git Service

ASoC: SOF: amd: Add SOF pm ops callback for Renoir
authorAjit Kumar Pandey <AjitKumar.Pandey@amd.com>
Mon, 6 Jun 2022 21:02:08 +0000 (16:02 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 6 Jun 2022 21:08:21 +0000 (22:08 +0100)
Add SOF PM ops callback in renoir dsp ops to power off and on ACP
IP block during system suspend and resume on Renoir platform.

Signed-off-by: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20220606210212.146626-2-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/amd/acp-dsp-offset.h
sound/soc/sof/amd/acp.c
sound/soc/sof/amd/acp.h
sound/soc/sof/amd/pci-rn.c
sound/soc/sof/amd/renoir.c

index 40fbf11..56cefd4 100644 (file)
 #define ACPAXI2AXI_ATU_BASE_ADDR_GRP_8         0xC3C
 #define ACPAXI2AXI_ATU_CTRL                    0xC40
 #define ACP_SOFT_RESET                         0x1000
+#define ACP_CONTROL                            0x1004
 
 #define ACP_I2S_PIN_CONFIG                     0x1400
 
 /* Registers from ACP_PGFSM block */
 #define ACP_PGFSM_CONTROL                      0x141C
 #define ACP_PGFSM_STATUS                       0x1420
+#define ACP_CLKMUX_SEL                         0x1424
 
 /* Registers from ACP_INTR block */
 #define ACP_EXTERNAL_INTR_ENB                  0x1800
index 0c27257..c40d290 100644 (file)
@@ -413,10 +413,46 @@ static int acp_init(struct snd_sof_dev *sdev)
                dev_err(sdev->dev, "ACP power on failed\n");
                return ret;
        }
+
+       snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_CONTROL, 0x01);
        /* Reset */
        return acp_reset(sdev);
 }
 
+int amd_sof_acp_suspend(struct snd_sof_dev *sdev, u32 target_state)
+{
+       int ret;
+
+       ret = acp_reset(sdev);
+       if (ret) {
+               dev_err(sdev->dev, "ACP Reset failed\n");
+               return ret;
+       }
+
+       snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_CONTROL, 0x00);
+
+       return 0;
+}
+EXPORT_SYMBOL_NS(amd_sof_acp_suspend, SND_SOC_SOF_AMD_COMMON);
+
+int amd_sof_acp_resume(struct snd_sof_dev *sdev)
+{
+       int ret;
+
+       ret = acp_init(sdev);
+       if (ret) {
+               dev_err(sdev->dev, "ACP Init failed\n");
+               return ret;
+       }
+
+       snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_CLKMUX_SEL, 0x03);
+
+       ret = acp_memory_init(sdev);
+
+       return ret;
+}
+EXPORT_SYMBOL_NS(amd_sof_acp_resume, SND_SOC_SOF_AMD_COMMON);
+
 int amd_sof_acp_probe(struct snd_sof_dev *sdev)
 {
        struct pci_dev *pci = to_pci_dev(sdev->dev);
index 291b44c..4c42b8f 100644 (file)
@@ -216,6 +216,10 @@ int acp_sof_trace_init(struct snd_sof_dev *sdev, struct snd_dma_buffer *dmab,
                       struct sof_ipc_dma_trace_params_ext *dtrace_params);
 int acp_sof_trace_release(struct snd_sof_dev *sdev);
 
+/* PM Callbacks */
+int amd_sof_acp_suspend(struct snd_sof_dev *sdev, u32 target_state);
+int amd_sof_acp_resume(struct snd_sof_dev *sdev);
+
 struct sof_amd_acp_desc {
        unsigned int host_bridge_id;
 };
index d5d9bcc..3a7fed2 100644 (file)
@@ -49,6 +49,7 @@ static const struct sof_amd_acp_desc renoir_chip_info = {
 
 static const struct sof_dev_desc renoir_desc = {
        .machines               = snd_soc_acpi_amd_sof_machines,
+       .use_acpi_target_states = true,
        .resindex_lpe_base      = 0,
        .resindex_pcicfg_base   = -1,
        .resindex_imr_base      = -1,
@@ -166,6 +167,9 @@ static struct pci_driver snd_sof_pci_amd_rn_driver = {
        .id_table = rn_pci_ids,
        .probe = acp_pci_rn_probe,
        .remove = acp_pci_rn_remove,
+       .driver = {
+               .pm = &sof_pci_pm,
+       },
 };
 module_pci_driver(snd_sof_pci_amd_rn_driver);
 
index 7019036..9261c8b 100644 (file)
@@ -173,6 +173,10 @@ struct snd_sof_dsp_ops sof_renoir_ops = {
        /* Trace Logger */
        .trace_init             = acp_sof_trace_init,
        .trace_release          = acp_sof_trace_release,
+
+       /* PM */
+       .suspend                = amd_sof_acp_suspend,
+       .resume                 = amd_sof_acp_resume,
 };
 EXPORT_SYMBOL(sof_renoir_ops);