@@ -849,22 +849,25 @@ static int clk_alpha_pll_hwfsm_set_rate(struct clk_hw *hw, unsigned long rate,
849849 clk_alpha_pll_hwfsm_is_enabled );
850850}
851851
852- static long clk_alpha_pll_round_rate (struct clk_hw * hw , unsigned long rate ,
853- unsigned long * prate )
852+ static int clk_alpha_pll_determine_rate (struct clk_hw * hw ,
853+ struct clk_rate_request * req )
854854{
855855 struct clk_alpha_pll * pll = to_clk_alpha_pll (hw );
856856 u32 l , alpha_width = pll_alpha_width (pll );
857857 u64 a ;
858858 unsigned long min_freq , max_freq ;
859859
860- rate = alpha_pll_round_rate (rate , * prate , & l , & a , alpha_width );
861- if (!pll -> vco_table || alpha_pll_find_vco (pll , rate ))
862- return rate ;
860+ req -> rate = alpha_pll_round_rate (req -> rate , req -> best_parent_rate , & l ,
861+ & a , alpha_width );
862+ if (!pll -> vco_table || alpha_pll_find_vco (pll , req -> rate ))
863+ return 0 ;
863864
864865 min_freq = pll -> vco_table [0 ].min_freq ;
865866 max_freq = pll -> vco_table [pll -> num_vco - 1 ].max_freq ;
866867
867- return clamp (rate , min_freq , max_freq );
868+ req -> rate = clamp (req -> rate , min_freq , max_freq );
869+
870+ return 0 ;
868871}
869872
870873void clk_huayra_2290_pll_configure (struct clk_alpha_pll * pll , struct regmap * regmap ,
@@ -1048,12 +1051,15 @@ static int alpha_pll_huayra_set_rate(struct clk_hw *hw, unsigned long rate,
10481051 return 0 ;
10491052}
10501053
1051- static long alpha_pll_huayra_round_rate (struct clk_hw * hw , unsigned long rate ,
1052- unsigned long * prate )
1054+ static int alpha_pll_huayra_determine_rate (struct clk_hw * hw ,
1055+ struct clk_rate_request * req )
10531056{
10541057 u32 l , a ;
10551058
1056- return alpha_huayra_pll_round_rate (rate , * prate , & l , & a );
1059+ req -> rate = alpha_huayra_pll_round_rate (req -> rate ,
1060+ req -> best_parent_rate , & l , & a );
1061+
1062+ return 0 ;
10571063}
10581064
10591065static int trion_pll_is_enabled (struct clk_alpha_pll * pll ,
@@ -1175,7 +1181,7 @@ const struct clk_ops clk_alpha_pll_ops = {
11751181 .disable = clk_alpha_pll_disable ,
11761182 .is_enabled = clk_alpha_pll_is_enabled ,
11771183 .recalc_rate = clk_alpha_pll_recalc_rate ,
1178- .round_rate = clk_alpha_pll_round_rate ,
1184+ .determine_rate = clk_alpha_pll_determine_rate ,
11791185 .set_rate = clk_alpha_pll_set_rate ,
11801186};
11811187EXPORT_SYMBOL_GPL (clk_alpha_pll_ops );
@@ -1185,7 +1191,7 @@ const struct clk_ops clk_alpha_pll_huayra_ops = {
11851191 .disable = clk_alpha_pll_disable ,
11861192 .is_enabled = clk_alpha_pll_is_enabled ,
11871193 .recalc_rate = alpha_pll_huayra_recalc_rate ,
1188- .round_rate = alpha_pll_huayra_round_rate ,
1194+ .determine_rate = alpha_pll_huayra_determine_rate ,
11891195 .set_rate = alpha_pll_huayra_set_rate ,
11901196};
11911197EXPORT_SYMBOL_GPL (clk_alpha_pll_huayra_ops );
@@ -1195,7 +1201,7 @@ const struct clk_ops clk_alpha_pll_hwfsm_ops = {
11951201 .disable = clk_alpha_pll_hwfsm_disable ,
11961202 .is_enabled = clk_alpha_pll_hwfsm_is_enabled ,
11971203 .recalc_rate = clk_alpha_pll_recalc_rate ,
1198- .round_rate = clk_alpha_pll_round_rate ,
1204+ .determine_rate = clk_alpha_pll_determine_rate ,
11991205 .set_rate = clk_alpha_pll_hwfsm_set_rate ,
12001206};
12011207EXPORT_SYMBOL_GPL (clk_alpha_pll_hwfsm_ops );
@@ -1205,7 +1211,7 @@ const struct clk_ops clk_alpha_pll_fixed_trion_ops = {
12051211 .disable = clk_trion_pll_disable ,
12061212 .is_enabled = clk_trion_pll_is_enabled ,
12071213 .recalc_rate = clk_trion_pll_recalc_rate ,
1208- .round_rate = clk_alpha_pll_round_rate ,
1214+ .determine_rate = clk_alpha_pll_determine_rate ,
12091215};
12101216EXPORT_SYMBOL_GPL (clk_alpha_pll_fixed_trion_ops );
12111217
@@ -1240,9 +1246,8 @@ static const struct clk_div_table clk_alpha_2bit_div_table[] = {
12401246 { }
12411247};
12421248
1243- static long
1244- clk_alpha_pll_postdiv_round_rate (struct clk_hw * hw , unsigned long rate ,
1245- unsigned long * prate )
1249+ static int clk_alpha_pll_postdiv_determine_rate (struct clk_hw * hw ,
1250+ struct clk_rate_request * req )
12461251{
12471252 struct clk_alpha_pll_postdiv * pll = to_clk_alpha_pll_postdiv (hw );
12481253 const struct clk_div_table * table ;
@@ -1252,13 +1257,15 @@ clk_alpha_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate,
12521257 else
12531258 table = clk_alpha_div_table ;
12541259
1255- return divider_round_rate (hw , rate , prate , table ,
1256- pll -> width , CLK_DIVIDER_POWER_OF_TWO );
1260+ req -> rate = divider_round_rate (hw , req -> rate , & req -> best_parent_rate ,
1261+ table , pll -> width ,
1262+ CLK_DIVIDER_POWER_OF_TWO );
1263+
1264+ return 0 ;
12571265}
12581266
1259- static long
1260- clk_alpha_pll_postdiv_round_ro_rate (struct clk_hw * hw , unsigned long rate ,
1261- unsigned long * prate )
1267+ static int clk_alpha_pll_postdiv_ro_determine_rate (struct clk_hw * hw ,
1268+ struct clk_rate_request * req )
12621269{
12631270 struct clk_alpha_pll_postdiv * pll = to_clk_alpha_pll_postdiv (hw );
12641271 u32 ctl , div ;
@@ -1270,9 +1277,12 @@ clk_alpha_pll_postdiv_round_ro_rate(struct clk_hw *hw, unsigned long rate,
12701277 div = 1 << fls (ctl );
12711278
12721279 if (clk_hw_get_flags (hw ) & CLK_SET_RATE_PARENT )
1273- * prate = clk_hw_round_rate (clk_hw_get_parent (hw ), div * rate );
1280+ req -> best_parent_rate = clk_hw_round_rate (clk_hw_get_parent (hw ),
1281+ div * req -> rate );
1282+
1283+ req -> rate = DIV_ROUND_UP_ULL ((u64 )req -> best_parent_rate , div );
12741284
1275- return DIV_ROUND_UP_ULL (( u64 ) * prate , div ) ;
1285+ return 0 ;
12761286}
12771287
12781288static int clk_alpha_pll_postdiv_set_rate (struct clk_hw * hw , unsigned long rate ,
@@ -1291,13 +1301,13 @@ static int clk_alpha_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
12911301
12921302const struct clk_ops clk_alpha_pll_postdiv_ops = {
12931303 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate ,
1294- .round_rate = clk_alpha_pll_postdiv_round_rate ,
1304+ .determine_rate = clk_alpha_pll_postdiv_determine_rate ,
12951305 .set_rate = clk_alpha_pll_postdiv_set_rate ,
12961306};
12971307EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_ops );
12981308
12991309const struct clk_ops clk_alpha_pll_postdiv_ro_ops = {
1300- .round_rate = clk_alpha_pll_postdiv_round_ro_rate ,
1310+ .determine_rate = clk_alpha_pll_postdiv_ro_determine_rate ,
13011311 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate ,
13021312};
13031313EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_ro_ops );
@@ -1542,7 +1552,7 @@ const struct clk_ops clk_alpha_pll_fabia_ops = {
15421552 .is_enabled = clk_alpha_pll_is_enabled ,
15431553 .set_rate = alpha_pll_fabia_set_rate ,
15441554 .recalc_rate = alpha_pll_fabia_recalc_rate ,
1545- .round_rate = clk_alpha_pll_round_rate ,
1555+ .determine_rate = clk_alpha_pll_determine_rate ,
15461556};
15471557EXPORT_SYMBOL_GPL (clk_alpha_pll_fabia_ops );
15481558
@@ -1551,7 +1561,7 @@ const struct clk_ops clk_alpha_pll_fixed_fabia_ops = {
15511561 .disable = alpha_pll_fabia_disable ,
15521562 .is_enabled = clk_alpha_pll_is_enabled ,
15531563 .recalc_rate = alpha_pll_fabia_recalc_rate ,
1554- .round_rate = clk_alpha_pll_round_rate ,
1564+ .determine_rate = clk_alpha_pll_determine_rate ,
15551565};
15561566EXPORT_SYMBOL_GPL (clk_alpha_pll_fixed_fabia_ops );
15571567
@@ -1602,14 +1612,16 @@ clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
16021612 return (parent_rate / div );
16031613}
16041614
1605- static long
1606- clk_trion_pll_postdiv_round_rate (struct clk_hw * hw , unsigned long rate ,
1607- unsigned long * prate )
1615+ static int clk_trion_pll_postdiv_determine_rate (struct clk_hw * hw ,
1616+ struct clk_rate_request * req )
16081617{
16091618 struct clk_alpha_pll_postdiv * pll = to_clk_alpha_pll_postdiv (hw );
16101619
1611- return divider_round_rate (hw , rate , prate , pll -> post_div_table ,
1612- pll -> width , CLK_DIVIDER_ROUND_CLOSEST );
1620+ req -> rate = divider_round_rate (hw , req -> rate , & req -> best_parent_rate ,
1621+ pll -> post_div_table ,
1622+ pll -> width , CLK_DIVIDER_ROUND_CLOSEST );
1623+
1624+ return 0 ;
16131625};
16141626
16151627static int
@@ -1635,18 +1647,21 @@ clk_trion_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
16351647
16361648const struct clk_ops clk_alpha_pll_postdiv_trion_ops = {
16371649 .recalc_rate = clk_trion_pll_postdiv_recalc_rate ,
1638- .round_rate = clk_trion_pll_postdiv_round_rate ,
1650+ .determine_rate = clk_trion_pll_postdiv_determine_rate ,
16391651 .set_rate = clk_trion_pll_postdiv_set_rate ,
16401652};
16411653EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_trion_ops );
16421654
1643- static long clk_alpha_pll_postdiv_fabia_round_rate (struct clk_hw * hw ,
1644- unsigned long rate , unsigned long * prate )
1655+ static int clk_alpha_pll_postdiv_fabia_determine_rate (struct clk_hw * hw ,
1656+ struct clk_rate_request * req )
16451657{
16461658 struct clk_alpha_pll_postdiv * pll = to_clk_alpha_pll_postdiv (hw );
16471659
1648- return divider_round_rate (hw , rate , prate , pll -> post_div_table ,
1649- pll -> width , CLK_DIVIDER_ROUND_CLOSEST );
1660+ req -> rate = divider_round_rate (hw , req -> rate , & req -> best_parent_rate ,
1661+ pll -> post_div_table ,
1662+ pll -> width , CLK_DIVIDER_ROUND_CLOSEST );
1663+
1664+ return 0 ;
16501665}
16511666
16521667static int clk_alpha_pll_postdiv_fabia_set_rate (struct clk_hw * hw ,
@@ -1681,7 +1696,7 @@ static int clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw *hw,
16811696
16821697const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = {
16831698 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate ,
1684- .round_rate = clk_alpha_pll_postdiv_fabia_round_rate ,
1699+ .determine_rate = clk_alpha_pll_postdiv_fabia_determine_rate ,
16851700 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate ,
16861701};
16871702EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_fabia_ops );
@@ -1833,7 +1848,7 @@ const struct clk_ops clk_alpha_pll_trion_ops = {
18331848 .disable = clk_trion_pll_disable ,
18341849 .is_enabled = clk_trion_pll_is_enabled ,
18351850 .recalc_rate = clk_trion_pll_recalc_rate ,
1836- .round_rate = clk_alpha_pll_round_rate ,
1851+ .determine_rate = clk_alpha_pll_determine_rate ,
18371852 .set_rate = alpha_pll_trion_set_rate ,
18381853};
18391854EXPORT_SYMBOL_GPL (clk_alpha_pll_trion_ops );
@@ -1844,14 +1859,14 @@ const struct clk_ops clk_alpha_pll_lucid_ops = {
18441859 .disable = clk_trion_pll_disable ,
18451860 .is_enabled = clk_trion_pll_is_enabled ,
18461861 .recalc_rate = clk_trion_pll_recalc_rate ,
1847- .round_rate = clk_alpha_pll_round_rate ,
1862+ .determine_rate = clk_alpha_pll_determine_rate ,
18481863 .set_rate = alpha_pll_trion_set_rate ,
18491864};
18501865EXPORT_SYMBOL_GPL (clk_alpha_pll_lucid_ops );
18511866
18521867const struct clk_ops clk_alpha_pll_postdiv_lucid_ops = {
18531868 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate ,
1854- .round_rate = clk_alpha_pll_postdiv_fabia_round_rate ,
1869+ .determine_rate = clk_alpha_pll_postdiv_fabia_determine_rate ,
18551870 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate ,
18561871};
18571872EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_lucid_ops );
@@ -1903,7 +1918,7 @@ const struct clk_ops clk_alpha_pll_agera_ops = {
19031918 .disable = clk_alpha_pll_disable ,
19041919 .is_enabled = clk_alpha_pll_is_enabled ,
19051920 .recalc_rate = alpha_pll_fabia_recalc_rate ,
1906- .round_rate = clk_alpha_pll_round_rate ,
1921+ .determine_rate = clk_alpha_pll_determine_rate ,
19071922 .set_rate = clk_alpha_pll_agera_set_rate ,
19081923};
19091924EXPORT_SYMBOL_GPL (clk_alpha_pll_agera_ops );
@@ -2119,7 +2134,7 @@ const struct clk_ops clk_alpha_pll_lucid_5lpe_ops = {
21192134 .disable = alpha_pll_lucid_5lpe_disable ,
21202135 .is_enabled = clk_trion_pll_is_enabled ,
21212136 .recalc_rate = clk_trion_pll_recalc_rate ,
2122- .round_rate = clk_alpha_pll_round_rate ,
2137+ .determine_rate = clk_alpha_pll_determine_rate ,
21232138 .set_rate = alpha_pll_lucid_5lpe_set_rate ,
21242139};
21252140EXPORT_SYMBOL_GPL (clk_alpha_pll_lucid_5lpe_ops );
@@ -2129,13 +2144,13 @@ const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops = {
21292144 .disable = alpha_pll_lucid_5lpe_disable ,
21302145 .is_enabled = clk_trion_pll_is_enabled ,
21312146 .recalc_rate = clk_trion_pll_recalc_rate ,
2132- .round_rate = clk_alpha_pll_round_rate ,
2147+ .determine_rate = clk_alpha_pll_determine_rate ,
21332148};
21342149EXPORT_SYMBOL_GPL (clk_alpha_pll_fixed_lucid_5lpe_ops );
21352150
21362151const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = {
21372152 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate ,
2138- .round_rate = clk_alpha_pll_postdiv_fabia_round_rate ,
2153+ .determine_rate = clk_alpha_pll_postdiv_fabia_determine_rate ,
21392154 .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate ,
21402155};
21412156EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_lucid_5lpe_ops );
@@ -2304,7 +2319,7 @@ const struct clk_ops clk_alpha_pll_zonda_ops = {
23042319 .disable = clk_zonda_pll_disable ,
23052320 .is_enabled = clk_trion_pll_is_enabled ,
23062321 .recalc_rate = clk_trion_pll_recalc_rate ,
2307- .round_rate = clk_alpha_pll_round_rate ,
2322+ .determine_rate = clk_alpha_pll_determine_rate ,
23082323 .set_rate = clk_zonda_pll_set_rate ,
23092324};
23102325EXPORT_SYMBOL_GPL (clk_alpha_pll_zonda_ops );
@@ -2529,13 +2544,13 @@ const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops = {
25292544 .disable = alpha_pll_lucid_evo_disable ,
25302545 .is_enabled = clk_trion_pll_is_enabled ,
25312546 .recalc_rate = alpha_pll_lucid_evo_recalc_rate ,
2532- .round_rate = clk_alpha_pll_round_rate ,
2547+ .determine_rate = clk_alpha_pll_determine_rate ,
25332548};
25342549EXPORT_SYMBOL_GPL (clk_alpha_pll_fixed_lucid_evo_ops );
25352550
25362551const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops = {
25372552 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate ,
2538- .round_rate = clk_alpha_pll_postdiv_fabia_round_rate ,
2553+ .determine_rate = clk_alpha_pll_postdiv_fabia_determine_rate ,
25392554 .set_rate = clk_lucid_evo_pll_postdiv_set_rate ,
25402555};
25412556EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_lucid_evo_ops );
@@ -2546,7 +2561,7 @@ const struct clk_ops clk_alpha_pll_lucid_evo_ops = {
25462561 .disable = alpha_pll_lucid_evo_disable ,
25472562 .is_enabled = clk_trion_pll_is_enabled ,
25482563 .recalc_rate = alpha_pll_lucid_evo_recalc_rate ,
2549- .round_rate = clk_alpha_pll_round_rate ,
2564+ .determine_rate = clk_alpha_pll_determine_rate ,
25502565 .set_rate = alpha_pll_lucid_5lpe_set_rate ,
25512566};
25522567EXPORT_SYMBOL_GPL (clk_alpha_pll_lucid_evo_ops );
@@ -2557,7 +2572,7 @@ const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops = {
25572572 .disable = alpha_pll_reset_lucid_evo_disable ,
25582573 .is_enabled = clk_trion_pll_is_enabled ,
25592574 .recalc_rate = alpha_pll_lucid_evo_recalc_rate ,
2560- .round_rate = clk_alpha_pll_round_rate ,
2575+ .determine_rate = clk_alpha_pll_determine_rate ,
25612576 .set_rate = alpha_pll_lucid_5lpe_set_rate ,
25622577};
25632578EXPORT_SYMBOL_GPL (clk_alpha_pll_reset_lucid_evo_ops );
@@ -2732,30 +2747,33 @@ static unsigned long clk_rivian_evo_pll_recalc_rate(struct clk_hw *hw,
27322747 return parent_rate * l ;
27332748}
27342749
2735- static long clk_rivian_evo_pll_round_rate (struct clk_hw * hw , unsigned long rate ,
2736- unsigned long * prate )
2750+ static int clk_rivian_evo_pll_determine_rate (struct clk_hw * hw ,
2751+ struct clk_rate_request * req )
27372752{
27382753 struct clk_alpha_pll * pll = to_clk_alpha_pll (hw );
27392754 unsigned long min_freq , max_freq ;
27402755 u32 l ;
27412756 u64 a ;
27422757
2743- rate = alpha_pll_round_rate (rate , * prate , & l , & a , 0 );
2744- if (!pll -> vco_table || alpha_pll_find_vco (pll , rate ))
2745- return rate ;
2758+ req -> rate = alpha_pll_round_rate (req -> rate , req -> best_parent_rate , & l ,
2759+ & a , 0 );
2760+ if (!pll -> vco_table || alpha_pll_find_vco (pll , req -> rate ))
2761+ return 0 ;
27462762
27472763 min_freq = pll -> vco_table [0 ].min_freq ;
27482764 max_freq = pll -> vco_table [pll -> num_vco - 1 ].max_freq ;
27492765
2750- return clamp (rate , min_freq , max_freq );
2766+ req -> rate = clamp (req -> rate , min_freq , max_freq );
2767+
2768+ return 0 ;
27512769}
27522770
27532771const struct clk_ops clk_alpha_pll_rivian_evo_ops = {
27542772 .enable = alpha_pll_lucid_5lpe_enable ,
27552773 .disable = alpha_pll_lucid_5lpe_disable ,
27562774 .is_enabled = clk_trion_pll_is_enabled ,
27572775 .recalc_rate = clk_rivian_evo_pll_recalc_rate ,
2758- .round_rate = clk_rivian_evo_pll_round_rate ,
2776+ .determine_rate = clk_rivian_evo_pll_determine_rate ,
27592777};
27602778EXPORT_SYMBOL_GPL (clk_alpha_pll_rivian_evo_ops );
27612779
@@ -2964,7 +2982,7 @@ const struct clk_ops clk_alpha_pll_regera_ops = {
29642982 .disable = clk_zonda_pll_disable ,
29652983 .is_enabled = clk_alpha_pll_is_enabled ,
29662984 .recalc_rate = clk_trion_pll_recalc_rate ,
2967- .round_rate = clk_alpha_pll_round_rate ,
2985+ .determine_rate = clk_alpha_pll_determine_rate ,
29682986 .set_rate = clk_zonda_pll_set_rate ,
29692987};
29702988EXPORT_SYMBOL_GPL (clk_alpha_pll_regera_ops );
@@ -3169,7 +3187,7 @@ const struct clk_ops clk_alpha_pll_slew_ops = {
31693187 .enable = clk_alpha_pll_slew_enable ,
31703188 .disable = clk_alpha_pll_disable ,
31713189 .recalc_rate = clk_alpha_pll_recalc_rate ,
3172- .round_rate = clk_alpha_pll_round_rate ,
3190+ .determine_rate = clk_alpha_pll_determine_rate ,
31733191 .set_rate = clk_alpha_pll_slew_set_rate ,
31743192};
31753193EXPORT_SYMBOL (clk_alpha_pll_slew_ops );
0 commit comments