X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=cmd%2Fnand.c;h=a22945d144b32b9a8f37f734b837ffb34ab81629;hb=c6b89f31806df06a5d7b688a65f9d2e6e6119a55;hp=c16ec77ed454fe9716997f8114b9597c034756d5;hpb=c0afcb588979e554fd28adeefa6810abb04cf108;p=u-boot diff --git a/cmd/nand.c b/cmd/nand.c index c16ec77ed4..a22945d144 100644 --- a/cmd/nand.c +++ b/cmd/nand.c @@ -115,20 +115,20 @@ free_dat: static int set_dev(int dev) { - if (dev < 0 || dev >= CONFIG_SYS_MAX_NAND_DEVICE || !nand_info[dev]) { - puts("No such device\n"); - return -1; - } + struct mtd_info *mtd = get_nand_dev_by_index(dev); + + if (!mtd) + return -ENODEV; if (nand_curr_device == dev) return 0; - printf("Device %d: %s", dev, nand_info[dev]->name); + printf("Device %d: %s", dev, mtd->name); puts("... is now current device\n"); nand_curr_device = dev; #ifdef CONFIG_SYS_NAND_SELECT_DEVICE - board_nand_select_device(nand_info[dev]->priv, dev); + board_nand_select_device(mtd_to_nand(mtd), dev); #endif return 0; @@ -188,7 +188,7 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[]) { int ret; uint32_t oob_buf[ENV_OFFSET_SIZE/sizeof(uint32_t)]; - struct mtd_info *mtd = nand_info[0]; + struct mtd_info *mtd = get_nand_dev_by_index(0); char *cmd = argv[1]; if (CONFIG_SYS_MAX_NAND_DEVICE == 0 || !mtd) { @@ -213,9 +213,10 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[]) if (argc < 3) goto usage; + mtd = get_nand_dev_by_index(idx); /* We don't care about size, or maxsize. */ if (mtd_arg_off(argv[2], &idx, &addr, &maxsize, &maxsize, - MTD_DEV_TYPE_NAND, nand_info[idx]->size)) { + MTD_DEV_TYPE_NAND, mtd->size)) { puts("Offset or partition name expected\n"); return 1; } @@ -283,9 +284,14 @@ usage: static void nand_print_and_set_info(int idx) { - struct mtd_info *mtd = nand_info[idx]; - struct nand_chip *chip = mtd_to_nand(mtd); + struct mtd_info *mtd; + struct nand_chip *chip; + + mtd = get_nand_dev_by_index(idx); + if (!mtd) + return; + chip = mtd_to_nand(mtd); printf("Device %d: ", idx); if (chip->numchips > 1) printf("%dx ", chip->numchips); @@ -295,13 +301,13 @@ static void nand_print_and_set_info(int idx) printf(" OOB size %8d b\n", mtd->oobsize); printf(" Erase size %8d b\n", mtd->erasesize); printf(" subpagesize %8d b\n", chip->subpagesize); - printf(" options 0x%8x\n", chip->options); - printf(" bbt options 0x%8x\n", chip->bbt_options); + printf(" options 0x%08x\n", chip->options); + printf(" bbt options 0x%08x\n", chip->bbt_options); /* Set geometry info */ - setenv_hex("nand_writesize", mtd->writesize); - setenv_hex("nand_oobsize", mtd->oobsize); - setenv_hex("nand_erasesize", mtd->erasesize); + env_set_hex("nand_writesize", mtd->writesize); + env_set_hex("nand_oobsize", mtd->oobsize); + env_set_hex("nand_erasesize", mtd->erasesize); } static int raw_access(struct mtd_info *mtd, ulong addr, loff_t off, @@ -348,7 +354,7 @@ static void adjust_size_for_badblocks(loff_t *size, loff_t offset, int dev) /* We grab the nand info object here fresh because this is usually * called after arg_off_size() which can change the value of dev. */ - struct mtd_info *mtd = nand_info[dev]; + struct mtd_info *mtd = get_nand_dev_by_index(dev); loff_t maxoffset = offset + *size; int badblocks = 0; @@ -377,7 +383,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #else int quiet = 0; #endif - const char *quiet_str = getenv("quiet"); + const char *quiet_str = env_get("quiet"); int dev = nand_curr_device; int repeat = flag & CMD_FLAG_REPEAT; @@ -397,10 +403,8 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (strcmp(cmd, "info") == 0) { putc('\n'); - for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) { - if (nand_info[i]) - nand_print_and_set_info(i); - } + for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) + nand_print_and_set_info(i); return 0; } @@ -432,12 +436,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * one before these commands can run, even if a partition specifier * for another device is to be used. */ - if (dev < 0 || dev >= CONFIG_SYS_MAX_NAND_DEVICE || - !nand_info[dev]) { + mtd = get_nand_dev_by_index(dev); + if (!mtd) { puts("\nno devices available\n"); return 1; } - mtd = nand_info[dev]; if (strcmp(cmd, "bad") == 0) { printf("\nDevice %d bad blocks:\n", dev); @@ -496,13 +499,13 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) /* skip first two or three arguments, look for offset and size */ if (mtd_arg_off_size(argc - o, argv + o, &dev, &off, &size, &maxsize, MTD_DEV_TYPE_NAND, - nand_info[dev]->size) != 0) + mtd->size) != 0) return 1; if (set_dev(dev)) return 1; - mtd = nand_info[dev]; + mtd = get_nand_dev_by_index(dev); memset(&opts, 0, sizeof(opts)); opts.offset = off; @@ -565,13 +568,13 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (mtd_arg_off(argv[3], &dev, &off, &size, &maxsize, MTD_DEV_TYPE_NAND, - nand_info[dev]->size)) + mtd->size)) return 1; if (set_dev(dev)) return 1; - mtd = nand_info[dev]; + mtd = get_nand_dev_by_index(dev); if (argc > 4 && !str2long(argv[4], &pagecount)) { printf("'%s' is not a number\n", argv[4]); @@ -588,7 +591,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (mtd_arg_off_size(argc - 3, argv + 3, &dev, &off, &size, &maxsize, MTD_DEV_TYPE_NAND, - nand_info[dev]->size) != 0) + mtd->size) != 0) return 1; if (set_dev(dev)) @@ -600,7 +603,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) rwsize = size; } - mtd = nand_info[dev]; + mtd = get_nand_dev_by_index(dev); if (!s || !strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i")) { @@ -760,13 +763,15 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (mtd_arg_off_size(argc - 2, argv + 2, &dev, &off, &size, &maxsize, MTD_DEV_TYPE_NAND, - nand_info[dev]->size) < 0) + mtd->size) < 0) return 1; if (set_dev(dev)) return 1; - if (!nand_unlock(nand_info[dev], off, size, allexcept)) { + mtd = get_nand_dev_by_index(dev); + + if (!nand_unlock(mtd, off, size, allexcept)) { puts("NAND flash successfully unlocked\n"); } else { puts("Error unlocking NAND flash, " @@ -929,6 +934,7 @@ static int do_nandboot(cmd_tbl_t *cmdtp, int flag, int argc, char *boot_device = NULL; int idx; ulong addr, offset = 0; + struct mtd_info *mtd; #if defined(CONFIG_CMD_MTDPARTS) struct mtd_device *dev; struct part_info *part; @@ -948,8 +954,10 @@ static int do_nandboot(cmd_tbl_t *cmdtp, int flag, int argc, addr = simple_strtoul(argv[1], NULL, 16); else addr = CONFIG_SYS_LOAD_ADDR; - return nand_load_image(cmdtp, nand_info[dev->id->num], - part->offset, addr, argv[0]); + + mtd = get_nand_dev_by_index(dev->id->num); + return nand_load_image(cmdtp, mtd, part->offset, + addr, argv[0]); } } #endif @@ -958,11 +966,11 @@ static int do_nandboot(cmd_tbl_t *cmdtp, int flag, int argc, switch (argc) { case 1: addr = CONFIG_SYS_LOAD_ADDR; - boot_device = getenv("bootdevice"); + boot_device = env_get("bootdevice"); break; case 2: addr = simple_strtoul(argv[1], NULL, 16); - boot_device = getenv("bootdevice"); + boot_device = env_get("bootdevice"); break; case 3: addr = simple_strtoul(argv[1], NULL, 16); @@ -991,14 +999,15 @@ usage: idx = simple_strtoul(boot_device, NULL, 16); - if (idx < 0 || idx >= CONFIG_SYS_MAX_NAND_DEVICE || !nand_info[idx]) { + mtd = get_nand_dev_by_index(idx); + if (!mtd) { printf("\n** Device %d not available\n", idx); bootstage_error(BOOTSTAGE_ID_NAND_AVAILABLE); return 1; } bootstage_mark(BOOTSTAGE_ID_NAND_AVAILABLE); - return nand_load_image(cmdtp, nand_info[idx], offset, addr, argv[0]); + return nand_load_image(cmdtp, mtd, offset, addr, argv[0]); } U_BOOT_CMD(nboot, 4, 1, do_nandboot,