@@ -421,12 +421,32 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
421421 rockchip_rk3036_pll_get_params (pll , & cur );
422422 cur .rate = 0 ;
423423
424+ if (pll -> type == pll_px30 ) {
425+ writel_relaxed (HIWORD_UPDATE (1 , PX30_BOOST_RECOVERY_MASK ,
426+ PX30_BOOST_RECOVERY_SHIFT ),
427+ pll -> reg_base + PX30_BOOST_BOOST_CON );
428+ do {
429+ ret = readl_relaxed (pll -> reg_base +
430+ PX30_BOOST_FSM_STATUS );
431+ } while (ret & PX30_BOOST_BUSY_STATE );
432+ writel_relaxed (HIWORD_UPDATE (1 , PX30_BOOST_SW_CTRL_MASK ,
433+ PX30_BOOST_SW_CTRL_SHIFT ) |
434+ HIWORD_UPDATE (1 , PX30_BOOST_LOW_FREQ_EN_MASK ,
435+ PX30_BOOST_LOW_FREQ_EN_SHIFT ),
436+ pll -> reg_base + PX30_BOOST_BOOST_CON );
437+ }
438+
424439 cur_parent = pll_mux_ops -> get_parent (& pll_mux -> hw );
425440 if (cur_parent == PLL_MODE_NORM ) {
426441 pll_mux_ops -> set_parent (& pll_mux -> hw , PLL_MODE_SLOW );
427442 rate_change_remuxed = 1 ;
428443 }
429444
445+ /* set pll power down */
446+ writel (HIWORD_UPDATE (1 ,
447+ RK3036_PLLCON1_PWRDOWN , 13 ),
448+ pll -> reg_base + RK3036_PLLCON (1 ));
449+
430450 /* update pll values */
431451 writel_relaxed (HIWORD_UPDATE (rate -> fbdiv , RK3036_PLLCON0_FBDIV_MASK ,
432452 RK3036_PLLCON0_FBDIV_SHIFT ) |
@@ -448,6 +468,16 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
448468 pllcon |= rate -> frac << RK3036_PLLCON2_FRAC_SHIFT ;
449469 writel_relaxed (pllcon , pll -> reg_base + RK3036_PLLCON (2 ));
450470
471+ if (pll -> type == pll_px30 ) {
472+ writel_relaxed (HIWORD_UPDATE (0 , PX30_BOOST_LOW_FREQ_EN_MASK ,
473+ PX30_BOOST_LOW_FREQ_EN_SHIFT ),
474+ pll -> reg_base + PX30_BOOST_BOOST_CON );
475+ }
476+
477+ /* set pll power up */
478+ writel (HIWORD_UPDATE (0 , RK3036_PLLCON1_PWRDOWN , 13 ),
479+ pll -> reg_base + RK3036_PLLCON (1 ));
480+
451481 /* wait for the pll to lock */
452482 ret = rockchip_pll_wait_lock (pll );
453483 if (ret ) {
@@ -459,6 +489,15 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
459489 if (rate_change_remuxed )
460490 pll_mux_ops -> set_parent (& pll_mux -> hw , PLL_MODE_NORM );
461491
492+ if (pll -> type == pll_px30 ) {
493+ writel_relaxed (HIWORD_UPDATE (0 , PX30_BOOST_RECOVERY_MASK ,
494+ PX30_BOOST_RECOVERY_SHIFT ),
495+ pll -> reg_base + PX30_BOOST_BOOST_CON );
496+ writel_relaxed (HIWORD_UPDATE (0 , PX30_BOOST_SW_CTRL_MASK ,
497+ PX30_BOOST_SW_CTRL_SHIFT ),
498+ pll -> reg_base + PX30_BOOST_BOOST_CON );
499+ }
500+
462501 return ret ;
463502}
464503
@@ -1303,7 +1342,8 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
13031342 pll_mux -> lock = & ctx -> lock ;
13041343 pll_mux -> hw .init = & init ;
13051344
1306- if (pll_type == pll_rk3036 ||
1345+ if (pll_type == pll_px30 ||
1346+ pll_type == pll_rk3036 ||
13071347 pll_type == pll_rk3066 ||
13081348 pll_type == pll_rk3328 ||
13091349 pll_type == pll_rk3366 ||
@@ -1355,6 +1395,7 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
13551395 }
13561396
13571397 switch (pll_type ) {
1398+ case pll_px30 :
13581399 case pll_rk3036 :
13591400 case pll_rk3328 :
13601401 if (!pll -> rate_table )
0 commit comments