diff options
| -rw-r--r-- | drivers/mtd/nand/nand_base.c | 9 | ||||
| -rw-r--r-- | include/linux/mtd/nand.h | 7 | 
2 files changed, 11 insertions, 5 deletions
| diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index d3b71a50a..a2d06be99 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -1245,7 +1245,8 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  			if (unlikely(ops->mode == MTD_OOB_RAW))  				ret = chip->ecc.read_page_raw(mtd, chip,  							      bufpoi, page); -			else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob) +			else if (!aligned && NAND_HAS_SUBPAGE_READ(chip) && +			    !oob)  				ret = chip->ecc.read_subpage(mtd, chip,  							col, bytes, bufpoi);  			else @@ -1256,7 +1257,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,  			/* Transfer not aligned data */  			if (!aligned) { -				if (!NAND_SUBPAGE_READ(chip) && !oob && +				if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&  				    !(mtd->ecc_stats.failed - stats.failed))  					chip->pagebuf = realpage;  				memcpy(buf, chip->buffers->databuf + col, bytes); @@ -3150,6 +3151,10 @@ int nand_scan_tail(struct mtd_info *mtd)  	/* Invalidate the pagebuffer reference */  	chip->pagebuf = -1; +	/* Large page NAND with SOFT_ECC should support subpage reads */ +	if ((chip->ecc.mode == NAND_ECC_SOFT) && (chip->page_shift > 9)) +		chip->options |= NAND_SUBPAGE_READ; +  	/* Fill in remaining MTD driver data */  	mtd->type = MTD_NANDFLASH;  	mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM : diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index f63e04b63..e9e904523 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -194,6 +194,9 @@ typedef enum {  /* Device behaves just like nand, but is readonly */  #define NAND_ROM		0x00000800 +/* Device supports subpage reads */ +#define NAND_SUBPAGE_READ       0x00001000 +  /* Options valid for Samsung large page devices */  #define NAND_SAMSUNG_LP_OPTIONS \  	(NAND_NO_PADDING | NAND_CACHEPRG | NAND_COPYBACK) @@ -203,9 +206,7 @@ typedef enum {  #define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING))  #define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))  #define NAND_HAS_COPYBACK(chip) ((chip->options & NAND_COPYBACK)) -/* Large page NAND with SOFT_ECC should support subpage reads */ -#define NAND_SUBPAGE_READ(chip) ((chip->ecc.mode == NAND_ECC_SOFT) \ -					&& (chip->page_shift > 9)) +#define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ))  /* Non chip related options */  /* |