* Add hook to NAND erase and implement nand_wait function.
[platform/kernel/u-boot.git] / common / cmd_jffs2.c
index 21eacc2..bc63f0c 100644 (file)
@@ -45,7 +45,7 @@
  * partition  := <part-id>
  * <part-id>  := <dev-id>,part_num
  *
- * 
+ *
  * 'mtdids' - linux kernel mtd device id <-> u-boot device id mapping
  *
  * mtdids=<idmap>[,<idmap>,...]
 
 #include <cramfs/cramfs_fs.h>
 
+#ifdef CONFIG_NEW_NAND_CODE
+#include <nand.h>
+#endif
+
 /* enable/disable debugging messages */
 #define        DEBUG
 #undef DEBUG
@@ -324,10 +328,9 @@ static int part_validate_nand(struct mtdids *id, struct part_info *part)
 {
 #if defined(CONFIG_JFFS2_NAND) && (CONFIG_COMMANDS & CFG_CMD_NAND)
        /* info for NAND chips */
-       extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
-       struct nand_chip *nand;
+       nand_info_t *nand;
 
-       nand = &nand_dev_desc[id->num];
+       nand = &nand_info[id->num];
 
        if ((unsigned long)(part->offset) % nand->erasesize) {
                printf("%s%d: partition (%s) start offset alignment incorrect\n",
@@ -403,7 +406,7 @@ static int part_del(struct mtd_device *dev, struct part_info *part)
                return device_del(dev);
 
        /* otherwise just delete this partition */
-       
+
        if (dev == current_dev) {
                /* we are modyfing partitions for the current device,
                 * update current */
@@ -416,14 +419,15 @@ static int part_del(struct mtd_device *dev, struct part_info *part)
                                current_partnum = 0;
                                current_save();
                        } else if (part->offset <= curr_pi->offset) {
-                               current_partnum--; 
+                               current_partnum--;
                                current_save();
                        }
                }
        }
 
-
+#ifndef CONFIG_NEW_NAND_CODE
        jffs2_free_cache(part);
+#endif
        list_del(&part->link);
        free(part);
        dev->num_parts--;
@@ -445,7 +449,9 @@ static void part_delall(struct list_head *head)
        list_for_each_safe(entry, n, head) {
                part_tmp = list_entry(entry, struct part_info, link);
 
+#ifndef CONFIG_NEW_NAND_CODE
                jffs2_free_cache(part_tmp);
+#endif
                list_del(entry);
                free(part_tmp);
        }
@@ -471,7 +477,7 @@ static int part_sort_add(struct mtd_device *dev, struct part_info *part)
                list_add(&part->link, &dev->parts);
                return 0;
        }
-               
+
        new_pi = list_entry(&part->link, struct part_info, link);
 
        /* get current partition info if we are updating current device */
@@ -492,7 +498,7 @@ static int part_sort_add(struct mtd_device *dev, struct part_info *part)
 
                if (new_pi->offset <= pi->offset) {
                        list_add_tail(&part->link, entry);
-                       
+
                        if (curr_pi && (pi->offset <= curr_pi->offset)) {
                                /* we are modyfing partitions for the current
                                 * device, update current */
@@ -516,7 +522,7 @@ static int part_sort_add(struct mtd_device *dev, struct part_info *part)
  */
 static int part_add(struct mtd_device *dev, struct part_info *part)
 {
-       /* verify alignment and size */ 
+       /* verify alignment and size */
        if (part_validate(dev->id, part) != 0)
                return 1;
 
@@ -565,14 +571,14 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i
                }
        }
 
-        /* check for offset */
+       /* check for offset */
        offset = OFFSET_NOT_SPECIFIED;
        if (*p == '@') {
                p++;
                offset = memsize_parse(p, &p);
        }
 
-        /* now look for the name */
+       /* now look for the name */
        if (*p == '(') {
                name = ++p;
                if ((p = strchr(name, ')')) == NULL) {
@@ -591,7 +597,7 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i
                name = NULL;
        }
 
-        /* test for options */
+       /* test for options */
        mask_flags = 0;
        if (strncmp(p, "ro", 2) == 0) {
                mask_flags |= MTD_WRITEABLE;
@@ -661,6 +667,7 @@ static int device_validate(u8 type, u8 num, u32 *size)
                if (num < CFG_MAX_FLASH_BANKS) {
                        extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
                        *size = flash_info[num].size;
+
                        return 0;
                }
 
@@ -672,8 +679,12 @@ static int device_validate(u8 type, u8 num, u32 *size)
        } else if (type == MTD_DEV_TYPE_NAND) {
 #if defined(CONFIG_JFFS2_NAND) && (CONFIG_COMMANDS & CFG_CMD_NAND)
                if (num < CFG_MAX_NAND_DEVICE) {
+#ifdef CONFIG_NEW_NAND_CODE
+                       *size = nand_info[num].size;
+#else
                        extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
                        *size = nand_dev_desc[num].totlen;
+#endif
                        return 0;
                }
 
@@ -823,8 +834,8 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
                printf("invalid mtd device '%.*s'\n", mtd_id_len - 1, mtd_id);
                return 1;
        }
-       
-       DEBUGF("dev type = %d (%s), dev num = %d, mtd-id = %s\n", 
+
+       DEBUGF("dev type = %d (%s), dev num = %d, mtd-id = %s\n",
                        id->type, MTD_DEV_TYPE(id->type),
                        id->num, id->mtd_id);
        pend = strchr(p, ';');
@@ -836,7 +847,7 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
 
        offset = 0;
        if ((dev = device_find(id->type, id->num)) != NULL) {
-               /* if device already exists start at the end of the last partition */ 
+               /* if device already exists start at the end of the last partition */
                part = list_entry(dev->parts.prev, struct part_info, link);
                offset = part->offset + part->size;
        }
@@ -852,7 +863,7 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
                else
                        offset = part->offset;
 
-               /* verify alignment and size */ 
+               /* verify alignment and size */
                if (part_validate(id, part) != 0)
                        break;
 
@@ -885,7 +896,7 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
                } else {
                        printf("unexpected character '%c' at the end of device\n", *p);
                        *ret = NULL;
-                       return 1;               
+                       return 1;
                }
        }
 
@@ -939,7 +950,7 @@ static struct mtdids* id_find(u8 type, u8 num)
 {
        struct list_head *entry;
        struct mtdids *id;
-       
+
        list_for_each(entry, &mtdids) {
                id = list_entry(entry, struct mtdids, link);
 
@@ -951,7 +962,7 @@ static struct mtdids* id_find(u8 type, u8 num)
 }
 
 /**
- * Search global mtdids list and find id of a requested mtd_id. 
+ * Search global mtdids list and find id of a requested mtd_id.
  *
  * Note: first argument is not null terminated.
  *
@@ -963,7 +974,7 @@ static struct mtdids* id_find_by_mtd_id(const char *mtd_id, unsigned int mtd_id_
 {
        struct list_head *entry;
        struct mtdids *id;
-       
+
        DEBUGF("--- id_find_by_mtd_id: '%.*s' (len = %d)\n",
                        mtd_id_len, mtd_id, mtd_id_len);
 
@@ -1045,13 +1056,13 @@ static int generate_mtdparts(char *buf, u32 buflen)
                buf[0] = '\0';
                return 0;
        }
-       
+
        sprintf(p, "mtdparts=");
        p += 9;
 
        list_for_each(dentry, &devices) {
                dev = list_entry(dentry, struct mtd_device, link);
-               
+
                /* copy mtd_id */
                len = strlen(dev->id->mtd_id) + 1;
                if (len > maxlen)
@@ -1078,8 +1089,8 @@ static int generate_mtdparts(char *buf, u32 buflen)
                        memcpy(p, tmpbuf, len);
                        p += len;
                        maxlen -= len;
-                       
-                       
+
+
                        /* add offset only when there is a gap between
                         * partitions */
                        if ((!prev_part && (offset != 0)) ||
@@ -1107,7 +1118,7 @@ static int generate_mtdparts(char *buf, u32 buflen)
                                *(p++) = ')';
                                maxlen -= len;
                        }
-                       
+
                        /* ro mask flag */
                        if (part->mask_flags && MTD_WRITEABLE) {
                                len = 2;
@@ -1188,7 +1199,7 @@ static void list_partitions(void)
                                MTD_DEV_TYPE(dev->id->type), dev->id->num,
                                dev->id->mtd_id, dev->num_parts);
                printf(" #: name\t\t\tsize\t\toffset\t\tmask_flags\n");
-               
+
                /* list partitions for given device */
                part_num = 0;
                list_for_each(pentry, &dev->parts) {
@@ -1256,7 +1267,7 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,
                printf("unexpected trailing character '%c'\n", *p);
                return 1;
        }
-       
+
        if ((*dev = device_find(type, dnum)) == NULL) {
                printf("no such device %s%d\n", MTD_DEV_TYPE(type), dnum);
                return 1;
@@ -1328,7 +1339,7 @@ static int parse_mtdparts(const char *const mtdparts)
 
        /* re-read 'mtdparts' variable, devices_init may be updating env */
        p = getenv("mtdparts");
-       
+
        if (strncmp(p, "mtdparts=", 9) != 0) {
                printf("mtdparts variable doesn't start with 'mtdparts='\n");
                return err;
@@ -1615,7 +1626,7 @@ int mtdparts_init(void)
 
 /**
  * Parse and initialize global mtdids mapping and create global
- * device/partition list. 
+ * device/partition list.
  *
  * @return 0 on success, 1 otherwise
  */
@@ -1627,6 +1638,9 @@ int mtdparts_init(void)
 
        DEBUGF("\n---mtdparts_init---\n");
        if (!initialized) {
+               struct mtdids *id;
+               struct part_info *part;
+
                initialized = 1;
                current_dev = (struct mtd_device *)
                        malloc(sizeof(struct mtd_device) +
@@ -1639,8 +1653,8 @@ int mtdparts_init(void)
                memset(current_dev, 0, sizeof(struct mtd_device) +
                                        sizeof(struct part_info) + sizeof(struct mtdids));
 
-               struct mtdids *id = (struct mtdids *)(current_dev + 1);
-               struct part_info *part = (struct part_info *)(id + 1);
+               id = (struct mtdids *)(current_dev + 1);
+               part = (struct part_info *)(id + 1);
 
                /* id */
                id->mtd_id = "single part";
@@ -1807,7 +1821,7 @@ int do_jffs2_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
                return !(size > 0);
        }
-       return 0;
+       return 1;
 }
 
 /**
@@ -1843,9 +1857,9 @@ int do_jffs2_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        ret = jffs2_1pass_ls(part, filename);
                }
 
-               return (ret == 1);
+               return ret ? 0 : 1;
        }
-       return 0;
+       return 1;
 }
 
 /**
@@ -1867,7 +1881,7 @@ int do_jffs2_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        /* make sure we are in sync with env variables */
        if (mtdparts_init() !=0)
                return 1;
-       
+
        if ((part = jffs2_part_info(current_dev, current_partnum))){
 
                /* check partition type for cramfs */
@@ -1881,9 +1895,9 @@ int do_jffs2_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        ret = jffs2_1pass_info(part);
                }
 
-               return (ret == 1);
+               return ret ? 0 : 1;
        }
-       return 0;
+       return 1;
 }
 
 /* command line only */
@@ -1965,7 +1979,7 @@ int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                list_partitions();
                return 0;
        }
-       
+
        /* mtdparts add <mtd-dev> <size>[@<offset>] <name> [ro] */
        if (((argc == 5) || (argc == 6)) && (strcmp(argv[1], "add") == 0)) {
 #define PART_ADD_DESC_MAXLEN 64
@@ -1995,7 +2009,7 @@ int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        return 1;
                }
                sprintf(tmpbuf, "%s:%s(%s)%s",
-                               id->mtd_id, argv[3], argv[4], argv[5] ? argv[5] : ""); 
+                               id->mtd_id, argv[3], argv[4], argv[5] ? argv[5] : "");
                DEBUGF("add tmpbuf: %s\n", tmpbuf);
 
                if ((device_parse(tmpbuf, NULL, &dev) != 0) || (!dev))