Skip to content

Commit 73ca392

Browse files
computersforpeaceDavid Woodhouse
authored andcommitted
mtd: nand: decode Hynix MLC, 6-byte ID length
Hynix has introduced a new ID decoding scheme for their newer MLC, some of which don't support ONFI. The following devices all follow the pattern given in the datasheet for Hynix H27UBG8T2B, p.22: Hynix H27UAG8T2A Hynix H27UBG8T2A Hynix H27UBG8T2B Signed-off-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
1 parent b9e4853 commit 73ca392

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

drivers/mtd/nand/nand_base.c

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2984,8 +2984,10 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
29842984
* Field definitions are in the following datasheets:
29852985
* Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32)
29862986
* New style (6 byte ID): Samsung K9GBG08U0M (p.40)
2987+
* Hynix MLC (6 byte ID): Hynix H27UBG8T2B (p.22)
29872988
*
2988-
* Check for ID length + Samsung ID to decide what to do.
2989+
* Check for ID length, cell type, and Hynix/Samsung ID to decide what
2990+
* to do.
29892991
*/
29902992
if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG &&
29912993
(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
@@ -3012,6 +3014,47 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
30123014
mtd->erasesize = (128 * 1024) <<
30133015
(((extid >> 1) & 0x04) | (extid & 0x03));
30143016
*busw = 0;
3017+
} else if (id_len == 6 && id_data[0] == NAND_MFR_HYNIX &&
3018+
(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
3019+
unsigned int tmp;
3020+
3021+
/* Calc pagesize */
3022+
mtd->writesize = 2048 << (extid & 0x03);
3023+
extid >>= 2;
3024+
/* Calc oobsize */
3025+
switch (((extid >> 2) & 0x04) | (extid & 0x03)) {
3026+
case 0:
3027+
mtd->oobsize = 128;
3028+
break;
3029+
case 1:
3030+
mtd->oobsize = 224;
3031+
break;
3032+
case 2:
3033+
mtd->oobsize = 448;
3034+
break;
3035+
case 3:
3036+
mtd->oobsize = 64;
3037+
break;
3038+
case 4:
3039+
mtd->oobsize = 32;
3040+
break;
3041+
case 5:
3042+
mtd->oobsize = 16;
3043+
break;
3044+
default:
3045+
mtd->oobsize = 640;
3046+
break;
3047+
}
3048+
extid >>= 2;
3049+
/* Calc blocksize */
3050+
tmp = ((extid >> 1) & 0x04) | (extid & 0x03);
3051+
if (tmp < 0x03)
3052+
mtd->erasesize = (128 * 1024) << tmp;
3053+
else if (tmp == 0x03)
3054+
mtd->erasesize = 768 * 1024;
3055+
else
3056+
mtd->erasesize = (64 * 1024) << tmp;
3057+
*busw = 0;
30153058
} else {
30163059
/* Calc pagesize */
30173060
mtd->writesize = 1024 << (extid & 0x03);

0 commit comments

Comments
 (0)