Skip to content

Commit e738d77

Browse files
bardliaovinodkoul
authored andcommitted
soundwire: cadence_master: set frame shape and divider based on actual clk freq
Frame shape and curr_dr_freq could be updated by sdw_compute_bus_params(). Peripherals will set curr_dr_freq as their frequency. Managers should do the same. Then update frame shape according to the actual bus frequency. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev> Link: https://lore.kernel.org/r/20250205074232.87537-2-yung-chuan.liao@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent 2014c95 commit e738d77

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

drivers/soundwire/cadence_master.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,7 +1341,7 @@ static u32 cdns_set_initial_frame_shape(int n_rows, int n_cols)
13411341
return val;
13421342
}
13431343

1344-
static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
1344+
static int cdns_init_clock_ctrl(struct sdw_cdns *cdns)
13451345
{
13461346
struct sdw_bus *bus = &cdns->bus;
13471347
struct sdw_master_prop *prop = &bus->prop;
@@ -1355,14 +1355,25 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
13551355
prop->default_row,
13561356
prop->default_col);
13571357

1358+
if (!prop->default_frame_rate || !prop->default_row) {
1359+
dev_err(cdns->dev, "Default frame_rate %d or row %d is invalid\n",
1360+
prop->default_frame_rate, prop->default_row);
1361+
return -EINVAL;
1362+
}
1363+
13581364
/* Set clock divider */
1359-
divider = (prop->mclk_freq / prop->max_clk_freq) - 1;
1365+
divider = (prop->mclk_freq * SDW_DOUBLE_RATE_FACTOR /
1366+
bus->params.curr_dr_freq) - 1;
13601367

13611368
cdns_updatel(cdns, CDNS_MCP_CLK_CTRL0,
13621369
CDNS_MCP_CLK_MCLKD_MASK, divider);
13631370
cdns_updatel(cdns, CDNS_MCP_CLK_CTRL1,
13641371
CDNS_MCP_CLK_MCLKD_MASK, divider);
13651372

1373+
/* Set frame shape base on the actual bus frequency. */
1374+
prop->default_col = bus->params.curr_dr_freq /
1375+
prop->default_frame_rate / prop->default_row;
1376+
13661377
/*
13671378
* Frame shape changes after initialization have to be done
13681379
* with the bank switch mechanism
@@ -1375,6 +1386,8 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
13751386
ssp_interval = prop->default_frame_rate / SDW_CADENCE_GSYNC_HZ;
13761387
cdns_writel(cdns, CDNS_MCP_SSP_CTRL0, ssp_interval);
13771388
cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval);
1389+
1390+
return 0;
13781391
}
13791392

13801393
/**
@@ -1408,9 +1421,12 @@ EXPORT_SYMBOL(sdw_cdns_soft_reset);
14081421
*/
14091422
int sdw_cdns_init(struct sdw_cdns *cdns)
14101423
{
1424+
int ret;
14111425
u32 val;
14121426

1413-
cdns_init_clock_ctrl(cdns);
1427+
ret = cdns_init_clock_ctrl(cdns);
1428+
if (ret)
1429+
return ret;
14141430

14151431
sdw_cdns_check_self_clearing_bits(cdns, __func__, false, 0);
14161432

0 commit comments

Comments
 (0)