}
 #endif
 
+static void nand_print_info(int idx)
+{
+       nand_info_t *nand = &nand_info[idx];
+       struct nand_chip *chip = nand->priv;
+       printf("Device %d: ", idx);
+       if (chip->numchips > 1)
+               printf("%dx ", chip->numchips);
+       printf("%s, sector size %u KiB\n",
+              nand->name, nand->erasesize >> 10);
+}
+
 int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
        int i, dev, ret = 0;
                putc('\n');
                for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) {
                        if (nand_info[i].name)
-                               printf("Device %d: %s, sector size %u KiB\n",
-                                      i, nand_info[i].name,
-                                      nand_info[i].erasesize >> 10);
+                               nand_print_info(i);
                }
                return 0;
        }
        if (strcmp(cmd, "device") == 0) {
 
                if (argc < 3) {
+                       putc('\n');
                        if ((nand_curr_device < 0) ||
                            (nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE))
-                               puts("\nno devices available\n");
+                               puts("no devices available\n");
                        else
-                               printf("\nDevice %d: %s\n", nand_curr_device,
-                                      nand_info[nand_curr_device].name);
+                               nand_print_info(nand_curr_device);
                        return 0;
                }
                dev = (int)simple_strtoul(argv[2], NULL, 10);
 
 static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
                           ulong base_addr)
 {
+       int maxchips = CONFIG_SYS_NAND_MAX_CHIPS;
+
+       if (maxchips < 1)
+               maxchips = 1;
        mtd->priv = nand;
 
        nand->IO_ADDR_R = nand->IO_ADDR_W = (void  __iomem *)base_addr;
        if (board_nand_init(nand) == 0) {
-               if (nand_scan(mtd, 1) == 0) {
+               if (nand_scan(mtd, maxchips) == 0) {
                        if (!mtd->name)
                                mtd->name = (char *)default_nand_name;
                        else