Skip to content

Commit 2a267a8

Browse files
vijendarmukundavinodkoul
authored andcommitted
soundwire: amd: add clock init control function
Add generic SoundWire clock initialization sequence to support different SoundWire bus clock frequencies for ACP6.3/7.0/7.1/7.2 platforms and remove hard coding initializations for 12Mhz bus clock frequency. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev> Link: https://patch.msgid.link/20260226065638.1251771-2-Vijendar.Mukunda@amd.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent 4b8fc2b commit 2a267a8

2 files changed

Lines changed: 36 additions & 11 deletions

File tree

drivers/soundwire/amd_manager.c

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,36 @@
2727

2828
#define to_amd_sdw(b) container_of(b, struct amd_sdw_manager, bus)
2929

30+
static int amd_sdw_clk_init_ctrl(struct amd_sdw_manager *amd_manager)
31+
{
32+
struct sdw_bus *bus = &amd_manager->bus;
33+
struct sdw_master_prop *prop = &bus->prop;
34+
u32 divider;
35+
36+
dev_dbg(amd_manager->dev, "mclk %d max %d row %d col %d frame_rate:%d\n",
37+
prop->mclk_freq, prop->max_clk_freq, prop->default_row,
38+
prop->default_col, prop->default_frame_rate);
39+
40+
if (!prop->default_frame_rate || !prop->default_row) {
41+
dev_err(amd_manager->dev, "Default frame_rate %d or row %d is invalid\n",
42+
prop->default_frame_rate, prop->default_row);
43+
return -EINVAL;
44+
}
45+
46+
/* Set clock divider */
47+
divider = (prop->mclk_freq / bus->params.curr_dr_freq);
48+
writel(divider, amd_manager->mmio + ACP_SW_CLK_FREQUENCY_CTRL);
49+
50+
/* Set frame shape base on the actual bus frequency. */
51+
prop->default_col = bus->params.curr_dr_freq /
52+
prop->default_frame_rate / prop->default_row;
53+
amd_manager->cols_index = sdw_find_col_index(prop->default_col);
54+
amd_manager->rows_index = sdw_find_row_index(prop->default_row);
55+
bus->params.col = prop->default_col;
56+
bus->params.row = prop->default_row;
57+
return 0;
58+
}
59+
3060
static int amd_init_sdw_manager(struct amd_sdw_manager *amd_manager)
3161
{
3262
u32 val;
@@ -960,6 +990,9 @@ int amd_sdw_manager_start(struct amd_sdw_manager *amd_manager)
960990

961991
prop = &amd_manager->bus.prop;
962992
if (!prop->hw_disabled) {
993+
ret = amd_sdw_clk_init_ctrl(amd_manager);
994+
if (ret)
995+
return ret;
963996
ret = amd_init_sdw_manager(amd_manager);
964997
if (ret)
965998
return ret;
@@ -984,7 +1017,6 @@ static int amd_sdw_manager_probe(struct platform_device *pdev)
9841017
struct resource *res;
9851018
struct device *dev = &pdev->dev;
9861019
struct sdw_master_prop *prop;
987-
struct sdw_bus_params *params;
9881020
struct amd_sdw_manager *amd_manager;
9891021
int ret;
9901022

@@ -1048,14 +1080,8 @@ static int amd_sdw_manager_probe(struct platform_device *pdev)
10481080
return -EINVAL;
10491081
}
10501082

1051-
params = &amd_manager->bus.params;
1052-
1053-
params->col = AMD_SDW_DEFAULT_COLUMNS;
1054-
params->row = AMD_SDW_DEFAULT_ROWS;
10551083
prop = &amd_manager->bus.prop;
1056-
prop->clk_freq = &amd_sdw_freq_tbl[0];
10571084
prop->mclk_freq = AMD_SDW_BUS_BASE_FREQ;
1058-
prop->max_clk_freq = AMD_SDW_DEFAULT_CLK_FREQ;
10591085

10601086
ret = sdw_bus_master_add(&amd_manager->bus, dev, dev->fwnode);
10611087
if (ret) {
@@ -1347,6 +1373,9 @@ static int __maybe_unused amd_resume_runtime(struct device *dev)
13471373
}
13481374
}
13491375
sdw_clear_slave_status(bus, SDW_UNATTACH_REQUEST_MASTER_RESET);
1376+
ret = amd_sdw_clk_init_ctrl(amd_manager);
1377+
if (ret)
1378+
return ret;
13501379
amd_init_sdw_manager(amd_manager);
13511380
amd_enable_sdw_interrupts(amd_manager);
13521381
ret = amd_enable_sdw_manager(amd_manager);

drivers/soundwire/amd_manager.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,6 @@
203203
#define AMD_SDW_DEVICE_STATE_D3 3
204204
#define ACP_PME_EN 0x0001400
205205

206-
static u32 amd_sdw_freq_tbl[AMD_SDW_MAX_FREQ_NUM] = {
207-
AMD_SDW_DEFAULT_CLK_FREQ,
208-
};
209-
210206
struct sdw_manager_dp_reg {
211207
u32 frame_fmt_reg;
212208
u32 sample_int_reg;

0 commit comments

Comments
 (0)