@@ -36,6 +36,22 @@ struct rk3066_clk_plat {
3636#endif
3737};
3838
39+ #ifndef CONFIG_SPL_BUILD
40+ #define RK3066_CLK_DUMP (_id , _name , _iscru ) \
41+ { \
42+ .id = _id, \
43+ .name = _name, \
44+ .is_cru = _iscru, \
45+ }
46+
47+ static const struct rk3066_clk_info clks_dump [] = {
48+ RK3066_CLK_DUMP (PLL_APLL , "apll" , true),
49+ RK3066_CLK_DUMP (PLL_DPLL , "dpll" , true),
50+ RK3066_CLK_DUMP (PLL_GPLL , "gpll" , true),
51+ RK3066_CLK_DUMP (PLL_CPLL , "cpll" , true),
52+ };
53+ #endif
54+
3955struct pll_div {
4056 u32 nr ;
4157 u32 nf ;
@@ -550,10 +566,15 @@ static int rk3066_clk_probe(struct udevice *dev)
550566
551567 priv -> cru = map_sysmem (plat -> dtd .reg [0 ], plat -> dtd .reg [1 ]);
552568#endif
553-
569+ priv -> sync_kernel = false;
570+ if (!priv -> armclk_enter_hz )
571+ priv -> armclk_enter_hz = rkclk_pll_get_rate (priv -> cru ,
572+ CLK_ARM );
554573 rkclk_init (priv -> cru , priv -> grf , 1 );
574+ if (!priv -> armclk_init_hz )
575+ priv -> armclk_init_hz = rkclk_pll_get_rate (priv -> cru ,
576+ CLK_ARM );
555577#endif
556-
557578 return 0 ;
558579}
559580
@@ -609,3 +630,69 @@ U_BOOT_DRIVER(rockchip_rk3066a_cru) = {
609630 .ofdata_to_platdata = rk3066_clk_ofdata_to_platdata ,
610631 .probe = rk3066_clk_probe ,
611632};
633+
634+ #ifndef CONFIG_SPL_BUILD
635+ /**
636+ * soc_clk_dump() - Print clock frequencies
637+ * Returns zero on success
638+ *
639+ * Implementation for the clk dump command.
640+ */
641+ int soc_clk_dump (void )
642+ {
643+ struct udevice * cru_dev ;
644+ struct rk3066_clk_priv * priv ;
645+ const struct rk3066_clk_info * clk_dump ;
646+ struct clk clk ;
647+ unsigned long clk_count = ARRAY_SIZE (clks_dump );
648+ unsigned long rate ;
649+ int i , ret ;
650+
651+ ret = uclass_get_device_by_driver (UCLASS_CLK ,
652+ DM_GET_DRIVER (rockchip_rk3066a_cru ),
653+ & cru_dev );
654+ if (ret ) {
655+ printf ("%s failed to get cru device\n" , __func__ );
656+ return ret ;
657+ }
658+
659+ priv = dev_get_priv (cru_dev );
660+ printf ("CLK: (%s. arm: enter %lu KHz, init %lu KHz, kernel %lu%s)\n" ,
661+ priv -> sync_kernel ? "sync kernel" : "uboot" ,
662+ priv -> armclk_enter_hz / 1000 ,
663+ priv -> armclk_init_hz / 1000 ,
664+ priv -> set_armclk_rate ? priv -> armclk_hz / 1000 : 0 ,
665+ priv -> set_armclk_rate ? " KHz" : "N/A" );
666+ for (i = 0 ; i < clk_count ; i ++ ) {
667+ clk_dump = & clks_dump [i ];
668+ if (clk_dump -> name ) {
669+ clk .id = clk_dump -> id ;
670+ if (clk_dump -> is_cru )
671+ ret = clk_request (cru_dev , & clk );
672+ if (ret < 0 )
673+ return ret ;
674+
675+ rate = clk_get_rate (& clk );
676+ clk_free (& clk );
677+ if (i == 0 ) {
678+ if (rate < 0 )
679+ printf (" %s %s\n" , clk_dump -> name ,
680+ "unknown" );
681+ else
682+ printf (" %s %lu KHz\n" , clk_dump -> name ,
683+ rate / 1000 );
684+ } else {
685+ if (rate < 0 )
686+ printf (" %s %s\n" , clk_dump -> name ,
687+ "unknown" );
688+ else
689+ printf (" %s %lu KHz\n" , clk_dump -> name ,
690+ rate / 1000 );
691+ }
692+ }
693+ }
694+
695+ return 0 ;
696+ }
697+ #endif
698+
0 commit comments