aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2012-09-24 23:40:55 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-09-29 10:58:28 -0400
commite2d3a35ee427aaba99b6c68a56609ce276c51270 (patch)
treefdc7fb47876d0e2ecbb3f48f107425a905fde878
parent73ca392f7d4a175dcf7b56a3c35efc92a55a5473 (diff)
mtd: nand: detect Samsung K9GBG08U0A, K9GAG08U0F ID
Datasheets for the following Samsung NAND parts (both MLC and SLC) describe extensions to the Samsung 6-byte extended ID decoding table: K9GBG08U0A (MLC, 6-byte ID) K9GAG08U0F (MLC, 6-byte ID) K9FAG08U0M (SLC, 6-byte ID) The table found in K9GAG08U0F, p.44, contains a superset of the information found in other previous datasheets. This patch adds support for all of these chips, with 512B and 640B OOB sizes. It also changes the detection pattern such that this table applies to all Samsung 6-byte ID NAND, not just MLC. This is safe, according to the NAND parameter data I have collected: Note that nand_base.c does not yet support the bad block marker scheme defined for these chips (i.e., scan 1st and last page for BB markers). 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>
-rw-r--r--drivers/mtd/nand/nand_base.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 304765140634..ec6841d8e956 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2983,19 +2983,18 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
2983 /* 2983 /*
2984 * Field definitions are in the following datasheets: 2984 * Field definitions are in the following datasheets:
2985 * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32) 2985 * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32)
2986 * New style (6 byte ID): Samsung K9GBG08U0M (p.40) 2986 * New style (6 byte ID): Samsung K9GAG08U0F (p.44)
2987 * Hynix MLC (6 byte ID): Hynix H27UBG8T2B (p.22) 2987 * Hynix MLC (6 byte ID): Hynix H27UBG8T2B (p.22)
2988 * 2988 *
2989 * Check for ID length, cell type, and Hynix/Samsung ID to decide what 2989 * Check for ID length, cell type, and Hynix/Samsung ID to decide what
2990 * to do. 2990 * to do.
2991 */ 2991 */
2992 if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG && 2992 if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG) {
2993 (chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
2994 /* Calc pagesize */ 2993 /* Calc pagesize */
2995 mtd->writesize = 2048 << (extid & 0x03); 2994 mtd->writesize = 2048 << (extid & 0x03);
2996 extid >>= 2; 2995 extid >>= 2;
2997 /* Calc oobsize */ 2996 /* Calc oobsize */
2998 switch (extid & 0x03) { 2997 switch (((extid >> 2) & 0x04) | (extid & 0x03)) {
2999 case 1: 2998 case 1:
3000 mtd->oobsize = 128; 2999 mtd->oobsize = 128;
3001 break; 3000 break;
@@ -3005,9 +3004,16 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
3005 case 3: 3004 case 3:
3006 mtd->oobsize = 400; 3005 mtd->oobsize = 400;
3007 break; 3006 break;
3008 default: 3007 case 4:
3009 mtd->oobsize = 436; 3008 mtd->oobsize = 436;
3010 break; 3009 break;
3010 case 5:
3011 mtd->oobsize = 512;
3012 break;
3013 case 6:
3014 default: /* Other cases are "reserved" (unknown) */
3015 mtd->oobsize = 640;
3016 break;
3011 } 3017 }
3012 extid >>= 2; 3018 extid >>= 2;
3013 /* Calc blocksize */ 3019 /* Calc blocksize */