diff options
Diffstat (limited to 'include/linux/mtd/docg4.h')
| -rw-r--r-- | include/linux/mtd/docg4.h | 134 | 
1 files changed, 134 insertions, 0 deletions
| diff --git a/include/linux/mtd/docg4.h b/include/linux/mtd/docg4.h new file mode 100644 index 000000000..982f5ad13 --- /dev/null +++ b/include/linux/mtd/docg4.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com> + * + * This file is released under the terms of GPL v2 and any later version. + * See the file COPYING in the root directory of the source tree for details. + * + */ + +#ifndef __DOCG4_H__ +#define __DOCG4_H__ + +#include <common.h> +#include <linux/mtd/nand.h> + +extern int docg4_nand_init(struct mtd_info *mtd, +			   struct nand_chip *nand, int devnum); + +/* SPL-related definitions */ +#define DOCG4_IPL_LOAD_BLOCK_COUNT 2  /* number of blocks that IPL loads */ +#define DOCG4_BLOCK_CAPACITY_SPL 0x10000 /* reliable mode; redundant pages */ + +#define DOC_IOSPACE_DATA		0x0800 + +/* register offsets */ +#define DOC_CHIPID			0x1000 +#define DOC_DEVICESELECT		0x100a +#define DOC_ASICMODE			0x100c +#define DOC_DATAEND			0x101e +#define DOC_NOP				0x103e + +#define DOC_FLASHSEQUENCE		0x1032 +#define DOC_FLASHCOMMAND		0x1034 +#define DOC_FLASHADDRESS		0x1036 +#define DOC_FLASHCONTROL		0x1038 +#define DOC_ECCCONF0			0x1040 +#define DOC_ECCCONF1			0x1042 +#define DOC_HAMMINGPARITY		0x1046 +#define DOC_BCH_SYNDROM(idx)		(0x1048 + idx) + +#define DOC_ASICMODECONFIRM		0x1072 +#define DOC_CHIPID_INV			0x1074 +#define DOC_POWERMODE			0x107c + +#define DOCG4_MYSTERY_REG		0x1050 + +/* apparently used only to write oob bytes 6 and 7 */ +#define DOCG4_OOB_6_7			0x1052 + +/* DOC_FLASHSEQUENCE register commands */ +#define DOC_SEQ_RESET			0x00 +#define DOCG4_SEQ_PAGE_READ		0x03 +#define DOCG4_SEQ_FLUSH			0x29 +#define DOCG4_SEQ_PAGEWRITE		0x16 +#define DOCG4_SEQ_PAGEPROG		0x1e +#define DOCG4_SEQ_BLOCKERASE		0x24 + +/* DOC_FLASHCOMMAND register commands */ +#define DOCG4_CMD_PAGE_READ             0x00 +#define DOC_CMD_ERASECYCLE2		0xd0 +#define DOCG4_CMD_FLUSH                 0x70 +#define DOCG4_CMD_READ2                 0x30 +#define DOC_CMD_PROG_BLOCK_ADDR		0x60 +#define DOCG4_CMD_PAGEWRITE		0x80 +#define DOC_CMD_PROG_CYCLE2		0x10 +#define DOC_CMD_RESET			0xff + +/* DOC_POWERMODE register bits */ +#define DOC_POWERDOWN_READY		0x80 + +/* DOC_FLASHCONTROL register bits */ +#define DOC_CTRL_CE			0x10 +#define DOC_CTRL_UNKNOWN		0x40 +#define DOC_CTRL_FLASHREADY		0x01 + +/* DOC_ECCCONF0 register bits */ +#define DOC_ECCCONF0_READ_MODE		0x8000 +#define DOC_ECCCONF0_UNKNOWN		0x2000 +#define DOC_ECCCONF0_ECC_ENABLE	        0x1000 +#define DOC_ECCCONF0_DATA_BYTES_MASK	0x07ff + +/* DOC_ECCCONF1 register bits */ +#define DOC_ECCCONF1_BCH_SYNDROM_ERR	0x80 +#define DOC_ECCCONF1_ECC_ENABLE         0x07 +#define DOC_ECCCONF1_PAGE_IS_WRITTEN	0x20 + +/* DOC_ASICMODE register bits */ +#define DOC_ASICMODE_RESET		0x00 +#define DOC_ASICMODE_NORMAL		0x01 +#define DOC_ASICMODE_POWERDOWN		0x02 +#define DOC_ASICMODE_MDWREN		0x04 +#define DOC_ASICMODE_BDETCT_RESET	0x08 +#define DOC_ASICMODE_RSTIN_RESET	0x10 +#define DOC_ASICMODE_RAM_WE		0x20 + +/* good status values read after read/write/erase operations */ +#define DOCG4_PROGSTATUS_GOOD          0x51 +#define DOCG4_PROGSTATUS_GOOD_2        0xe0 + +/* + * On read operations (page and oob-only), the first byte read from I/O reg is a + * status.  On error, it reads 0x73; otherwise, it reads either 0x71 (first read + * after reset only) or 0x51, so bit 1 is presumed to be an error indicator. + */ +#define DOCG4_READ_ERROR           0x02 /* bit 1 indicates read error */ + +/* anatomy of the device */ +#define DOCG4_CHIP_SIZE        0x8000000 +#define DOCG4_PAGE_SIZE        0x200 +#define DOCG4_PAGES_PER_BLOCK  0x200 +#define DOCG4_BLOCK_SIZE       (DOCG4_PAGES_PER_BLOCK * DOCG4_PAGE_SIZE) +#define DOCG4_NUMBLOCKS        (DOCG4_CHIP_SIZE / DOCG4_BLOCK_SIZE) +#define DOCG4_OOB_SIZE         0x10 +#define DOCG4_CHIP_SHIFT       27    /* log_2(DOCG4_CHIP_SIZE) */ +#define DOCG4_PAGE_SHIFT       9     /* log_2(DOCG4_PAGE_SIZE) */ +#define DOCG4_ERASE_SHIFT      18    /* log_2(DOCG4_BLOCK_SIZE) */ + +/* all but the last byte is included in ecc calculation */ +#define DOCG4_BCH_SIZE         (DOCG4_PAGE_SIZE + DOCG4_OOB_SIZE - 1) + +#define DOCG4_USERDATA_LEN     520 /* 512 byte page plus 8 oob avail to user */ + +/* expected values from the ID registers */ +#define DOCG4_IDREG1_VALUE     0x0400 +#define DOCG4_IDREG2_VALUE     0xfbff + +/* primitive polynomial used to build the Galois field used by hw ecc gen */ +#define DOCG4_PRIMITIVE_POLY   0x4443 + +#define DOCG4_M                14  /* Galois field is of order 2^14 */ +#define DOCG4_T                4   /* BCH alg corrects up to 4 bit errors */ + +#define DOCG4_FACTORY_BBT_PAGE 16 /* page where read-only factory bbt lives */ + +#endif	/* __DOCG4_H__ */ |