diff options
Diffstat (limited to 'cmd/fuse.c')
| -rw-r--r-- | cmd/fuse.c | 63 | 
1 files changed, 40 insertions, 23 deletions
| diff --git a/cmd/fuse.c b/cmd/fuse.c index 598ef496a43..6c42c096809 100644 --- a/cmd/fuse.c +++ b/cmd/fuse.c @@ -15,17 +15,6 @@  #include <vsprintf.h>  #include <linux/errno.h> -static int strtou32(const char *str, unsigned int base, u32 *result) -{ -	char *ep; - -	*result = simple_strtoul(str, &ep, base); -	if (ep == str || *ep != '\0') -		return -EINVAL; - -	return 0; -} -  static int confirm_prog(void)  {  	puts("Warning: Programming fuses is an irreversible operation!\n" @@ -54,14 +43,25 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc,  	argc -= 2 + confirmed;  	argv += 2 + confirmed; -	if (argc < 2 || strtou32(argv[0], 0, &bank) || -			strtou32(argv[1], 0, &word)) -		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); +	}  	if (!strcmp(op, "read")) {  		if (argc == 2)  			cnt = 1; -		else if (argc != 3 || strtou32(argv[2], 0, &cnt)) +		else if (argc == 3) +			cnt = simple_strtoul(argv[2], NULL, 0); +		else  			return CMD_RET_USAGE;  		printf("Reading bank %u:\n", bank); @@ -79,7 +79,9 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc,  	} else if (!strcmp(op, "readm")) {  		if (argc == 3)  			cnt = 1; -		else if (argc != 4 || strtou32(argv[3], 0, &cnt)) +		else if (argc == 4) +			cnt = simple_strtoul(argv[3], NULL, 0); +		else  			return CMD_RET_USAGE;  		addr = simple_strtoul(argv[2], NULL, 16); @@ -99,7 +101,9 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc,  		unmap_sysmem(start);  	} else if (!strcmp(op, "cmp")) { -		if (argc != 3 || strtou32(argv[2], 0, &cmp)) +		if (argc == 3) +			cmp = simple_strtoul(argv[2], NULL, 0); +		else  			return CMD_RET_USAGE;  		printf("Comparing bank %u:\n", bank); @@ -119,7 +123,9 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc,  	} else if (!strcmp(op, "sense")) {  		if (argc == 2)  			cnt = 1; -		else if (argc != 3 || strtou32(argv[2], 0, &cnt)) +		else if (argc == 3) +			cnt = simple_strtoul(argv[2], NULL, 0); +		else  			return CMD_RET_USAGE;  		printf("Sensing bank %u:\n", bank); @@ -139,8 +145,7 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc,  			return CMD_RET_USAGE;  		for (i = 2; i < argc; i++, word++) { -			if (strtou32(argv[i], 16, &val)) -				return CMD_RET_USAGE; +			val = simple_strtoul(argv[i], NULL, 16);  			printf("Programming bank %u word 0x%.8x to 0x%.8x...\n",  					bank, word, val); @@ -155,8 +160,7 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc,  			return CMD_RET_USAGE;  		for (i = 2; i < argc; i++, word++) { -			if (strtou32(argv[i], 16, &val)) -				return CMD_RET_USAGE; +			val = simple_strtoul(argv[i], NULL, 16);  			printf("Overriding bank %u word 0x%.8x with "  					"0x%.8x...\n", bank, word, val); @@ -164,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;  	} @@ -189,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 */  ); | 
