eeprom: refactor i2c bus and devaddr parsing
[oweals/u-boot.git] / cmd / eeprom.c
index 39ebee8dd9619927bbbf7af859c13ae8777bd944..54bf06ceb32f1d8d6422cd31b8479276050c82c0 100644 (file)
@@ -207,6 +207,56 @@ int eeprom_write(unsigned dev_addr, unsigned offset,
        return ret;
 }
 
+static int parse_numeric_param(char *str)
+{
+       char *endptr;
+       int value = simple_strtol(str, &endptr, 16);
+
+       return (*endptr != '\0') ? -1 : value;
+}
+
+/**
+ * parse_i2c_bus_addr - parse the i2c bus and i2c devaddr parameters
+ *
+ * @i2c_bus:   address to store the i2c bus
+ * @i2c_addr:  address to store the device i2c address
+ * @argc:      count of command line arguments left to parse
+ * @argv:      command line arguments left to parse
+ * @argc_no_bus_addr:  argc value we expect to see when bus & addr aren't given
+ *
+ * @returns:   number of arguments parsed or CMD_RET_USAGE if error
+ */
+static int parse_i2c_bus_addr(int *i2c_bus, ulong *i2c_addr, int argc,
+                             char * const argv[], int argc_no_bus_addr)
+{
+       int argc_no_bus = argc_no_bus_addr + 1;
+       int argc_bus_addr = argc_no_bus_addr + 2;
+
+#ifdef CONFIG_SYS_DEF_EEPROM_ADDR
+       if (argc == argc_no_bus_addr) {
+               *i2c_bus = -1;
+               *i2c_addr = CONFIG_SYS_DEF_EEPROM_ADDR;
+
+               return 0;
+       }
+#endif
+       if (argc == argc_no_bus) {
+               *i2c_bus = -1;
+               *i2c_addr = parse_numeric_param(argv[0]);
+
+               return 1;
+       }
+
+       if (argc == argc_bus_addr) {
+               *i2c_bus = parse_numeric_param(argv[0]);
+               *i2c_addr = parse_numeric_param(argv[1]);
+
+               return 2;
+       }
+
+       return CMD_RET_USAGE;
+}
+
 #ifdef CONFIG_CMD_EEPROM_LAYOUT
 #include <eeprom_layout.h>
 
@@ -237,14 +287,6 @@ static enum eeprom_action parse_action(char *cmd)
        return EEPROM_ACTION_INVALID;
 }
 
-static int parse_numeric_param(char *str)
-{
-       char *endptr;
-       int value = simple_strtol(str, &endptr, 16);
-
-       return (*endptr != '\0') ? -1 : value;
-}
-
 static int eeprom_execute_command(enum eeprom_action action, int i2c_bus,
                                  int i2c_addr, int layout_ver, char *key,
                                  char *value)
@@ -348,24 +390,9 @@ static int do_eeprom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        }
 #endif
 
-       switch (argc) {
-#ifdef CONFIG_SYS_DEF_EEPROM_ADDR
-       case 5:
-               bus_addr = -1;
-               dev_addr = CONFIG_SYS_DEF_EEPROM_ADDR;
-               break;
-#endif
-       case 6:
-               bus_addr = -1;
-               dev_addr = simple_strtoul(*args++, NULL, 16);
-               break;
-       case 7:
-               bus_addr = simple_strtoul(*args++, NULL, 16);
-               dev_addr = simple_strtoul(*args++, NULL, 16);
-               break;
-       default:
-               return CMD_RET_USAGE;
-       }
+       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);