Merge branch 'master' of git://git.denx.de/u-boot-video
[oweals/u-boot.git] / common / cmd_jffs2.c
index 7866c808dd4c752fa0ca0a9acd029f5166c0b79b..d0a7ceaa58b34636bc455f1a560b75268cffee6e 100644 (file)
@@ -1777,6 +1777,96 @@ int mtdparts_init(void)
  * a single device configuration.
  */
 
+/**
+ * Calculate sector size.
+ *
+ * @return sector size
+ */
+static inline u32 get_part_sector_size_nand(struct mtdids *id)
+{
+#if defined(CONFIG_JFFS2_NAND) && defined(CONFIG_CMD_NAND)
+#if defined(CONFIG_NAND_LEGACY)
+       extern struct nand_chip nand_dev_desc[CONFIG_SYS_MAX_NAND_DEVICE];
+
+       return nand_dev_desc[id->num].erasesize;
+#else
+       nand_info_t *nand;
+
+       nand = &nand_info[id->num];
+
+       return nand->erasesize;
+#endif
+#else
+       BUG();
+       return 0;
+#endif
+}
+
+static inline u32 get_part_sector_size_nor(struct mtdids *id, struct part_info *part)
+{
+#if defined(CONFIG_CMD_FLASH)
+       extern flash_info_t flash_info[];
+
+       u32 end_phys, start_phys, sector_size = 0, size = 0;
+       int i;
+       flash_info_t *flash;
+
+       flash = &flash_info[id->num];
+
+       start_phys = flash->start[0] + part->offset;
+       end_phys = start_phys + part->size;
+
+       for (i = 0; i < flash->sector_count; i++) {
+               if (flash->start[i] >= end_phys)
+                       break;
+
+               if (flash->start[i] >= start_phys) {
+                       if (i == flash->sector_count - 1) {
+                               size = flash->start[0] + flash->size - flash->start[i];
+                       } else {
+                               size = flash->start[i+1] - flash->start[i];
+                       }
+
+                       if (sector_size < size)
+                               sector_size = size;
+               }
+       }
+
+       return sector_size;
+#else
+       BUG();
+       return 0;
+#endif
+}
+
+static inline u32 get_part_sector_size_onenand(void)
+{
+#if defined(CONFIG_CMD_ONENAND)
+       struct mtd_info *mtd;
+
+       mtd = &onenand_mtd;
+
+       return mtd->erasesize;
+#else
+       BUG();
+       return 0;
+#endif
+}
+
+static inline u32 get_part_sector_size(struct mtdids *id, struct part_info *part)
+{
+       if (id->type == MTD_DEV_TYPE_NAND)
+               return get_part_sector_size_nand(id);
+       else if (id->type == MTD_DEV_TYPE_NOR)
+               return get_part_sector_size_nor(id, part);
+       else if (id->type == MTD_DEV_TYPE_ONENAND)
+               return get_part_sector_size_onenand();
+       else
+               DEBUGF("Error: Unknown device type.\n");
+
+       return 0;
+}
+
 /**
  * Parse and initialize global mtdids mapping and create global
  * device/partition list.
@@ -1846,6 +1936,8 @@ int mtdparts_init(void)
                part->offset = 0x00000000;
 #endif
 
+               part->sector_size = get_part_sector_size(id, part);
+
                part->dev = current_dev;
                INIT_LIST_HEAD(&part->link);
 
@@ -2197,7 +2289,7 @@ int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                return delete_partition(argv[2]);
        }
 
-       printf ("Usage:\n%s\n", cmdtp->usage);
+       cmd_usage(cmdtp);
        return 1;
 }
 #endif /* #ifdef CONFIG_JFFS2_CMDLINE */
@@ -2205,35 +2297,35 @@ int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 /***************************************************/
 U_BOOT_CMD(
        fsload, 3,      0,      do_jffs2_fsload,
-       "fsload\t- load binary file from a filesystem image\n",
+       "load binary file from a filesystem image",
        "[ off ] [ filename ]\n"
        "    - load binary file from flash bank\n"
        "      with offset 'off'\n"
 );
 U_BOOT_CMD(
        ls,     2,      1,      do_jffs2_ls,
-       "ls\t- list files in a directory (default /)\n",
+       "list files in a directory (default /)",
        "[ directory ]\n"
        "    - list files in a directory.\n"
 );
 
 U_BOOT_CMD(
        fsinfo, 1,      1,      do_jffs2_fsinfo,
-       "fsinfo\t- print information about filesystems\n",
+       "print information about filesystems",
        "    - print information about filesystems\n"
 );
 
 #ifdef CONFIG_JFFS2_CMDLINE
 U_BOOT_CMD(
        chpart, 2,      0,      do_jffs2_chpart,
-       "chpart\t- change active partition\n",
+       "change active partition",
        "part-id\n"
        "    - change active partition (e.g. part-id = nand0,1)\n"
 );
 
 U_BOOT_CMD(
        mtdparts,       6,      0,      do_jffs2_mtdparts,
-       "mtdparts- define flash/nand partitions\n",
+       "define flash/nand partitions",
        "\n"
        "    - list partition table\n"
        "mtdparts delall\n"