diff options
author | Tom Rini <trini@konsulko.com> | 2017-07-18 08:42:48 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-07-18 08:42:48 -0400 |
commit | 39632b4a01210e329333d787d828157dcd2c7328 (patch) | |
tree | a1013e4161de425f81aea052eeabe572c5e557d3 /arch/arm/mach-imx/cmd_bmode.c | |
parent | e14b1169c0c5a1b362b41451006b492bd16f2fff (diff) | |
parent | 651782a08b5bb4e710bda1b11fff774b8ade384f (diff) | |
download | u-boot-39632b4a01210e329333d787d828157dcd2c7328.tar.gz |
Merge branch 'master' of git://www.denx.de/git/u-boot-imx
Diffstat (limited to 'arch/arm/mach-imx/cmd_bmode.c')
-rw-r--r-- | arch/arm/mach-imx/cmd_bmode.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/cmd_bmode.c b/arch/arm/mach-imx/cmd_bmode.c new file mode 100644 index 0000000000..4ee514fdc6 --- /dev/null +++ b/arch/arm/mach-imx/cmd_bmode.c @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2012 Boundary Devices Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include <common.h> +#include <linux/errno.h> +#include <asm/io.h> +#include <asm/mach-imx/boot_mode.h> +#include <malloc.h> +#include <command.h> + +static const struct boot_mode *modes[2]; + +static const struct boot_mode *search_modes(char *arg) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(modes); i++) { + const struct boot_mode *p = modes[i]; + if (p) { + while (p->name) { + if (!strcmp(p->name, arg)) + return p; + p++; + } + } + } + return NULL; +} + +static int create_usage(char *dest) +{ + int i; + int size = 0; + + for (i = 0; i < ARRAY_SIZE(modes); i++) { + const struct boot_mode *p = modes[i]; + if (p) { + while (p->name) { + int len = strlen(p->name); + if (dest) { + memcpy(dest, p->name, len); + dest += len; + *dest++ = '|'; + } + size += len + 1; + p++; + } + } + } + if (dest) + memcpy(dest - 1, " [noreset]", 11); /* include trailing 0 */ + size += 10; + return size; +} + +static int do_boot_mode(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + const struct boot_mode *p; + int reset_requested = 1; + + if (argc < 2) + return CMD_RET_USAGE; + p = search_modes(argv[1]); + if (!p) + return CMD_RET_USAGE; + if (argc == 3) { + if (strcmp(argv[2], "noreset")) + return CMD_RET_USAGE; + reset_requested = 0; + } + + boot_mode_apply(p->cfg_val); + if (reset_requested && p->cfg_val) + do_reset(NULL, 0, 0, NULL); + return 0; +} + +U_BOOT_CMD( + bmode, 3, 0, do_boot_mode, + NULL, + ""); + +void add_board_boot_modes(const struct boot_mode *p) +{ + int size; + char *dest; + + cmd_tbl_t *entry = ll_entry_get(cmd_tbl_t, bmode, cmd); + + if (entry->usage) { + free(entry->usage); + entry->usage = NULL; + } + + modes[0] = p; + modes[1] = soc_boot_modes; + size = create_usage(NULL); + dest = malloc(size); + if (dest) { + create_usage(dest); + entry->usage = dest; + } +} |