Commit 672ed2aee91b4856f6671fc72cd34168d8f1b624

Authored by Wolfgang Grandegger
Committed by Scott Wood
1 parent 4ace2823bc

Enable multi chip support in the NAND layer

This patch adds support for NAND_MAX_CHIPS to the MTD NAND layer.
Multi-chips devices are displayed as shown:

  Device 0: 2x NAND 512MiB 3,3V 8-bit, sector size 128 KiB

Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>

Showing 3 changed files with 22 additions and 7 deletions Side-by-side Diff

... ... @@ -205,6 +205,17 @@
205 205 }
206 206 #endif
207 207  
  208 +static void nand_print_info(int idx)
  209 +{
  210 + nand_info_t *nand = &nand_info[idx];
  211 + struct nand_chip *chip = nand->priv;
  212 + printf("Device %d: ", idx);
  213 + if (chip->numchips > 1)
  214 + printf("%dx ", chip->numchips);
  215 + printf("%s, sector size %u KiB\n",
  216 + nand->name, nand->erasesize >> 10);
  217 +}
  218 +
208 219 int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
209 220 {
210 221 int i, dev, ret = 0;
... ... @@ -233,9 +244,7 @@
233 244 putc('\n');
234 245 for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) {
235 246 if (nand_info[i].name)
236   - printf("Device %d: %s, sector size %u KiB\n",
237   - i, nand_info[i].name,
238   - nand_info[i].erasesize >> 10);
  247 + nand_print_info(i);
239 248 }
240 249 return 0;
241 250 }
242 251  
243 252  
... ... @@ -243,12 +252,12 @@
243 252 if (strcmp(cmd, "device") == 0) {
244 253  
245 254 if (argc < 3) {
  255 + putc('\n');
246 256 if ((nand_curr_device < 0) ||
247 257 (nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE))
248   - puts("\nno devices available\n");
  258 + puts("no devices available\n");
249 259 else
250   - printf("\nDevice %d: %s\n", nand_curr_device,
251   - nand_info[nand_curr_device].name);
  260 + nand_print_info(nand_curr_device);
252 261 return 0;
253 262 }
254 263 dev = (int)simple_strtoul(argv[2], NULL, 10);
drivers/mtd/nand/nand.c
... ... @@ -41,11 +41,15 @@
41 41 static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
42 42 ulong base_addr)
43 43 {
  44 + int maxchips = CONFIG_SYS_NAND_MAX_CHIPS;
  45 +
  46 + if (maxchips < 1)
  47 + maxchips = 1;
44 48 mtd->priv = nand;
45 49  
46 50 nand->IO_ADDR_R = nand->IO_ADDR_W = (void __iomem *)base_addr;
47 51 if (board_nand_init(nand) == 0) {
48   - if (nand_scan(mtd, 1) == 0) {
  52 + if (nand_scan(mtd, maxchips) == 0) {
49 53 if (!mtd->name)
50 54 mtd->name = (char *)default_nand_name;
51 55 else
drivers/mtd/nand/nand_base.c
... ... @@ -2652,8 +2652,10 @@
2652 2652 type->id != chip->read_byte(mtd))
2653 2653 break;
2654 2654 }
  2655 +#ifdef DEBUG
2655 2656 if (i > 1)
2656 2657 printk(KERN_INFO "%d NAND chips detected\n", i);
  2658 +#endif
2657 2659  
2658 2660 /* Store the number of chips and calc total size for mtd */
2659 2661 chip->numchips = i;