mtd: rawnand: Always store info about bad block markers in chip struct
The information about where the manufacturer puts the bad block markers inside the bad block and in the OOB data is stored in different places. Let's move this information to nand_chip.options and nand_chip.badblockpos. As this chip-specific information is not directly related to the bad block table (BBT), we also rename the flags to NAND_BBM_*. Signed-off-by: Frieder Schrempf <frieder.schrempf@kontron.de> Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
This commit is contained in:

committed by
Miquel Raynal

parent
39e01956e2
commit
04649ec133
@@ -45,7 +45,7 @@ static void amd_nand_decode_id(struct nand_chip *chip)
|
||||
static int amd_nand_init(struct nand_chip *chip)
|
||||
{
|
||||
if (nand_is_slc(chip))
|
||||
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
||||
chip->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -295,11 +295,11 @@ static int nand_block_bad(struct nand_chip *chip, loff_t ofs)
|
||||
int page, page_end, res;
|
||||
u8 bad;
|
||||
|
||||
if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
|
||||
if (chip->options & NAND_BBM_LASTPAGE)
|
||||
ofs += mtd->erasesize - mtd->writesize;
|
||||
|
||||
page = (int)(ofs >> chip->page_shift) & chip->pagemask;
|
||||
page_end = page + (chip->bbt_options & NAND_BBT_SCAN2NDPAGE ? 2 : 1);
|
||||
page_end = page + ((chip->options & NAND_BBM_SECONDPAGE) ? 2 : 1);
|
||||
|
||||
for (; page < page_end; page++) {
|
||||
res = chip->ecc.read_oob(chip, page);
|
||||
@@ -507,7 +507,7 @@ static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs)
|
||||
ops.mode = MTD_OPS_PLACE_OOB;
|
||||
|
||||
/* Write to first/last page(s) if necessary */
|
||||
if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
|
||||
if (chip->options & NAND_BBM_LASTPAGE)
|
||||
ofs += mtd->erasesize - mtd->writesize;
|
||||
do {
|
||||
res = nand_do_write_oob(chip, ofs, &ops);
|
||||
@@ -516,7 +516,7 @@ static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs)
|
||||
|
||||
i++;
|
||||
ofs += mtd->writesize;
|
||||
} while ((chip->bbt_options & NAND_BBT_SCAN2NDPAGE) && i < 2);
|
||||
} while ((chip->options & NAND_BBM_SECONDPAGE) && i < 2);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -4513,9 +4513,9 @@ static void nand_decode_bbm_options(struct nand_chip *chip)
|
||||
|
||||
/* Set the bad block position */
|
||||
if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16))
|
||||
chip->badblockpos = NAND_LARGE_BADBLOCK_POS;
|
||||
chip->badblockpos = NAND_BBM_POS_LARGE;
|
||||
else
|
||||
chip->badblockpos = NAND_SMALL_BADBLOCK_POS;
|
||||
chip->badblockpos = NAND_BBM_POS_SMALL;
|
||||
}
|
||||
|
||||
static inline bool is_full_id_nand(struct nand_flash_dev *type)
|
||||
|
@@ -468,7 +468,7 @@ static int create_bbt(struct nand_chip *this, uint8_t *buf,
|
||||
|
||||
pr_info("Scanning device for bad blocks\n");
|
||||
|
||||
if (bd->options & NAND_BBT_SCAN2NDPAGE)
|
||||
if (this->options & NAND_BBM_SECONDPAGE)
|
||||
numpages = 2;
|
||||
else
|
||||
numpages = 1;
|
||||
@@ -489,7 +489,7 @@ static int create_bbt(struct nand_chip *this, uint8_t *buf,
|
||||
from = (loff_t)startblock << this->bbt_erase_shift;
|
||||
}
|
||||
|
||||
if (this->bbt_options & NAND_BBT_SCANLASTPAGE)
|
||||
if (this->options & NAND_BBM_LASTPAGE)
|
||||
from += mtd->erasesize - (mtd->writesize * numpages);
|
||||
|
||||
for (i = startblock; i < numblocks; i++) {
|
||||
|
@@ -36,7 +36,7 @@ static void esmt_nand_decode_id(struct nand_chip *chip)
|
||||
static int esmt_nand_init(struct nand_chip *chip)
|
||||
{
|
||||
if (nand_is_slc(chip))
|
||||
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
||||
chip->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -688,9 +688,9 @@ static int hynix_nand_init(struct nand_chip *chip)
|
||||
int ret;
|
||||
|
||||
if (!nand_is_slc(chip))
|
||||
chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
|
||||
chip->options |= NAND_BBM_LASTPAGE;
|
||||
else
|
||||
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
||||
chip->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
hynix = kzalloc(sizeof(*hynix), GFP_KERNEL);
|
||||
if (!hynix)
|
||||
|
@@ -62,7 +62,7 @@ static void macronix_nand_fix_broken_get_timings(struct nand_chip *chip)
|
||||
static int macronix_nand_init(struct nand_chip *chip)
|
||||
{
|
||||
if (nand_is_slc(chip))
|
||||
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
||||
chip->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
macronix_nand_fix_broken_get_timings(chip);
|
||||
|
||||
|
@@ -448,7 +448,7 @@ static int micron_nand_init(struct nand_chip *chip)
|
||||
goto err_free_manuf_data;
|
||||
|
||||
if (mtd->writesize == 2048)
|
||||
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
||||
chip->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
ondie = micron_supports_on_die_ecc(chip);
|
||||
|
||||
|
@@ -131,9 +131,9 @@ static int samsung_nand_init(struct nand_chip *chip)
|
||||
chip->options |= NAND_SAMSUNG_LP_OPTIONS;
|
||||
|
||||
if (!nand_is_slc(chip))
|
||||
chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
|
||||
chip->options |= NAND_BBM_LASTPAGE;
|
||||
else
|
||||
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
||||
chip->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -152,7 +152,7 @@ static void toshiba_nand_decode_id(struct nand_chip *chip)
|
||||
static int toshiba_nand_init(struct nand_chip *chip)
|
||||
{
|
||||
if (nand_is_slc(chip))
|
||||
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
|
||||
chip->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
/* Check that chip is BENAND and ECC mode is on-die */
|
||||
if (nand_is_slc(chip) && chip->ecc.mode == NAND_ECC_ON_DIE &&
|
||||
|
@@ -101,14 +101,12 @@ static const struct mtd_ooblayout_ops flctl_4secc_oob_largepage_ops = {
|
||||
static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
|
||||
|
||||
static struct nand_bbt_descr flctl_4secc_smallpage = {
|
||||
.options = NAND_BBT_SCAN2NDPAGE,
|
||||
.offs = 11,
|
||||
.len = 1,
|
||||
.pattern = scan_ff_pattern,
|
||||
};
|
||||
|
||||
static struct nand_bbt_descr flctl_4secc_largepage = {
|
||||
.options = NAND_BBT_SCAN2NDPAGE,
|
||||
.offs = 0,
|
||||
.len = 2,
|
||||
.pattern = scan_ff_pattern,
|
||||
@@ -1179,6 +1177,8 @@ static int flctl_probe(struct platform_device *pdev)
|
||||
if (pdata->flcmncr_val & SEL_16BIT)
|
||||
nand->options |= NAND_BUSWIDTH_16;
|
||||
|
||||
nand->options |= NAND_BBM_SECONDPAGE;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_resume(&pdev->dev);
|
||||
|
||||
|
Reference in New Issue
Block a user