clk: add support for setting clk rate from cmdline

Add new clk subcommand "clk setfreq", for setting up a clock rate
directly from u-boot cmdline. This is handy for any debugging purposes
towards clocks.

Acked-by: Lukasz Majewski <lukma@denx.de>
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Tero Kristo <kristo@kernel.org>
This commit is contained in:
Tero Kristo 2021-06-11 11:45:09 +03:00 committed by Lokesh Vutla
parent 920ea5a7f8
commit 7ab418fbe6

View File

@ -98,8 +98,56 @@ static int do_clk_dump(struct cmd_tbl *cmdtp, int flag, int argc,
return ret;
}
#if CONFIG_IS_ENABLED(DM) && CONFIG_IS_ENABLED(CLK)
struct udevice *clk_lookup(const char *name)
{
int i = 0;
struct udevice *dev;
do {
uclass_get_device(UCLASS_CLK, i++, &dev);
if (!strcmp(name, dev->name))
return dev;
} while (dev);
return NULL;
}
static int do_clk_setfreq(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct clk *clk = NULL;
s32 freq;
struct udevice *dev;
freq = simple_strtoul(argv[2], NULL, 10);
dev = clk_lookup(argv[1]);
if (dev)
clk = dev_get_clk_ptr(dev);
if (!clk) {
printf("clock '%s' not found.\n", argv[1]);
return -EINVAL;
}
freq = clk_set_rate(clk, freq);
if (freq < 0) {
printf("set_rate failed: %d\n", freq);
return CMD_RET_FAILURE;
}
printf("set_rate returns %u\n", freq);
return 0;
}
#endif
static struct cmd_tbl cmd_clk_sub[] = {
U_BOOT_CMD_MKENT(dump, 1, 1, do_clk_dump, "", ""),
#if CONFIG_IS_ENABLED(DM) && CONFIG_IS_ENABLED(CLK)
U_BOOT_CMD_MKENT(setfreq, 3, 1, do_clk_setfreq, "", ""),
#endif
};
static int do_clk(struct cmd_tbl *cmdtp, int flag, int argc,
@ -124,7 +172,8 @@ static int do_clk(struct cmd_tbl *cmdtp, int flag, int argc,
#ifdef CONFIG_SYS_LONGHELP
static char clk_help_text[] =
"dump - Print clock frequencies";
"dump - Print clock frequencies\n"
"setfreq [clk] [freq] - Set clock frequency";
#endif
U_BOOT_CMD(clk, 2, 1, do_clk, "CLK sub-system", clk_help_text);
U_BOOT_CMD(clk, 4, 1, do_clk, "CLK sub-system", clk_help_text);