From c797f3c168e2c3fd8bc9532680b7c587652ac8c1 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 24 Sep 2012 00:38:25 +0200 Subject: commands: Add clk commands This adds some basic commands to manupulate clocks on the command line. Right now we have: - clk_set_parent - clk_set_rate - clk_enable - clk_disable - clk_dump The commands work based on the clock name, otherwise they behave like the Linux Kernel C functions. clk_dump will dump the clocktree to the console. Signed-off-by: Sascha Hauer --- commands/Kconfig | 8 +++ commands/Makefile | 1 + commands/clk.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 commands/clk.c (limited to 'commands') diff --git a/commands/Kconfig b/commands/Kconfig index 1561315633..cf4142008b 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -613,6 +613,14 @@ config CMD_USB help The usb command allows to rescan for USB devices. +config CMD_CLK + tristate + depends on COMMON_CLK + prompt "clock manipulation commands" + help + Say yes here to get clk_set_rate, clk_set_parent and clk_dump + commands to manipulate clocks on your system. + menuconfig CMD_WD bool depends on WATCHDOG diff --git a/commands/Makefile b/commands/Makefile index bd2dfaa735..610be55c6a 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -74,4 +74,5 @@ obj-$(CONFIG_CMD_BASENAME) += basename.o obj-$(CONFIG_CMD_DIRNAME) += dirname.o obj-$(CONFIG_CMD_READLINK) += readlink.o obj-$(CONFIG_CMD_LN) += ln.o +obj-$(CONFIG_CMD_CLK) += clk.o obj-$(CONFIG_CMD_TFTP) += tftp.o diff --git a/commands/clk.c b/commands/clk.c new file mode 100644 index 0000000000..241dc79c36 --- /dev/null +++ b/commands/clk.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#include + +static int do_clk_enable(int argc, char *argv[]) +{ + struct clk *clk; + + if (argc != 2) + return COMMAND_ERROR_USAGE; + + clk = clk_lookup(argv[1]); + if (IS_ERR(clk)) + return PTR_ERR(clk); + + return clk_enable(clk); +} + +BAREBOX_CMD_HELP_START(clk_enable) +BAREBOX_CMD_HELP_USAGE("clk_enable \n") +BAREBOX_CMD_HELP_SHORT("enable \n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(clk_enable) + .cmd = do_clk_enable, + .usage = "enable a clock", + BAREBOX_CMD_HELP(cmd_clk_enable_help) +BAREBOX_CMD_END + +static int do_clk_disable(int argc, char *argv[]) +{ + struct clk *clk; + + if (argc != 2) + return COMMAND_ERROR_USAGE; + + clk = clk_lookup(argv[1]); + if (IS_ERR(clk)) + return PTR_ERR(clk); + + clk_disable(clk); + + return 0; +} + +BAREBOX_CMD_HELP_START(clk_disable) +BAREBOX_CMD_HELP_USAGE("clk_disable \n") +BAREBOX_CMD_HELP_SHORT("disable \n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(clk_disable) + .cmd = do_clk_disable, + .usage = "disable a clock", + BAREBOX_CMD_HELP(cmd_clk_disable_help) +BAREBOX_CMD_END + +static int do_clk_set_rate(int argc, char *argv[]) +{ + struct clk *clk; + unsigned long rate; + + if (argc != 3) + return COMMAND_ERROR_USAGE; + + clk = clk_lookup(argv[1]); + if (IS_ERR(clk)) + return PTR_ERR(clk); + + rate = simple_strtoul(argv[2], NULL, 0); + + return clk_set_rate(clk, rate); +} + +BAREBOX_CMD_HELP_START(clk_set_rate) +BAREBOX_CMD_HELP_USAGE("clk_set_rate \n") +BAREBOX_CMD_HELP_SHORT("Set clock to \n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(clk_set_rate) + .cmd = do_clk_set_rate, + .usage = "set a clocks rate", + BAREBOX_CMD_HELP(cmd_clk_set_rate_help) +BAREBOX_CMD_END + +static int do_clk_dump(int argc, char *argv[]) +{ + int opt, verbose = 0; + + while ((opt = getopt(argc, argv, "v")) > 0) { + switch(opt) { + case 'v': + verbose = 1; + break; + default: + return -EINVAL; + + } + } + + clk_dump(verbose); + + return 0; +} + +BAREBOX_CMD_HELP_START(clk_dump) +BAREBOX_CMD_HELP_USAGE("clk_dump [-v]\n") +BAREBOX_CMD_HELP_OPT ("-v", "verbose\n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(clk_dump) + .cmd = do_clk_dump, + .usage = "show information about registered clocks", + BAREBOX_CMD_HELP(cmd_clk_dump_help) +BAREBOX_CMD_END + +static int do_clk_set_parent(int argc, char *argv[]) +{ + struct clk *clk, *parent; + + if (argc != 3) + return COMMAND_ERROR_USAGE; + + clk = clk_lookup(argv[1]); + if (IS_ERR(clk)) + return PTR_ERR(clk); + parent = clk_lookup(argv[2]); + if (IS_ERR(parent)) + return PTR_ERR(parent); + + return clk_set_parent(clk, parent); +} + +BAREBOX_CMD_HELP_START(clk_set_parent) +BAREBOX_CMD_HELP_USAGE("clk_set_parent \n") +BAREBOX_CMD_HELP_SHORT("Set parent of to \n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(clk_set_parent) + .cmd = do_clk_set_parent, + .usage = "set a parent of a clock", + BAREBOX_CMD_HELP(cmd_clk_set_parent_help) +BAREBOX_CMD_END -- cgit v1.2.3