xref: /rk3399_rockchip-uboot/arch/arm/mach-keystone/cmd_clock.c (revision 43ebbfc39ff0b59047b84827a9f92f4a8ff9bb9b)
139a72345SMasahiro Yamada /*
239a72345SMasahiro Yamada  * keystone2: commands for clocks
339a72345SMasahiro Yamada  *
439a72345SMasahiro Yamada  * (C) Copyright 2012-2014
539a72345SMasahiro Yamada  *     Texas Instruments Incorporated, <www.ti.com>
639a72345SMasahiro Yamada  *
739a72345SMasahiro Yamada  * SPDX-License-Identifier:     GPL-2.0+
839a72345SMasahiro Yamada  */
939a72345SMasahiro Yamada 
1039a72345SMasahiro Yamada #include <common.h>
1139a72345SMasahiro Yamada #include <command.h>
1239a72345SMasahiro Yamada #include <asm/arch/hardware.h>
1339a72345SMasahiro Yamada #include <asm/arch/clock.h>
1439a72345SMasahiro Yamada #include <asm/arch/psc_defs.h>
1539a72345SMasahiro Yamada 
1639a72345SMasahiro Yamada struct pll_init_data cmd_pll_data = {
1739a72345SMasahiro Yamada 	.pll = MAIN_PLL,
1839a72345SMasahiro Yamada 	.pll_m = 16,
1939a72345SMasahiro Yamada 	.pll_d = 1,
2039a72345SMasahiro Yamada 	.pll_od = 2,
2139a72345SMasahiro Yamada };
2239a72345SMasahiro Yamada 
do_pll_cmd(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])2339a72345SMasahiro Yamada int do_pll_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
2439a72345SMasahiro Yamada {
2539a72345SMasahiro Yamada 	if (argc != 5)
2639a72345SMasahiro Yamada 		goto pll_cmd_usage;
2739a72345SMasahiro Yamada 
2839a72345SMasahiro Yamada 	if (strncmp(argv[1], "pa", 2) == 0)
2939a72345SMasahiro Yamada 		cmd_pll_data.pll = PASS_PLL;
3039a72345SMasahiro Yamada #ifndef CONFIG_SOC_K2E
3139a72345SMasahiro Yamada 	else if (strncmp(argv[1], "arm", 3) == 0)
3239a72345SMasahiro Yamada 		cmd_pll_data.pll = TETRIS_PLL;
3339a72345SMasahiro Yamada #endif
3439a72345SMasahiro Yamada #ifdef CONFIG_SOC_K2HK
3539a72345SMasahiro Yamada 	else if (strncmp(argv[1], "ddr3a", 5) == 0)
3639a72345SMasahiro Yamada 		cmd_pll_data.pll = DDR3A_PLL;
3739a72345SMasahiro Yamada 	else if (strncmp(argv[1], "ddr3b", 5) == 0)
3839a72345SMasahiro Yamada 		cmd_pll_data.pll = DDR3B_PLL;
3939a72345SMasahiro Yamada #else
4039a72345SMasahiro Yamada 	else if (strncmp(argv[1], "ddr3", 4) == 0)
4139a72345SMasahiro Yamada 		cmd_pll_data.pll = DDR3_PLL;
4239a72345SMasahiro Yamada #endif
4339a72345SMasahiro Yamada 	else
4439a72345SMasahiro Yamada 		goto pll_cmd_usage;
4539a72345SMasahiro Yamada 
4639a72345SMasahiro Yamada 	cmd_pll_data.pll_m   = simple_strtoul(argv[2], NULL, 10);
4739a72345SMasahiro Yamada 	cmd_pll_data.pll_d   = simple_strtoul(argv[3], NULL, 10);
4839a72345SMasahiro Yamada 	cmd_pll_data.pll_od  = simple_strtoul(argv[4], NULL, 10);
4939a72345SMasahiro Yamada 
5039a72345SMasahiro Yamada 	printf("Trying to set pll %d; mult %d; div %d; OD %d\n",
5139a72345SMasahiro Yamada 	       cmd_pll_data.pll, cmd_pll_data.pll_m,
5239a72345SMasahiro Yamada 	       cmd_pll_data.pll_d, cmd_pll_data.pll_od);
5339a72345SMasahiro Yamada 	init_pll(&cmd_pll_data);
5439a72345SMasahiro Yamada 
5539a72345SMasahiro Yamada 	return 0;
5639a72345SMasahiro Yamada 
5739a72345SMasahiro Yamada pll_cmd_usage:
5839a72345SMasahiro Yamada 	return cmd_usage(cmdtp);
5939a72345SMasahiro Yamada }
6039a72345SMasahiro Yamada 
6139a72345SMasahiro Yamada U_BOOT_CMD(
6239a72345SMasahiro Yamada 	pllset, 5,      0,      do_pll_cmd,
6339a72345SMasahiro Yamada 	"set pll multiplier and pre divider",
6439a72345SMasahiro Yamada 	PLLSET_CMD_LIST " <mult> <div> <OD>\n"
6539a72345SMasahiro Yamada );
6639a72345SMasahiro Yamada 
do_getclk_cmd(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])6739a72345SMasahiro Yamada int do_getclk_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
6839a72345SMasahiro Yamada {
6939a72345SMasahiro Yamada 	unsigned int clk;
70fe772ebdSLokesh Vutla 	unsigned long freq;
7139a72345SMasahiro Yamada 
7239a72345SMasahiro Yamada 	if (argc != 2)
7339a72345SMasahiro Yamada 		goto getclk_cmd_usage;
7439a72345SMasahiro Yamada 
7539a72345SMasahiro Yamada 	clk = simple_strtoul(argv[1], NULL, 10);
7639a72345SMasahiro Yamada 
77*43ebbfc3SMasahiro Yamada 	freq = ks_clk_get_rate(clk);
78fe772ebdSLokesh Vutla 	if (freq)
79fe772ebdSLokesh Vutla 		printf("clock index [%d] - frequency %lu\n", clk, freq);
80fe772ebdSLokesh Vutla 	else
81fe772ebdSLokesh Vutla 		printf("clock index [%d] Not available\n", clk);
8239a72345SMasahiro Yamada 	return 0;
8339a72345SMasahiro Yamada 
8439a72345SMasahiro Yamada getclk_cmd_usage:
8539a72345SMasahiro Yamada 	return cmd_usage(cmdtp);
8639a72345SMasahiro Yamada }
8739a72345SMasahiro Yamada 
8839a72345SMasahiro Yamada U_BOOT_CMD(
8939a72345SMasahiro Yamada 	getclk,	2,	0,	do_getclk_cmd,
9039a72345SMasahiro Yamada 	"get clock rate",
9139a72345SMasahiro Yamada 	"<clk index>\n"
9239a72345SMasahiro Yamada 	"The indexes for clocks:\n"
9339a72345SMasahiro Yamada 	CLOCK_INDEXES_LIST
9439a72345SMasahiro Yamada );
9539a72345SMasahiro Yamada 
do_psc_cmd(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])9639a72345SMasahiro Yamada int do_psc_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
9739a72345SMasahiro Yamada {
9839a72345SMasahiro Yamada 	int	psc_module;
9939a72345SMasahiro Yamada 	int	res;
10039a72345SMasahiro Yamada 
10139a72345SMasahiro Yamada 	if (argc != 3)
10239a72345SMasahiro Yamada 		goto psc_cmd_usage;
10339a72345SMasahiro Yamada 
10439a72345SMasahiro Yamada 	psc_module = simple_strtoul(argv[1], NULL, 10);
10539a72345SMasahiro Yamada 	if (strcmp(argv[2], "en") == 0) {
10639a72345SMasahiro Yamada 		res = psc_enable_module(psc_module);
10739a72345SMasahiro Yamada 		printf("psc_enable_module(%d) - %s\n", psc_module,
10839a72345SMasahiro Yamada 		       (res) ? "ERROR" : "OK");
10939a72345SMasahiro Yamada 		return 0;
11039a72345SMasahiro Yamada 	}
11139a72345SMasahiro Yamada 
11239a72345SMasahiro Yamada 	if (strcmp(argv[2], "di") == 0) {
11339a72345SMasahiro Yamada 		res = psc_disable_module(psc_module);
11439a72345SMasahiro Yamada 		printf("psc_disable_module(%d) - %s\n", psc_module,
11539a72345SMasahiro Yamada 		       (res) ? "ERROR" : "OK");
11639a72345SMasahiro Yamada 		return 0;
11739a72345SMasahiro Yamada 	}
11839a72345SMasahiro Yamada 
11939a72345SMasahiro Yamada 	if (strcmp(argv[2], "domain") == 0) {
12039a72345SMasahiro Yamada 		res = psc_disable_domain(psc_module);
12139a72345SMasahiro Yamada 		printf("psc_disable_domain(%d) - %s\n", psc_module,
12239a72345SMasahiro Yamada 		       (res) ? "ERROR" : "OK");
12339a72345SMasahiro Yamada 		return 0;
12439a72345SMasahiro Yamada 	}
12539a72345SMasahiro Yamada 
12639a72345SMasahiro Yamada psc_cmd_usage:
12739a72345SMasahiro Yamada 	return cmd_usage(cmdtp);
12839a72345SMasahiro Yamada }
12939a72345SMasahiro Yamada 
13039a72345SMasahiro Yamada U_BOOT_CMD(
13139a72345SMasahiro Yamada 	psc,	3,	0,	do_psc_cmd,
13239a72345SMasahiro Yamada 	"<enable/disable psc module os disable domain>",
13339a72345SMasahiro Yamada 	"<mod/domain index> <en|di|domain>\n"
13439a72345SMasahiro Yamada 	"Intended to control Power and Sleep Controller (PSC) domains and\n"
13539a72345SMasahiro Yamada 	"modules. The module or domain index exectly corresponds to ones\n"
13639a72345SMasahiro Yamada 	"listed in official TRM. For instance, to enable MSMC RAM clock\n"
13739a72345SMasahiro Yamada 	"domain use command: psc 14 en.\n"
13839a72345SMasahiro Yamada );
139