blob: 741fc0db46e463e1ca02c73603bf13e07a2a623b [file] [log] [blame]
Mike Dunn54baebe2013-04-12 11:59:18 -07001/*
2 * Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>
3 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02004 * SPDX-License-Identifier: GPL-2.0+
Mike Dunn54baebe2013-04-12 11:59:18 -07005 */
6
7#ifndef __DOCG4_H__
8#define __DOCG4_H__
9
10#include <common.h>
11#include <linux/mtd/nand.h>
12
13extern 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__ */