Fix common misspellings
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / mtd / nand / diskonchip.c
CommitLineData
61b03bd7 1/*
1da177e4
LT
2 * drivers/mtd/nand/diskonchip.c
3 *
4 * (C) 2003 Red Hat, Inc.
5 * (C) 2004 Dan Brown <dan_brown@ieee.org>
6 * (C) 2004 Kalev Lember <kalev@smartlink.ee>
7 *
8 * Author: David Woodhouse <dwmw2@infradead.org>
9 * Additional Diskonchip 2000 and Millennium support by Dan Brown <dan_brown@ieee.org>
10 * Diskonchip Millennium Plus support by Kalev Lember <kalev@smartlink.ee>
61b03bd7 11 *
1da177e4 12 * Error correction code lifted from the old docecc code
61b03bd7 13 * Author: Fabrice Bellard (fabrice.bellard@netgem.com)
1da177e4
LT
14 * Copyright (C) 2000 Netgem S.A.
15 * converted to the generic Reed-Solomon library by Thomas Gleixner <tglx@linutronix.de>
61b03bd7 16 *
1da177e4 17 * Interface to generic NAND code for M-Systems DiskOnChip devices
1da177e4
LT
18 */
19
20#include <linux/kernel.h>
21#include <linux/init.h>
22#include <linux/sched.h>
23#include <linux/delay.h>
24#include <linux/rslib.h>
25#include <linux/moduleparam.h>
5a0e3ad6 26#include <linux/slab.h>
1da177e4
LT
27#include <asm/io.h>
28
29#include <linux/mtd/mtd.h>
30#include <linux/mtd/nand.h>
31#include <linux/mtd/doc2000.h>
1da177e4
LT
32#include <linux/mtd/partitions.h>
33#include <linux/mtd/inftl.h>
34
35/* Where to look for the devices? */
651078ba
TG
36#ifndef CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS
37#define CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS 0
1da177e4
LT
38#endif
39
40static unsigned long __initdata doc_locations[] = {
41#if defined (__alpha__) || defined(__i386__) || defined(__x86_64__)
651078ba 42#ifdef CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH
61b03bd7 43 0xfffc8000, 0xfffca000, 0xfffcc000, 0xfffce000,
1da177e4 44 0xfffd0000, 0xfffd2000, 0xfffd4000, 0xfffd6000,
61b03bd7
TG
45 0xfffd8000, 0xfffda000, 0xfffdc000, 0xfffde000,
46 0xfffe0000, 0xfffe2000, 0xfffe4000, 0xfffe6000,
1da177e4
LT
47 0xfffe8000, 0xfffea000, 0xfffec000, 0xfffee000,
48#else /* CONFIG_MTD_DOCPROBE_HIGH */
61b03bd7 49 0xc8000, 0xca000, 0xcc000, 0xce000,
1da177e4 50 0xd0000, 0xd2000, 0xd4000, 0xd6000,
61b03bd7
TG
51 0xd8000, 0xda000, 0xdc000, 0xde000,
52 0xe0000, 0xe2000, 0xe4000, 0xe6000,
1da177e4
LT
53 0xe8000, 0xea000, 0xec000, 0xee000,
54#endif /* CONFIG_MTD_DOCPROBE_HIGH */
e0c7d767 55#else
1da177e4
LT
56#warning Unknown architecture for DiskOnChip. No default probe locations defined
57#endif
58 0xffffffff };
59
60static struct mtd_info *doclist = NULL;
61
62struct doc_priv {
63 void __iomem *virtadr;
64 unsigned long physadr;
65 u_char ChipID;
66 u_char CDSNControl;
e0c7d767 67 int chips_per_floor; /* The number of chips detected on each floor */
1da177e4
LT
68 int curfloor;
69 int curchip;
70 int mh0_page;
71 int mh1_page;
72 struct mtd_info *nextdoc;
73};
74
1da177e4
LT
75/* This is the syndrome computed by the HW ecc generator upon reading an empty
76 page, one with all 0xff for data and stored ecc code. */
77static u_char empty_read_syndrome[6] = { 0x26, 0xff, 0x6d, 0x47, 0x73, 0x7a };
e0c7d767 78
1da177e4
LT
79/* This is the ecc value computed by the HW ecc generator upon writing an empty
80 page, one with all 0xff for data. */
81static u_char empty_write_ecc[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 };
82
83#define INFTL_BBT_RESERVED_BLOCKS 4
84
85#define DoC_is_MillenniumPlus(doc) ((doc)->ChipID == DOC_ChipID_DocMilPlus16 || (doc)->ChipID == DOC_ChipID_DocMilPlus32)
86#define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)
87#define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)
88
7abd3ef9
TG
89static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd,
90 unsigned int bitmask);
1da177e4
LT
91static void doc200x_select_chip(struct mtd_info *mtd, int chip);
92
e0c7d767 93static int debug = 0;
1da177e4
LT
94module_param(debug, int, 0);
95
e0c7d767 96static int try_dword = 1;
1da177e4
LT
97module_param(try_dword, int, 0);
98
e0c7d767 99static int no_ecc_failures = 0;
1da177e4
LT
100module_param(no_ecc_failures, int, 0);
101
e0c7d767 102static int no_autopart = 0;
1da177e4 103module_param(no_autopart, int, 0);
1a78ff6b 104
e0c7d767 105static int show_firmware_partition = 0;
1a78ff6b 106module_param(show_firmware_partition, int, 0);
1da177e4 107
89e2bf61 108#ifdef CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE
e0c7d767 109static int inftl_bbt_write = 1;
1da177e4 110#else
e0c7d767 111static int inftl_bbt_write = 0;
1da177e4
LT
112#endif
113module_param(inftl_bbt_write, int, 0);
114
651078ba 115static unsigned long doc_config_location = CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS;
1da177e4
LT
116module_param(doc_config_location, ulong, 0);
117MODULE_PARM_DESC(doc_config_location, "Physical memory address at which to probe for DiskOnChip");
118
1da177e4
LT
119/* Sector size for HW ECC */
120#define SECTOR_SIZE 512
121/* The sector bytes are packed into NB_DATA 10 bit words */
122#define NB_DATA (((SECTOR_SIZE + 1) * 8 + 6) / 10)
123/* Number of roots */
124#define NROOTS 4
125/* First consective root */
126#define FCR 510
127/* Number of symbols */
128#define NN 1023
129
130/* the Reed Solomon control structure */
131static struct rs_control *rs_decoder;
132
61b03bd7 133/*
1da177e4
LT
134 * The HW decoder in the DoC ASIC's provides us a error syndrome,
135 * which we must convert to a standard syndrom usable by the generic
136 * Reed-Solomon library code.
137 *
138 * Fabrice Bellard figured this out in the old docecc code. I added
139 * some comments, improved a minor bit and converted it to make use
25985edc 140 * of the generic Reed-Solomon library. tglx
1da177e4 141 */
e0c7d767 142static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
1da177e4
LT
143{
144 int i, j, nerr, errpos[8];
145 uint8_t parity;
146 uint16_t ds[4], s[5], tmp, errval[8], syn[4];
147
c9fb6773 148 memset(syn, 0, sizeof(syn));
1da177e4
LT
149 /* Convert the ecc bytes into words */
150 ds[0] = ((ecc[4] & 0xff) >> 0) | ((ecc[5] & 0x03) << 8);
151 ds[1] = ((ecc[5] & 0xfc) >> 2) | ((ecc[2] & 0x0f) << 6);
152 ds[2] = ((ecc[2] & 0xf0) >> 4) | ((ecc[3] & 0x3f) << 4);
153 ds[3] = ((ecc[3] & 0xc0) >> 6) | ((ecc[0] & 0xff) << 2);
154 parity = ecc[1];
155
156 /* Initialize the syndrom buffer */
157 for (i = 0; i < NROOTS; i++)
158 s[i] = ds[0];
61b03bd7
TG
159 /*
160 * Evaluate
1da177e4
LT
161 * s[i] = ds[3]x^3 + ds[2]x^2 + ds[1]x^1 + ds[0]
162 * where x = alpha^(FCR + i)
163 */
e0c7d767
DW
164 for (j = 1; j < NROOTS; j++) {
165 if (ds[j] == 0)
1da177e4
LT
166 continue;
167 tmp = rs->index_of[ds[j]];
e0c7d767 168 for (i = 0; i < NROOTS; i++)
1da177e4
LT
169 s[i] ^= rs->alpha_to[rs_modnn(rs, tmp + (FCR + i) * j)];
170 }
171
c9fb6773 172 /* Calc syn[i] = s[i] / alpha^(v + i) */
1da177e4 173 for (i = 0; i < NROOTS; i++) {
c9fb6773 174 if (s[i])
e0c7d767 175 syn[i] = rs_modnn(rs, rs->index_of[s[i]] + (NN - FCR - i));
1da177e4
LT
176 }
177 /* Call the decoder library */
178 nerr = decode_rs16(rs, NULL, NULL, 1019, syn, 0, errpos, 0, errval);
179
180 /* Incorrectable errors ? */
181 if (nerr < 0)
182 return nerr;
183
61b03bd7 184 /*
1da177e4
LT
185 * Correct the errors. The bitpositions are a bit of magic,
186 * but they are given by the design of the de/encoder circuit
187 * in the DoC ASIC's.
188 */
e0c7d767 189 for (i = 0; i < nerr; i++) {
1da177e4
LT
190 int index, bitpos, pos = 1015 - errpos[i];
191 uint8_t val;
192 if (pos >= NB_DATA && pos < 1019)
193 continue;
194 if (pos < NB_DATA) {
195 /* extract bit position (MSB first) */
196 pos = 10 * (NB_DATA - 1 - pos) - 6;
197 /* now correct the following 10 bits. At most two bytes
198 can be modified since pos is even */
199 index = (pos >> 3) ^ 1;
200 bitpos = pos & 7;
e0c7d767 201 if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) {
1da177e4
LT
202 val = (uint8_t) (errval[i] >> (2 + bitpos));
203 parity ^= val;
204 if (index < SECTOR_SIZE)
205 data[index] ^= val;
206 }
207 index = ((pos >> 3) + 1) ^ 1;
208 bitpos = (bitpos + 10) & 7;
209 if (bitpos == 0)
210 bitpos = 8;
e0c7d767
DW
211 if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) {
212 val = (uint8_t) (errval[i] << (8 - bitpos));
1da177e4
LT
213 parity ^= val;
214 if (index < SECTOR_SIZE)
215 data[index] ^= val;
216 }
217 }
218 }
219 /* If the parity is wrong, no rescue possible */
eb684507 220 return parity ? -EBADMSG : nerr;
1da177e4
LT
221}
222
223static void DoC_Delay(struct doc_priv *doc, unsigned short cycles)
224{
225 volatile char dummy;
226 int i;
61b03bd7 227
1da177e4
LT
228 for (i = 0; i < cycles; i++) {
229 if (DoC_is_Millennium(doc))
230 dummy = ReadDOC(doc->virtadr, NOP);
231 else if (DoC_is_MillenniumPlus(doc))
232 dummy = ReadDOC(doc->virtadr, Mplus_NOP);
233 else
234 dummy = ReadDOC(doc->virtadr, DOCStatus);
235 }
61b03bd7 236
1da177e4
LT
237}
238
239#define CDSN_CTRL_FR_B_MASK (CDSN_CTRL_FR_B0 | CDSN_CTRL_FR_B1)
240
241/* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */
242static int _DoC_WaitReady(struct doc_priv *doc)
243{
e0c7d767 244 void __iomem *docptr = doc->virtadr;
1da177e4
LT
245 unsigned long timeo = jiffies + (HZ * 10);
246
e0c7d767
DW
247 if (debug)
248 printk("_DoC_WaitReady...\n");
1da177e4
LT
249 /* Out-of-line routine to wait for chip response */
250 if (DoC_is_MillenniumPlus(doc)) {
251 while ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) {
252 if (time_after(jiffies, timeo)) {
253 printk("_DoC_WaitReady timed out.\n");
254 return -EIO;
255 }
256 udelay(1);
257 cond_resched();
258 }
259 } else {
260 while (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) {
261 if (time_after(jiffies, timeo)) {
262 printk("_DoC_WaitReady timed out.\n");
263 return -EIO;
264 }
265 udelay(1);
266 cond_resched();
267 }
268 }
269
270 return 0;
271}
272
273static inline int DoC_WaitReady(struct doc_priv *doc)
274{
e0c7d767 275 void __iomem *docptr = doc->virtadr;
1da177e4
LT
276 int ret = 0;
277
278 if (DoC_is_MillenniumPlus(doc)) {
279 DoC_Delay(doc, 4);
280
281 if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK)
282 /* Call the out-of-line routine to wait */
283 ret = _DoC_WaitReady(doc);
284 } else {
285 DoC_Delay(doc, 4);
286
287 if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B))
288 /* Call the out-of-line routine to wait */
289 ret = _DoC_WaitReady(doc);
290 DoC_Delay(doc, 2);
291 }
292
e0c7d767
DW
293 if (debug)
294 printk("DoC_WaitReady OK\n");
1da177e4
LT
295 return ret;
296}
297
298static void doc2000_write_byte(struct mtd_info *mtd, u_char datum)
299{
300 struct nand_chip *this = mtd->priv;
301 struct doc_priv *doc = this->priv;
e0c7d767 302 void __iomem *docptr = doc->virtadr;
1da177e4 303
e0c7d767
DW
304 if (debug)
305 printk("write_byte %02x\n", datum);
1da177e4
LT
306 WriteDOC(datum, docptr, CDSNSlowIO);
307 WriteDOC(datum, docptr, 2k_CDSN_IO);
308}
309
310static u_char doc2000_read_byte(struct mtd_info *mtd)
311{
312 struct nand_chip *this = mtd->priv;
313 struct doc_priv *doc = this->priv;
e0c7d767 314 void __iomem *docptr = doc->virtadr;
1da177e4
LT
315 u_char ret;
316
317 ReadDOC(docptr, CDSNSlowIO);
318 DoC_Delay(doc, 2);
319 ret = ReadDOC(docptr, 2k_CDSN_IO);
e0c7d767
DW
320 if (debug)
321 printk("read_byte returns %02x\n", ret);
1da177e4
LT
322 return ret;
323}
324
e0c7d767 325static void doc2000_writebuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
326{
327 struct nand_chip *this = mtd->priv;
328 struct doc_priv *doc = this->priv;
e0c7d767 329 void __iomem *docptr = doc->virtadr;
1da177e4 330 int i;
e0c7d767
DW
331 if (debug)
332 printk("writebuf of %d bytes: ", len);
333 for (i = 0; i < len; i++) {
1da177e4
LT
334 WriteDOC_(buf[i], docptr, DoC_2k_CDSN_IO + i);
335 if (debug && i < 16)
336 printk("%02x ", buf[i]);
337 }
e0c7d767
DW
338 if (debug)
339 printk("\n");
1da177e4
LT
340}
341
e0c7d767 342static void doc2000_readbuf(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
343{
344 struct nand_chip *this = mtd->priv;
345 struct doc_priv *doc = this->priv;
e0c7d767
DW
346 void __iomem *docptr = doc->virtadr;
347 int i;
1da177e4 348
e0c7d767
DW
349 if (debug)
350 printk("readbuf of %d bytes: ", len);
1da177e4 351
e0c7d767 352 for (i = 0; i < len; i++) {
1da177e4
LT
353 buf[i] = ReadDOC(docptr, 2k_CDSN_IO + i);
354 }
355}
356
e0c7d767 357static void doc2000_readbuf_dword(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
358{
359 struct nand_chip *this = mtd->priv;
360 struct doc_priv *doc = this->priv;
e0c7d767
DW
361 void __iomem *docptr = doc->virtadr;
362 int i;
1da177e4 363
e0c7d767
DW
364 if (debug)
365 printk("readbuf_dword of %d bytes: ", len);
1da177e4 366
e0c7d767
DW
367 if (unlikely((((unsigned long)buf) | len) & 3)) {
368 for (i = 0; i < len; i++) {
369 *(uint8_t *) (&buf[i]) = ReadDOC(docptr, 2k_CDSN_IO + i);
1da177e4
LT
370 }
371 } else {
e0c7d767
DW
372 for (i = 0; i < len; i += 4) {
373 *(uint32_t *) (&buf[i]) = readl(docptr + DoC_2k_CDSN_IO + i);
1da177e4
LT
374 }
375 }
376}
377
e0c7d767 378static int doc2000_verifybuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
379{
380 struct nand_chip *this = mtd->priv;
381 struct doc_priv *doc = this->priv;
e0c7d767 382 void __iomem *docptr = doc->virtadr;
1da177e4
LT
383 int i;
384
e0c7d767 385 for (i = 0; i < len; i++)
1da177e4
LT
386 if (buf[i] != ReadDOC(docptr, 2k_CDSN_IO))
387 return -EFAULT;
388 return 0;
389}
390
391static uint16_t __init doc200x_ident_chip(struct mtd_info *mtd, int nr)
392{
393 struct nand_chip *this = mtd->priv;
394 struct doc_priv *doc = this->priv;
395 uint16_t ret;
396
397 doc200x_select_chip(mtd, nr);
7abd3ef9
TG
398 doc200x_hwcontrol(mtd, NAND_CMD_READID,
399 NAND_CTRL_CLE | NAND_CTRL_CHANGE);
400 doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE);
401 doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
61b03bd7 402
25985edc 403 /* We can't' use dev_ready here, but at least we wait for the
61b03bd7 404 * command to complete
dfd61294
TG
405 */
406 udelay(50);
61b03bd7 407
1da177e4
LT
408 ret = this->read_byte(mtd) << 8;
409 ret |= this->read_byte(mtd);
410
411 if (doc->ChipID == DOC_ChipID_Doc2k && try_dword && !nr) {
412 /* First chip probe. See if we get same results by 32-bit access */
413 union {
414 uint32_t dword;
415 uint8_t byte[4];
416 } ident;
417 void __iomem *docptr = doc->virtadr;
418
7abd3ef9
TG
419 doc200x_hwcontrol(mtd, NAND_CMD_READID,
420 NAND_CTRL_CLE | NAND_CTRL_CHANGE);
421 doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE);
422 doc200x_hwcontrol(mtd, NAND_CMD_NONE,
423 NAND_NCE | NAND_CTRL_CHANGE);
1da177e4 424
dfd61294
TG
425 udelay(50);
426
1da177e4
LT
427 ident.dword = readl(docptr + DoC_2k_CDSN_IO);
428 if (((ident.byte[0] << 8) | ident.byte[1]) == ret) {
429 printk(KERN_INFO "DiskOnChip 2000 responds to DWORD access\n");
430 this->read_buf = &doc2000_readbuf_dword;
431 }
432 }
61b03bd7 433
1da177e4
LT
434 return ret;
435}
436
437static void __init doc2000_count_chips(struct mtd_info *mtd)
438{
439 struct nand_chip *this = mtd->priv;
440 struct doc_priv *doc = this->priv;
441 uint16_t mfrid;
442 int i;
443
444 /* Max 4 chips per floor on DiskOnChip 2000 */
445 doc->chips_per_floor = 4;
446
447 /* Find out what the first chip is */
448 mfrid = doc200x_ident_chip(mtd, 0);
449
450 /* Find how many chips in each floor. */
451 for (i = 1; i < 4; i++) {
452 if (doc200x_ident_chip(mtd, i) != mfrid)
453 break;
454 }
455 doc->chips_per_floor = i;
456 printk(KERN_DEBUG "Detected %d chips per floor.\n", i);
457}
458
7bc3312b 459static int doc200x_wait(struct mtd_info *mtd, struct nand_chip *this)
1da177e4
LT
460{
461 struct doc_priv *doc = this->priv;
462
463 int status;
61b03bd7 464
1da177e4
LT
465 DoC_WaitReady(doc);
466 this->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
467 DoC_WaitReady(doc);
468 status = (int)this->read_byte(mtd);
469
470 return status;
471}
472
473static void doc2001_write_byte(struct mtd_info *mtd, u_char datum)
474{
475 struct nand_chip *this = mtd->priv;
476 struct doc_priv *doc = this->priv;
e0c7d767 477 void __iomem *docptr = doc->virtadr;
1da177e4
LT
478
479 WriteDOC(datum, docptr, CDSNSlowIO);
480 WriteDOC(datum, docptr, Mil_CDSN_IO);
481 WriteDOC(datum, docptr, WritePipeTerm);
482}
483
484static u_char doc2001_read_byte(struct mtd_info *mtd)
485{
486 struct nand_chip *this = mtd->priv;
487 struct doc_priv *doc = this->priv;
e0c7d767 488 void __iomem *docptr = doc->virtadr;
1da177e4
LT
489
490 //ReadDOC(docptr, CDSNSlowIO);
491 /* 11.4.5 -- delay twice to allow extended length cycle */
492 DoC_Delay(doc, 2);
493 ReadDOC(docptr, ReadPipeInit);
494 //return ReadDOC(docptr, Mil_CDSN_IO);
495 return ReadDOC(docptr, LastDataRead);
496}
497
e0c7d767 498static void doc2001_writebuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
499{
500 struct nand_chip *this = mtd->priv;
501 struct doc_priv *doc = this->priv;
e0c7d767 502 void __iomem *docptr = doc->virtadr;
1da177e4
LT
503 int i;
504
e0c7d767 505 for (i = 0; i < len; i++)
1da177e4
LT
506 WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i);
507 /* Terminate write pipeline */
508 WriteDOC(0x00, docptr, WritePipeTerm);
509}
510
e0c7d767 511static void doc2001_readbuf(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
512{
513 struct nand_chip *this = mtd->priv;
514 struct doc_priv *doc = this->priv;
e0c7d767 515 void __iomem *docptr = doc->virtadr;
1da177e4
LT
516 int i;
517
518 /* Start read pipeline */
519 ReadDOC(docptr, ReadPipeInit);
520
e0c7d767 521 for (i = 0; i < len - 1; i++)
1da177e4
LT
522 buf[i] = ReadDOC(docptr, Mil_CDSN_IO + (i & 0xff));
523
524 /* Terminate read pipeline */
525 buf[i] = ReadDOC(docptr, LastDataRead);
526}
527
e0c7d767 528static int doc2001_verifybuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
529{
530 struct nand_chip *this = mtd->priv;
531 struct doc_priv *doc = this->priv;
e0c7d767 532 void __iomem *docptr = doc->virtadr;
1da177e4
LT
533 int i;
534
535 /* Start read pipeline */
536 ReadDOC(docptr, ReadPipeInit);
537
e0c7d767 538 for (i = 0; i < len - 1; i++)
1da177e4
LT
539 if (buf[i] != ReadDOC(docptr, Mil_CDSN_IO)) {
540 ReadDOC(docptr, LastDataRead);
541 return i;
542 }
543 if (buf[i] != ReadDOC(docptr, LastDataRead))
544 return i;
545 return 0;
546}
547
548static u_char doc2001plus_read_byte(struct mtd_info *mtd)
549{
550 struct nand_chip *this = mtd->priv;
551 struct doc_priv *doc = this->priv;
e0c7d767 552 void __iomem *docptr = doc->virtadr;
1da177e4
LT
553 u_char ret;
554
e0c7d767
DW
555 ReadDOC(docptr, Mplus_ReadPipeInit);
556 ReadDOC(docptr, Mplus_ReadPipeInit);
557 ret = ReadDOC(docptr, Mplus_LastDataRead);
558 if (debug)
559 printk("read_byte returns %02x\n", ret);
1da177e4
LT
560 return ret;
561}
562
e0c7d767 563static void doc2001plus_writebuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
564{
565 struct nand_chip *this = mtd->priv;
566 struct doc_priv *doc = this->priv;
e0c7d767 567 void __iomem *docptr = doc->virtadr;
1da177e4
LT
568 int i;
569
e0c7d767
DW
570 if (debug)
571 printk("writebuf of %d bytes: ", len);
572 for (i = 0; i < len; i++) {
1da177e4
LT
573 WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i);
574 if (debug && i < 16)
575 printk("%02x ", buf[i]);
576 }
e0c7d767
DW
577 if (debug)
578 printk("\n");
1da177e4
LT
579}
580
e0c7d767 581static void doc2001plus_readbuf(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
582{
583 struct nand_chip *this = mtd->priv;
584 struct doc_priv *doc = this->priv;
e0c7d767 585 void __iomem *docptr = doc->virtadr;
1da177e4
LT
586 int i;
587
e0c7d767
DW
588 if (debug)
589 printk("readbuf of %d bytes: ", len);
1da177e4
LT
590
591 /* Start read pipeline */
592 ReadDOC(docptr, Mplus_ReadPipeInit);
593 ReadDOC(docptr, Mplus_ReadPipeInit);
594
e0c7d767 595 for (i = 0; i < len - 2; i++) {
1da177e4
LT
596 buf[i] = ReadDOC(docptr, Mil_CDSN_IO);
597 if (debug && i < 16)
598 printk("%02x ", buf[i]);
599 }
600
601 /* Terminate read pipeline */
e0c7d767 602 buf[len - 2] = ReadDOC(docptr, Mplus_LastDataRead);
1da177e4 603 if (debug && i < 16)
e0c7d767
DW
604 printk("%02x ", buf[len - 2]);
605 buf[len - 1] = ReadDOC(docptr, Mplus_LastDataRead);
1da177e4 606 if (debug && i < 16)
e0c7d767
DW
607 printk("%02x ", buf[len - 1]);
608 if (debug)
609 printk("\n");
1da177e4
LT
610}
611
e0c7d767 612static int doc2001plus_verifybuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
613{
614 struct nand_chip *this = mtd->priv;
615 struct doc_priv *doc = this->priv;
e0c7d767 616 void __iomem *docptr = doc->virtadr;
1da177e4
LT
617 int i;
618
e0c7d767
DW
619 if (debug)
620 printk("verifybuf of %d bytes: ", len);
1da177e4
LT
621
622 /* Start read pipeline */
623 ReadDOC(docptr, Mplus_ReadPipeInit);
624 ReadDOC(docptr, Mplus_ReadPipeInit);
625
e0c7d767 626 for (i = 0; i < len - 2; i++)
1da177e4
LT
627 if (buf[i] != ReadDOC(docptr, Mil_CDSN_IO)) {
628 ReadDOC(docptr, Mplus_LastDataRead);
629 ReadDOC(docptr, Mplus_LastDataRead);
630 return i;
631 }
e0c7d767
DW
632 if (buf[len - 2] != ReadDOC(docptr, Mplus_LastDataRead))
633 return len - 2;
634 if (buf[len - 1] != ReadDOC(docptr, Mplus_LastDataRead))
635 return len - 1;
1da177e4
LT
636 return 0;
637}
638
639static void doc2001plus_select_chip(struct mtd_info *mtd, int chip)
640{
641 struct nand_chip *this = mtd->priv;
642 struct doc_priv *doc = this->priv;
e0c7d767 643 void __iomem *docptr = doc->virtadr;
1da177e4
LT
644 int floor = 0;
645
e0c7d767
DW
646 if (debug)
647 printk("select chip (%d)\n", chip);
1da177e4
LT
648
649 if (chip == -1) {
650 /* Disable flash internally */
651 WriteDOC(0, docptr, Mplus_FlashSelect);
652 return;
653 }
654
655 floor = chip / doc->chips_per_floor;
e0c7d767 656 chip -= (floor * doc->chips_per_floor);
1da177e4
LT
657
658 /* Assert ChipEnable and deassert WriteProtect */
659 WriteDOC((DOC_FLASH_CE), docptr, Mplus_FlashSelect);
660 this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
661
662 doc->curchip = chip;
663 doc->curfloor = floor;
664}
665
666static void doc200x_select_chip(struct mtd_info *mtd, int chip)
667{
668 struct nand_chip *this = mtd->priv;
669 struct doc_priv *doc = this->priv;
e0c7d767 670 void __iomem *docptr = doc->virtadr;
1da177e4
LT
671 int floor = 0;
672
e0c7d767
DW
673 if (debug)
674 printk("select chip (%d)\n", chip);
1da177e4
LT
675
676 if (chip == -1)
677 return;
678
679 floor = chip / doc->chips_per_floor;
e0c7d767 680 chip -= (floor * doc->chips_per_floor);
1da177e4
LT
681
682 /* 11.4.4 -- deassert CE before changing chip */
7abd3ef9 683 doc200x_hwcontrol(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
1da177e4
LT
684
685 WriteDOC(floor, docptr, FloorSelect);
686 WriteDOC(chip, docptr, CDSNDeviceSelect);
687
7abd3ef9 688 doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
1da177e4
LT
689
690 doc->curchip = chip;
691 doc->curfloor = floor;
692}
693
7abd3ef9
TG
694#define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE)
695
696static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd,
697 unsigned int ctrl)
1da177e4
LT
698{
699 struct nand_chip *this = mtd->priv;
700 struct doc_priv *doc = this->priv;
e0c7d767 701 void __iomem *docptr = doc->virtadr;
1da177e4 702
7abd3ef9
TG
703 if (ctrl & NAND_CTRL_CHANGE) {
704 doc->CDSNControl &= ~CDSN_CTRL_MSK;
705 doc->CDSNControl |= ctrl & CDSN_CTRL_MSK;
706 if (debug)
707 printk("hwcontrol(%d): %02x\n", cmd, doc->CDSNControl);
708 WriteDOC(doc->CDSNControl, docptr, CDSNControl);
709 /* 11.4.3 -- 4 NOPs after CSDNControl write */
710 DoC_Delay(doc, 4);
1da177e4 711 }
cad74f2c
TG
712 if (cmd != NAND_CMD_NONE) {
713 if (DoC_is_2000(doc))
714 doc2000_write_byte(mtd, cmd);
715 else
716 doc2001_write_byte(mtd, cmd);
717 }
1da177e4
LT
718}
719
e0c7d767 720static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int column, int page_addr)
1da177e4
LT
721{
722 struct nand_chip *this = mtd->priv;
723 struct doc_priv *doc = this->priv;
e0c7d767 724 void __iomem *docptr = doc->virtadr;
1da177e4
LT
725
726 /*
727 * Must terminate write pipeline before sending any commands
728 * to the device.
729 */
730 if (command == NAND_CMD_PAGEPROG) {
731 WriteDOC(0x00, docptr, Mplus_WritePipeTerm);
732 WriteDOC(0x00, docptr, Mplus_WritePipeTerm);
733 }
734
735 /*
736 * Write out the command to the device.
737 */
738 if (command == NAND_CMD_SEQIN) {
739 int readcmd;
740
28318776 741 if (column >= mtd->writesize) {
1da177e4 742 /* OOB area */
28318776 743 column -= mtd->writesize;
1da177e4
LT
744 readcmd = NAND_CMD_READOOB;
745 } else if (column < 256) {
746 /* First 256 bytes --> READ0 */
747 readcmd = NAND_CMD_READ0;
748 } else {
749 column -= 256;
750 readcmd = NAND_CMD_READ1;
751 }
752 WriteDOC(readcmd, docptr, Mplus_FlashCmd);
753 }
754 WriteDOC(command, docptr, Mplus_FlashCmd);
755 WriteDOC(0, docptr, Mplus_WritePipeTerm);
756 WriteDOC(0, docptr, Mplus_WritePipeTerm);
757
758 if (column != -1 || page_addr != -1) {
759 /* Serially input address */
760 if (column != -1) {
761 /* Adjust columns for 16 bit buswidth */
762 if (this->options & NAND_BUSWIDTH_16)
763 column >>= 1;
764 WriteDOC(column, docptr, Mplus_FlashAddress);
765 }
766 if (page_addr != -1) {
e0c7d767
DW
767 WriteDOC((unsigned char)(page_addr & 0xff), docptr, Mplus_FlashAddress);
768 WriteDOC((unsigned char)((page_addr >> 8) & 0xff), docptr, Mplus_FlashAddress);
1da177e4
LT
769 /* One more address cycle for higher density devices */
770 if (this->chipsize & 0x0c000000) {
e0c7d767 771 WriteDOC((unsigned char)((page_addr >> 16) & 0x0f), docptr, Mplus_FlashAddress);
1da177e4
LT
772 printk("high density\n");
773 }
774 }
775 WriteDOC(0, docptr, Mplus_WritePipeTerm);
776 WriteDOC(0, docptr, Mplus_WritePipeTerm);
777 /* deassert ALE */
e0c7d767
DW
778 if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 ||
779 command == NAND_CMD_READOOB || command == NAND_CMD_READID)
1da177e4
LT
780 WriteDOC(0, docptr, Mplus_FlashControl);
781 }
782
61b03bd7 783 /*
1da177e4
LT
784 * program and erase have their own busy handlers
785 * status and sequential in needs no delay
e0c7d767 786 */
1da177e4
LT
787 switch (command) {
788
789 case NAND_CMD_PAGEPROG:
790 case NAND_CMD_ERASE1:
791 case NAND_CMD_ERASE2:
792 case NAND_CMD_SEQIN:
793 case NAND_CMD_STATUS:
794 return;
795
796 case NAND_CMD_RESET:
797 if (this->dev_ready)
798 break;
799 udelay(this->chip_delay);
800 WriteDOC(NAND_CMD_STATUS, docptr, Mplus_FlashCmd);
801 WriteDOC(0, docptr, Mplus_WritePipeTerm);
802 WriteDOC(0, docptr, Mplus_WritePipeTerm);
e0c7d767 803 while (!(this->read_byte(mtd) & 0x40)) ;
1da177e4
LT
804 return;
805
e0c7d767 806 /* This applies to read commands */
1da177e4 807 default:
61b03bd7 808 /*
1da177e4
LT
809 * If we don't have access to the busy pin, we apply the given
810 * command delay
e0c7d767 811 */
1da177e4 812 if (!this->dev_ready) {
e0c7d767 813 udelay(this->chip_delay);
1da177e4
LT
814 return;
815 }
816 }
817
818 /* Apply this short delay always to ensure that we do wait tWB in
819 * any case on any machine. */
e0c7d767 820 ndelay(100);
1da177e4 821 /* wait until command is processed */
e0c7d767 822 while (!this->dev_ready(mtd)) ;
1da177e4
LT
823}
824
825static int doc200x_dev_ready(struct mtd_info *mtd)
826{
827 struct nand_chip *this = mtd->priv;
828 struct doc_priv *doc = this->priv;
e0c7d767 829 void __iomem *docptr = doc->virtadr;
1da177e4
LT
830
831 if (DoC_is_MillenniumPlus(doc)) {
832 /* 11.4.2 -- must NOP four times before checking FR/B# */
833 DoC_Delay(doc, 4);
834 if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) {
e0c7d767 835 if (debug)
1da177e4
LT
836 printk("not ready\n");
837 return 0;
838 }
e0c7d767
DW
839 if (debug)
840 printk("was ready\n");
1da177e4
LT
841 return 1;
842 } else {
843 /* 11.4.2 -- must NOP four times before checking FR/B# */
844 DoC_Delay(doc, 4);
845 if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) {
e0c7d767 846 if (debug)
1da177e4
LT
847 printk("not ready\n");
848 return 0;
849 }
850 /* 11.4.2 -- Must NOP twice if it's ready */
851 DoC_Delay(doc, 2);
e0c7d767
DW
852 if (debug)
853 printk("was ready\n");
1da177e4
LT
854 return 1;
855 }
856}
857
858static int doc200x_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
859{
860 /* This is our last resort if we couldn't find or create a BBT. Just
861 pretend all blocks are good. */
862 return 0;
863}
864
865static void doc200x_enable_hwecc(struct mtd_info *mtd, int mode)
866{
867 struct nand_chip *this = mtd->priv;
868 struct doc_priv *doc = this->priv;
e0c7d767 869 void __iomem *docptr = doc->virtadr;
1da177e4
LT
870
871 /* Prime the ECC engine */
e0c7d767 872 switch (mode) {
1da177e4
LT
873 case NAND_ECC_READ:
874 WriteDOC(DOC_ECC_RESET, docptr, ECCConf);
875 WriteDOC(DOC_ECC_EN, docptr, ECCConf);
876 break;
877 case NAND_ECC_WRITE:
878 WriteDOC(DOC_ECC_RESET, docptr, ECCConf);
879 WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf);
880 break;
881 }
882}
883
884static void doc2001plus_enable_hwecc(struct mtd_info *mtd, int mode)
885{
886 struct nand_chip *this = mtd->priv;
887 struct doc_priv *doc = this->priv;
e0c7d767 888 void __iomem *docptr = doc->virtadr;
1da177e4
LT
889
890 /* Prime the ECC engine */
e0c7d767 891 switch (mode) {
1da177e4
LT
892 case NAND_ECC_READ:
893 WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf);
894 WriteDOC(DOC_ECC_EN, docptr, Mplus_ECCConf);
895 break;
896 case NAND_ECC_WRITE:
897 WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf);
898 WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, Mplus_ECCConf);
899 break;
900 }
901}
902
903/* This code is only called on write */
e0c7d767 904static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, unsigned char *ecc_code)
1da177e4
LT
905{
906 struct nand_chip *this = mtd->priv;
907 struct doc_priv *doc = this->priv;
e0c7d767 908 void __iomem *docptr = doc->virtadr;
1da177e4
LT
909 int i;
910 int emptymatch = 1;
911
912 /* flush the pipeline */
913 if (DoC_is_2000(doc)) {
914 WriteDOC(doc->CDSNControl & ~CDSN_CTRL_FLASH_IO, docptr, CDSNControl);
915 WriteDOC(0, docptr, 2k_CDSN_IO);
916 WriteDOC(0, docptr, 2k_CDSN_IO);
917 WriteDOC(0, docptr, 2k_CDSN_IO);
918 WriteDOC(doc->CDSNControl, docptr, CDSNControl);
919 } else if (DoC_is_MillenniumPlus(doc)) {
920 WriteDOC(0, docptr, Mplus_NOP);
921 WriteDOC(0, docptr, Mplus_NOP);
922 WriteDOC(0, docptr, Mplus_NOP);
923 } else {
924 WriteDOC(0, docptr, NOP);
925 WriteDOC(0, docptr, NOP);
926 WriteDOC(0, docptr, NOP);
927 }
928
929 for (i = 0; i < 6; i++) {
930 if (DoC_is_MillenniumPlus(doc))
931 ecc_code[i] = ReadDOC_(docptr, DoC_Mplus_ECCSyndrome0 + i);
61b03bd7 932 else
1da177e4
LT
933 ecc_code[i] = ReadDOC_(docptr, DoC_ECCSyndrome0 + i);
934 if (ecc_code[i] != empty_write_ecc[i])
935 emptymatch = 0;
936 }
937 if (DoC_is_MillenniumPlus(doc))
938 WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf);
939 else
940 WriteDOC(DOC_ECC_DIS, docptr, ECCConf);
941#if 0
942 /* If emptymatch=1, we might have an all-0xff data buffer. Check. */
943 if (emptymatch) {
944 /* Note: this somewhat expensive test should not be triggered
945 often. It could be optimized away by examining the data in
946 the writebuf routine, and remembering the result. */
947 for (i = 0; i < 512; i++) {
e0c7d767
DW
948 if (dat[i] == 0xff)
949 continue;
1da177e4
LT
950 emptymatch = 0;
951 break;
952 }
953 }
954 /* If emptymatch still =1, we do have an all-0xff data buffer.
955 Return all-0xff ecc value instead of the computed one, so
956 it'll look just like a freshly-erased page. */
e0c7d767
DW
957 if (emptymatch)
958 memset(ecc_code, 0xff, 6);
1da177e4
LT
959#endif
960 return 0;
961}
962
f5bbdacc
TG
963static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat,
964 u_char *read_ecc, u_char *isnull)
1da177e4
LT
965{
966 int i, ret = 0;
967 struct nand_chip *this = mtd->priv;
968 struct doc_priv *doc = this->priv;
e0c7d767 969 void __iomem *docptr = doc->virtadr;
f5bbdacc 970 uint8_t calc_ecc[6];
1da177e4
LT
971 volatile u_char dummy;
972 int emptymatch = 1;
61b03bd7 973
1da177e4
LT
974 /* flush the pipeline */
975 if (DoC_is_2000(doc)) {
976 dummy = ReadDOC(docptr, 2k_ECCStatus);
977 dummy = ReadDOC(docptr, 2k_ECCStatus);
978 dummy = ReadDOC(docptr, 2k_ECCStatus);
979 } else if (DoC_is_MillenniumPlus(doc)) {
980 dummy = ReadDOC(docptr, Mplus_ECCConf);
981 dummy = ReadDOC(docptr, Mplus_ECCConf);
982 dummy = ReadDOC(docptr, Mplus_ECCConf);
983 } else {
984 dummy = ReadDOC(docptr, ECCConf);
985 dummy = ReadDOC(docptr, ECCConf);
986 dummy = ReadDOC(docptr, ECCConf);
987 }
61b03bd7 988
25985edc 989 /* Error occurred ? */
1da177e4
LT
990 if (dummy & 0x80) {
991 for (i = 0; i < 6; i++) {
992 if (DoC_is_MillenniumPlus(doc))
993 calc_ecc[i] = ReadDOC_(docptr, DoC_Mplus_ECCSyndrome0 + i);
994 else
995 calc_ecc[i] = ReadDOC_(docptr, DoC_ECCSyndrome0 + i);
996 if (calc_ecc[i] != empty_read_syndrome[i])
997 emptymatch = 0;
998 }
999 /* If emptymatch=1, the read syndrome is consistent with an
1000 all-0xff data and stored ecc block. Check the stored ecc. */
1001 if (emptymatch) {
1002 for (i = 0; i < 6; i++) {
e0c7d767
DW
1003 if (read_ecc[i] == 0xff)
1004 continue;
1da177e4
LT
1005 emptymatch = 0;
1006 break;
1007 }
1008 }
1009 /* If emptymatch still =1, check the data block. */
1010 if (emptymatch) {
e0c7d767
DW
1011 /* Note: this somewhat expensive test should not be triggered
1012 often. It could be optimized away by examining the data in
1013 the readbuf routine, and remembering the result. */
1da177e4 1014 for (i = 0; i < 512; i++) {
e0c7d767
DW
1015 if (dat[i] == 0xff)
1016 continue;
1da177e4
LT
1017 emptymatch = 0;
1018 break;
1019 }
1020 }
1021 /* If emptymatch still =1, this is almost certainly a freshly-
1022 erased block, in which case the ECC will not come out right.
1023 We'll suppress the error and tell the caller everything's
1024 OK. Because it is. */
e0c7d767
DW
1025 if (!emptymatch)
1026 ret = doc_ecc_decode(rs_decoder, dat, calc_ecc);
1da177e4
LT
1027 if (ret > 0)
1028 printk(KERN_ERR "doc200x_correct_data corrected %d errors\n", ret);
61b03bd7 1029 }
1da177e4
LT
1030 if (DoC_is_MillenniumPlus(doc))
1031 WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf);
1032 else
1033 WriteDOC(DOC_ECC_DIS, docptr, ECCConf);
eb684507 1034 if (no_ecc_failures && (ret == -EBADMSG)) {
1da177e4
LT
1035 printk(KERN_ERR "suppressing ECC failure\n");
1036 ret = 0;
1037 }
1038 return ret;
1039}
61b03bd7 1040
1da177e4
LT
1041//u_char mydatabuf[528];
1042
abc37e67
DB
1043/* The strange out-of-order .oobfree list below is a (possibly unneeded)
1044 * attempt to retain compatibility. It used to read:
1045 * .oobfree = { {8, 8} }
1046 * Since that leaves two bytes unusable, it was changed. But the following
1047 * scheme might affect existing jffs2 installs by moving the cleanmarker:
1048 * .oobfree = { {6, 10} }
1049 * jffs2 seems to handle the above gracefully, but the current scheme seems
1050 * safer. The only problem with it is that any code that parses oobfree must
1051 * be able to handle out-of-order segments.
1052 */
5bd34c09 1053static struct nand_ecclayout doc200x_oobinfo = {
e0c7d767
DW
1054 .eccbytes = 6,
1055 .eccpos = {0, 1, 2, 3, 4, 5},
1056 .oobfree = {{8, 8}, {6, 2}}
1da177e4 1057};
61b03bd7 1058
1da177e4 1059/* Find the (I)NFTL Media Header, and optionally also the mirror media header.
af901ca1 1060 On successful return, buf will contain a copy of the media header for
1da177e4
LT
1061 further processing. id is the string to scan for, and will presumably be
1062 either "ANAND" or "BNAND". If findmirror=1, also look for the mirror media
1063 header. The page #s of the found media headers are placed in mh0_page and
1064 mh1_page in the DOC private structure. */
e0c7d767 1065static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const char *id, int findmirror)
1da177e4
LT
1066{
1067 struct nand_chip *this = mtd->priv;
1068 struct doc_priv *doc = this->priv;
1a78ff6b 1069 unsigned offs;
1da177e4
LT
1070 int ret;
1071 size_t retlen;
1072
1a78ff6b 1073 for (offs = 0; offs < mtd->size; offs += mtd->erasesize) {
28318776
JE
1074 ret = mtd->read(mtd, offs, mtd->writesize, &retlen, buf);
1075 if (retlen != mtd->writesize)
e0c7d767 1076 continue;
1da177e4 1077 if (ret) {
e0c7d767 1078 printk(KERN_WARNING "ECC error scanning DOC at 0x%x\n", offs);
1da177e4 1079 }
e0c7d767
DW
1080 if (memcmp(buf, id, 6))
1081 continue;
1da177e4
LT
1082 printk(KERN_INFO "Found DiskOnChip %s Media Header at 0x%x\n", id, offs);
1083 if (doc->mh0_page == -1) {
1084 doc->mh0_page = offs >> this->page_shift;
e0c7d767
DW
1085 if (!findmirror)
1086 return 1;
1da177e4
LT
1087 continue;
1088 }
1089 doc->mh1_page = offs >> this->page_shift;
1090 return 2;
1091 }
1092 if (doc->mh0_page == -1) {
1093 printk(KERN_WARNING "DiskOnChip %s Media Header not found.\n", id);
1094 return 0;
1095 }
1096 /* Only one mediaheader was found. We want buf to contain a
1097 mediaheader on return, so we'll have to re-read the one we found. */
1098 offs = doc->mh0_page << this->page_shift;
28318776
JE
1099 ret = mtd->read(mtd, offs, mtd->writesize, &retlen, buf);
1100 if (retlen != mtd->writesize) {
1da177e4
LT
1101 /* Insanity. Give up. */
1102 printk(KERN_ERR "Read DiskOnChip Media Header once, but can't reread it???\n");
1103 return 0;
1104 }
1105 return 1;
1106}
1107
e0c7d767 1108static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts)
1da177e4
LT
1109{
1110 struct nand_chip *this = mtd->priv;
1111 struct doc_priv *doc = this->priv;
1112 int ret = 0;
1113 u_char *buf;
1114 struct NFTLMediaHeader *mh;
1115 const unsigned psize = 1 << this->page_shift;
1a78ff6b 1116 int numparts = 0;
1da177e4
LT
1117 unsigned blocks, maxblocks;
1118 int offs, numheaders;
1119
28318776 1120 buf = kmalloc(mtd->writesize, GFP_KERNEL);
1da177e4
LT
1121 if (!buf) {
1122 printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n");
1123 return 0;
1124 }
e0c7d767
DW
1125 if (!(numheaders = find_media_headers(mtd, buf, "ANAND", 1)))
1126 goto out;
1127 mh = (struct NFTLMediaHeader *)buf;
1da177e4 1128
96372446
HH
1129 le16_to_cpus(&mh->NumEraseUnits);
1130 le16_to_cpus(&mh->FirstPhysicalEUN);
1131 le32_to_cpus(&mh->FormattedSize);
f29a4b86 1132
1da177e4
LT
1133 printk(KERN_INFO " DataOrgID = %s\n"
1134 " NumEraseUnits = %d\n"
1135 " FirstPhysicalEUN = %d\n"
1136 " FormattedSize = %d\n"
1137 " UnitSizeFactor = %d\n",
1138 mh->DataOrgID, mh->NumEraseUnits,
1139 mh->FirstPhysicalEUN, mh->FormattedSize,
1140 mh->UnitSizeFactor);
1da177e4
LT
1141
1142 blocks = mtd->size >> this->phys_erase_shift;
1143 maxblocks = min(32768U, mtd->erasesize - psize);
1144
1145 if (mh->UnitSizeFactor == 0x00) {
1146 /* Auto-determine UnitSizeFactor. The constraints are:
1147 - There can be at most 32768 virtual blocks.
1148 - There can be at most (virtual block size - page size)
e0c7d767
DW
1149 virtual blocks (because MediaHeader+BBT must fit in 1).
1150 */
1da177e4
LT
1151 mh->UnitSizeFactor = 0xff;
1152 while (blocks > maxblocks) {
1153 blocks >>= 1;
1154 maxblocks = min(32768U, (maxblocks << 1) + psize);
1155 mh->UnitSizeFactor--;
1156 }
1157 printk(KERN_WARNING "UnitSizeFactor=0x00 detected. Correct value is assumed to be 0x%02x.\n", mh->UnitSizeFactor);
1158 }
1159
1160 /* NOTE: The lines below modify internal variables of the NAND and MTD
1161 layers; variables with have already been configured by nand_scan.
1162 Unfortunately, we didn't know before this point what these values
25985edc 1163 should be. Thus, this code is somewhat dependent on the exact
1da177e4
LT
1164 implementation of the NAND layer. */
1165 if (mh->UnitSizeFactor != 0xff) {
1166 this->bbt_erase_shift += (0xff - mh->UnitSizeFactor);
1167 mtd->erasesize <<= (0xff - mh->UnitSizeFactor);
1168 printk(KERN_INFO "Setting virtual erase size to %d\n", mtd->erasesize);
1169 blocks = mtd->size >> this->bbt_erase_shift;
1170 maxblocks = min(32768U, mtd->erasesize - psize);
1171 }
1172
1173 if (blocks > maxblocks) {
1174 printk(KERN_ERR "UnitSizeFactor of 0x%02x is inconsistent with device size. Aborting.\n", mh->UnitSizeFactor);
1175 goto out;
1176 }
1177
1178 /* Skip past the media headers. */
1179 offs = max(doc->mh0_page, doc->mh1_page);
1180 offs <<= this->page_shift;
1181 offs += mtd->erasesize;
1182
1a78ff6b
DB
1183 if (show_firmware_partition == 1) {
1184 parts[0].name = " DiskOnChip Firmware / Media Header partition";
1185 parts[0].offset = 0;
1186 parts[0].size = offs;
1187 numparts = 1;
1188 }
1189
1190 parts[numparts].name = " DiskOnChip BDTL partition";
1191 parts[numparts].offset = offs;
1192 parts[numparts].size = (mh->NumEraseUnits - numheaders) << this->bbt_erase_shift;
1193
1194 offs += parts[numparts].size;
1195 numparts++;
1da177e4 1196
1da177e4 1197 if (offs < mtd->size) {
1a78ff6b
DB
1198 parts[numparts].name = " DiskOnChip Remainder partition";
1199 parts[numparts].offset = offs;
1200 parts[numparts].size = mtd->size - offs;
1201 numparts++;
1da177e4 1202 }
1a78ff6b
DB
1203
1204 ret = numparts;
e0c7d767 1205 out:
1da177e4
LT
1206 kfree(buf);
1207 return ret;
1208}
1209
1210/* This is a stripped-down copy of the code in inftlmount.c */
e0c7d767 1211static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts)
1da177e4
LT
1212{
1213 struct nand_chip *this = mtd->priv;
1214 struct doc_priv *doc = this->priv;
1215 int ret = 0;
1216 u_char *buf;
1217 struct INFTLMediaHeader *mh;
1218 struct INFTLPartition *ip;
1219 int numparts = 0;
1220 int blocks;
1221 int vshift, lastvunit = 0;
1222 int i;
1223 int end = mtd->size;
1224
1225 if (inftl_bbt_write)
1226 end -= (INFTL_BBT_RESERVED_BLOCKS << this->phys_erase_shift);
1227
28318776 1228 buf = kmalloc(mtd->writesize, GFP_KERNEL);
1da177e4
LT
1229 if (!buf) {
1230 printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n");
1231 return 0;
1232 }
1233
e0c7d767
DW
1234 if (!find_media_headers(mtd, buf, "BNAND", 0))
1235 goto out;
1da177e4 1236 doc->mh1_page = doc->mh0_page + (4096 >> this->page_shift);
e0c7d767 1237 mh = (struct INFTLMediaHeader *)buf;
1da177e4 1238
96372446
HH
1239 le32_to_cpus(&mh->NoOfBootImageBlocks);
1240 le32_to_cpus(&mh->NoOfBinaryPartitions);
1241 le32_to_cpus(&mh->NoOfBDTLPartitions);
1242 le32_to_cpus(&mh->BlockMultiplierBits);
1243 le32_to_cpus(&mh->FormatFlags);
1244 le32_to_cpus(&mh->PercentUsed);
61b03bd7 1245
1da177e4
LT
1246 printk(KERN_INFO " bootRecordID = %s\n"
1247 " NoOfBootImageBlocks = %d\n"
1248 " NoOfBinaryPartitions = %d\n"
1249 " NoOfBDTLPartitions = %d\n"
1250 " BlockMultiplerBits = %d\n"
1251 " FormatFlgs = %d\n"
1252 " OsakVersion = %d.%d.%d.%d\n"
1253 " PercentUsed = %d\n",
1254 mh->bootRecordID, mh->NoOfBootImageBlocks,
1255 mh->NoOfBinaryPartitions,
1256 mh->NoOfBDTLPartitions,
1257 mh->BlockMultiplierBits, mh->FormatFlags,
1258 ((unsigned char *) &mh->OsakVersion)[0] & 0xf,
1259 ((unsigned char *) &mh->OsakVersion)[1] & 0xf,
1260 ((unsigned char *) &mh->OsakVersion)[2] & 0xf,
1261 ((unsigned char *) &mh->OsakVersion)[3] & 0xf,
1262 mh->PercentUsed);
1da177e4
LT
1263
1264 vshift = this->phys_erase_shift + mh->BlockMultiplierBits;
1265
1266 blocks = mtd->size >> vshift;
1267 if (blocks > 32768) {
1268 printk(KERN_ERR "BlockMultiplierBits=%d is inconsistent with device size. Aborting.\n", mh->BlockMultiplierBits);
1269 goto out;
1270 }
1271
1272 blocks = doc->chips_per_floor << (this->chip_shift - this->phys_erase_shift);
1273 if (inftl_bbt_write && (blocks > mtd->erasesize)) {
1274 printk(KERN_ERR "Writeable BBTs spanning more than one erase block are not yet supported. FIX ME!\n");
1275 goto out;
1276 }
1277
1278 /* Scan the partitions */
1279 for (i = 0; (i < 4); i++) {
1280 ip = &(mh->Partitions[i]);
96372446
HH
1281 le32_to_cpus(&ip->virtualUnits);
1282 le32_to_cpus(&ip->firstUnit);
1283 le32_to_cpus(&ip->lastUnit);
1284 le32_to_cpus(&ip->flags);
1285 le32_to_cpus(&ip->spareUnits);
1286 le32_to_cpus(&ip->Reserved0);
1da177e4 1287
1da177e4
LT
1288 printk(KERN_INFO " PARTITION[%d] ->\n"
1289 " virtualUnits = %d\n"
1290 " firstUnit = %d\n"
1291 " lastUnit = %d\n"
1292 " flags = 0x%x\n"
1293 " spareUnits = %d\n",
1294 i, ip->virtualUnits, ip->firstUnit,
1295 ip->lastUnit, ip->flags,
1296 ip->spareUnits);
1da177e4 1297
1a78ff6b
DB
1298 if ((show_firmware_partition == 1) &&
1299 (i == 0) && (ip->firstUnit > 0)) {
1da177e4
LT
1300 parts[0].name = " DiskOnChip IPL / Media Header partition";
1301 parts[0].offset = 0;
1302 parts[0].size = mtd->erasesize * ip->firstUnit;
1303 numparts = 1;
1304 }
1da177e4
LT
1305
1306 if (ip->flags & INFTL_BINARY)
1307 parts[numparts].name = " DiskOnChip BDK partition";
1308 else
1309 parts[numparts].name = " DiskOnChip BDTL partition";
1310 parts[numparts].offset = ip->firstUnit << vshift;
1311 parts[numparts].size = (1 + ip->lastUnit - ip->firstUnit) << vshift;
1312 numparts++;
e0c7d767
DW
1313 if (ip->lastUnit > lastvunit)
1314 lastvunit = ip->lastUnit;
1315 if (ip->flags & INFTL_LAST)
1316 break;
1da177e4
LT
1317 }
1318 lastvunit++;
1319 if ((lastvunit << vshift) < end) {
1320 parts[numparts].name = " DiskOnChip Remainder partition";
1321 parts[numparts].offset = lastvunit << vshift;
1322 parts[numparts].size = end - parts[numparts].offset;
1323 numparts++;
1324 }
1325 ret = numparts;
e0c7d767 1326 out:
1da177e4
LT
1327 kfree(buf);
1328 return ret;
1329}
1330
1331static int __init nftl_scan_bbt(struct mtd_info *mtd)
1332{
1333 int ret, numparts;
1334 struct nand_chip *this = mtd->priv;
1335 struct doc_priv *doc = this->priv;
1336 struct mtd_partition parts[2];
1337
e0c7d767 1338 memset((char *)parts, 0, sizeof(parts));
1da177e4
LT
1339 /* On NFTL, we have to find the media headers before we can read the
1340 BBTs, since they're stored in the media header eraseblocks. */
1341 numparts = nftl_partscan(mtd, parts);
e0c7d767
DW
1342 if (!numparts)
1343 return -EIO;
1da177e4
LT
1344 this->bbt_td->options = NAND_BBT_ABSPAGE | NAND_BBT_8BIT |
1345 NAND_BBT_SAVECONTENT | NAND_BBT_WRITE |
1346 NAND_BBT_VERSION;
1347 this->bbt_td->veroffs = 7;
1348 this->bbt_td->pages[0] = doc->mh0_page + 1;
1349 if (doc->mh1_page != -1) {
1350 this->bbt_md->options = NAND_BBT_ABSPAGE | NAND_BBT_8BIT |
1351 NAND_BBT_SAVECONTENT | NAND_BBT_WRITE |
1352 NAND_BBT_VERSION;
1353 this->bbt_md->veroffs = 7;
1354 this->bbt_md->pages[0] = doc->mh1_page + 1;
1355 } else {
1356 this->bbt_md = NULL;
1357 }
1358
1359 /* It's safe to set bd=NULL below because NAND_BBT_CREATE is not set.
1360 At least as nand_bbt.c is currently written. */
1361 if ((ret = nand_scan_bbt(mtd, NULL)))
1362 return ret;
1363 add_mtd_device(mtd);
1364#ifdef CONFIG_MTD_PARTITIONS
1365 if (!no_autopart)
1366 add_mtd_partitions(mtd, parts, numparts);
1367#endif
1368 return 0;
1369}
1370
1371static int __init inftl_scan_bbt(struct mtd_info *mtd)
1372{
1373 int ret, numparts;
1374 struct nand_chip *this = mtd->priv;
1375 struct doc_priv *doc = this->priv;
1376 struct mtd_partition parts[5];
1377
1378 if (this->numchips > doc->chips_per_floor) {
1379 printk(KERN_ERR "Multi-floor INFTL devices not yet supported.\n");
1380 return -EIO;
1381 }
1382
1383 if (DoC_is_MillenniumPlus(doc)) {
1384 this->bbt_td->options = NAND_BBT_2BIT | NAND_BBT_ABSPAGE;
1385 if (inftl_bbt_write)
1386 this->bbt_td->options |= NAND_BBT_WRITE;
1387 this->bbt_td->pages[0] = 2;
1388 this->bbt_md = NULL;
1389 } else {
e0c7d767 1390 this->bbt_td->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION;
1da177e4
LT
1391 if (inftl_bbt_write)
1392 this->bbt_td->options |= NAND_BBT_WRITE;
1393 this->bbt_td->offs = 8;
1394 this->bbt_td->len = 8;
1395 this->bbt_td->veroffs = 7;
1396 this->bbt_td->maxblocks = INFTL_BBT_RESERVED_BLOCKS;
1397 this->bbt_td->reserved_block_code = 0x01;
1398 this->bbt_td->pattern = "MSYS_BBT";
1399
e0c7d767 1400 this->bbt_md->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION;
1da177e4
LT
1401 if (inftl_bbt_write)
1402 this->bbt_md->options |= NAND_BBT_WRITE;
1403 this->bbt_md->offs = 8;
1404 this->bbt_md->len = 8;
1405 this->bbt_md->veroffs = 7;
1406 this->bbt_md->maxblocks = INFTL_BBT_RESERVED_BLOCKS;
1407 this->bbt_md->reserved_block_code = 0x01;
1408 this->bbt_md->pattern = "TBB_SYSM";
1409 }
1410
1411 /* It's safe to set bd=NULL below because NAND_BBT_CREATE is not set.
1412 At least as nand_bbt.c is currently written. */
1413 if ((ret = nand_scan_bbt(mtd, NULL)))
1414 return ret;
e0c7d767 1415 memset((char *)parts, 0, sizeof(parts));
1da177e4
LT
1416 numparts = inftl_partscan(mtd, parts);
1417 /* At least for now, require the INFTL Media Header. We could probably
1418 do without it for non-INFTL use, since all it gives us is
1419 autopartitioning, but I want to give it more thought. */
e0c7d767
DW
1420 if (!numparts)
1421 return -EIO;
1da177e4
LT
1422 add_mtd_device(mtd);
1423#ifdef CONFIG_MTD_PARTITIONS
1424 if (!no_autopart)
1425 add_mtd_partitions(mtd, parts, numparts);
1426#endif
1427 return 0;
1428}
1429
1430static inline int __init doc2000_init(struct mtd_info *mtd)
1431{
1432 struct nand_chip *this = mtd->priv;
1433 struct doc_priv *doc = this->priv;
1434
1da177e4
LT
1435 this->read_byte = doc2000_read_byte;
1436 this->write_buf = doc2000_writebuf;
1437 this->read_buf = doc2000_readbuf;
1438 this->verify_buf = doc2000_verifybuf;
1439 this->scan_bbt = nftl_scan_bbt;
1440
1441 doc->CDSNControl = CDSN_CTRL_FLASH_IO | CDSN_CTRL_ECC_IO;
1442 doc2000_count_chips(mtd);
1443 mtd->name = "DiskOnChip 2000 (NFTL Model)";
1444 return (4 * doc->chips_per_floor);
1445}
1446
1447static inline int __init doc2001_init(struct mtd_info *mtd)
1448{
1449 struct nand_chip *this = mtd->priv;
1450 struct doc_priv *doc = this->priv;
1451
1da177e4
LT
1452 this->read_byte = doc2001_read_byte;
1453 this->write_buf = doc2001_writebuf;
1454 this->read_buf = doc2001_readbuf;
1455 this->verify_buf = doc2001_verifybuf;
1456
1457 ReadDOC(doc->virtadr, ChipID);
1458 ReadDOC(doc->virtadr, ChipID);
1459 ReadDOC(doc->virtadr, ChipID);
1460 if (ReadDOC(doc->virtadr, ChipID) != DOC_ChipID_DocMil) {
1461 /* It's not a Millennium; it's one of the newer
61b03bd7 1462 DiskOnChip 2000 units with a similar ASIC.
1da177e4
LT
1463 Treat it like a Millennium, except that it
1464 can have multiple chips. */
1465 doc2000_count_chips(mtd);
1466 mtd->name = "DiskOnChip 2000 (INFTL Model)";
1467 this->scan_bbt = inftl_scan_bbt;
1468 return (4 * doc->chips_per_floor);
1469 } else {
1470 /* Bog-standard Millennium */
1471 doc->chips_per_floor = 1;
1472 mtd->name = "DiskOnChip Millennium";
1473 this->scan_bbt = nftl_scan_bbt;
1474 return 1;
1475 }
1476}
1477
1478static inline int __init doc2001plus_init(struct mtd_info *mtd)
1479{
1480 struct nand_chip *this = mtd->priv;
1481 struct doc_priv *doc = this->priv;
1482
1da177e4
LT
1483 this->read_byte = doc2001plus_read_byte;
1484 this->write_buf = doc2001plus_writebuf;
1485 this->read_buf = doc2001plus_readbuf;
1486 this->verify_buf = doc2001plus_verifybuf;
1487 this->scan_bbt = inftl_scan_bbt;
7abd3ef9 1488 this->cmd_ctrl = NULL;
1da177e4
LT
1489 this->select_chip = doc2001plus_select_chip;
1490 this->cmdfunc = doc2001plus_command;
0cddd6c2 1491 this->ecc.hwctl = doc2001plus_enable_hwecc;
1da177e4
LT
1492
1493 doc->chips_per_floor = 1;
1494 mtd->name = "DiskOnChip Millennium Plus";
1495
1496 return 1;
1497}
1498
858119e1 1499static int __init doc_probe(unsigned long physadr)
1da177e4
LT
1500{
1501 unsigned char ChipID;
1502 struct mtd_info *mtd;
1503 struct nand_chip *nand;
1504 struct doc_priv *doc;
1505 void __iomem *virtadr;
1506 unsigned char save_control;
1507 unsigned char tmp, tmpb, tmpc;
1508 int reg, len, numchips;
1509 int ret = 0;
1510
1511 virtadr = ioremap(physadr, DOC_IOREMAP_LEN);
1512 if (!virtadr) {
1513 printk(KERN_ERR "Diskonchip ioremap failed: 0x%x bytes at 0x%lx\n", DOC_IOREMAP_LEN, physadr);
1514 return -EIO;
1515 }
1516
1517 /* It's not possible to cleanly detect the DiskOnChip - the
1518 * bootup procedure will put the device into reset mode, and
1519 * it's not possible to talk to it without actually writing
1520 * to the DOCControl register. So we store the current contents
1521 * of the DOCControl register's location, in case we later decide
1522 * that it's not a DiskOnChip, and want to put it back how we
61b03bd7 1523 * found it.
1da177e4
LT
1524 */
1525 save_control = ReadDOC(virtadr, DOCControl);
1526
1527 /* Reset the DiskOnChip ASIC */
e0c7d767
DW
1528 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl);
1529 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl);
1da177e4
LT
1530
1531 /* Enable the DiskOnChip ASIC */
e0c7d767
DW
1532 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl);
1533 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl);
1da177e4
LT
1534
1535 ChipID = ReadDOC(virtadr, ChipID);
1536
e0c7d767 1537 switch (ChipID) {
1da177e4
LT
1538 case DOC_ChipID_Doc2k:
1539 reg = DoC_2k_ECCStatus;
1540 break;
1541 case DOC_ChipID_DocMil:
1542 reg = DoC_ECCConf;
1543 break;
1544 case DOC_ChipID_DocMilPlus16:
1545 case DOC_ChipID_DocMilPlus32:
1546 case 0:
1547 /* Possible Millennium Plus, need to do more checks */
1548 /* Possibly release from power down mode */
1549 for (tmp = 0; (tmp < 4); tmp++)
1550 ReadDOC(virtadr, Mplus_Power);
1551
1552 /* Reset the Millennium Plus ASIC */
e0c7d767 1553 tmp = DOC_MODE_RESET | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT;
1da177e4
LT
1554 WriteDOC(tmp, virtadr, Mplus_DOCControl);
1555 WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm);
1556
1557 mdelay(1);
1558 /* Enable the Millennium Plus ASIC */
e0c7d767 1559 tmp = DOC_MODE_NORMAL | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT;
1da177e4
LT
1560 WriteDOC(tmp, virtadr, Mplus_DOCControl);
1561 WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm);
1562 mdelay(1);
1563
1564 ChipID = ReadDOC(virtadr, ChipID);
1565
1566 switch (ChipID) {
1567 case DOC_ChipID_DocMilPlus16:
1568 reg = DoC_Mplus_Toggle;
1569 break;
1570 case DOC_ChipID_DocMilPlus32:
1571 printk(KERN_ERR "DiskOnChip Millennium Plus 32MB is not supported, ignoring.\n");
1572 default:
1573 ret = -ENODEV;
1574 goto notfound;
1575 }
1576 break;
1577
1578 default:
1579 ret = -ENODEV;
1580 goto notfound;
1581 }
1582 /* Check the TOGGLE bit in the ECC register */
e0c7d767 1583 tmp = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT;
1da177e4
LT
1584 tmpb = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT;
1585 tmpc = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT;
1586 if ((tmp == tmpb) || (tmp != tmpc)) {
1587 printk(KERN_WARNING "Possible DiskOnChip at 0x%lx failed TOGGLE test, dropping.\n", physadr);
1588 ret = -ENODEV;
1589 goto notfound;
1590 }
1591
1592 for (mtd = doclist; mtd; mtd = doc->nextdoc) {
1593 unsigned char oldval;
1594 unsigned char newval;
1595 nand = mtd->priv;
1596 doc = nand->priv;
1597 /* Use the alias resolution register to determine if this is
1598 in fact the same DOC aliased to a new address. If writes
1599 to one chip's alias resolution register change the value on
1600 the other chip, they're the same chip. */
1601 if (ChipID == DOC_ChipID_DocMilPlus16) {
1602 oldval = ReadDOC(doc->virtadr, Mplus_AliasResolution);
1603 newval = ReadDOC(virtadr, Mplus_AliasResolution);
1604 } else {
1605 oldval = ReadDOC(doc->virtadr, AliasResolution);
1606 newval = ReadDOC(virtadr, AliasResolution);
1607 }
1608 if (oldval != newval)
1609 continue;
1610 if (ChipID == DOC_ChipID_DocMilPlus16) {
1611 WriteDOC(~newval, virtadr, Mplus_AliasResolution);
1612 oldval = ReadDOC(doc->virtadr, Mplus_AliasResolution);
e0c7d767 1613 WriteDOC(newval, virtadr, Mplus_AliasResolution); // restore it
1da177e4
LT
1614 } else {
1615 WriteDOC(~newval, virtadr, AliasResolution);
1616 oldval = ReadDOC(doc->virtadr, AliasResolution);
e0c7d767 1617 WriteDOC(newval, virtadr, AliasResolution); // restore it
1da177e4
LT
1618 }
1619 newval = ~newval;
1620 if (oldval == newval) {
1621 printk(KERN_DEBUG "Found alias of DOC at 0x%lx to 0x%lx\n", doc->physadr, physadr);
1622 goto notfound;
1623 }
1624 }
1625
1626 printk(KERN_NOTICE "DiskOnChip found at 0x%lx\n", physadr);
1627
1628 len = sizeof(struct mtd_info) +
e0c7d767 1629 sizeof(struct nand_chip) + sizeof(struct doc_priv) + (2 * sizeof(struct nand_bbt_descr));
95b93a0c 1630 mtd = kzalloc(len, GFP_KERNEL);
1da177e4
LT
1631 if (!mtd) {
1632 printk(KERN_ERR "DiskOnChip kmalloc (%d bytes) failed!\n", len);
1633 ret = -ENOMEM;
1634 goto fail;
1635 }
1da177e4
LT
1636
1637 nand = (struct nand_chip *) (mtd + 1);
1638 doc = (struct doc_priv *) (nand + 1);
1639 nand->bbt_td = (struct nand_bbt_descr *) (doc + 1);
1640 nand->bbt_md = nand->bbt_td + 1;
1641
1642 mtd->priv = nand;
1643 mtd->owner = THIS_MODULE;
1644
1645 nand->priv = doc;
1646 nand->select_chip = doc200x_select_chip;
7abd3ef9 1647 nand->cmd_ctrl = doc200x_hwcontrol;
1da177e4
LT
1648 nand->dev_ready = doc200x_dev_ready;
1649 nand->waitfunc = doc200x_wait;
1650 nand->block_bad = doc200x_block_bad;
6dfc6d25
TG
1651 nand->ecc.hwctl = doc200x_enable_hwecc;
1652 nand->ecc.calculate = doc200x_calculate_ecc;
1653 nand->ecc.correct = doc200x_correct_data;
1da177e4 1654
5bd34c09 1655 nand->ecc.layout = &doc200x_oobinfo;
6dfc6d25
TG
1656 nand->ecc.mode = NAND_ECC_HW_SYNDROME;
1657 nand->ecc.size = 512;
1658 nand->ecc.bytes = 6;
f75e5097 1659 nand->options = NAND_USE_FLASH_BBT;
1da177e4
LT
1660
1661 doc->physadr = physadr;
1662 doc->virtadr = virtadr;
1663 doc->ChipID = ChipID;
1664 doc->curfloor = -1;
1665 doc->curchip = -1;
1666 doc->mh0_page = -1;
1667 doc->mh1_page = -1;
1668 doc->nextdoc = doclist;
1669
1670 if (ChipID == DOC_ChipID_Doc2k)
1671 numchips = doc2000_init(mtd);
1672 else if (ChipID == DOC_ChipID_DocMilPlus16)
1673 numchips = doc2001plus_init(mtd);
1674 else
1675 numchips = doc2001_init(mtd);
1676
1677 if ((ret = nand_scan(mtd, numchips))) {
1678 /* DBB note: i believe nand_release is necessary here, as
1679 buffers may have been allocated in nand_base. Check with
1680 Thomas. FIX ME! */
1681 /* nand_release will call del_mtd_device, but we haven't yet
1682 added it. This is handled without incident by
1683 del_mtd_device, as far as I can tell. */
1684 nand_release(mtd);
1685 kfree(mtd);
1686 goto fail;
1687 }
1688
1689 /* Success! */
1690 doclist = mtd;
1691 return 0;
1692
e0c7d767 1693 notfound:
1da177e4
LT
1694 /* Put back the contents of the DOCControl register, in case it's not
1695 actually a DiskOnChip. */
1696 WriteDOC(save_control, virtadr, DOCControl);
e0c7d767 1697 fail:
1da177e4
LT
1698 iounmap(virtadr);
1699 return ret;
1700}
1701
1702static void release_nanddoc(void)
1703{
e0c7d767 1704 struct mtd_info *mtd, *nextmtd;
1da177e4
LT
1705 struct nand_chip *nand;
1706 struct doc_priv *doc;
1707
1708 for (mtd = doclist; mtd; mtd = nextmtd) {
1709 nand = mtd->priv;
1710 doc = nand->priv;
1711
1712 nextmtd = doc->nextdoc;
1713 nand_release(mtd);
1714 iounmap(doc->virtadr);
1715 kfree(mtd);
1716 }
1717}
1718
1719static int __init init_nanddoc(void)
1720{
1721 int i, ret = 0;
1722
1723 /* We could create the decoder on demand, if memory is a concern.
61b03bd7 1724 * This way we have it handy, if an error happens
1da177e4
LT
1725 *
1726 * Symbolsize is 10 (bits)
1727 * Primitve polynomial is x^10+x^3+1
1728 * first consecutive root is 510
1729 * primitve element to generate roots = 1
1730 * generator polinomial degree = 4
1731 */
1732 rs_decoder = init_rs(10, 0x409, FCR, 1, NROOTS);
e0c7d767
DW
1733 if (!rs_decoder) {
1734 printk(KERN_ERR "DiskOnChip: Could not create a RS decoder\n");
1da177e4
LT
1735 return -ENOMEM;
1736 }
1737
1738 if (doc_config_location) {
1739 printk(KERN_INFO "Using configured DiskOnChip probe address 0x%lx\n", doc_config_location);
1740 ret = doc_probe(doc_config_location);
1741 if (ret < 0)
1742 goto outerr;
1743 } else {
e0c7d767 1744 for (i = 0; (doc_locations[i] != 0xffffffff); i++) {
1da177e4
LT
1745 doc_probe(doc_locations[i]);
1746 }
1747 }
1748 /* No banner message any more. Print a message if no DiskOnChip
1749 found, so the user knows we at least tried. */
1750 if (!doclist) {
1751 printk(KERN_INFO "No valid DiskOnChip devices found\n");
1752 ret = -ENODEV;
1753 goto outerr;
1754 }
1755 return 0;
e0c7d767 1756 outerr:
1da177e4
LT
1757 free_rs(rs_decoder);
1758 return ret;
1759}
1760
1761static void __exit cleanup_nanddoc(void)
1762{
1763 /* Cleanup the nand/DoC resources */
1764 release_nanddoc();
1765
1766 /* Free the reed solomon resources */
1767 if (rs_decoder) {
1768 free_rs(rs_decoder);
1769 }
1770}
1771
1772module_init(init_nanddoc);
1773module_exit(cleanup_nanddoc);
1774
1775MODULE_LICENSE("GPL");
1776MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
2a7af8ca 1777MODULE_DESCRIPTION("M-Systems DiskOnChip 2000, Millennium and Millennium Plus device driver");