]> Git Repo - J-u-boot.git/blobdiff - cmd/bcb.c
mtd: spi-nor-ids: Add support for XMC XM25QH64C
[J-u-boot.git] / cmd / bcb.c
index 9626f2c69e345c984c83a730fdae1ba3bd11024d..6b6f1e9a2f10ca4f2ed6c10e203059f218c8aa43 100644 (file)
--- a/cmd/bcb.c
+++ b/cmd/bcb.c
@@ -6,8 +6,12 @@
  */
 
 #include <android_bootloader_message.h>
+#include <bcb.h>
 #include <command.h>
 #include <common.h>
+#include <log.h>
+#include <part.h>
+#include <malloc.h>
 
 enum bcb_cmd {
        BCB_CMD_LOAD,
@@ -108,26 +112,27 @@ static int bcb_field_get(char *name, char **fieldp, int *sizep)
        return 0;
 }
 
-static int do_bcb_load(cmd_tbl_t *cmdtp, int flag, int argc,
-                      char * const argv[])
+static int __bcb_load(int devnum, const char *partp)
 {
        struct blk_desc *desc;
-       disk_partition_t info;
+       struct disk_partition info;
        u64 cnt;
        char *endp;
        int part, ret;
 
-       ret = blk_get_device_by_str("mmc", argv[1], &desc);
-       if (ret < 0)
+       desc = blk_get_devnum_by_type(IF_TYPE_MMC, devnum);
+       if (!desc) {
+               ret = -ENODEV;
                goto err_read_fail;
+       }
 
-       part = simple_strtoul(argv[2], &endp, 0);
+       part = simple_strtoul(partp, &endp, 0);
        if (*endp == '\0') {
                ret = part_get_info(desc, part, &info);
                if (ret)
                        goto err_read_fail;
        } else {
-               part = part_get_info_by_name(desc, argv[2], &info);
+               part = part_get_info_by_name(desc, partp, &info);
                if (part < 0) {
                        ret = part;
                        goto err_read_fail;
@@ -149,10 +154,10 @@ static int do_bcb_load(cmd_tbl_t *cmdtp, int flag, int argc,
 
        return CMD_RET_SUCCESS;
 err_read_fail:
-       printf("Error: mmc %s:%s read failed (%d)\n", argv[1], argv[2], ret);
+       printf("Error: mmc %d:%s read failed (%d)\n", devnum, partp, ret);
        goto err;
 err_too_small:
-       printf("Error: mmc %s:%s too small!", argv[1], argv[2]);
+       printf("Error: mmc %d:%s too small!", devnum, partp);
        goto err;
 err:
        bcb_dev = -1;
@@ -161,35 +166,60 @@ err:
        return CMD_RET_FAILURE;
 }
 
-static int do_bcb_set(cmd_tbl_t *cmdtp, int flag, int argc,
-                     char * const argv[])
+static int do_bcb_load(struct cmd_tbl *cmdtp, int flag, int argc,
+                      char * const argv[])
+{
+       char *endp;
+       int devnum = simple_strtoul(argv[1], &endp, 0);
+
+       if (*endp != '\0') {
+               printf("Error: Device id '%s' not a number\n", argv[1]);
+               return CMD_RET_FAILURE;
+       }
+
+       return __bcb_load(devnum, argv[2]);
+}
+
+static int __bcb_set(char *fieldp, const char *valp)
 {
        int size, len;
-       char *field, *str, *found;
+       char *field, *str, *found, *tmp;
 
-       if (bcb_field_get(argv[1], &field, &size))
+       if (bcb_field_get(fieldp, &field, &size))
                return CMD_RET_FAILURE;
 
-       len = strlen(argv[2]);
+       len = strlen(valp);
        if (len >= size) {
                printf("Error: sizeof('%s') = %d >= %d = sizeof(bcb.%s)\n",
-                      argv[2], len, size, argv[1]);
+                      valp, len, size, fieldp);
+               return CMD_RET_FAILURE;
+       }
+       str = strdup(valp);
+       if (!str) {
+               printf("Error: Out of memory while strdup\n");
                return CMD_RET_FAILURE;
        }
-       str = argv[2];
 
+       tmp = str;
        field[0] = '\0';
-       while ((found = strsep(&str, ":"))) {
+       while ((found = strsep(&tmp, ":"))) {
                if (field[0] != '\0')
                        strcat(field, "\n");
                strcat(field, found);
        }
+       free(str);
 
        return CMD_RET_SUCCESS;
 }
 
-static int do_bcb_clear(cmd_tbl_t *cmdtp, int flag, int argc,
-                       char * const argv[])
+static int do_bcb_set(struct cmd_tbl *cmdtp, int flag, int argc,
+                     char * const argv[])
+{
+       return __bcb_set(argv[1], argv[2]);
+}
+
+static int do_bcb_clear(struct cmd_tbl *cmdtp, int flag, int argc,
+                       char *const argv[])
 {
        int size;
        char *field;
@@ -207,8 +237,8 @@ static int do_bcb_clear(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_SUCCESS;
 }
 
-static int do_bcb_test(cmd_tbl_t *cmdtp, int flag, int argc,
-                      char * const argv[])
+static int do_bcb_test(struct cmd_tbl *cmdtp, int flag, int argc,
+                      char *const argv[])
 {
        int size;
        char *field;
@@ -234,8 +264,8 @@ static int do_bcb_test(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_FAILURE;
 }
 
-static int do_bcb_dump(cmd_tbl_t *cmdtp, int flag, int argc,
-                      char * const argv[])
+static int do_bcb_dump(struct cmd_tbl *cmdtp, int flag, int argc,
+                      char *const argv[])
 {
        int size;
        char *field;
@@ -248,11 +278,10 @@ static int do_bcb_dump(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_SUCCESS;
 }
 
-static int do_bcb_store(cmd_tbl_t *cmdtp, int flag, int argc,
-                       char * const argv[])
+static int __bcb_store(void)
 {
        struct blk_desc *desc;
-       disk_partition_t info;
+       struct disk_partition info;
        u64 cnt;
        int ret;
 
@@ -280,7 +309,32 @@ err:
        return CMD_RET_FAILURE;
 }
 
-static cmd_tbl_t cmd_bcb_sub[] = {
+static int do_bcb_store(struct cmd_tbl *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       return __bcb_store();
+}
+
+int bcb_write_reboot_reason(int devnum, char *partp, const char *reasonp)
+{
+       int ret;
+
+       ret = __bcb_load(devnum, partp);
+       if (ret != CMD_RET_SUCCESS)
+               return ret;
+
+       ret = __bcb_set("command", reasonp);
+       if (ret != CMD_RET_SUCCESS)
+               return ret;
+
+       ret = __bcb_store();
+       if (ret != CMD_RET_SUCCESS)
+               return ret;
+
+       return 0;
+}
+
+static struct cmd_tbl cmd_bcb_sub[] = {
        U_BOOT_CMD_MKENT(load, CONFIG_SYS_MAXARGS, 1, do_bcb_load, "", ""),
        U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 1, do_bcb_set, "", ""),
        U_BOOT_CMD_MKENT(clear, CONFIG_SYS_MAXARGS, 1, do_bcb_clear, "", ""),
@@ -289,9 +343,9 @@ static cmd_tbl_t cmd_bcb_sub[] = {
        U_BOOT_CMD_MKENT(store, CONFIG_SYS_MAXARGS, 1, do_bcb_store, "", ""),
 };
 
-static int do_bcb(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+static int do_bcb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
-       cmd_tbl_t *c;
+       struct cmd_tbl *c;
 
        if (argc < 2)
                return CMD_RET_USAGE;
This page took 0.033437 seconds and 4 git commands to generate.