Add CMD_FUSE_WRITEBUFF config option to add and enable fuse writebuff sub-system command. Add fuse_writebuff function to be invoked on writebuff command.
Signed-off-by: Harsha Vardhan V M <h...@ti.com> Reviewed-by: Tom Rini <tr...@konsulko.com> --- cmd/Kconfig | 8 ++++++++ cmd/fuse.c | 30 +++++++++++++++++++++++++----- include/fuse.h | 9 +++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/cmd/Kconfig b/cmd/Kconfig index cd391d422ae..81c59becc2d 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1236,6 +1236,14 @@ config CMD_FUSE which control the behaviour of the device. The command uses the fuse_...() API. +config CMD_FUSE_WRITEBUFF + bool "Support for the fuse writebuff" + depends on CMD_FUSE + help + This allows programming fuses, which control the behaviour of + the device, using a structured buffer in memory. The command + uses the fuse_writebuff() API. + config CMD_GPIO bool "gpio" help diff --git a/cmd/fuse.c b/cmd/fuse.c index a23cedba90f..6c42c096809 100644 --- a/cmd/fuse.c +++ b/cmd/fuse.c @@ -43,11 +43,18 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, argc -= 2 + confirmed; argv += 2 + confirmed; - if (argc < 2) - return CMD_RET_USAGE; + if (IS_ENABLED(CONFIG_CMD_FUSE_WRITEBUFF) && !strcmp(op, "writebuff")) { + if (argc == 1) + addr = simple_strtoul(argv[0], NULL, 16); + else + return CMD_RET_USAGE; + } else { + if (argc < 2) + return CMD_RET_USAGE; - bank = simple_strtoul(argv[0], NULL, 0); - word = simple_strtoul(argv[1], NULL, 0); + bank = simple_strtoul(argv[0], NULL, 0); + word = simple_strtoul(argv[1], NULL, 0); + } if (!strcmp(op, "read")) { if (argc == 2) @@ -161,6 +168,15 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, if (ret) goto err; } + } else if (IS_ENABLED(CONFIG_CMD_FUSE_WRITEBUFF) && !strcmp(op, "writebuff")) { + printf("Programming fuses using a structured buffer in memory " + "starting at addr 0x%lx\n", addr); + if (!confirmed && !confirm_prog()) + return CMD_RET_FAILURE; + + ret = fuse_writebuff(addr); + if (ret) + goto err; } else { return CMD_RET_USAGE; } @@ -186,5 +202,9 @@ U_BOOT_CMD( "fuse prog [-y] <bank> <word> <hexval> [<hexval>...] - program 1 or\n" " several fuse words, starting at 'word' (PERMANENT)\n" "fuse override <bank> <word> <hexval> [<hexval>...] - override 1 or\n" - " several fuse words, starting at 'word'" + " several fuse words, starting at 'word'\n" +#ifdef CONFIG_CMD_FUSE_WRITEBUFF + "fuse writebuff [-y] <addr> - program fuse data\n" + " using a structured buffer in memory starting at 'addr'\n" +#endif /* CONFIG_CMD_FUSE_WRITEBUFF */ ); diff --git a/include/fuse.h b/include/fuse.h index 4519821af7e..902b5f56a74 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -12,6 +12,7 @@ #define _FUSE_H_ #include <linux/types.h> +#include <linux/errno.h> /* * Read/Sense/Program/Override interface: @@ -25,5 +26,13 @@ int fuse_read(u32 bank, u32 word, u32 *val); int fuse_sense(u32 bank, u32 word, u32 *val); int fuse_prog(u32 bank, u32 word, u32 val); int fuse_override(u32 bank, u32 word, u32 val); +#ifdef CONFIG_CMD_FUSE_WRITEBUFF +int fuse_writebuff(ulong addr); +#else +static inline int fuse_writebuff(ulong addr) +{ + return -EPERM; +} +#endif /* CONFIG_CMD_FUSE_WRITEBUFF */ #endif /* _FUSE_H_ */ -- 2.34.1