@@ -154,6 +154,18 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = {
154154 [PLL_OFF_TEST_CTL_U ] = 0x30 ,
155155 [PLL_OFF_TEST_CTL_U1 ] = 0x34 ,
156156 },
157+ [CLK_ALPHA_PLL_TYPE_RIVIAN_EVO ] = {
158+ [PLL_OFF_OPMODE ] = 0x04 ,
159+ [PLL_OFF_STATUS ] = 0x0c ,
160+ [PLL_OFF_L_VAL ] = 0x10 ,
161+ [PLL_OFF_USER_CTL ] = 0x14 ,
162+ [PLL_OFF_USER_CTL_U ] = 0x18 ,
163+ [PLL_OFF_CONFIG_CTL ] = 0x1c ,
164+ [PLL_OFF_CONFIG_CTL_U ] = 0x20 ,
165+ [PLL_OFF_CONFIG_CTL_U1 ] = 0x24 ,
166+ [PLL_OFF_TEST_CTL ] = 0x28 ,
167+ [PLL_OFF_TEST_CTL_U ] = 0x2c ,
168+ },
157169};
158170EXPORT_SYMBOL_GPL (clk_alpha_pll_regs );
159171
@@ -2178,3 +2190,61 @@ const struct clk_ops clk_alpha_pll_lucid_evo_ops = {
21782190 .set_rate = alpha_pll_lucid_5lpe_set_rate ,
21792191};
21802192EXPORT_SYMBOL_GPL (clk_alpha_pll_lucid_evo_ops );
2193+
2194+ void clk_rivian_evo_pll_configure (struct clk_alpha_pll * pll , struct regmap * regmap ,
2195+ const struct alpha_pll_config * config )
2196+ {
2197+ clk_alpha_pll_write_config (regmap , PLL_CONFIG_CTL (pll ), config -> config_ctl_val );
2198+ clk_alpha_pll_write_config (regmap , PLL_CONFIG_CTL_U (pll ), config -> config_ctl_hi_val );
2199+ clk_alpha_pll_write_config (regmap , PLL_CONFIG_CTL_U1 (pll ), config -> config_ctl_hi1_val );
2200+ clk_alpha_pll_write_config (regmap , PLL_TEST_CTL (pll ), config -> test_ctl_val );
2201+ clk_alpha_pll_write_config (regmap , PLL_TEST_CTL_U (pll ), config -> test_ctl_hi_val );
2202+ clk_alpha_pll_write_config (regmap , PLL_L_VAL (pll ), config -> l );
2203+ clk_alpha_pll_write_config (regmap , PLL_USER_CTL (pll ), config -> user_ctl_val );
2204+ clk_alpha_pll_write_config (regmap , PLL_USER_CTL_U (pll ), config -> user_ctl_hi_val );
2205+
2206+ regmap_write (regmap , PLL_OPMODE (pll ), PLL_STANDBY );
2207+
2208+ regmap_update_bits (regmap , PLL_MODE (pll ),
2209+ PLL_RESET_N | PLL_BYPASSNL | PLL_OUTCTRL ,
2210+ PLL_RESET_N | PLL_BYPASSNL );
2211+ }
2212+ EXPORT_SYMBOL_GPL (clk_rivian_evo_pll_configure );
2213+
2214+ static unsigned long clk_rivian_evo_pll_recalc_rate (struct clk_hw * hw ,
2215+ unsigned long parent_rate )
2216+ {
2217+ struct clk_alpha_pll * pll = to_clk_alpha_pll (hw );
2218+ u32 l ;
2219+
2220+ regmap_read (pll -> clkr .regmap , PLL_L_VAL (pll ), & l );
2221+
2222+ return parent_rate * l ;
2223+ }
2224+
2225+ static long clk_rivian_evo_pll_round_rate (struct clk_hw * hw , unsigned long rate ,
2226+ unsigned long * prate )
2227+ {
2228+ struct clk_alpha_pll * pll = to_clk_alpha_pll (hw );
2229+ unsigned long min_freq , max_freq ;
2230+ u32 l ;
2231+ u64 a ;
2232+
2233+ rate = alpha_pll_round_rate (rate , * prate , & l , & a , 0 );
2234+ if (!pll -> vco_table || alpha_pll_find_vco (pll , rate ))
2235+ return rate ;
2236+
2237+ min_freq = pll -> vco_table [0 ].min_freq ;
2238+ max_freq = pll -> vco_table [pll -> num_vco - 1 ].max_freq ;
2239+
2240+ return clamp (rate , min_freq , max_freq );
2241+ }
2242+
2243+ const struct clk_ops clk_alpha_pll_rivian_evo_ops = {
2244+ .enable = alpha_pll_lucid_5lpe_enable ,
2245+ .disable = alpha_pll_lucid_5lpe_disable ,
2246+ .is_enabled = clk_trion_pll_is_enabled ,
2247+ .recalc_rate = clk_rivian_evo_pll_recalc_rate ,
2248+ .round_rate = clk_rivian_evo_pll_round_rate ,
2249+ };
2250+ EXPORT_SYMBOL_GPL (clk_alpha_pll_rivian_evo_ops );
0 commit comments