diff --git a/cmd/eeprom.c b/cmd/eeprom.c
index 0f2a9f763f72498b9aa1617495c2403f903c8542..0a0e4a2c1cc8f365c5f4d9539dd91eeec24d0e9e 100644
--- a/cmd/eeprom.c
+++ b/cmd/eeprom.c
@@ -281,17 +281,21 @@ enum eeprom_action {
 	EEPROM_ACTION_INVALID,
 };
 
-#ifdef CONFIG_CMD_EEPROM_LAYOUT
 static enum eeprom_action parse_action(char *cmd)
 {
+	if (!strncmp(cmd, "read", 4))
+		return EEPROM_READ;
+	if (!strncmp(cmd, "write", 5))
+		return EEPROM_WRITE;
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
 	if (!strncmp(cmd, "print", 5))
 		return EEPROM_PRINT;
 	if (!strncmp(cmd, "update", 6))
 		return EEPROM_UPDATE;
+#endif
 
 	return EEPROM_ACTION_INVALID;
 }
-#endif
 
 static int eeprom_execute_command(enum eeprom_action action, int i2c_bus,
 				  ulong i2c_addr, int layout_ver, char *key,
@@ -345,14 +349,14 @@ static int eeprom_execute_command(enum eeprom_action action, int i2c_bus,
 	return rcode;
 }
 
-#ifdef CONFIG_CMD_EEPROM_LAYOUT
 #define NEXT_PARAM(argc, index)	{ (argc)--; (index)++; }
-static int do_eeprom_layout(cmd_tbl_t *cmdtp, int flag, int argc,
-			    char * const argv[])
+int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	int layout_ver = LAYOUT_VERSION_AUTODETECT;
 	enum eeprom_action action = EEPROM_ACTION_INVALID;
-	int i2c_bus = -1, i2c_addr = -1, index = 0;
+	int i2c_bus = -1, index = 0;
+	ulong i2c_addr = -1, addr = 0, cnt = 0, off = 0;
+	int ret;
 	char *field_name = "";
 	char *field_value = "";
 
@@ -364,78 +368,63 @@ static int do_eeprom_layout(cmd_tbl_t *cmdtp, int flag, int argc,
 	action = parse_action(argv[index]);
 	NEXT_PARAM(argc, index);
 
-	if (argc <= 1)
+	if (action == EEPROM_ACTION_INVALID)
 		return CMD_RET_USAGE;
 
-	if (!strcmp(argv[index], "-l")) {
-		NEXT_PARAM(argc, index);
-
-		layout_ver = eeprom_parse_layout_version(argv[index]);
-		NEXT_PARAM(argc, index);
+#ifdef CONFIG_CMD_EEPROM_LAYOUT
+	if (action == EEPROM_PRINT || action == EEPROM_UPDATE) {
+		if (!strcmp(argv[index], "-l")) {
+			NEXT_PARAM(argc, index);
+			layout_ver = eeprom_parse_layout_version(argv[index]);
+			NEXT_PARAM(argc, index);
+		}
 	}
+#endif
 
-	if (argc <= 1)
+	switch (action) {
+	case EEPROM_READ:
+	case EEPROM_WRITE:
+		ret = parse_i2c_bus_addr(&i2c_bus, &i2c_addr, argc,
+					 argv + index, 3);
+		break;
+	case EEPROM_PRINT:
+		ret = parse_i2c_bus_addr(&i2c_bus, &i2c_addr, argc,
+					 argv + index, 0);
+		break;
+	case EEPROM_UPDATE:
+		ret = parse_i2c_bus_addr(&i2c_bus, &i2c_addr, argc,
+					 argv + index, 2);
+		break;
+	default:
+		/* Get compiler to stop whining */
 		return CMD_RET_USAGE;
+	}
 
-	i2c_bus = parse_numeric_param(argv[index]);
-	NEXT_PARAM(argc, index);
-
-	i2c_addr = parse_numeric_param(argv[index]);
-	NEXT_PARAM(argc, index);
-
-	if (action == EEPROM_PRINT)
-		goto done;
+	if (ret == CMD_RET_USAGE)
+		return ret;
 
-	if (argc) {
-		field_name = argv[index];
+	while (ret--)
 		NEXT_PARAM(argc, index);
-	}
 
-	if (argc) {
-		field_value = argv[index];
+	if (action == EEPROM_READ || action == EEPROM_WRITE) {
+		addr = parse_numeric_param(argv[index]);
+		NEXT_PARAM(argc, index);
+		off = parse_numeric_param(argv[index]);
 		NEXT_PARAM(argc, index);
+		cnt = parse_numeric_param(argv[index]);
 	}
 
-done:
-	return eeprom_execute_command(action, i2c_bus, i2c_addr, layout_ver,
-				      field_name, field_value, 0, 0, 0);
-}
-
-#endif
-
-static int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-	char * const *args = &argv[2];
-	int rcode;
-	ulong dev_addr, addr, off, cnt;
-	int bus_addr;
-
 #ifdef CONFIG_CMD_EEPROM_LAYOUT
-	if (argc >= 2) {
-		if (!strcmp(argv[1], "update") || !strcmp(argv[1], "print"))
-			return do_eeprom_layout(cmdtp, flag, argc, argv);
+	if (action == EEPROM_UPDATE) {
+		field_name = argv[index];
+		NEXT_PARAM(argc, index);
+		field_value = argv[index];
+		NEXT_PARAM(argc, index);
 	}
 #endif
 
-	rcode = parse_i2c_bus_addr(&bus_addr, &dev_addr, argc - 2, argv + 2, 3);
-	if (rcode == CMD_RET_USAGE)
-		return rcode;
-
-	addr = simple_strtoul(*args++, NULL, 16);
-	off = simple_strtoul(*args++, NULL, 16);
-	cnt = simple_strtoul(*args++, NULL, 16);
-
-	if (strcmp(argv[1], "read") == 0) {
-		return eeprom_execute_command(EEPROM_READ, bus_addr, dev_addr,
-					      LAYOUT_VERSION_UNRECOGNIZED,
-					      NULL, NULL, addr, off, cnt);
-	} else if (strcmp(argv[1], "write") == 0) {
-		return eeprom_execute_command(EEPROM_WRITE, bus_addr, dev_addr,
-					      LAYOUT_VERSION_UNRECOGNIZED,
-					      NULL, NULL, addr, off, cnt);
-	}
-
-	return CMD_RET_USAGE;
+	return eeprom_execute_command(action, i2c_bus, i2c_addr, layout_ver,
+				      field_name, field_value, addr, off, cnt);
 }
 
 U_BOOT_CMD(
@@ -446,9 +435,9 @@ U_BOOT_CMD(
 	"       - read/write `cnt' bytes from `devaddr` EEPROM at offset `off'"
 #ifdef CONFIG_CMD_EEPROM_LAYOUT
 	"\n"
-	"eeprom print [-l <layout_version>] bus devaddr\n"
+	"eeprom print [-l <layout_version>] <bus> <devaddr>\n"
 	"       - Print layout fields and their data in human readable format\n"
-	"eeprom update [-l <layout_version>] bus devaddr <field_name> <field_value>\n"
+	"eeprom update [-l <layout_version>] <bus> <devaddr> field_name field_value\n"
 	"       - Update a specific eeprom field with new data.\n"
 	"         The new data must be written in the same human readable format as shown by the print command.\n"
 	"\n"