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+
3060static 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 );
0 commit comments