aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/onenand/onenand_base.c15
-rw-r--r--include/linux/mtd/onenand.h4
2 files changed, 19 insertions, 0 deletions
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
index ac9e959802a7..51800a7ef7f8 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -3429,6 +3429,19 @@ static void onenand_check_features(struct mtd_info *mtd)
3429 else if (numbufs == 1) { 3429 else if (numbufs == 1) {
3430 this->options |= ONENAND_HAS_4KB_PAGE; 3430 this->options |= ONENAND_HAS_4KB_PAGE;
3431 this->options |= ONENAND_HAS_CACHE_PROGRAM; 3431 this->options |= ONENAND_HAS_CACHE_PROGRAM;
3432 /*
3433 * There are two different 4KiB pagesize chips
3434 * and no way to detect it by H/W config values.
3435 *
3436 * To detect the correct NOP for each chips,
3437 * It should check the version ID as workaround.
3438 *
3439 * Now it has as following
3440 * KFM4G16Q4M has NOP 4 with version ID 0x0131
3441 * KFM4G16Q5M has NOP 1 with versoin ID 0x013e
3442 */
3443 if ((this->version_id & 0xf) == 0xe)
3444 this->options |= ONENAND_HAS_NOP_1;
3432 } 3445 }
3433 3446
3434 case ONENAND_DEVICE_DENSITY_2Gb: 3447 case ONENAND_DEVICE_DENSITY_2Gb:
@@ -4054,6 +4067,8 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
4054 this->ecclayout = &onenand_oob_128; 4067 this->ecclayout = &onenand_oob_128;
4055 mtd->subpage_sft = 2; 4068 mtd->subpage_sft = 2;
4056 } 4069 }
4070 if (ONENAND_IS_NOP_1(this))
4071 mtd->subpage_sft = 0;
4057 break; 4072 break;
4058 case 64: 4073 case 64:
4059 this->ecclayout = &onenand_oob_64; 4074 this->ecclayout = &onenand_oob_64;
diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h
index 52b6f187bf49..4596503c9da9 100644
--- a/include/linux/mtd/onenand.h
+++ b/include/linux/mtd/onenand.h
@@ -184,6 +184,9 @@ struct onenand_chip {
184#define ONENAND_IS_CACHE_PROGRAM(this) \ 184#define ONENAND_IS_CACHE_PROGRAM(this) \
185 (this->options & ONENAND_HAS_CACHE_PROGRAM) 185 (this->options & ONENAND_HAS_CACHE_PROGRAM)
186 186
187#define ONENAND_IS_NOP_1(this) \
188 (this->options & ONENAND_HAS_NOP_1)
189
187/* Check byte access in OneNAND */ 190/* Check byte access in OneNAND */
188#define ONENAND_CHECK_BYTE_ACCESS(addr) (addr & 0x1) 191#define ONENAND_CHECK_BYTE_ACCESS(addr) (addr & 0x1)
189 192
@@ -195,6 +198,7 @@ struct onenand_chip {
195#define ONENAND_HAS_2PLANE (0x0004) 198#define ONENAND_HAS_2PLANE (0x0004)
196#define ONENAND_HAS_4KB_PAGE (0x0008) 199#define ONENAND_HAS_4KB_PAGE (0x0008)
197#define ONENAND_HAS_CACHE_PROGRAM (0x0010) 200#define ONENAND_HAS_CACHE_PROGRAM (0x0010)
201#define ONENAND_HAS_NOP_1 (0x0020)
198#define ONENAND_SKIP_UNLOCK_CHECK (0x0100) 202#define ONENAND_SKIP_UNLOCK_CHECK (0x0100)
199#define ONENAND_PAGEBUF_ALLOC (0x1000) 203#define ONENAND_PAGEBUF_ALLOC (0x1000)
200#define ONENAND_OOBBUF_ALLOC (0x2000) 204#define ONENAND_OOBBUF_ALLOC (0x2000)