blob: ac97b8d5341432c40f4eadc00c87f07fb81f40e9 [file] [log] [blame]
From 4e0f723c4b89f4f751b68b88504cd9d89212cfe2 Mon Sep 17 00:00:00 2001
From: V sujith kumar Reddy <vsujithkumar.reddy@amd.corp-partner.google.com>
Date: Fri, 7 Jul 2023 12:25:07 +0530
Subject: [PATCH] CHROMIUM: ASoC: SOF: amd: Configure MCLK 196.6 MHz and select
lpfll as input.
Select lpfll to generate MCLK, configure the register values to get
196.6Mhz value.
BUG=b:290189450
TEST=TESTED on myst
Change-Id: Id2e34e11bf08e525d4620c23cc52936cda214cc7
Signed-off-by: V sujith kumar Reddy <vsujithkumar.reddy@amd.corp-partner.google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/4672740
Tested-by: Baili Deng <bailideng@google.com>
Commit-Queue: Baili Deng <bailideng@google.com>
Reviewed-by: Baili Deng <bailideng@google.com>
---
sound/soc/sof/amd/acp.c | 59 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 58 insertions(+), 1 deletion(-)
diff --git a/sound/soc/sof/amd/acp.c b/sound/soc/sof/amd/acp.c
index 9e021957e199268f291f0479ef03ad6a158feef1..2a03efcc13dd26f9b6f02750a4860307e6f65d1f 100644
--- a/sound/soc/sof/amd/acp.c
+++ b/sound/soc/sof/amd/acp.c
@@ -22,6 +22,31 @@
#define SECURED_FIRMWARE 1
+#define CLK5_CLK_PLL_PWR_REQ_N0 0X0006C2C0
+#define CLK5_SPLL_FIELD_2_N0 0X0006C114
+#define CLK5_CLK_PLL_REQ_N0 0X0006C0DC
+#define CLK5_CLK_DFSBYPASS_CONTR 0X0006C2C8
+#define CLK5_CLK_DFS_CNTL_N0 0X0006C1A4
+
+#define PLL_AUTO_STOP_REQ BIT(4)
+#define PLL_AUTO_START_REQ BIT(0)
+#define PLL_FRANCE_EN BIT(4)
+#define EXIT_DPF_BYPASS_0 BIT(16)
+#define EXIT_DPF_BYPASS_1 BIT(17)
+#define CLK0_DIVIDER 0X30
+
+union clk5_pll_req_no {
+ struct {
+ u32 fb_mult_int : 9;
+ u32 reserved : 3;
+ u32 pll_spine_div : 4;
+ u32 gb_mult_frac : 16;
+ } bitfields, bits;
+ u32 clk5_pll_req_no_reg;
+};
+
+
+
static bool enable_fw_debug;
module_param(enable_fw_debug, bool, 0444);
MODULE_PARM_DESC(enable_fw_debug, "Enable Firmware debug");
@@ -58,6 +83,38 @@ static int smn_read(struct pci_dev *dev, u32 smn_addr)
return data;
}
+void master_clock_generate(struct acp_dev_data *adata)
+{
+ struct snd_sof_dev *sdev = adata->dev;
+ union clk5_pll_req_no clk5_pll;
+ u32 data;
+
+ /* Clk5 pll register values to get mclk as 196.6MHz*/
+ clk5_pll.bits.fb_mult_int = 0x31;
+ clk5_pll.bits.pll_spine_div = 0;
+ clk5_pll.bits.gb_mult_frac = 0x26E9;
+
+ snd_sof_dsp_write(sdev, ACP_DSP_BAR, 0x105c, 0x1);
+ smn_read(adata->smn_dev, CLK5_CLK_PLL_PWR_REQ_N0, &data);
+ smn_write(adata->smn_dev, CLK5_CLK_PLL_PWR_REQ_N0, data | PLL_AUTO_STOP_REQ);
+
+ smn_read(adata->smn_dev, CLK5_SPLL_FIELD_2_N0, &data);
+ if (data & PLL_FRANCE_EN)
+ smn_write(adata->smn_dev, CLK5_SPLL_FIELD_2_N0, data | PLL_FRANCE_EN);
+
+ smn_write(adata->smn_dev, CLK5_CLK_PLL_REQ_N0, clk5_pll.clk5_pll_req_no_reg);
+
+ smn_read(adata->smn_dev, CLK5_CLK_PLL_PWR_REQ_N0, &data);
+ smn_write(adata->smn_dev, CLK5_CLK_PLL_PWR_REQ_N0, data | PLL_AUTO_START_REQ);
+
+ smn_read(adata->smn_dev, CLK5_CLK_DFSBYPASS_CONTR, &data);
+ smn_write(adata->smn_dev, CLK5_CLK_DFSBYPASS_CONTR, data | EXIT_DPF_BYPASS_0);
+ smn_write(adata->smn_dev, CLK5_CLK_DFSBYPASS_CONTR, data | EXIT_DPF_BYPASS_1);
+
+ smn_write(adata->smn_dev, CLK5_CLK_DFS_CNTL_N0, CLK0_DIVIDER);
+}
+
+
static void init_dma_descriptor(struct acp_dev_data *adata)
{
struct snd_sof_dev *sdev = adata->dev;
@@ -561,7 +618,7 @@ int amd_sof_acp_probe(struct snd_sof_dev *sdev)
}
adata->enable_fw_debug = enable_fw_debug;
acp_memory_init(sdev);
-
+ master_clock_generate(adata);
acp_dsp_stream_init(sdev);
return 0;
--
2.34.1