cmd: part: Add 'number-format' sub-command

The part number sub-command is very useful for retrieving the partition
index in the u-boot environment.

It can be used for various purposes, such as:
1. Retrieving the UUID of the partition using it's name as explained in
patch [1]:

  part number mmc $mmcdev system_a system_a_index
  part uuid mmc $mmcdev:${system_a_index} system_a_uuid

2. setting the 'root=<somedev>' bootarg, as done in ti's
boot environment [2]:

 "if part number mmc ${mmcdev} system${slot_suffix} " \
       "system_part_number; then " \
               "setenv bootargs_ab " \
               "ro root=/dev/mmcblk${mmcdev}p${system_part_number} "

Unfortunetely, the second snippet is broken, since it currently does:
  root=/dev/mmcblk0p<0xhex_value>

And it should do:
  root=/dev/mmcblk0p<decimal_value>

By introducing a new command, part number-format <hex|dec>, we can
control the output format of part number:

  => part number mmc 0 system_a
  0x7
  => part number-format dec
  => part number mmc 0 system_a
  7

[1] https://www.mail-archive.com/u-boot@lists.denx.de/msg342867.html
[2] https://www.mail-archive.com/u-boot@lists.denx.de/msg316806.html

Bug: https://baylibre.atlassian.net/browse/RITA-65
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
diff --git a/cmd/part.c b/cmd/part.c
index 5e4e45c..cc785dc 100644
--- a/cmd/part.c
+++ b/cmd/part.c
@@ -28,6 +28,13 @@
 	CMD_PART_INFO_NUMBER
 };
 
+enum cmd_part_number_format {
+	CMD_PART_NUMBER_FORMAT_HEX = 0,
+	CMD_PART_NUMBER_FORMAT_DECIMAL
+};
+
+static enum cmd_part_number_format number_format = CMD_PART_NUMBER_FORMAT_HEX;
+
 static int do_part_uuid(int argc, char * const argv[])
 {
 	int part;
@@ -152,7 +159,10 @@
 		snprintf(buf, sizeof(buf), LBAF, info.size);
 		break;
 	case CMD_PART_INFO_NUMBER:
-		snprintf(buf, sizeof(buf), "0x%x", part);
+		if (number_format == CMD_PART_NUMBER_FORMAT_DECIMAL)
+			snprintf(buf, sizeof(buf), "%d", part);
+		else // default is hexadecimal
+			snprintf(buf, sizeof(buf), "0x%x", part);
 		break;
 	default:
 		printf("** Unknown cmd_part_info value: %d\n", param);
@@ -182,6 +192,21 @@
 	return do_part_info(argc, argv, CMD_PART_INFO_NUMBER);
 }
 
+static int do_part_number_format(int argc, char * const argv[])
+{
+	if (argc != 1)
+		return CMD_RET_USAGE;
+
+	if (!strcmp(argv[0], "hex"))
+		number_format = CMD_PART_NUMBER_FORMAT_HEX;
+	else if (!strcmp(argv[0], "dec"))
+		number_format = CMD_PART_NUMBER_FORMAT_DECIMAL;
+	else
+		return CMD_RET_USAGE;
+
+	return CMD_RET_SUCCESS;
+}
+
 static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	if (argc < 2)
@@ -197,6 +222,8 @@
 		return do_part_size(argc - 2, argv + 2);
 	else if (!strcmp(argv[1], "number"))
 		return do_part_number(argc - 2, argv + 2);
+	else if (!strcmp(argv[1], "number-format"))
+		return do_part_number_format(argc - 2, argv + 2);
 
 	return CMD_RET_USAGE;
 }
@@ -221,5 +248,8 @@
 	"      part can be either partition number or partition name\n"
 	"part number <interface> <dev> <part> <varname>\n"
 	"    - set environment variable to the partition number using the partition name\n"
-	"      part must be specified as partition name"
+	"      part must be specified as partition name\n"
+	"part number-format <format>\n"
+	"    - set the output format of the part number command. Default is hex\n"
+	"      format must be either hex or dec"
 );