@@ -37,6 +37,22 @@ struct rk3188_clk_plat {
3737#endif
3838};
3939
40+ #ifndef CONFIG_SPL_BUILD
41+ #define RK3188_CLK_DUMP (_id , _name , _iscru ) \
42+ { \
43+ .id = _id, \
44+ .name = _name, \
45+ .is_cru = _iscru, \
46+ }
47+
48+ static const struct rk3188_clk_info clks_dump [] = {
49+ RK3188_CLK_DUMP (PLL_APLL , "apll" , true),
50+ RK3188_CLK_DUMP (PLL_DPLL , "dpll" , true),
51+ RK3188_CLK_DUMP (PLL_CPLL , "cpll" , true),
52+ RK3188_CLK_DUMP (PLL_GPLL , "gpll" , true),
53+ };
54+ #endif
55+
4056struct pll_div {
4157 u32 nr ;
4258 u32 nf ;
@@ -593,8 +609,14 @@ static int rk3188_clk_probe(struct udevice *dev)
593609
594610 priv -> cru = map_sysmem (plat -> dtd .reg [0 ], plat -> dtd .reg [1 ]);
595611#endif
596-
612+ priv -> sync_kernel = false;
613+ if (!priv -> armclk_enter_hz )
614+ priv -> armclk_enter_hz = rkclk_pll_get_rate (priv -> cru ,
615+ CLK_ARM );
597616 rkclk_init (priv -> cru , priv -> grf , priv -> has_bwadj );
617+ if (!priv -> armclk_init_hz )
618+ priv -> armclk_init_hz = rkclk_pll_get_rate (priv -> cru ,
619+ CLK_ARM );
598620#endif
599621
600622 return 0 ;
@@ -653,3 +675,69 @@ U_BOOT_DRIVER(rockchip_rk3188_cru) = {
653675 .ofdata_to_platdata = rk3188_clk_ofdata_to_platdata ,
654676 .probe = rk3188_clk_probe ,
655677};
678+
679+ #ifndef CONFIG_SPL_BUILD
680+ /**
681+ * soc_clk_dump() - Print clock frequencies
682+ * Returns zero on success
683+ *
684+ * Implementation for the clk dump command.
685+ */
686+ int soc_clk_dump (void )
687+ {
688+ struct udevice * cru_dev ;
689+ struct rk3188_clk_priv * priv ;
690+ const struct rk3188_clk_info * clk_dump ;
691+ struct clk clk ;
692+ unsigned long clk_count = ARRAY_SIZE (clks_dump );
693+ unsigned long rate ;
694+ int i , ret ;
695+
696+ ret = uclass_get_device_by_driver (UCLASS_CLK ,
697+ DM_GET_DRIVER (rockchip_rk3188_cru ),
698+ & cru_dev );
699+ if (ret ) {
700+ printf ("%s failed to get cru device\n" , __func__ );
701+ return ret ;
702+ }
703+
704+ priv = dev_get_priv (cru_dev );
705+ printf ("CLK: (%s. arm: enter %lu KHz, init %lu KHz, kernel %lu%s)\n" ,
706+ priv -> sync_kernel ? "sync kernel" : "uboot" ,
707+ priv -> armclk_enter_hz / 1000 ,
708+ priv -> armclk_init_hz / 1000 ,
709+ priv -> set_armclk_rate ? priv -> armclk_hz / 1000 : 0 ,
710+ priv -> set_armclk_rate ? " KHz" : "N/A" );
711+ for (i = 0 ; i < clk_count ; i ++ ) {
712+ clk_dump = & clks_dump [i ];
713+ if (clk_dump -> name ) {
714+ clk .id = clk_dump -> id ;
715+ if (clk_dump -> is_cru )
716+ ret = clk_request (cru_dev , & clk );
717+ if (ret < 0 )
718+ return ret ;
719+
720+ rate = clk_get_rate (& clk );
721+ clk_free (& clk );
722+ if (i == 0 ) {
723+ if (rate < 0 )
724+ printf (" %s %s\n" , clk_dump -> name ,
725+ "unknown" );
726+ else
727+ printf (" %s %lu KHz\n" , clk_dump -> name ,
728+ rate / 1000 );
729+ } else {
730+ if (rate < 0 )
731+ printf (" %s %s\n" , clk_dump -> name ,
732+ "unknown" );
733+ else
734+ printf (" %s %lu KHz\n" , clk_dump -> name ,
735+ rate / 1000 );
736+ }
737+ }
738+ }
739+
740+ return 0 ;
741+ }
742+ #endif
743+
0 commit comments