From patchwork Fri Aug 24 06:41:28 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/2] nand: nand_bbt: Export nand_update_bbt Date: Thu, 23 Aug 2012 20:41:28 -0000 From: Artem Bityutskiy X-Patchwork-Id: 179771 Message-Id: <1345790488.2848.252.camel@sauron.fi.intel.com> To: Huang Shijie Cc: Fabio Estevam , dwmw2@infradead.org, b32955@freescale.com, linux-mtd@lists.infradead.org, marex.vasut@denx.de, kernel@pengutronix.de, shawn.guo@linaro.org, Fabio Estevam On Thu, 2012-08-23 at 11:36 -0400, Huang Shijie wrote: > On Thu, Aug 23, 2012 at 11:08 AM, Artem Bityutskiy wrote: > > On Sat, 2012-07-28 at 19:29 -0300, Fabio Estevam wrote: > >> From: Fabio Estevam > >> > >> When building MTD_NAND_GPMI_NAND as module, the following error shows up: > >> > >> ERROR: "nand_update_bbt" [drivers/mtd/nand/gpmi-nand/gpmi_nand.ko] undefined! > >> > >> Export nand_update_bbt to fix it > >> > >> Signed-off-by: Fabio Estevam > > > > Why this driver redefined ->block_markbad() at all, it is not supposed > For hardware reason, in mx23, the bad block mark is stored in the > first byte of the nand page; > in mx28/mx50/mx6q, the bad block mark is stored in the first byte of the OOB. > > That's why the driver redefined the ->block_markbad(). The default function seem to do the same as your function does. You select where you keep your OOB using chip options, and the default function does the right thing, no? >From 5cdff78da6dde1e2eef472dcbbe7ca8f7fd64061 Mon Sep 17 00:00:00 2001 From: Artem Bityutskiy Date: Fri, 24 Aug 2012 09:26:29 +0300 Subject: [PATCH] gpmi-nand: use the default implementation of block_markbad Signed-off-by: Artem Bityutskiy --- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 46 -------------------------------- 1 file changed, 46 deletions(-) diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index 8c0d2f0..8e193fb 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c @@ -1179,51 +1179,6 @@ gpmi_ecc_write_oob(struct mtd_info *mtd, struct nand_chip *chip, int page) return -EPERM; } -static int gpmi_block_markbad(struct mtd_info *mtd, loff_t ofs) -{ - struct nand_chip *chip = mtd->priv; - struct gpmi_nand_data *this = chip->priv; - int block, ret = 0; - uint8_t *block_mark; - int column, page, status, chipnr; - - /* Get block number */ - block = (int)(ofs >> chip->bbt_erase_shift); - if (chip->bbt) - chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1); - - /* Do we have a flash based bad block table ? */ - if (chip->bbt_options & NAND_BBT_USE_FLASH) - ret = nand_update_bbt(mtd, ofs); - else { - chipnr = (int)(ofs >> chip->chip_shift); - chip->select_chip(mtd, chipnr); - - column = this->swap_block_mark ? mtd->writesize : 0; - - /* Write the block mark. */ - block_mark = this->data_buffer_dma; - block_mark[0] = 0; /* bad block marker */ - - /* Shift to get page */ - page = (int)(ofs >> chip->page_shift); - - chip->cmdfunc(mtd, NAND_CMD_SEQIN, column, page); - chip->write_buf(mtd, block_mark, 1); - chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); - - status = chip->waitfunc(mtd, chip); - if (status & NAND_STATUS_FAIL) - ret = -EIO; - - chip->select_chip(mtd, -1); - } - if (!ret) - mtd->ecc_stats.badblocks++; - - return ret; -} - static int nand_boot_set_geometry(struct gpmi_nand_data *this) { struct boot_rom_geometry *geometry = &this->rom_geometry; @@ -1562,7 +1517,6 @@ static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this) chip->ecc.write_oob = gpmi_ecc_write_oob; chip->scan_bbt = gpmi_scan_bbt; chip->badblock_pattern = &gpmi_bbt_descr; - chip->block_markbad = gpmi_block_markbad; chip->options |= NAND_NO_SUBPAGE_WRITE; chip->ecc.mode = NAND_ECC_HW; chip->ecc.size = 1;