Commit e7ab03bc authored by Mark Brown's avatar Mark Brown

ASoC: SOF: AMD/Mediatek updates for 5.20

Merge series from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>:

Small patches reviewed on SOF GitHub.
parents efe2178d 078f28fe
...@@ -46,12 +46,14 @@ ...@@ -46,12 +46,14 @@
#define ACPAXI2AXI_ATU_BASE_ADDR_GRP_8 0xC3C #define ACPAXI2AXI_ATU_BASE_ADDR_GRP_8 0xC3C
#define ACPAXI2AXI_ATU_CTRL 0xC40 #define ACPAXI2AXI_ATU_CTRL 0xC40
#define ACP_SOFT_RESET 0x1000 #define ACP_SOFT_RESET 0x1000
#define ACP_CONTROL 0x1004
#define ACP_I2S_PIN_CONFIG 0x1400 #define ACP_I2S_PIN_CONFIG 0x1400
/* Registers from ACP_PGFSM block */ /* Registers from ACP_PGFSM block */
#define ACP_PGFSM_CONTROL 0x141C #define ACP_PGFSM_CONTROL 0x141C
#define ACP_PGFSM_STATUS 0x1420 #define ACP_PGFSM_STATUS 0x1420
#define ACP_CLKMUX_SEL 0x1424
/* Registers from ACP_INTR block */ /* Registers from ACP_INTR block */
#define ACP_EXTERNAL_INTR_ENB 0x1800 #define ACP_EXTERNAL_INTR_ENB 0x1800
......
...@@ -413,10 +413,46 @@ static int acp_init(struct snd_sof_dev *sdev) ...@@ -413,10 +413,46 @@ static int acp_init(struct snd_sof_dev *sdev)
dev_err(sdev->dev, "ACP power on failed\n"); dev_err(sdev->dev, "ACP power on failed\n");
return ret; return ret;
} }
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_CONTROL, 0x01);
/* Reset */ /* Reset */
return acp_reset(sdev); 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) int amd_sof_acp_probe(struct snd_sof_dev *sdev)
{ {
struct pci_dev *pci = to_pci_dev(sdev->dev); struct pci_dev *pci = to_pci_dev(sdev->dev);
......
...@@ -216,6 +216,10 @@ int acp_sof_trace_init(struct snd_sof_dev *sdev, struct snd_dma_buffer *dmab, ...@@ -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); struct sof_ipc_dma_trace_params_ext *dtrace_params);
int acp_sof_trace_release(struct snd_sof_dev *sdev); 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 { struct sof_amd_acp_desc {
unsigned int host_bridge_id; unsigned int host_bridge_id;
}; };
......
...@@ -49,6 +49,7 @@ static const struct sof_amd_acp_desc renoir_chip_info = { ...@@ -49,6 +49,7 @@ static const struct sof_amd_acp_desc renoir_chip_info = {
static const struct sof_dev_desc renoir_desc = { static const struct sof_dev_desc renoir_desc = {
.machines = snd_soc_acpi_amd_sof_machines, .machines = snd_soc_acpi_amd_sof_machines,
.use_acpi_target_states = true,
.resindex_lpe_base = 0, .resindex_lpe_base = 0,
.resindex_pcicfg_base = -1, .resindex_pcicfg_base = -1,
.resindex_imr_base = -1, .resindex_imr_base = -1,
...@@ -166,6 +167,9 @@ static struct pci_driver snd_sof_pci_amd_rn_driver = { ...@@ -166,6 +167,9 @@ static struct pci_driver snd_sof_pci_amd_rn_driver = {
.id_table = rn_pci_ids, .id_table = rn_pci_ids,
.probe = acp_pci_rn_probe, .probe = acp_pci_rn_probe,
.remove = acp_pci_rn_remove, .remove = acp_pci_rn_remove,
.driver = {
.pm = &sof_pci_pm,
},
}; };
module_pci_driver(snd_sof_pci_amd_rn_driver); module_pci_driver(snd_sof_pci_amd_rn_driver);
......
...@@ -173,6 +173,10 @@ struct snd_sof_dsp_ops sof_renoir_ops = { ...@@ -173,6 +173,10 @@ struct snd_sof_dsp_ops sof_renoir_ops = {
/* Trace Logger */ /* Trace Logger */
.trace_init = acp_sof_trace_init, .trace_init = acp_sof_trace_init,
.trace_release = acp_sof_trace_release, .trace_release = acp_sof_trace_release,
/* PM */
.suspend = amd_sof_acp_suspend,
.resume = amd_sof_acp_resume,
}; };
EXPORT_SYMBOL(sof_renoir_ops); EXPORT_SYMBOL(sof_renoir_ops);
......
...@@ -20,6 +20,7 @@ struct mtk_adsp_chip_info { ...@@ -20,6 +20,7 @@ struct mtk_adsp_chip_info {
u32 sramsize; u32 sramsize;
u32 dramsize; u32 dramsize;
u32 cfgregsize; u32 cfgregsize;
u32 shared_size;
void __iomem *va_sram; /* corresponding to pa_sram */ void __iomem *va_sram; /* corresponding to pa_sram */
void __iomem *va_dram; /* corresponding to pa_dram */ void __iomem *va_dram; /* corresponding to pa_dram */
void __iomem *va_cfgreg; void __iomem *va_cfgreg;
......
...@@ -132,6 +132,13 @@ static int adsp_default_clk_init(struct snd_sof_dev *sdev, bool enable) ...@@ -132,6 +132,13 @@ static int adsp_default_clk_init(struct snd_sof_dev *sdev, bool enable)
return ret; return ret;
} }
ret = clk_set_parent(priv->clk[CLK_TOP_AUDIO_H],
priv->clk[CLK_TOP_CLK26M]);
if (ret) {
dev_err(dev, "set audio_h_sel failed %d\n", ret);
return ret;
}
ret = adsp_enable_all_clock(sdev); ret = adsp_enable_all_clock(sdev);
if (ret) { if (ret) {
dev_err(dev, "failed to adsp_enable_clock: %d\n", ret); dev_err(dev, "failed to adsp_enable_clock: %d\n", ret);
......
...@@ -145,6 +145,14 @@ static int platform_parse_resource(struct platform_device *pdev, void *data) ...@@ -145,6 +145,14 @@ static int platform_parse_resource(struct platform_device *pdev, void *data)
dev_dbg(dev, "DMA %pR\n", &res); dev_dbg(dev, "DMA %pR\n", &res);
adsp->pa_shared_dram = (phys_addr_t)res.start;
adsp->shared_size = resource_size(&res);
if (adsp->pa_shared_dram & DRAM_REMAP_MASK) {
dev_err(dev, "adsp shared dma memory(%#x) is not 4K-aligned\n",
(u32)adsp->pa_shared_dram);
return -EINVAL;
}
ret = of_reserved_mem_device_init(dev); ret = of_reserved_mem_device_init(dev);
if (ret) { if (ret) {
dev_err(dev, "of_reserved_mem_device_init failed\n"); dev_err(dev, "of_reserved_mem_device_init failed\n");
...@@ -273,23 +281,18 @@ static int adsp_shared_base_ioremap(struct platform_device *pdev, void *data) ...@@ -273,23 +281,18 @@ static int adsp_shared_base_ioremap(struct platform_device *pdev, void *data)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct mtk_adsp_chip_info *adsp = data; struct mtk_adsp_chip_info *adsp = data;
u32 shared_size;
/* remap shared-dram base to be non-cachable */ /* remap shared-dram base to be non-cachable */
shared_size = TOTAL_SIZE_SHARED_DRAM_FROM_TAIL;
adsp->pa_shared_dram = adsp->pa_dram + adsp->dramsize - shared_size;
if (adsp->va_dram) {
adsp->shared_dram = adsp->va_dram + DSP_DRAM_SIZE - shared_size;
} else {
adsp->shared_dram = devm_ioremap(dev, adsp->pa_shared_dram, adsp->shared_dram = devm_ioremap(dev, adsp->pa_shared_dram,
shared_size); adsp->shared_size);
if (!adsp->shared_dram) { if (!adsp->shared_dram) {
dev_err(dev, "ioremap failed for shared DRAM\n"); dev_err(dev, "failed to ioremap base %pa size %#x\n",
adsp->shared_dram, adsp->shared_size);
return -ENOMEM; return -ENOMEM;
} }
}
dev_dbg(dev, "shared-dram vbase=%p, phy addr :%pa, size=%#x\n", dev_dbg(dev, "shared-dram vbase=%p, phy addr :%pa, size=%#x\n",
adsp->shared_dram, &adsp->pa_shared_dram, shared_size); adsp->shared_dram, &adsp->pa_shared_dram, adsp->shared_size);
return 0; return 0;
} }
...@@ -361,7 +364,9 @@ static int mt8195_dsp_probe(struct snd_sof_dev *sdev) ...@@ -361,7 +364,9 @@ static int mt8195_dsp_probe(struct snd_sof_dev *sdev)
goto err_adsp_sram_power_off; goto err_adsp_sram_power_off;
} }
sdev->bar[SOF_FW_BLK_TYPE_SRAM] = devm_ioremap_wc(sdev->dev, priv->adsp->va_sram = sdev->bar[SOF_FW_BLK_TYPE_IRAM];
sdev->bar[SOF_FW_BLK_TYPE_SRAM] = devm_ioremap(sdev->dev,
priv->adsp->pa_dram, priv->adsp->pa_dram,
priv->adsp->dramsize); priv->adsp->dramsize);
if (!sdev->bar[SOF_FW_BLK_TYPE_SRAM]) { if (!sdev->bar[SOF_FW_BLK_TYPE_SRAM]) {
...@@ -438,6 +443,19 @@ static int mt8195_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state) ...@@ -438,6 +443,19 @@ static int mt8195_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
{ {
struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev); struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev);
int ret; int ret;
u32 reset_sw, dbg_pc;
/* wait dsp enter idle, timeout is 1 second */
ret = snd_sof_dsp_read_poll_timeout(sdev, DSP_REG_BAR,
DSP_RESET_SW, reset_sw,
((reset_sw & ADSP_PWAIT) == ADSP_PWAIT),
SUSPEND_DSP_IDLE_POLL_INTERVAL_US,
SUSPEND_DSP_IDLE_TIMEOUT_US);
if (ret < 0) {
dbg_pc = snd_sof_dsp_read(sdev, DSP_REG_BAR, DSP_PDEBUGPC);
dev_warn(sdev->dev, "dsp not idle, powering off anyway : swrest %#x, pc %#x, ret %d\n",
reset_sw, dbg_pc, ret);
}
/* stall and reset dsp */ /* stall and reset dsp */
sof_hifixdsp_shutdown(sdev); sof_hifixdsp_shutdown(sdev);
......
...@@ -34,6 +34,7 @@ struct snd_sof_dev; ...@@ -34,6 +34,7 @@ struct snd_sof_dev;
#define ADSP_DRESET_SW BIT(1) #define ADSP_DRESET_SW BIT(1)
#define ADSP_RUNSTALL BIT(3) #define ADSP_RUNSTALL BIT(3)
#define STATVECTOR_SEL BIT(4) #define STATVECTOR_SEL BIT(4)
#define ADSP_PWAIT BIT(16)
#define DSP_PFAULTBUS 0x0028 #define DSP_PFAULTBUS 0x0028
#define DSP_PFAULTINFO 0x002c #define DSP_PFAULTINFO 0x002c
#define DSP_GPR00 0x0030 #define DSP_GPR00 0x0030
...@@ -153,6 +154,10 @@ struct snd_sof_dev; ...@@ -153,6 +154,10 @@ struct snd_sof_dev;
#define DRAM_REMAP_SHIFT 12 #define DRAM_REMAP_SHIFT 12
#define DRAM_REMAP_MASK (BIT(DRAM_REMAP_SHIFT) - 1) #define DRAM_REMAP_MASK (BIT(DRAM_REMAP_SHIFT) - 1)
/* suspend dsp idle check interval and timeout */
#define SUSPEND_DSP_IDLE_TIMEOUT_US 1000000 /* timeout to wait dsp idle, 1 sec */
#define SUSPEND_DSP_IDLE_POLL_INTERVAL_US 500 /* 0.5 msec */
void sof_hifixdsp_boot_sequence(struct snd_sof_dev *sdev, u32 boot_addr); void sof_hifixdsp_boot_sequence(struct snd_sof_dev *sdev, u32 boot_addr);
void sof_hifixdsp_shutdown(struct snd_sof_dev *sdev); void sof_hifixdsp_shutdown(struct snd_sof_dev *sdev);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment