From 79917b2054cd8bd0947127c8b61bc1c7d04dfde7 Mon Sep 17 00:00:00 2001 From: Chuanxiao Dong Date: Fri, 6 Aug 2010 18:19:09 +0800 Subject: [PATCH] --- yaml --- r: 207807 b: refs/heads/master c: 08b9ab9996c7e582f86da319f43d2dcb8ff55993 h: refs/heads/master i: 207805: df3c4eedec9d2cd4ea5d0f8eda7d5dc9ec7e0894 207803: 42e807a703981d2921325bf85148735b5363b1b4 207799: 942dd533686cc0e99603067a02059cdc92522632 207791: ca0c07bb1ea2b5a6e007c4bf84fca39e0578e544 207775: 580e551fc149fdeb8a30d4b11b074e86a377df77 207743: 2d510f490d6dbdb944c920dbaaa0a043fe365af7 v: v3 --- [refs] | 2 +- trunk/drivers/mtd/nand/denali.c | 22 +++++++++++++++++++++- trunk/drivers/mtd/nand/denali.h | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index a18e2ff42896..2cc41e4aa1c6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: db9a321049ead6424848b1040a714290d5df39d7 +refs/heads/master: 08b9ab9996c7e582f86da319f43d2dcb8ff55993 diff --git a/trunk/drivers/mtd/nand/denali.c b/trunk/drivers/mtd/nand/denali.c index f20d1b14ea1d..1422edda3e71 100644 --- a/trunk/drivers/mtd/nand/denali.c +++ b/trunk/drivers/mtd/nand/denali.c @@ -1677,6 +1677,25 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) goto failed_nand; } + /* support for multi nand + * MTD known nothing about multi nand, + * so we should tell it the real pagesize + * and anything necessery + */ + denali->devnum = ioread32(denali->flash_reg + DEVICES_CONNECTED); + denali->nand.chipsize <<= (denali->devnum - 1); + denali->nand.page_shift += (denali->devnum - 1); + denali->nand.pagemask = (denali->nand.chipsize >> + denali->nand.page_shift) - 1; + denali->nand.bbt_erase_shift += (denali->devnum - 1); + denali->nand.phys_erase_shift = denali->nand.bbt_erase_shift; + denali->nand.chip_shift += (denali->devnum - 1); + denali->mtd.writesize <<= (denali->devnum - 1); + denali->mtd.oobsize <<= (denali->devnum - 1); + denali->mtd.erasesize <<= (denali->devnum - 1); + denali->mtd.size = denali->nand.numchips * denali->nand.chipsize; + denali->bbtskipbytes *= denali->devnum; + /* second stage of the NAND scan * this stage requires information regarding ECC and * bad block management. */ @@ -1713,6 +1732,7 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) denali_write32(8, denali->flash_reg + ECC_CORRECTION); } + denali->nand.ecc.bytes *= denali->devnum; denali->nand.ecc.layout->eccbytes *= denali->mtd.writesize / ECC_SECTOR_SIZE; denali->nand.ecc.layout->oobfree[0].offset = @@ -1738,7 +1758,7 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) denali->nand.ecc.hwctl = denali_ecc_hwctl; /* override the default read operations */ - denali->nand.ecc.size = denali->mtd.writesize; + denali->nand.ecc.size = ECC_SECTOR_SIZE * denali->devnum; denali->nand.ecc.read_page = denali_read_page; denali->nand.ecc.read_page_raw = denali_read_page_raw; denali->nand.ecc.write_page = denali_write_page; diff --git a/trunk/drivers/mtd/nand/denali.h b/trunk/drivers/mtd/nand/denali.h index bdf5c2af5000..b680474e6333 100644 --- a/trunk/drivers/mtd/nand/denali.h +++ b/trunk/drivers/mtd/nand/denali.h @@ -764,6 +764,7 @@ struct denali_nand_info { int irq_debug_array[32]; int idx; + uint32_t devnum; /* represent how many nands connected */ uint32_t fwblks; /* represent how many blocks FW used */ uint32_t totalblks; uint32_t blksperchip;