diff options
-rw-r--r-- | drivers/mtd/onenand/onenand_base.c | 15 | ||||
-rw-r--r-- | include/linux/mtd/onenand.h | 4 |
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) |