|
@@ -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);
|