Commit 672ed2aee91b4856f6671fc72cd34168d8f1b624
Committed by
Scott Wood
1 parent
4ace2823bc
Exists in
master
and in
54 other branches
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
common/cmd_nand.c
... | ... | @@ -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; |