]> Git Repo - J-u-boot.git/blobdiff - common/cmd_nand.c
common/cmd_*.c: sparse fixes
[J-u-boot.git] / common / cmd_nand.c
index f060a317e07d94f821f4a60e5dbe2da2124c6523..4b1606972b2d3b701b44b9e5080548d1815b6d83 100644 (file)
@@ -48,8 +48,8 @@ static int nand_dump(nand_info_t *nand, ulong off, int only_oob, int repeat)
 
        last = off;
 
-       datbuf = malloc(nand->writesize);
-       oobbuf = malloc(nand->oobsize);
+       datbuf = memalign(ARCH_DMA_MINALIGN, nand->writesize);
+       oobbuf = memalign(ARCH_DMA_MINALIGN, nand->oobsize);
        if (!datbuf || !oobbuf) {
                puts("No memory for page buffer\n");
                return 1;
@@ -231,12 +231,18 @@ print:
 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
 static void print_status(ulong start, ulong end, ulong erasesize, int status)
 {
+       /*
+        * Micron NAND flash (e.g. MT29F4G08ABADAH4) BLOCK LOCK READ STATUS is
+        * not the same as others.  Instead of bit 1 being lock, it is
+        * #lock_tight. To make the driver support either format, ignore bit 1
+        * and use only bit 0 and bit 2.
+        */
        printf("%08lx - %08lx: %08lx blocks %s%s%s\n",
                start,
                end - 1,
                (end - start) / erasesize,
                ((status & NAND_LOCK_STATUS_TIGHT) ?  "TIGHT " : ""),
-               ((status & NAND_LOCK_STATUS_LOCK) ?  "LOCK " : ""),
+               (!(status & NAND_LOCK_STATUS_UNLOCK) ?  "LOCK " : ""),
                ((status & NAND_LOCK_STATUS_UNLOCK) ?  "UNLOCK " : ""));
 }
 
@@ -367,8 +373,7 @@ static void nand_print_and_set_info(int idx)
 {
        nand_info_t *nand = &nand_info[idx];
        struct nand_chip *chip = nand->priv;
-       const int bufsz = 32;
-       char buf[bufsz];
+       char buf[32];
 
        printf("Device %d: ", idx);
        if (chip->numchips > 1)
@@ -394,7 +399,6 @@ static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
                        int read)
 {
        int ret = 0;
-       size_t rwsize;
 
        while (count--) {
                /* Raw access */
@@ -406,7 +410,6 @@ static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
                        .mode = MTD_OOB_RAW
                };
 
-               rwsize = nand->writesize + nand->oobsize;
                if (read)
                        ret = nand->read_oob(nand, off, &ops);
                else
@@ -425,7 +428,7 @@ static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
        return ret;
 }
 
-int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
+static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        int i, ret = 0;
        ulong addr;
@@ -619,7 +622,7 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 
                s = strchr(cmd, '.');
 
-               if (!strcmp(s, ".raw")) {
+               if (s && !strcmp(s, ".raw")) {
                        raw = 1;
 
                        if (arg_off(argv[3], &dev, &off, &size))
@@ -751,11 +754,18 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                return 0;
        }
 
-       if (strcmp(cmd, "unlock") == 0) {
+       if (strncmp(cmd, "unlock", 5) == 0) {
+               int allexcept = 0;
+
+               s = strchr(cmd, '.');
+
+               if (s && !strcmp(s, ".allexcept"))
+                       allexcept = 1;
+
                if (arg_off_size(argc - 2, argv + 2, &dev, &off, &size) < 0)
                        return 1;
 
-               if (!nand_unlock(&nand_info[dev], off, size)) {
+               if (!nand_unlock(&nand_info[dev], off, size, allexcept)) {
                        puts("NAND flash successfully unlocked\n");
                } else {
                        puts("Error unlocking NAND flash, "
@@ -770,9 +780,8 @@ usage:
        return CMD_RET_USAGE;
 }
 
-U_BOOT_CMD(
-       nand, CONFIG_SYS_MAXARGS, 1, do_nand,
-       "NAND sub-system",
+#ifdef CONFIG_SYS_LONGHELP
+static char nand_help_text[] =
        "info - show available NAND devices\n"
        "nand device [dev] - show or set current device\n"
        "nand read - addr off|partition size\n"
@@ -809,7 +818,7 @@ U_BOOT_CMD(
        "\n"
        "nand lock [tight] [status]\n"
        "    bring nand to lock state or display locked pages\n"
-       "nand unlock [offset] [size] - unlock section"
+       "nand unlock[.allexcept] [offset] [size] - unlock section"
 #endif
 #ifdef CONFIG_ENV_OFFSET_OOB
        "\n"
@@ -818,6 +827,12 @@ U_BOOT_CMD(
        "nand env.oob set off|partition - set enviromnent offset\n"
        "nand env.oob get - get environment offset"
 #endif
+       "";
+#endif
+
+U_BOOT_CMD(
+       nand, CONFIG_SYS_MAXARGS, 1, do_nand,
+       "NAND sub-system", nand_help_text
 );
 
 static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
@@ -902,7 +917,8 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
        return bootm_maybe_autostart(cmdtp, cmd);
 }
 
-int do_nandboot(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
+static int do_nandboot(cmd_tbl_t *cmdtp, int flag, int argc,
+                      char * const argv[])
 {
        char *boot_device = NULL;
        int idx;
This page took 0.031344 seconds and 4 git commands to generate.