Mike Dunn | 956b03e | 2013-04-12 11:59:18 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com> |
| 3 | * |
Wolfgang Denk | 1a45966 | 2013-07-08 09:37:19 +0200 | [diff] [blame] | 4 | * SPDX-License-Identifier: GPL-2.0+ |
Mike Dunn | 956b03e | 2013-04-12 11:59:18 -0700 | [diff] [blame] | 5 | */ |
| 6 | |
| 7 | #ifndef __DOCG4_H__ |
| 8 | #define __DOCG4_H__ |
| 9 | |
| 10 | #include <common.h> |
| 11 | #include <linux/mtd/nand.h> |
| 12 | |
| 13 | extern int docg4_nand_init(struct mtd_info *mtd, |
| 14 | struct nand_chip *nand, int devnum); |
| 15 | |
| 16 | /* SPL-related definitions */ |
| 17 | #define DOCG4_IPL_LOAD_BLOCK_COUNT 2 /* number of blocks that IPL loads */ |
| 18 | #define DOCG4_BLOCK_CAPACITY_SPL 0x10000 /* reliable mode; redundant pages */ |
| 19 | |
| 20 | #define DOC_IOSPACE_DATA 0x0800 |
| 21 | |
| 22 | /* register offsets */ |
| 23 | #define DOC_CHIPID 0x1000 |
| 24 | #define DOC_DEVICESELECT 0x100a |
| 25 | #define DOC_ASICMODE 0x100c |
| 26 | #define DOC_DATAEND 0x101e |
| 27 | #define DOC_NOP 0x103e |
| 28 | |
| 29 | #define DOC_FLASHSEQUENCE 0x1032 |
| 30 | #define DOC_FLASHCOMMAND 0x1034 |
| 31 | #define DOC_FLASHADDRESS 0x1036 |
| 32 | #define DOC_FLASHCONTROL 0x1038 |
| 33 | #define DOC_ECCCONF0 0x1040 |
| 34 | #define DOC_ECCCONF1 0x1042 |
| 35 | #define DOC_HAMMINGPARITY 0x1046 |
| 36 | #define DOC_BCH_SYNDROM(idx) (0x1048 + idx) |
| 37 | |
| 38 | #define DOC_ASICMODECONFIRM 0x1072 |
| 39 | #define DOC_CHIPID_INV 0x1074 |
| 40 | #define DOC_POWERMODE 0x107c |
| 41 | |
| 42 | #define DOCG4_MYSTERY_REG 0x1050 |
| 43 | |
| 44 | /* apparently used only to write oob bytes 6 and 7 */ |
| 45 | #define DOCG4_OOB_6_7 0x1052 |
| 46 | |
| 47 | /* DOC_FLASHSEQUENCE register commands */ |
| 48 | #define DOC_SEQ_RESET 0x00 |
| 49 | #define DOCG4_SEQ_PAGE_READ 0x03 |
| 50 | #define DOCG4_SEQ_FLUSH 0x29 |
| 51 | #define DOCG4_SEQ_PAGEWRITE 0x16 |
| 52 | #define DOCG4_SEQ_PAGEPROG 0x1e |
| 53 | #define DOCG4_SEQ_BLOCKERASE 0x24 |
| 54 | |
| 55 | /* DOC_FLASHCOMMAND register commands */ |
| 56 | #define DOCG4_CMD_PAGE_READ 0x00 |
| 57 | #define DOC_CMD_ERASECYCLE2 0xd0 |
| 58 | #define DOCG4_CMD_FLUSH 0x70 |
| 59 | #define DOCG4_CMD_READ2 0x30 |
| 60 | #define DOC_CMD_PROG_BLOCK_ADDR 0x60 |
| 61 | #define DOCG4_CMD_PAGEWRITE 0x80 |
| 62 | #define DOC_CMD_PROG_CYCLE2 0x10 |
| 63 | #define DOC_CMD_RESET 0xff |
| 64 | |
| 65 | /* DOC_POWERMODE register bits */ |
| 66 | #define DOC_POWERDOWN_READY 0x80 |
| 67 | |
| 68 | /* DOC_FLASHCONTROL register bits */ |
| 69 | #define DOC_CTRL_CE 0x10 |
| 70 | #define DOC_CTRL_UNKNOWN 0x40 |
| 71 | #define DOC_CTRL_FLASHREADY 0x01 |
| 72 | |
| 73 | /* DOC_ECCCONF0 register bits */ |
| 74 | #define DOC_ECCCONF0_READ_MODE 0x8000 |
| 75 | #define DOC_ECCCONF0_UNKNOWN 0x2000 |
| 76 | #define DOC_ECCCONF0_ECC_ENABLE 0x1000 |
| 77 | #define DOC_ECCCONF0_DATA_BYTES_MASK 0x07ff |
| 78 | |
| 79 | /* DOC_ECCCONF1 register bits */ |
| 80 | #define DOC_ECCCONF1_BCH_SYNDROM_ERR 0x80 |
| 81 | #define DOC_ECCCONF1_ECC_ENABLE 0x07 |
| 82 | #define DOC_ECCCONF1_PAGE_IS_WRITTEN 0x20 |
| 83 | |
| 84 | /* DOC_ASICMODE register bits */ |
| 85 | #define DOC_ASICMODE_RESET 0x00 |
| 86 | #define DOC_ASICMODE_NORMAL 0x01 |
| 87 | #define DOC_ASICMODE_POWERDOWN 0x02 |
| 88 | #define DOC_ASICMODE_MDWREN 0x04 |
| 89 | #define DOC_ASICMODE_BDETCT_RESET 0x08 |
| 90 | #define DOC_ASICMODE_RSTIN_RESET 0x10 |
| 91 | #define DOC_ASICMODE_RAM_WE 0x20 |
| 92 | |
| 93 | /* good status values read after read/write/erase operations */ |
| 94 | #define DOCG4_PROGSTATUS_GOOD 0x51 |
| 95 | #define DOCG4_PROGSTATUS_GOOD_2 0xe0 |
| 96 | |
| 97 | /* |
| 98 | * On read operations (page and oob-only), the first byte read from I/O reg is a |
| 99 | * status. On error, it reads 0x73; otherwise, it reads either 0x71 (first read |
| 100 | * after reset only) or 0x51, so bit 1 is presumed to be an error indicator. |
| 101 | */ |
| 102 | #define DOCG4_READ_ERROR 0x02 /* bit 1 indicates read error */ |
| 103 | |
| 104 | /* anatomy of the device */ |
| 105 | #define DOCG4_CHIP_SIZE 0x8000000 |
| 106 | #define DOCG4_PAGE_SIZE 0x200 |
| 107 | #define DOCG4_PAGES_PER_BLOCK 0x200 |
| 108 | #define DOCG4_BLOCK_SIZE (DOCG4_PAGES_PER_BLOCK * DOCG4_PAGE_SIZE) |
| 109 | #define DOCG4_NUMBLOCKS (DOCG4_CHIP_SIZE / DOCG4_BLOCK_SIZE) |
| 110 | #define DOCG4_OOB_SIZE 0x10 |
| 111 | #define DOCG4_CHIP_SHIFT 27 /* log_2(DOCG4_CHIP_SIZE) */ |
| 112 | #define DOCG4_PAGE_SHIFT 9 /* log_2(DOCG4_PAGE_SIZE) */ |
| 113 | #define DOCG4_ERASE_SHIFT 18 /* log_2(DOCG4_BLOCK_SIZE) */ |
| 114 | |
| 115 | /* all but the last byte is included in ecc calculation */ |
| 116 | #define DOCG4_BCH_SIZE (DOCG4_PAGE_SIZE + DOCG4_OOB_SIZE - 1) |
| 117 | |
| 118 | #define DOCG4_USERDATA_LEN 520 /* 512 byte page plus 8 oob avail to user */ |
| 119 | |
| 120 | /* expected values from the ID registers */ |
| 121 | #define DOCG4_IDREG1_VALUE 0x0400 |
| 122 | #define DOCG4_IDREG2_VALUE 0xfbff |
| 123 | |
| 124 | /* primitive polynomial used to build the Galois field used by hw ecc gen */ |
| 125 | #define DOCG4_PRIMITIVE_POLY 0x4443 |
| 126 | |
| 127 | #define DOCG4_M 14 /* Galois field is of order 2^14 */ |
| 128 | #define DOCG4_T 4 /* BCH alg corrects up to 4 bit errors */ |
| 129 | |
| 130 | #define DOCG4_FACTORY_BBT_PAGE 16 /* page where read-only factory bbt lives */ |
| 131 | |
| 132 | #endif /* __DOCG4_H__ */ |