diff options
author | Tom Rini <trini@konsulko.com> | 2024-02-13 17:31:11 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2024-02-13 17:32:17 -0500 |
commit | 0b66c54a97320956b837f61216debfb50c0ffec6 (patch) | |
tree | 4a641d6853dd8dd7fd7586b6be8d67c418717204 | |
parent | 73b5b47dd5b546d0b9106bcca54c72815380e6d3 (diff) | |
parent | ea7d3eec1e6e6541db68bf48a1314410e06cd9de (diff) | |
download | u-boot-0b66c54a97320956b837f61216debfb50c0ffec6.zip u-boot-0b66c54a97320956b837f61216debfb50c0ffec6.tar.gz u-boot-0b66c54a97320956b837f61216debfb50c0ffec6.tar.bz2 |
Merge branch '2024-02-13-assorted-updates'
- Add the button command patch, update MAINTAINERS entry for a platform,
fix a problem with the hash command, fix a problem on K3 platforms and
revert a change on verdin-am62.
-rw-r--r-- | board/hisilicon/poplar/MAINTAINERS | 1 | ||||
-rw-r--r-- | board/toradex/verdin-am62/verdin-am62.c | 47 | ||||
-rw-r--r-- | boot/Kconfig | 15 | ||||
-rw-r--r-- | cmd/hash.c | 19 | ||||
-rw-r--r-- | common/Makefile | 1 | ||||
-rw-r--r-- | common/button_cmd.c | 83 | ||||
-rw-r--r-- | common/main.c | 3 | ||||
-rw-r--r-- | doc/usage/environment.rst | 4 | ||||
-rw-r--r-- | drivers/memory/ti-gpmc.c | 6 | ||||
-rw-r--r-- | include/button.h | 9 |
10 files changed, 132 insertions, 56 deletions
diff --git a/board/hisilicon/poplar/MAINTAINERS b/board/hisilicon/poplar/MAINTAINERS index bfd4a9b..01efc96 100644 --- a/board/hisilicon/poplar/MAINTAINERS +++ b/board/hisilicon/poplar/MAINTAINERS @@ -1,6 +1,7 @@ Poplar BOARD M: Jorge Ramirez-Ortiz <jorge.ramirez.ortiz@gmail.com> M: Shawn Guo <shawn.guo@linaro.org> +M: Igor Opaniuk <igor.opaniuk@gmail.com> S: Maintained F: board/hisilicon/poplar F: doc/board/hisilicon/poplar.rst diff --git a/board/toradex/verdin-am62/verdin-am62.c b/board/toradex/verdin-am62/verdin-am62.c index 395eb36..e948fc1 100644 --- a/board/toradex/verdin-am62/verdin-am62.c +++ b/board/toradex/verdin-am62/verdin-am62.c @@ -14,13 +14,10 @@ #include <fdt_support.h> #include <init.h> #include <k3-ddrss.h> -#include <power/regulator.h> #include <spl.h> #include "../common/tdx-cfg-block.h" -#define VDD_CORE_REG "buck1" - DECLARE_GLOBAL_DATA_PTR; int board_init(void) @@ -53,37 +50,9 @@ int board_fit_config_name_match(const char *name) } #endif -static u32 get_vdd_core_nominal(void) -{ - int core_uvolt; - - switch (k3_get_speed_grade()) { - case 'G': - case 'K': - case 'S': - core_uvolt = 750000; - break; - case 'T': - default: - core_uvolt = 850000; - break; - } - return core_uvolt; -} - #if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP) int ft_board_setup(void *blob, struct bd_info *bd) { - int core_uvolt; - - core_uvolt = get_vdd_core_nominal(); - if (core_uvolt != 850000) { - do_fixup_by_path_u32(blob, "/bus@f0000/i2c@20000000/pmic@30/regulators/buck1", - "regulator-max-microvolt", core_uvolt, 0); - do_fixup_by_path_u32(blob, "/bus@f0000/i2c@20000000/pmic@30/regulators/buck1", - "regulator-min-microvolt", core_uvolt, 0); - } - return ft_common_board_setup(blob, bd); } #endif @@ -118,22 +87,6 @@ static void select_dt_from_module_version(void) int board_late_init(void) { - int ret; - int core_uvolt; - struct udevice *dev = NULL; - - core_uvolt = get_vdd_core_nominal(); - if (core_uvolt != 850000) { - /* Set CPU core voltage to 0.75V for slower speed grades */ - ret = regulator_get_by_devname(VDD_CORE_REG, &dev); - if (ret) - pr_err("VDD CORE Regulator get error: %d\n", ret); - - ret = regulator_set_value_force(dev, core_uvolt); - if (ret) - pr_err("VDD CORE Regulator value setting error: %d\n", ret); - } - select_dt_from_module_version(); return 0; diff --git a/boot/Kconfig b/boot/Kconfig index 71ee416..3d7aabd 100644 --- a/boot/Kconfig +++ b/boot/Kconfig @@ -20,6 +20,21 @@ config TIMESTAMP loaded that does not, the message 'Wrong FIT format: no timestamp' is shown. +config BUTTON_CMD + bool "Support for running a command if a button is held during boot" + depends on CMDLINE + depends on BUTTON + help + For many embedded devices it's useful to enter a special flashing mode + such as fastboot mode when a button is held during boot. This option + allows arbitrary commands to be assigned to specific buttons. These will + be run after "preboot" if the button is held. Configuration is done via + the environment variables "button_cmd_N_name" and "button_cmd_N" where n is + the button number (starting from 0). e.g: + + "button_cmd_0_name=vol_down" + "button_cmd_0=fastboot usb 0" + menuconfig FIT bool "Flattened Image Tree (FIT)" select HASH @@ -14,15 +14,22 @@ #include <hash.h> #include <linux/ctype.h> +#if IS_ENABLED(CONFIG_HASH_VERIFY) +#define HARGS 6 +#else +#define HARGS 5 +#endif + static int do_hash(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { char *s; int flags = HASH_FLAG_ENV; -#ifdef CONFIG_HASH_VERIFY - if (argc < 4) + if (argc < (HARGS - 1)) return CMD_RET_USAGE; + +#if IS_ENABLED(CONFIG_HASH_VERIFY) if (!strcmp(argv[1], "-v")) { flags |= HASH_FLAG_VERIFY; argc--; @@ -37,18 +44,12 @@ static int do_hash(struct cmd_tbl *cmdtp, int flag, int argc, return hash_command(*argv, flags, cmdtp, flag, argc - 1, argv + 1); } -#ifdef CONFIG_HASH_VERIFY -#define HARGS 6 -#else -#define HARGS 5 -#endif - U_BOOT_CMD( hash, HARGS, 1, do_hash, "compute hash message digest", "algorithm address count [[*]hash_dest]\n" " - compute message digest [save to env var / *address]" -#ifdef CONFIG_HASH_VERIFY +#if IS_ENABLED(CONFIG_HASH_VERIFY) "\nhash -v algorithm address count [*]hash\n" " - verify message digest of memory area to immediate value, \n" " env var or *address" diff --git a/common/Makefile b/common/Makefile index f010c2a..e983547 100644 --- a/common/Makefile +++ b/common/Makefile @@ -12,6 +12,7 @@ obj-y += cli_getch.o cli_simple.o cli_readline.o obj-$(CONFIG_HUSH_OLD_PARSER) += cli_hush.o obj-$(CONFIG_HUSH_MODERN_PARSER) += cli_hush_modern.o obj-$(CONFIG_AUTOBOOT) += autoboot.o +obj-$(CONFIG_BUTTON_CMD) += button_cmd.o obj-y += version.o # # boards diff --git a/common/button_cmd.c b/common/button_cmd.c new file mode 100644 index 0000000..b6a8434 --- /dev/null +++ b/common/button_cmd.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2023 Linaro Ltd. + * Author: Caleb Connolly <caleb.connolly@linaro.org> + */ + +#include <button.h> +#include <command.h> +#include <env.h> +#include <log.h> +#include <vsprintf.h> + +/* Some sane limit "just in case" */ +#define MAX_BTN_CMDS 32 + +struct button_cmd { + bool pressed; + const char *btn_name; + const char *cmd; +}; + +/* + * Button commands are set via environment variables, e.g.: + * button_cmd_N_name=Volume Up + * button_cmd_N=fastboot usb 0 + * + * This function will retrieve the command for the given button N + * and populate the cmd struct with the command string and pressed + * state of the button. + * + * Returns 1 if a command was found, 0 otherwise. + */ +static int get_button_cmd(int n, struct button_cmd *cmd) +{ + const char *cmd_str; + struct udevice *btn; + char buf[24]; + + snprintf(buf, sizeof(buf), "button_cmd_%d_name", n); + cmd->btn_name = env_get(buf); + if (!cmd->btn_name) + return 0; + + button_get_by_label(cmd->btn_name, &btn); + if (!btn) { + log_err("No button labelled '%s'\n", cmd->btn_name); + return 0; + } + + cmd->pressed = button_get_state(btn) == BUTTON_ON; + /* If the button isn't pressed then cmd->cmd will be unused so don't waste + * cycles reading it + */ + if (!cmd->pressed) + return 1; + + snprintf(buf, sizeof(buf), "button_cmd_%d", n); + cmd_str = env_get(buf); + if (!cmd_str) { + log_err("No command set for button '%s'\n", cmd->btn_name); + return 0; + } + + cmd->cmd = cmd_str; + + return 1; +} + +void process_button_cmds(void) +{ + struct button_cmd cmd = {0}; + int i = 0; + + while (get_button_cmd(i++, &cmd) && i < MAX_BTN_CMDS) { + if (!cmd.pressed) + continue; + + log_info("BTN '%s'> %s\n", cmd.btn_name, cmd.cmd); + run_command(cmd.cmd, CMD_FLAG_ENV); + /* Don't run commands for multiple buttons */ + return; + } +} diff --git a/common/main.c b/common/main.c index 6dba6cb..82d3aaf 100644 --- a/common/main.c +++ b/common/main.c @@ -8,6 +8,7 @@ #include <common.h> #include <autoboot.h> +#include <button.h> #include <bootstage.h> #include <bootstd.h> #include <cli.h> @@ -62,6 +63,8 @@ void main_loop(void) efi_launch_capsules(); } + process_button_cmds(); + s = bootdelay_process(); if (cli_process_fdt(&s)) cli_secure_boot_cmd(s); diff --git a/doc/usage/environment.rst b/doc/usage/environment.rst index 82b6ea7..ebf75fa 100644 --- a/doc/usage/environment.rst +++ b/doc/usage/environment.rst @@ -190,6 +190,10 @@ bootm_size bootstopkeysha256, bootdelaykey, bootstopkey See README.autoboot +button_cmd_0, button_cmd_0_name ... button_cmd_N, button_cmd_N_name + Used to map commands to run when a button is held during boot. + See CONFIG_BUTTON_CMD. + updatefile Location of the software update file on a TFTP server, used by the automatic software update feature. Please refer to diff --git a/drivers/memory/ti-gpmc.c b/drivers/memory/ti-gpmc.c index 0b86743..8877b8f 100644 --- a/drivers/memory/ti-gpmc.c +++ b/drivers/memory/ti-gpmc.c @@ -1196,6 +1196,12 @@ static int gpmc_probe(struct udevice *dev) gpmc_cfg = (struct gpmc *)priv->base; gpmc_base = priv->base; + /* + * Disable all IRQs as some bootroms might leave them enabled + * and that will cause a lock-up later + */ + gpmc_write_reg(GPMC_IRQENABLE, 0); + priv->l3_clk = devm_clk_get(dev, "fck"); if (IS_ERR(priv->l3_clk)) return PTR_ERR(priv->l3_clk); diff --git a/include/button.h b/include/button.h index 207f4a0..8d38e52 100644 --- a/include/button.h +++ b/include/button.h @@ -74,4 +74,13 @@ enum button_state_t button_get_state(struct udevice *dev); */ int button_get_code(struct udevice *dev); +#if IS_ENABLED(CONFIG_BUTTON_CMD) +/* Process button command mappings specified in the environment, + * running the commands for buttons which are pressed + */ +void process_button_cmds(void); +#else +static inline void process_button_cmds(void) {} +#endif /* CONFIG_BUTTON_CMD */ + #endif |