xref: /rk3399_rockchip-uboot/include/linux/mtd/doc2000.h (revision 2fc000d756920b340945a74ec1214a34d9e84858)
1012771d8Swdenk 
2012771d8Swdenk /* Linux driver for Disk-On-Chip 2000       */
3012771d8Swdenk /* (c) 1999 Machine Vision Holdings, Inc.   */
4012771d8Swdenk /* Author: David Woodhouse <dwmw2@mvhi.com> */
5012771d8Swdenk /* $Id: doc2000.h,v 1.15 2001/09/19 00:22:15 dwmw2 Exp $ */
6012771d8Swdenk 
7012771d8Swdenk #ifndef __MTD_DOC2000_H__
8012771d8Swdenk #define __MTD_DOC2000_H__
9012771d8Swdenk 
10012771d8Swdenk struct DiskOnChip;
11012771d8Swdenk 
12012771d8Swdenk #include <linux/mtd/nftl.h>
13012771d8Swdenk 
14012771d8Swdenk #define DoC_Sig1 0
15012771d8Swdenk #define DoC_Sig2 1
16012771d8Swdenk 
17012771d8Swdenk #define DoC_ChipID		0x1000
18012771d8Swdenk #define DoC_DOCStatus		0x1001
19012771d8Swdenk #define DoC_DOCControl		0x1002
20012771d8Swdenk #define DoC_FloorSelect		0x1003
21012771d8Swdenk #define DoC_CDSNControl		0x1004
22012771d8Swdenk #define DoC_CDSNDeviceSelect 	0x1005
23012771d8Swdenk #define DoC_ECCConf 		0x1006
24012771d8Swdenk #define DoC_2k_ECCStatus	0x1007
25012771d8Swdenk 
26012771d8Swdenk #define DoC_CDSNSlowIO		0x100d
27012771d8Swdenk #define DoC_ECCSyndrome0	0x1010
28012771d8Swdenk #define DoC_ECCSyndrome1	0x1011
29012771d8Swdenk #define DoC_ECCSyndrome2	0x1012
30012771d8Swdenk #define DoC_ECCSyndrome3	0x1013
31012771d8Swdenk #define DoC_ECCSyndrome4	0x1014
32012771d8Swdenk #define DoC_ECCSyndrome5	0x1015
33012771d8Swdenk #define DoC_AliasResolution 	0x101b
34012771d8Swdenk #define DoC_ConfigInput		0x101c
35012771d8Swdenk #define DoC_ReadPipeInit 	0x101d
36012771d8Swdenk #define DoC_WritePipeTerm 	0x101e
37012771d8Swdenk #define DoC_LastDataRead 	0x101f
38012771d8Swdenk #define DoC_NOP 		0x1020
39012771d8Swdenk 
40012771d8Swdenk #define DoC_Mil_CDSN_IO 	0x0800
41012771d8Swdenk #define DoC_2k_CDSN_IO 		0x1800
42012771d8Swdenk 
43012771d8Swdenk #define ReadDOC_(adr, reg)      ((volatile unsigned char)(*(volatile __u8 *)(((unsigned long)adr)+((reg)))))
44012771d8Swdenk #define WriteDOC_(d, adr, reg)  do{ *(volatile __u8 *)(((unsigned long)adr)+((reg))) = (__u8)d; eieio();} while(0)
45012771d8Swdenk 
46012771d8Swdenk #define DOC_IOREMAP_LEN		0x4000
47012771d8Swdenk 
48012771d8Swdenk /* These are provided to directly use the DoC_xxx defines */
49012771d8Swdenk #define ReadDOC(adr, reg)      ReadDOC_(adr,DoC_##reg)
50012771d8Swdenk #define WriteDOC(d, adr, reg)  WriteDOC_(d,adr,DoC_##reg)
51012771d8Swdenk 
52012771d8Swdenk #define DOC_MODE_RESET 		0
53012771d8Swdenk #define DOC_MODE_NORMAL 	1
54012771d8Swdenk #define DOC_MODE_RESERVED1 	2
55012771d8Swdenk #define DOC_MODE_RESERVED2 	3
56012771d8Swdenk 
57012771d8Swdenk #define DOC_MODE_MDWREN 	4
58012771d8Swdenk #define DOC_MODE_CLR_ERR 	0x80
59012771d8Swdenk 
60012771d8Swdenk #define DOC_ChipID_UNKNOWN 	0x00
61012771d8Swdenk #define DOC_ChipID_Doc2k 	0x20
62012771d8Swdenk #define DOC_ChipID_DocMil 	0x30
63012771d8Swdenk 
64012771d8Swdenk #define CDSN_CTRL_FR_B 		0x80
65012771d8Swdenk #define CDSN_CTRL_ECC_IO 	0x20
66012771d8Swdenk #define CDSN_CTRL_FLASH_IO 	0x10
67012771d8Swdenk #define CDSN_CTRL_WP 		0x08
68012771d8Swdenk #define CDSN_CTRL_ALE 		0x04
69012771d8Swdenk #define CDSN_CTRL_CLE 		0x02
70012771d8Swdenk #define CDSN_CTRL_CE 		0x01
71012771d8Swdenk 
72012771d8Swdenk #define DOC_ECC_RESET 		0
73012771d8Swdenk #define DOC_ECC_ERROR 		0x80
74012771d8Swdenk #define DOC_ECC_RW 		0x20
75012771d8Swdenk #define DOC_ECC__EN 		0x08
76012771d8Swdenk #define DOC_TOGGLE_BIT 		0x04
77012771d8Swdenk #define DOC_ECC_RESV 		0x02
78012771d8Swdenk #define DOC_ECC_IGNORE		0x01
79012771d8Swdenk 
80012771d8Swdenk /* We have to also set the reserved bit 1 for enable */
81012771d8Swdenk #define DOC_ECC_EN (DOC_ECC__EN | DOC_ECC_RESV)
82012771d8Swdenk #define DOC_ECC_DIS (DOC_ECC_RESV)
83012771d8Swdenk 
84012771d8Swdenk #define MAX_FLOORS 4
85012771d8Swdenk #define MAX_CHIPS 4
86012771d8Swdenk 
87012771d8Swdenk #define MAX_FLOORS_MIL 4
88012771d8Swdenk #define MAX_CHIPS_MIL 1
89012771d8Swdenk 
90012771d8Swdenk #define ADDR_COLUMN 1
91012771d8Swdenk #define ADDR_PAGE 2
92012771d8Swdenk #define ADDR_COLUMN_PAGE 3
93012771d8Swdenk 
94*2fc000d7SMarian Balakowicz struct Nand {
95*2fc000d7SMarian Balakowicz 	char floor, chip;
96*2fc000d7SMarian Balakowicz 	unsigned long curadr;
97*2fc000d7SMarian Balakowicz 	unsigned char curmode;
98*2fc000d7SMarian Balakowicz 	/* Also some erase/write/pipeline info when we get that far */
99*2fc000d7SMarian Balakowicz };
100*2fc000d7SMarian Balakowicz 
101012771d8Swdenk struct DiskOnChip {
102012771d8Swdenk 	unsigned long physadr;
103012771d8Swdenk 	unsigned long virtadr;
104012771d8Swdenk 	unsigned long totlen;
105012771d8Swdenk 	char* name;
106012771d8Swdenk 	char ChipID; /* Type of DiskOnChip */
107012771d8Swdenk 	int ioreg;
108012771d8Swdenk 
109012771d8Swdenk 	char* chips_name;
110012771d8Swdenk 	unsigned long mfr; /* Flash IDs - only one type of flash per device */
111012771d8Swdenk 	unsigned long id;
112012771d8Swdenk 	int chipshift;
113012771d8Swdenk 	char page256;
114012771d8Swdenk 	char pageadrlen;
115012771d8Swdenk 	unsigned long erasesize;
116012771d8Swdenk 
117012771d8Swdenk 	int curfloor;
118012771d8Swdenk 	int curchip;
119012771d8Swdenk 
120012771d8Swdenk 	int numchips;
121012771d8Swdenk 	struct Nand *chips;
122012771d8Swdenk 
123012771d8Swdenk 	int nftl_found;
124012771d8Swdenk 	struct NFTLrecord nftl;
125012771d8Swdenk };
126012771d8Swdenk 
127012771d8Swdenk #define SECTORSIZE 512
128012771d8Swdenk 
129012771d8Swdenk /* Return codes from doc_write(), doc_read(), and doc_erase().
130012771d8Swdenk  */
131012771d8Swdenk #define DOC_OK		0
132012771d8Swdenk #define DOC_EIO		1
133012771d8Swdenk #define DOC_EINVAL	2
134012771d8Swdenk #define DOC_EECC	3
135012771d8Swdenk #define DOC_ETIMEOUT	4
136012771d8Swdenk 
137012771d8Swdenk /*
138012771d8Swdenk  * Function Prototypes
139012771d8Swdenk  */
140012771d8Swdenk int doc_decode_ecc(unsigned char sector[512], unsigned char ecc1[6]);
141012771d8Swdenk 
142012771d8Swdenk int doc_rw(struct DiskOnChip* this, int cmd, loff_t from, size_t len,
143012771d8Swdenk 	   size_t *retlen, u_char *buf);
144012771d8Swdenk int doc_read_ecc(struct DiskOnChip* this, loff_t from, size_t len,
145012771d8Swdenk 		 size_t *retlen, u_char *buf, u_char *eccbuf);
146012771d8Swdenk int doc_write_ecc(struct DiskOnChip* this, loff_t to, size_t len,
147012771d8Swdenk 		  size_t *retlen, const u_char *buf, u_char *eccbuf);
148012771d8Swdenk int doc_read_oob(struct DiskOnChip* this, loff_t ofs, size_t len,
149012771d8Swdenk 		 size_t *retlen, u_char *buf);
150012771d8Swdenk int doc_write_oob(struct DiskOnChip* this, loff_t ofs, size_t len,
151012771d8Swdenk 		  size_t *retlen, const u_char *buf);
152012771d8Swdenk int doc_erase (struct DiskOnChip* this, loff_t ofs, size_t len);
153012771d8Swdenk 
154012771d8Swdenk void doc_probe(unsigned long physadr);
155012771d8Swdenk 
156012771d8Swdenk void doc_print(struct DiskOnChip*);
157012771d8Swdenk 
158*2fc000d7SMarian Balakowicz /*
159*2fc000d7SMarian Balakowicz  * Standard NAND flash commands
160*2fc000d7SMarian Balakowicz  */
161*2fc000d7SMarian Balakowicz #define NAND_CMD_READ0		0
162*2fc000d7SMarian Balakowicz #define NAND_CMD_READ1		1
163*2fc000d7SMarian Balakowicz #define NAND_CMD_PAGEPROG	0x10
164*2fc000d7SMarian Balakowicz #define NAND_CMD_READOOB	0x50
165*2fc000d7SMarian Balakowicz #define NAND_CMD_ERASE1		0x60
166*2fc000d7SMarian Balakowicz #define NAND_CMD_STATUS		0x70
167*2fc000d7SMarian Balakowicz #define NAND_CMD_SEQIN		0x80
168*2fc000d7SMarian Balakowicz #define NAND_CMD_READID		0x90
169*2fc000d7SMarian Balakowicz #define NAND_CMD_ERASE2		0xd0
170*2fc000d7SMarian Balakowicz #define NAND_CMD_RESET		0xff
171*2fc000d7SMarian Balakowicz 
172*2fc000d7SMarian Balakowicz /*
173*2fc000d7SMarian Balakowicz  * NAND Flash Manufacturer ID Codes
174*2fc000d7SMarian Balakowicz  */
175*2fc000d7SMarian Balakowicz #define NAND_MFR_TOSHIBA	0x98
176*2fc000d7SMarian Balakowicz #define NAND_MFR_SAMSUNG	0xec
177*2fc000d7SMarian Balakowicz 
178*2fc000d7SMarian Balakowicz /*
179*2fc000d7SMarian Balakowicz  * NAND Flash Device ID Structure
180*2fc000d7SMarian Balakowicz  *
181*2fc000d7SMarian Balakowicz  * Structure overview:
182*2fc000d7SMarian Balakowicz  *
183*2fc000d7SMarian Balakowicz  *  name - Complete name of device
184*2fc000d7SMarian Balakowicz  *
185*2fc000d7SMarian Balakowicz  *  manufacture_id - manufacturer ID code of device.
186*2fc000d7SMarian Balakowicz  *
187*2fc000d7SMarian Balakowicz  *  model_id - model ID code of device.
188*2fc000d7SMarian Balakowicz  *
189*2fc000d7SMarian Balakowicz  *  chipshift - total number of address bits for the device which
190*2fc000d7SMarian Balakowicz  *              is used to calculate address offsets and the total
191*2fc000d7SMarian Balakowicz  *              number of bytes the device is capable of.
192*2fc000d7SMarian Balakowicz  *
193*2fc000d7SMarian Balakowicz  *  page256 - denotes if flash device has 256 byte pages or not.
194*2fc000d7SMarian Balakowicz  *
195*2fc000d7SMarian Balakowicz  *  pageadrlen - number of bytes minus one needed to hold the
196*2fc000d7SMarian Balakowicz  *               complete address into the flash array. Keep in
197*2fc000d7SMarian Balakowicz  *               mind that when a read or write is done to a
198*2fc000d7SMarian Balakowicz  *               specific address, the address is input serially
199*2fc000d7SMarian Balakowicz  *               8 bits at a time. This structure member is used
200*2fc000d7SMarian Balakowicz  *               by the read/write routines as a loop index for
201*2fc000d7SMarian Balakowicz  *               shifting the address out 8 bits at a time.
202*2fc000d7SMarian Balakowicz  *
203*2fc000d7SMarian Balakowicz  *  erasesize - size of an erase block in the flash device.
204*2fc000d7SMarian Balakowicz  */
205*2fc000d7SMarian Balakowicz struct nand_flash_dev {
206*2fc000d7SMarian Balakowicz 	char * name;
207*2fc000d7SMarian Balakowicz 	int manufacture_id;
208*2fc000d7SMarian Balakowicz 	int model_id;
209*2fc000d7SMarian Balakowicz 	int chipshift;
210*2fc000d7SMarian Balakowicz 	char page256;
211*2fc000d7SMarian Balakowicz 	char pageadrlen;
212*2fc000d7SMarian Balakowicz 	unsigned long erasesize;
213*2fc000d7SMarian Balakowicz 	int bus16;
214*2fc000d7SMarian Balakowicz };
215*2fc000d7SMarian Balakowicz 
216012771d8Swdenk #endif /* __MTD_DOC2000_H__ */
217