Pull output-switch into test branch
[linux-2.6] / drivers / mtd / chips / cfi_cmdset_0002.c
1 /*
2  * Common Flash Interface support:
3  *   AMD & Fujitsu Standard Vendor Command Set (ID 0x0002)
4  *
5  * Copyright (C) 2000 Crossnet Co. <info@crossnet.co.jp>
6  * Copyright (C) 2004 Arcom Control Systems Ltd <linux@arcom.com>
7  * Copyright (C) 2005 MontaVista Software Inc. <source@mvista.com>
8  *
9  * 2_by_8 routines added by Simon Munton
10  *
11  * 4_by_16 work by Carolyn J. Smith
12  *
13  * XIP support hooks by Vitaly Wool (based on code for Intel flash
14  * by Nicolas Pitre)
15  *
16  * Occasionally maintained by Thayne Harbaugh tharbaugh at lnxi dot com
17  *
18  * This code is GPL
19  *
20  * $Id: cfi_cmdset_0002.c,v 1.122 2005/11/07 11:14:22 gleixner Exp $
21  *
22  */
23
24 #include <linux/module.h>
25 #include <linux/types.h>
26 #include <linux/kernel.h>
27 #include <linux/sched.h>
28 #include <linux/init.h>
29 #include <asm/io.h>
30 #include <asm/byteorder.h>
31
32 #include <linux/errno.h>
33 #include <linux/slab.h>
34 #include <linux/delay.h>
35 #include <linux/interrupt.h>
36 #include <linux/mtd/compatmac.h>
37 #include <linux/mtd/map.h>
38 #include <linux/mtd/mtd.h>
39 #include <linux/mtd/cfi.h>
40 #include <linux/mtd/xip.h>
41
42 #define AMD_BOOTLOC_BUG
43 #define FORCE_WORD_WRITE 0
44
45 #define MAX_WORD_RETRIES 3
46
47 #define MANUFACTURER_AMD        0x0001
48 #define MANUFACTURER_ATMEL      0x001F
49 #define MANUFACTURER_SST        0x00BF
50 #define SST49LF004B             0x0060
51 #define SST49LF040B             0x0050
52 #define SST49LF008A             0x005a
53 #define AT49BV6416              0x00d6
54
55 static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
56 static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
57 static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
58 static int cfi_amdstd_erase_chip(struct mtd_info *, struct erase_info *);
59 static int cfi_amdstd_erase_varsize(struct mtd_info *, struct erase_info *);
60 static void cfi_amdstd_sync (struct mtd_info *);
61 static int cfi_amdstd_suspend (struct mtd_info *);
62 static void cfi_amdstd_resume (struct mtd_info *);
63 static int cfi_amdstd_secsi_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
64
65 static void cfi_amdstd_destroy(struct mtd_info *);
66
67 struct mtd_info *cfi_cmdset_0002(struct map_info *, int);
68 static struct mtd_info *cfi_amdstd_setup (struct mtd_info *);
69
70 static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode);
71 static void put_chip(struct map_info *map, struct flchip *chip, unsigned long adr);
72 #include "fwh_lock.h"
73
74 static int cfi_atmel_lock(struct mtd_info *mtd, loff_t ofs, size_t len);
75 static int cfi_atmel_unlock(struct mtd_info *mtd, loff_t ofs, size_t len);
76
77 static struct mtd_chip_driver cfi_amdstd_chipdrv = {
78         .probe          = NULL, /* Not usable directly */
79         .destroy        = cfi_amdstd_destroy,
80         .name           = "cfi_cmdset_0002",
81         .module         = THIS_MODULE
82 };
83
84
85 /* #define DEBUG_CFI_FEATURES */
86
87
88 #ifdef DEBUG_CFI_FEATURES
89 static void cfi_tell_features(struct cfi_pri_amdstd *extp)
90 {
91         const char* erase_suspend[3] = {
92                 "Not supported", "Read only", "Read/write"
93         };
94         const char* top_bottom[6] = {
95                 "No WP", "8x8KiB sectors at top & bottom, no WP",
96                 "Bottom boot", "Top boot",
97                 "Uniform, Bottom WP", "Uniform, Top WP"
98         };
99
100         printk("  Silicon revision: %d\n", extp->SiliconRevision >> 1);
101         printk("  Address sensitive unlock: %s\n",
102                (extp->SiliconRevision & 1) ? "Not required" : "Required");
103
104         if (extp->EraseSuspend < ARRAY_SIZE(erase_suspend))
105                 printk("  Erase Suspend: %s\n", erase_suspend[extp->EraseSuspend]);
106         else
107                 printk("  Erase Suspend: Unknown value %d\n", extp->EraseSuspend);
108
109         if (extp->BlkProt == 0)
110                 printk("  Block protection: Not supported\n");
111         else
112                 printk("  Block protection: %d sectors per group\n", extp->BlkProt);
113
114
115         printk("  Temporary block unprotect: %s\n",
116                extp->TmpBlkUnprotect ? "Supported" : "Not supported");
117         printk("  Block protect/unprotect scheme: %d\n", extp->BlkProtUnprot);
118         printk("  Number of simultaneous operations: %d\n", extp->SimultaneousOps);
119         printk("  Burst mode: %s\n",
120                extp->BurstMode ? "Supported" : "Not supported");
121         if (extp->PageMode == 0)
122                 printk("  Page mode: Not supported\n");
123         else
124                 printk("  Page mode: %d word page\n", extp->PageMode << 2);
125
126         printk("  Vpp Supply Minimum Program/Erase Voltage: %d.%d V\n",
127                extp->VppMin >> 4, extp->VppMin & 0xf);
128         printk("  Vpp Supply Maximum Program/Erase Voltage: %d.%d V\n",
129                extp->VppMax >> 4, extp->VppMax & 0xf);
130
131         if (extp->TopBottom < ARRAY_SIZE(top_bottom))
132                 printk("  Top/Bottom Boot Block: %s\n", top_bottom[extp->TopBottom]);
133         else
134                 printk("  Top/Bottom Boot Block: Unknown value %d\n", extp->TopBottom);
135 }
136 #endif
137
138 #ifdef AMD_BOOTLOC_BUG
139 /* Wheee. Bring me the head of someone at AMD. */
140 static void fixup_amd_bootblock(struct mtd_info *mtd, void* param)
141 {
142         struct map_info *map = mtd->priv;
143         struct cfi_private *cfi = map->fldrv_priv;
144         struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
145         __u8 major = extp->MajorVersion;
146         __u8 minor = extp->MinorVersion;
147
148         if (((major << 8) | minor) < 0x3131) {
149                 /* CFI version 1.0 => don't trust bootloc */
150                 if (cfi->id & 0x80) {
151                         printk(KERN_WARNING "%s: JEDEC Device ID is 0x%02X. Assuming broken CFI table.\n", map->name, cfi->id);
152                         extp->TopBottom = 3;    /* top boot */
153                 } else {
154                         extp->TopBottom = 2;    /* bottom boot */
155                 }
156         }
157 }
158 #endif
159
160 static void fixup_use_write_buffers(struct mtd_info *mtd, void *param)
161 {
162         struct map_info *map = mtd->priv;
163         struct cfi_private *cfi = map->fldrv_priv;
164         if (cfi->cfiq->BufWriteTimeoutTyp) {
165                 DEBUG(MTD_DEBUG_LEVEL1, "Using buffer write method\n" );
166                 mtd->write = cfi_amdstd_write_buffers;
167         }
168 }
169
170 /* Atmel chips don't use the same PRI format as AMD chips */
171 static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
172 {
173         struct map_info *map = mtd->priv;
174         struct cfi_private *cfi = map->fldrv_priv;
175         struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
176         struct cfi_pri_atmel atmel_pri;
177
178         memcpy(&atmel_pri, extp, sizeof(atmel_pri));
179         memset((char *)extp + 5, 0, sizeof(*extp) - 5);
180
181         if (atmel_pri.Features & 0x02)
182                 extp->EraseSuspend = 2;
183
184         if (atmel_pri.BottomBoot)
185                 extp->TopBottom = 2;
186         else
187                 extp->TopBottom = 3;
188 }
189
190 static void fixup_use_secsi(struct mtd_info *mtd, void *param)
191 {
192         /* Setup for chips with a secsi area */
193         mtd->read_user_prot_reg = cfi_amdstd_secsi_read;
194         mtd->read_fact_prot_reg = cfi_amdstd_secsi_read;
195 }
196
197 static void fixup_use_erase_chip(struct mtd_info *mtd, void *param)
198 {
199         struct map_info *map = mtd->priv;
200         struct cfi_private *cfi = map->fldrv_priv;
201         if ((cfi->cfiq->NumEraseRegions == 1) &&
202                 ((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0)) {
203                 mtd->erase = cfi_amdstd_erase_chip;
204         }
205
206 }
207
208 /*
209  * Some Atmel chips (e.g. the AT49BV6416) power-up with all sectors
210  * locked by default.
211  */
212 static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param)
213 {
214         mtd->lock = cfi_atmel_lock;
215         mtd->unlock = cfi_atmel_unlock;
216         mtd->flags |= MTD_STUPID_LOCK;
217 }
218
219 static struct cfi_fixup cfi_fixup_table[] = {
220 #ifdef AMD_BOOTLOC_BUG
221         { CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },
222 #endif
223         { CFI_MFR_AMD, 0x0050, fixup_use_secsi, NULL, },
224         { CFI_MFR_AMD, 0x0053, fixup_use_secsi, NULL, },
225         { CFI_MFR_AMD, 0x0055, fixup_use_secsi, NULL, },
226         { CFI_MFR_AMD, 0x0056, fixup_use_secsi, NULL, },
227         { CFI_MFR_AMD, 0x005C, fixup_use_secsi, NULL, },
228         { CFI_MFR_AMD, 0x005F, fixup_use_secsi, NULL, },
229 #if !FORCE_WORD_WRITE
230         { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
231 #endif
232         { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
233         { 0, 0, NULL, NULL }
234 };
235 static struct cfi_fixup jedec_fixup_table[] = {
236         { MANUFACTURER_SST, SST49LF004B, fixup_use_fwh_lock, NULL, },
237         { MANUFACTURER_SST, SST49LF040B, fixup_use_fwh_lock, NULL, },
238         { MANUFACTURER_SST, SST49LF008A, fixup_use_fwh_lock, NULL, },
239         { 0, 0, NULL, NULL }
240 };
241
242 static struct cfi_fixup fixup_table[] = {
243         /* The CFI vendor ids and the JEDEC vendor IDs appear
244          * to be common.  It is like the devices id's are as
245          * well.  This table is to pick all cases where
246          * we know that is the case.
247          */
248         { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_erase_chip, NULL },
249         { CFI_MFR_ATMEL, AT49BV6416, fixup_use_atmel_lock, NULL },
250         { 0, 0, NULL, NULL }
251 };
252
253
254 struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
255 {
256         struct cfi_private *cfi = map->fldrv_priv;
257         struct mtd_info *mtd;
258         int i;
259
260         mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
261         if (!mtd) {
262                 printk(KERN_WARNING "Failed to allocate memory for MTD device\n");
263                 return NULL;
264         }
265         mtd->priv = map;
266         mtd->type = MTD_NORFLASH;
267
268         /* Fill in the default mtd operations */
269         mtd->erase   = cfi_amdstd_erase_varsize;
270         mtd->write   = cfi_amdstd_write_words;
271         mtd->read    = cfi_amdstd_read;
272         mtd->sync    = cfi_amdstd_sync;
273         mtd->suspend = cfi_amdstd_suspend;
274         mtd->resume  = cfi_amdstd_resume;
275         mtd->flags   = MTD_CAP_NORFLASH;
276         mtd->name    = map->name;
277         mtd->writesize = 1;
278
279         if (cfi->cfi_mode==CFI_MODE_CFI){
280                 unsigned char bootloc;
281                 /*
282                  * It's a real CFI chip, not one for which the probe
283                  * routine faked a CFI structure. So we read the feature
284                  * table from it.
285                  */
286                 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
287                 struct cfi_pri_amdstd *extp;
288
289                 extp = (struct cfi_pri_amdstd*)cfi_read_pri(map, adr, sizeof(*extp), "Amd/Fujitsu");
290                 if (!extp) {
291                         kfree(mtd);
292                         return NULL;
293                 }
294
295                 if (extp->MajorVersion != '1' ||
296                     (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
297                         printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "
298                                "version %c.%c.\n",  extp->MajorVersion,
299                                extp->MinorVersion);
300                         kfree(extp);
301                         kfree(mtd);
302                         return NULL;
303                 }
304
305                 /* Install our own private info structure */
306                 cfi->cmdset_priv = extp;
307
308                 /* Apply cfi device specific fixups */
309                 cfi_fixup(mtd, cfi_fixup_table);
310
311 #ifdef DEBUG_CFI_FEATURES
312                 /* Tell the user about it in lots of lovely detail */
313                 cfi_tell_features(extp);
314 #endif
315
316                 bootloc = extp->TopBottom;
317                 if ((bootloc != 2) && (bootloc != 3)) {
318                         printk(KERN_WARNING "%s: CFI does not contain boot "
319                                "bank location. Assuming top.\n", map->name);
320                         bootloc = 2;
321                 }
322
323                 if (bootloc == 3 && cfi->cfiq->NumEraseRegions > 1) {
324                         printk(KERN_WARNING "%s: Swapping erase regions for broken CFI table.\n", map->name);
325
326                         for (i=0; i<cfi->cfiq->NumEraseRegions / 2; i++) {
327                                 int j = (cfi->cfiq->NumEraseRegions-1)-i;
328                                 __u32 swap;
329
330                                 swap = cfi->cfiq->EraseRegionInfo[i];
331                                 cfi->cfiq->EraseRegionInfo[i] = cfi->cfiq->EraseRegionInfo[j];
332                                 cfi->cfiq->EraseRegionInfo[j] = swap;
333                         }
334                 }
335                 /* Set the default CFI lock/unlock addresses */
336                 cfi->addr_unlock1 = 0x555;
337                 cfi->addr_unlock2 = 0x2aa;
338                 /* Modify the unlock address if we are in compatibility mode */
339                 if (    /* x16 in x8 mode */
340                         ((cfi->device_type == CFI_DEVICETYPE_X8) &&
341                                 (cfi->cfiq->InterfaceDesc == 2)) ||
342                         /* x32 in x16 mode */
343                         ((cfi->device_type == CFI_DEVICETYPE_X16) &&
344                                 (cfi->cfiq->InterfaceDesc == 4)))
345                 {
346                         cfi->addr_unlock1 = 0xaaa;
347                         cfi->addr_unlock2 = 0x555;
348                 }
349
350         } /* CFI mode */
351         else if (cfi->cfi_mode == CFI_MODE_JEDEC) {
352                 /* Apply jedec specific fixups */
353                 cfi_fixup(mtd, jedec_fixup_table);
354         }
355         /* Apply generic fixups */
356         cfi_fixup(mtd, fixup_table);
357
358         for (i=0; i< cfi->numchips; i++) {
359                 cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp;
360                 cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp;
361                 cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp;
362         }
363
364         map->fldrv = &cfi_amdstd_chipdrv;
365
366         return cfi_amdstd_setup(mtd);
367 }
368 EXPORT_SYMBOL_GPL(cfi_cmdset_0002);
369
370 static struct mtd_info *cfi_amdstd_setup(struct mtd_info *mtd)
371 {
372         struct map_info *map = mtd->priv;
373         struct cfi_private *cfi = map->fldrv_priv;
374         unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
375         unsigned long offset = 0;
376         int i,j;
377
378         printk(KERN_NOTICE "number of %s chips: %d\n",
379                (cfi->cfi_mode == CFI_MODE_CFI)?"CFI":"JEDEC",cfi->numchips);
380         /* Select the correct geometry setup */
381         mtd->size = devsize * cfi->numchips;
382
383         mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
384         mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info)
385                                     * mtd->numeraseregions, GFP_KERNEL);
386         if (!mtd->eraseregions) {
387                 printk(KERN_WARNING "Failed to allocate memory for MTD erase region info\n");
388                 goto setup_err;
389         }
390
391         for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
392                 unsigned long ernum, ersize;
393                 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
394                 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
395
396                 if (mtd->erasesize < ersize) {
397                         mtd->erasesize = ersize;
398                 }
399                 for (j=0; j<cfi->numchips; j++) {
400                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
401                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
402                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
403                 }
404                 offset += (ersize * ernum);
405         }
406         if (offset != devsize) {
407                 /* Argh */
408                 printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);
409                 goto setup_err;
410         }
411 #if 0
412         // debug
413         for (i=0; i<mtd->numeraseregions;i++){
414                 printk("%d: offset=0x%x,size=0x%x,blocks=%d\n",
415                        i,mtd->eraseregions[i].offset,
416                        mtd->eraseregions[i].erasesize,
417                        mtd->eraseregions[i].numblocks);
418         }
419 #endif
420
421         /* FIXME: erase-suspend-program is broken.  See
422            http://lists.infradead.org/pipermail/linux-mtd/2003-December/009001.html */
423         printk(KERN_NOTICE "cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness.\n");
424
425         __module_get(THIS_MODULE);
426         return mtd;
427
428  setup_err:
429         if(mtd) {
430                 kfree(mtd->eraseregions);
431                 kfree(mtd);
432         }
433         kfree(cfi->cmdset_priv);
434         kfree(cfi->cfiq);
435         return NULL;
436 }
437
438 /*
439  * Return true if the chip is ready.
440  *
441  * Ready is one of: read mode, query mode, erase-suspend-read mode (in any
442  * non-suspended sector) and is indicated by no toggle bits toggling.
443  *
444  * Note that anything more complicated than checking if no bits are toggling
445  * (including checking DQ5 for an error status) is tricky to get working
446  * correctly and is therefore not done  (particulary with interleaved chips
447  * as each chip must be checked independantly of the others).
448  */
449 static int __xipram chip_ready(struct map_info *map, unsigned long addr)
450 {
451         map_word d, t;
452
453         d = map_read(map, addr);
454         t = map_read(map, addr);
455
456         return map_word_equal(map, d, t);
457 }
458
459 /*
460  * Return true if the chip is ready and has the correct value.
461  *
462  * Ready is one of: read mode, query mode, erase-suspend-read mode (in any
463  * non-suspended sector) and it is indicated by no bits toggling.
464  *
465  * Error are indicated by toggling bits or bits held with the wrong value,
466  * or with bits toggling.
467  *
468  * Note that anything more complicated than checking if no bits are toggling
469  * (including checking DQ5 for an error status) is tricky to get working
470  * correctly and is therefore not done  (particulary with interleaved chips
471  * as each chip must be checked independantly of the others).
472  *
473  */
474 static int __xipram chip_good(struct map_info *map, unsigned long addr, map_word expected)
475 {
476         map_word oldd, curd;
477
478         oldd = map_read(map, addr);
479         curd = map_read(map, addr);
480
481         return  map_word_equal(map, oldd, curd) &&
482                 map_word_equal(map, curd, expected);
483 }
484
485 static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode)
486 {
487         DECLARE_WAITQUEUE(wait, current);
488         struct cfi_private *cfi = map->fldrv_priv;
489         unsigned long timeo;
490         struct cfi_pri_amdstd *cfip = (struct cfi_pri_amdstd *)cfi->cmdset_priv;
491
492  resettime:
493         timeo = jiffies + HZ;
494  retry:
495         switch (chip->state) {
496
497         case FL_STATUS:
498                 for (;;) {
499                         if (chip_ready(map, adr))
500                                 break;
501
502                         if (time_after(jiffies, timeo)) {
503                                 printk(KERN_ERR "Waiting for chip to be ready timed out.\n");
504                                 spin_unlock(chip->mutex);
505                                 return -EIO;
506                         }
507                         spin_unlock(chip->mutex);
508                         cfi_udelay(1);
509                         spin_lock(chip->mutex);
510                         /* Someone else might have been playing with it. */
511                         goto retry;
512                 }
513
514         case FL_READY:
515         case FL_CFI_QUERY:
516         case FL_JEDEC_QUERY:
517                 return 0;
518
519         case FL_ERASING:
520                 if (mode == FL_WRITING) /* FIXME: Erase-suspend-program appears broken. */
521                         goto sleep;
522
523                 if (!(   mode == FL_READY
524                       || mode == FL_POINT
525                       || !cfip
526                       || (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))
527                       || (mode == FL_WRITING && (cfip->EraseSuspend & 0x1)
528                     )))
529                         goto sleep;
530
531                 /* We could check to see if we're trying to access the sector
532                  * that is currently being erased. However, no user will try
533                  * anything like that so we just wait for the timeout. */
534
535                 /* Erase suspend */
536                 /* It's harmless to issue the Erase-Suspend and Erase-Resume
537                  * commands when the erase algorithm isn't in progress. */
538                 map_write(map, CMD(0xB0), chip->in_progress_block_addr);
539                 chip->oldstate = FL_ERASING;
540                 chip->state = FL_ERASE_SUSPENDING;
541                 chip->erase_suspended = 1;
542                 for (;;) {
543                         if (chip_ready(map, adr))
544                                 break;
545
546                         if (time_after(jiffies, timeo)) {
547                                 /* Should have suspended the erase by now.
548                                  * Send an Erase-Resume command as either
549                                  * there was an error (so leave the erase
550                                  * routine to recover from it) or we trying to
551                                  * use the erase-in-progress sector. */
552                                 map_write(map, CMD(0x30), chip->in_progress_block_addr);
553                                 chip->state = FL_ERASING;
554                                 chip->oldstate = FL_READY;
555                                 printk(KERN_ERR "MTD %s(): chip not ready after erase suspend\n", __func__);
556                                 return -EIO;
557                         }
558
559                         spin_unlock(chip->mutex);
560                         cfi_udelay(1);
561                         spin_lock(chip->mutex);
562                         /* Nobody will touch it while it's in state FL_ERASE_SUSPENDING.
563                            So we can just loop here. */
564                 }
565                 chip->state = FL_READY;
566                 return 0;
567
568         case FL_XIP_WHILE_ERASING:
569                 if (mode != FL_READY && mode != FL_POINT &&
570                     (!cfip || !(cfip->EraseSuspend&2)))
571                         goto sleep;
572                 chip->oldstate = chip->state;
573                 chip->state = FL_READY;
574                 return 0;
575
576         case FL_POINT:
577                 /* Only if there's no operation suspended... */
578                 if (mode == FL_READY && chip->oldstate == FL_READY)
579                         return 0;
580
581         default:
582         sleep:
583                 set_current_state(TASK_UNINTERRUPTIBLE);
584                 add_wait_queue(&chip->wq, &wait);
585                 spin_unlock(chip->mutex);
586                 schedule();
587                 remove_wait_queue(&chip->wq, &wait);
588                 spin_lock(chip->mutex);
589                 goto resettime;
590         }
591 }
592
593
594 static void put_chip(struct map_info *map, struct flchip *chip, unsigned long adr)
595 {
596         struct cfi_private *cfi = map->fldrv_priv;
597
598         switch(chip->oldstate) {
599         case FL_ERASING:
600                 chip->state = chip->oldstate;
601                 map_write(map, CMD(0x30), chip->in_progress_block_addr);
602                 chip->oldstate = FL_READY;
603                 chip->state = FL_ERASING;
604                 break;
605
606         case FL_XIP_WHILE_ERASING:
607                 chip->state = chip->oldstate;
608                 chip->oldstate = FL_READY;
609                 break;
610
611         case FL_READY:
612         case FL_STATUS:
613                 /* We should really make set_vpp() count, rather than doing this */
614                 DISABLE_VPP(map);
615                 break;
616         default:
617                 printk(KERN_ERR "MTD: put_chip() called with oldstate %d!!\n", chip->oldstate);
618         }
619         wake_up(&chip->wq);
620 }
621
622 #ifdef CONFIG_MTD_XIP
623
624 /*
625  * No interrupt what so ever can be serviced while the flash isn't in array
626  * mode.  This is ensured by the xip_disable() and xip_enable() functions
627  * enclosing any code path where the flash is known not to be in array mode.
628  * And within a XIP disabled code path, only functions marked with __xipram
629  * may be called and nothing else (it's a good thing to inspect generated
630  * assembly to make sure inline functions were actually inlined and that gcc
631  * didn't emit calls to its own support functions). Also configuring MTD CFI
632  * support to a single buswidth and a single interleave is also recommended.
633  */
634
635 static void xip_disable(struct map_info *map, struct flchip *chip,
636                         unsigned long adr)
637 {
638         /* TODO: chips with no XIP use should ignore and return */
639         (void) map_read(map, adr); /* ensure mmu mapping is up to date */
640         local_irq_disable();
641 }
642
643 static void __xipram xip_enable(struct map_info *map, struct flchip *chip,
644                                 unsigned long adr)
645 {
646         struct cfi_private *cfi = map->fldrv_priv;
647
648         if (chip->state != FL_POINT && chip->state != FL_READY) {
649                 map_write(map, CMD(0xf0), adr);
650                 chip->state = FL_READY;
651         }
652         (void) map_read(map, adr);
653         xip_iprefetch();
654         local_irq_enable();
655 }
656
657 /*
658  * When a delay is required for the flash operation to complete, the
659  * xip_udelay() function is polling for both the given timeout and pending
660  * (but still masked) hardware interrupts.  Whenever there is an interrupt
661  * pending then the flash erase operation is suspended, array mode restored
662  * and interrupts unmasked.  Task scheduling might also happen at that
663  * point.  The CPU eventually returns from the interrupt or the call to
664  * schedule() and the suspended flash operation is resumed for the remaining
665  * of the delay period.
666  *
667  * Warning: this function _will_ fool interrupt latency tracing tools.
668  */
669
670 static void __xipram xip_udelay(struct map_info *map, struct flchip *chip,
671                                 unsigned long adr, int usec)
672 {
673         struct cfi_private *cfi = map->fldrv_priv;
674         struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
675         map_word status, OK = CMD(0x80);
676         unsigned long suspended, start = xip_currtime();
677         flstate_t oldstate;
678
679         do {
680                 cpu_relax();
681                 if (xip_irqpending() && extp &&
682                     ((chip->state == FL_ERASING && (extp->EraseSuspend & 2))) &&
683                     (cfi_interleave_is_1(cfi) || chip->oldstate == FL_READY)) {
684                         /*
685                          * Let's suspend the erase operation when supported.
686                          * Note that we currently don't try to suspend
687                          * interleaved chips if there is already another
688                          * operation suspended (imagine what happens
689                          * when one chip was already done with the current
690                          * operation while another chip suspended it, then
691                          * we resume the whole thing at once).  Yes, it
692                          * can happen!
693                          */
694                         map_write(map, CMD(0xb0), adr);
695                         usec -= xip_elapsed_since(start);
696                         suspended = xip_currtime();
697                         do {
698                                 if (xip_elapsed_since(suspended) > 100000) {
699                                         /*
700                                          * The chip doesn't want to suspend
701                                          * after waiting for 100 msecs.
702                                          * This is a critical error but there
703                                          * is not much we can do here.
704                                          */
705                                         return;
706                                 }
707                                 status = map_read(map, adr);
708                         } while (!map_word_andequal(map, status, OK, OK));
709
710                         /* Suspend succeeded */
711                         oldstate = chip->state;
712                         if (!map_word_bitsset(map, status, CMD(0x40)))
713                                 break;
714                         chip->state = FL_XIP_WHILE_ERASING;
715                         chip->erase_suspended = 1;
716                         map_write(map, CMD(0xf0), adr);
717                         (void) map_read(map, adr);
718                         asm volatile (".rep 8; nop; .endr");
719                         local_irq_enable();
720                         spin_unlock(chip->mutex);
721                         asm volatile (".rep 8; nop; .endr");
722                         cond_resched();
723
724                         /*
725                          * We're back.  However someone else might have
726                          * decided to go write to the chip if we are in
727                          * a suspended erase state.  If so let's wait
728                          * until it's done.
729                          */
730                         spin_lock(chip->mutex);
731                         while (chip->state != FL_XIP_WHILE_ERASING) {
732                                 DECLARE_WAITQUEUE(wait, current);
733                                 set_current_state(TASK_UNINTERRUPTIBLE);
734                                 add_wait_queue(&chip->wq, &wait);
735                                 spin_unlock(chip->mutex);
736                                 schedule();
737                                 remove_wait_queue(&chip->wq, &wait);
738                                 spin_lock(chip->mutex);
739                         }
740                         /* Disallow XIP again */
741                         local_irq_disable();
742
743                         /* Resume the write or erase operation */
744                         map_write(map, CMD(0x30), adr);
745                         chip->state = oldstate;
746                         start = xip_currtime();
747                 } else if (usec >= 1000000/HZ) {
748                         /*
749                          * Try to save on CPU power when waiting delay
750                          * is at least a system timer tick period.
751                          * No need to be extremely accurate here.
752                          */
753                         xip_cpu_idle();
754                 }
755                 status = map_read(map, adr);
756         } while (!map_word_andequal(map, status, OK, OK)
757                  && xip_elapsed_since(start) < usec);
758 }
759
760 #define UDELAY(map, chip, adr, usec)  xip_udelay(map, chip, adr, usec)
761
762 /*
763  * The INVALIDATE_CACHED_RANGE() macro is normally used in parallel while
764  * the flash is actively programming or erasing since we have to poll for
765  * the operation to complete anyway.  We can't do that in a generic way with
766  * a XIP setup so do it before the actual flash operation in this case
767  * and stub it out from INVALIDATE_CACHE_UDELAY.
768  */
769 #define XIP_INVAL_CACHED_RANGE(map, from, size)  \
770         INVALIDATE_CACHED_RANGE(map, from, size)
771
772 #define INVALIDATE_CACHE_UDELAY(map, chip, adr, len, usec)  \
773         UDELAY(map, chip, adr, usec)
774
775 /*
776  * Extra notes:
777  *
778  * Activating this XIP support changes the way the code works a bit.  For
779  * example the code to suspend the current process when concurrent access
780  * happens is never executed because xip_udelay() will always return with the
781  * same chip state as it was entered with.  This is why there is no care for
782  * the presence of add_wait_queue() or schedule() calls from within a couple
783  * xip_disable()'d  areas of code, like in do_erase_oneblock for example.
784  * The queueing and scheduling are always happening within xip_udelay().
785  *
786  * Similarly, get_chip() and put_chip() just happen to always be executed
787  * with chip->state set to FL_READY (or FL_XIP_WHILE_*) where flash state
788  * is in array mode, therefore never executing many cases therein and not
789  * causing any problem with XIP.
790  */
791
792 #else
793
794 #define xip_disable(map, chip, adr)
795 #define xip_enable(map, chip, adr)
796 #define XIP_INVAL_CACHED_RANGE(x...)
797
798 #define UDELAY(map, chip, adr, usec)  \
799 do {  \
800         spin_unlock(chip->mutex);  \
801         cfi_udelay(usec);  \
802         spin_lock(chip->mutex);  \
803 } while (0)
804
805 #define INVALIDATE_CACHE_UDELAY(map, chip, adr, len, usec)  \
806 do {  \
807         spin_unlock(chip->mutex);  \
808         INVALIDATE_CACHED_RANGE(map, adr, len);  \
809         cfi_udelay(usec);  \
810         spin_lock(chip->mutex);  \
811 } while (0)
812
813 #endif
814
815 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
816 {
817         unsigned long cmd_addr;
818         struct cfi_private *cfi = map->fldrv_priv;
819         int ret;
820
821         adr += chip->start;
822
823         /* Ensure cmd read/writes are aligned. */
824         cmd_addr = adr & ~(map_bankwidth(map)-1);
825
826         spin_lock(chip->mutex);
827         ret = get_chip(map, chip, cmd_addr, FL_READY);
828         if (ret) {
829                 spin_unlock(chip->mutex);
830                 return ret;
831         }
832
833         if (chip->state != FL_POINT && chip->state != FL_READY) {
834                 map_write(map, CMD(0xf0), cmd_addr);
835                 chip->state = FL_READY;
836         }
837
838         map_copy_from(map, buf, adr, len);
839
840         put_chip(map, chip, cmd_addr);
841
842         spin_unlock(chip->mutex);
843         return 0;
844 }
845
846
847 static int cfi_amdstd_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
848 {
849         struct map_info *map = mtd->priv;
850         struct cfi_private *cfi = map->fldrv_priv;
851         unsigned long ofs;
852         int chipnum;
853         int ret = 0;
854
855         /* ofs: offset within the first chip that the first read should start */
856
857         chipnum = (from >> cfi->chipshift);
858         ofs = from - (chipnum <<  cfi->chipshift);
859
860
861         *retlen = 0;
862
863         while (len) {
864                 unsigned long thislen;
865
866                 if (chipnum >= cfi->numchips)
867                         break;
868
869                 if ((len + ofs -1) >> cfi->chipshift)
870                         thislen = (1<<cfi->chipshift) - ofs;
871                 else
872                         thislen = len;
873
874                 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
875                 if (ret)
876                         break;
877
878                 *retlen += thislen;
879                 len -= thislen;
880                 buf += thislen;
881
882                 ofs = 0;
883                 chipnum++;
884         }
885         return ret;
886 }
887
888
889 static inline int do_read_secsi_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
890 {
891         DECLARE_WAITQUEUE(wait, current);
892         unsigned long timeo = jiffies + HZ;
893         struct cfi_private *cfi = map->fldrv_priv;
894
895  retry:
896         spin_lock(chip->mutex);
897
898         if (chip->state != FL_READY){
899 #if 0
900                 printk(KERN_DEBUG "Waiting for chip to read, status = %d\n", chip->state);
901 #endif
902                 set_current_state(TASK_UNINTERRUPTIBLE);
903                 add_wait_queue(&chip->wq, &wait);
904
905                 spin_unlock(chip->mutex);
906
907                 schedule();
908                 remove_wait_queue(&chip->wq, &wait);
909 #if 0
910                 if(signal_pending(current))
911                         return -EINTR;
912 #endif
913                 timeo = jiffies + HZ;
914
915                 goto retry;
916         }
917
918         adr += chip->start;
919
920         chip->state = FL_READY;
921
922         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
923         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
924         cfi_send_gen_cmd(0x88, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
925
926         map_copy_from(map, buf, adr, len);
927
928         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
929         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
930         cfi_send_gen_cmd(0x90, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
931         cfi_send_gen_cmd(0x00, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
932
933         wake_up(&chip->wq);
934         spin_unlock(chip->mutex);
935
936         return 0;
937 }
938
939 static int cfi_amdstd_secsi_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
940 {
941         struct map_info *map = mtd->priv;
942         struct cfi_private *cfi = map->fldrv_priv;
943         unsigned long ofs;
944         int chipnum;
945         int ret = 0;
946
947
948         /* ofs: offset within the first chip that the first read should start */
949
950         /* 8 secsi bytes per chip */
951         chipnum=from>>3;
952         ofs=from & 7;
953
954
955         *retlen = 0;
956
957         while (len) {
958                 unsigned long thislen;
959
960                 if (chipnum >= cfi->numchips)
961                         break;
962
963                 if ((len + ofs -1) >> 3)
964                         thislen = (1<<3) - ofs;
965                 else
966                         thislen = len;
967
968                 ret = do_read_secsi_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
969                 if (ret)
970                         break;
971
972                 *retlen += thislen;
973                 len -= thislen;
974                 buf += thislen;
975
976                 ofs = 0;
977                 chipnum++;
978         }
979         return ret;
980 }
981
982
983 static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, unsigned long adr, map_word datum)
984 {
985         struct cfi_private *cfi = map->fldrv_priv;
986         unsigned long timeo = jiffies + HZ;
987         /*
988          * We use a 1ms + 1 jiffies generic timeout for writes (most devices
989          * have a max write time of a few hundreds usec). However, we should
990          * use the maximum timeout value given by the chip at probe time
991          * instead.  Unfortunately, struct flchip does have a field for
992          * maximum timeout, only for typical which can be far too short
993          * depending of the conditions.  The ' + 1' is to avoid having a
994          * timeout of 0 jiffies if HZ is smaller than 1000.
995          */
996         unsigned long uWriteTimeout = ( HZ / 1000 ) + 1;
997         int ret = 0;
998         map_word oldd;
999         int retry_cnt = 0;
1000
1001         adr += chip->start;
1002
1003         spin_lock(chip->mutex);
1004         ret = get_chip(map, chip, adr, FL_WRITING);
1005         if (ret) {
1006                 spin_unlock(chip->mutex);
1007                 return ret;
1008         }
1009
1010         DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): WRITE 0x%.8lx(0x%.8lx)\n",
1011                __func__, adr, datum.x[0] );
1012
1013         /*
1014          * Check for a NOP for the case when the datum to write is already
1015          * present - it saves time and works around buggy chips that corrupt
1016          * data at other locations when 0xff is written to a location that
1017          * already contains 0xff.
1018          */
1019         oldd = map_read(map, adr);
1020         if (map_word_equal(map, oldd, datum)) {
1021                 DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): NOP\n",
1022                        __func__);
1023                 goto op_done;
1024         }
1025
1026         XIP_INVAL_CACHED_RANGE(map, adr, map_bankwidth(map));
1027         ENABLE_VPP(map);
1028         xip_disable(map, chip, adr);
1029  retry:
1030         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1031         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1032         cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1033         map_write(map, datum, adr);
1034         chip->state = FL_WRITING;
1035
1036         INVALIDATE_CACHE_UDELAY(map, chip,
1037                                 adr, map_bankwidth(map),
1038                                 chip->word_write_time);
1039
1040         /* See comment above for timeout value. */
1041         timeo = jiffies + uWriteTimeout;
1042         for (;;) {
1043                 if (chip->state != FL_WRITING) {
1044                         /* Someone's suspended the write. Sleep */
1045                         DECLARE_WAITQUEUE(wait, current);
1046
1047                         set_current_state(TASK_UNINTERRUPTIBLE);
1048                         add_wait_queue(&chip->wq, &wait);
1049                         spin_unlock(chip->mutex);
1050                         schedule();
1051                         remove_wait_queue(&chip->wq, &wait);
1052                         timeo = jiffies + (HZ / 2); /* FIXME */
1053                         spin_lock(chip->mutex);
1054                         continue;
1055                 }
1056
1057                 if (time_after(jiffies, timeo) && !chip_ready(map, adr)){
1058                         xip_enable(map, chip, adr);
1059                         printk(KERN_WARNING "MTD %s(): software timeout\n", __func__);
1060                         xip_disable(map, chip, adr);
1061                         break;
1062                 }
1063
1064                 if (chip_ready(map, adr))
1065                         break;
1066
1067                 /* Latency issues. Drop the lock, wait a while and retry */
1068                 UDELAY(map, chip, adr, 1);
1069         }
1070         /* Did we succeed? */
1071         if (!chip_good(map, adr, datum)) {
1072                 /* reset on all failures. */
1073                 map_write( map, CMD(0xF0), chip->start );
1074                 /* FIXME - should have reset delay before continuing */
1075
1076                 if (++retry_cnt <= MAX_WORD_RETRIES)
1077                         goto retry;
1078
1079                 ret = -EIO;
1080         }
1081         xip_enable(map, chip, adr);
1082  op_done:
1083         chip->state = FL_READY;
1084         put_chip(map, chip, adr);
1085         spin_unlock(chip->mutex);
1086
1087         return ret;
1088 }
1089
1090
1091 static int cfi_amdstd_write_words(struct mtd_info *mtd, loff_t to, size_t len,
1092                                   size_t *retlen, const u_char *buf)
1093 {
1094         struct map_info *map = mtd->priv;
1095         struct cfi_private *cfi = map->fldrv_priv;
1096         int ret = 0;
1097         int chipnum;
1098         unsigned long ofs, chipstart;
1099         DECLARE_WAITQUEUE(wait, current);
1100
1101         *retlen = 0;
1102         if (!len)
1103                 return 0;
1104
1105         chipnum = to >> cfi->chipshift;
1106         ofs = to  - (chipnum << cfi->chipshift);
1107         chipstart = cfi->chips[chipnum].start;
1108
1109         /* If it's not bus-aligned, do the first byte write */
1110         if (ofs & (map_bankwidth(map)-1)) {
1111                 unsigned long bus_ofs = ofs & ~(map_bankwidth(map)-1);
1112                 int i = ofs - bus_ofs;
1113                 int n = 0;
1114                 map_word tmp_buf;
1115
1116  retry:
1117                 spin_lock(cfi->chips[chipnum].mutex);
1118
1119                 if (cfi->chips[chipnum].state != FL_READY) {
1120 #if 0
1121                         printk(KERN_DEBUG "Waiting for chip to write, status = %d\n", cfi->chips[chipnum].state);
1122 #endif
1123                         set_current_state(TASK_UNINTERRUPTIBLE);
1124                         add_wait_queue(&cfi->chips[chipnum].wq, &wait);
1125
1126                         spin_unlock(cfi->chips[chipnum].mutex);
1127
1128                         schedule();
1129                         remove_wait_queue(&cfi->chips[chipnum].wq, &wait);
1130 #if 0
1131                         if(signal_pending(current))
1132                                 return -EINTR;
1133 #endif
1134                         goto retry;
1135                 }
1136
1137                 /* Load 'tmp_buf' with old contents of flash */
1138                 tmp_buf = map_read(map, bus_ofs+chipstart);
1139
1140                 spin_unlock(cfi->chips[chipnum].mutex);
1141
1142                 /* Number of bytes to copy from buffer */
1143                 n = min_t(int, len, map_bankwidth(map)-i);
1144
1145                 tmp_buf = map_word_load_partial(map, tmp_buf, buf, i, n);
1146
1147                 ret = do_write_oneword(map, &cfi->chips[chipnum],
1148                                        bus_ofs, tmp_buf);
1149                 if (ret)
1150                         return ret;
1151
1152                 ofs += n;
1153                 buf += n;
1154                 (*retlen) += n;
1155                 len -= n;
1156
1157                 if (ofs >> cfi->chipshift) {
1158                         chipnum ++;
1159                         ofs = 0;
1160                         if (chipnum == cfi->numchips)
1161                                 return 0;
1162                 }
1163         }
1164
1165         /* We are now aligned, write as much as possible */
1166         while(len >= map_bankwidth(map)) {
1167                 map_word datum;
1168
1169                 datum = map_word_load(map, buf);
1170
1171                 ret = do_write_oneword(map, &cfi->chips[chipnum],
1172                                        ofs, datum);
1173                 if (ret)
1174                         return ret;
1175
1176                 ofs += map_bankwidth(map);
1177                 buf += map_bankwidth(map);
1178                 (*retlen) += map_bankwidth(map);
1179                 len -= map_bankwidth(map);
1180
1181                 if (ofs >> cfi->chipshift) {
1182                         chipnum ++;
1183                         ofs = 0;
1184                         if (chipnum == cfi->numchips)
1185                                 return 0;
1186                         chipstart = cfi->chips[chipnum].start;
1187                 }
1188         }
1189
1190         /* Write the trailing bytes if any */
1191         if (len & (map_bankwidth(map)-1)) {
1192                 map_word tmp_buf;
1193
1194  retry1:
1195                 spin_lock(cfi->chips[chipnum].mutex);
1196
1197                 if (cfi->chips[chipnum].state != FL_READY) {
1198 #if 0
1199                         printk(KERN_DEBUG "Waiting for chip to write, status = %d\n", cfi->chips[chipnum].state);
1200 #endif
1201                         set_current_state(TASK_UNINTERRUPTIBLE);
1202                         add_wait_queue(&cfi->chips[chipnum].wq, &wait);
1203
1204                         spin_unlock(cfi->chips[chipnum].mutex);
1205
1206                         schedule();
1207                         remove_wait_queue(&cfi->chips[chipnum].wq, &wait);
1208 #if 0
1209                         if(signal_pending(current))
1210                                 return -EINTR;
1211 #endif
1212                         goto retry1;
1213                 }
1214
1215                 tmp_buf = map_read(map, ofs + chipstart);
1216
1217                 spin_unlock(cfi->chips[chipnum].mutex);
1218
1219                 tmp_buf = map_word_load_partial(map, tmp_buf, buf, 0, len);
1220
1221                 ret = do_write_oneword(map, &cfi->chips[chipnum],
1222                                 ofs, tmp_buf);
1223                 if (ret)
1224                         return ret;
1225
1226                 (*retlen) += len;
1227         }
1228
1229         return 0;
1230 }
1231
1232
1233 /*
1234  * FIXME: interleaved mode not tested, and probably not supported!
1235  */
1236 static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
1237                                     unsigned long adr, const u_char *buf,
1238                                     int len)
1239 {
1240         struct cfi_private *cfi = map->fldrv_priv;
1241         unsigned long timeo = jiffies + HZ;
1242         /* see comments in do_write_oneword() regarding uWriteTimeo. */
1243         unsigned long uWriteTimeout = ( HZ / 1000 ) + 1;
1244         int ret = -EIO;
1245         unsigned long cmd_adr;
1246         int z, words;
1247         map_word datum;
1248
1249         adr += chip->start;
1250         cmd_adr = adr;
1251
1252         spin_lock(chip->mutex);
1253         ret = get_chip(map, chip, adr, FL_WRITING);
1254         if (ret) {
1255                 spin_unlock(chip->mutex);
1256                 return ret;
1257         }
1258
1259         datum = map_word_load(map, buf);
1260
1261         DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): WRITE 0x%.8lx(0x%.8lx)\n",
1262                __func__, adr, datum.x[0] );
1263
1264         XIP_INVAL_CACHED_RANGE(map, adr, len);
1265         ENABLE_VPP(map);
1266         xip_disable(map, chip, cmd_adr);
1267
1268         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1269         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1270         //cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1271
1272         /* Write Buffer Load */
1273         map_write(map, CMD(0x25), cmd_adr);
1274
1275         chip->state = FL_WRITING_TO_BUFFER;
1276
1277         /* Write length of data to come */
1278         words = len / map_bankwidth(map);
1279         map_write(map, CMD(words - 1), cmd_adr);
1280         /* Write data */
1281         z = 0;
1282         while(z < words * map_bankwidth(map)) {
1283                 datum = map_word_load(map, buf);
1284                 map_write(map, datum, adr + z);
1285
1286                 z += map_bankwidth(map);
1287                 buf += map_bankwidth(map);
1288         }
1289         z -= map_bankwidth(map);
1290
1291         adr += z;
1292
1293         /* Write Buffer Program Confirm: GO GO GO */
1294         map_write(map, CMD(0x29), cmd_adr);
1295         chip->state = FL_WRITING;
1296
1297         INVALIDATE_CACHE_UDELAY(map, chip,
1298                                 adr, map_bankwidth(map),
1299                                 chip->word_write_time);
1300
1301         timeo = jiffies + uWriteTimeout;
1302
1303         for (;;) {
1304                 if (chip->state != FL_WRITING) {
1305                         /* Someone's suspended the write. Sleep */
1306                         DECLARE_WAITQUEUE(wait, current);
1307
1308                         set_current_state(TASK_UNINTERRUPTIBLE);
1309                         add_wait_queue(&chip->wq, &wait);
1310                         spin_unlock(chip->mutex);
1311                         schedule();
1312                         remove_wait_queue(&chip->wq, &wait);
1313                         timeo = jiffies + (HZ / 2); /* FIXME */
1314                         spin_lock(chip->mutex);
1315                         continue;
1316                 }
1317
1318                 if (time_after(jiffies, timeo) && !chip_ready(map, adr))
1319                         break;
1320
1321                 if (chip_ready(map, adr)) {
1322                         xip_enable(map, chip, adr);
1323                         goto op_done;
1324                 }
1325
1326                 /* Latency issues. Drop the lock, wait a while and retry */
1327                 UDELAY(map, chip, adr, 1);
1328         }
1329
1330         /* reset on all failures. */
1331         map_write( map, CMD(0xF0), chip->start );
1332         xip_enable(map, chip, adr);
1333         /* FIXME - should have reset delay before continuing */
1334
1335         printk(KERN_WARNING "MTD %s(): software timeout\n",
1336                __func__ );
1337
1338         ret = -EIO;
1339  op_done:
1340         chip->state = FL_READY;
1341         put_chip(map, chip, adr);
1342         spin_unlock(chip->mutex);
1343
1344         return ret;
1345 }
1346
1347
1348 static int cfi_amdstd_write_buffers(struct mtd_info *mtd, loff_t to, size_t len,
1349                                     size_t *retlen, const u_char *buf)
1350 {
1351         struct map_info *map = mtd->priv;
1352         struct cfi_private *cfi = map->fldrv_priv;
1353         int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
1354         int ret = 0;
1355         int chipnum;
1356         unsigned long ofs;
1357
1358         *retlen = 0;
1359         if (!len)
1360                 return 0;
1361
1362         chipnum = to >> cfi->chipshift;
1363         ofs = to  - (chipnum << cfi->chipshift);
1364
1365         /* If it's not bus-aligned, do the first word write */
1366         if (ofs & (map_bankwidth(map)-1)) {
1367                 size_t local_len = (-ofs)&(map_bankwidth(map)-1);
1368                 if (local_len > len)
1369                         local_len = len;
1370                 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift),
1371                                              local_len, retlen, buf);
1372                 if (ret)
1373                         return ret;
1374                 ofs += local_len;
1375                 buf += local_len;
1376                 len -= local_len;
1377
1378                 if (ofs >> cfi->chipshift) {
1379                         chipnum ++;
1380                         ofs = 0;
1381                         if (chipnum == cfi->numchips)
1382                                 return 0;
1383                 }
1384         }
1385
1386         /* Write buffer is worth it only if more than one word to write... */
1387         while (len >= map_bankwidth(map) * 2) {
1388                 /* We must not cross write block boundaries */
1389                 int size = wbufsize - (ofs & (wbufsize-1));
1390
1391                 if (size > len)
1392                         size = len;
1393                 if (size % map_bankwidth(map))
1394                         size -= size % map_bankwidth(map);
1395
1396                 ret = do_write_buffer(map, &cfi->chips[chipnum],
1397                                       ofs, buf, size);
1398                 if (ret)
1399                         return ret;
1400
1401                 ofs += size;
1402                 buf += size;
1403                 (*retlen) += size;
1404                 len -= size;
1405
1406                 if (ofs >> cfi->chipshift) {
1407                         chipnum ++;
1408                         ofs = 0;
1409                         if (chipnum == cfi->numchips)
1410                                 return 0;
1411                 }
1412         }
1413
1414         if (len) {
1415                 size_t retlen_dregs = 0;
1416
1417                 ret = cfi_amdstd_write_words(mtd, ofs + (chipnum<<cfi->chipshift),
1418                                              len, &retlen_dregs, buf);
1419
1420                 *retlen += retlen_dregs;
1421                 return ret;
1422         }
1423
1424         return 0;
1425 }
1426
1427
1428 /*
1429  * Handle devices with one erase region, that only implement
1430  * the chip erase command.
1431  */
1432 static int __xipram do_erase_chip(struct map_info *map, struct flchip *chip)
1433 {
1434         struct cfi_private *cfi = map->fldrv_priv;
1435         unsigned long timeo = jiffies + HZ;
1436         unsigned long int adr;
1437         DECLARE_WAITQUEUE(wait, current);
1438         int ret = 0;
1439
1440         adr = cfi->addr_unlock1;
1441
1442         spin_lock(chip->mutex);
1443         ret = get_chip(map, chip, adr, FL_WRITING);
1444         if (ret) {
1445                 spin_unlock(chip->mutex);
1446                 return ret;
1447         }
1448
1449         DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): ERASE 0x%.8lx\n",
1450                __func__, chip->start );
1451
1452         XIP_INVAL_CACHED_RANGE(map, adr, map->size);
1453         ENABLE_VPP(map);
1454         xip_disable(map, chip, adr);
1455
1456         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1457         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1458         cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1459         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1460         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1461         cfi_send_gen_cmd(0x10, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1462
1463         chip->state = FL_ERASING;
1464         chip->erase_suspended = 0;
1465         chip->in_progress_block_addr = adr;
1466
1467         INVALIDATE_CACHE_UDELAY(map, chip,
1468                                 adr, map->size,
1469                                 chip->erase_time*500);
1470
1471         timeo = jiffies + (HZ*20);
1472
1473         for (;;) {
1474                 if (chip->state != FL_ERASING) {
1475                         /* Someone's suspended the erase. Sleep */
1476                         set_current_state(TASK_UNINTERRUPTIBLE);
1477                         add_wait_queue(&chip->wq, &wait);
1478                         spin_unlock(chip->mutex);
1479                         schedule();
1480                         remove_wait_queue(&chip->wq, &wait);
1481                         spin_lock(chip->mutex);
1482                         continue;
1483                 }
1484                 if (chip->erase_suspended) {
1485                         /* This erase was suspended and resumed.
1486                            Adjust the timeout */
1487                         timeo = jiffies + (HZ*20); /* FIXME */
1488                         chip->erase_suspended = 0;
1489                 }
1490
1491                 if (chip_ready(map, adr))
1492                         break;
1493
1494                 if (time_after(jiffies, timeo)) {
1495                         printk(KERN_WARNING "MTD %s(): software timeout\n",
1496                                 __func__ );
1497                         break;
1498                 }
1499
1500                 /* Latency issues. Drop the lock, wait a while and retry */
1501                 UDELAY(map, chip, adr, 1000000/HZ);
1502         }
1503         /* Did we succeed? */
1504         if (!chip_good(map, adr, map_word_ff(map))) {
1505                 /* reset on all failures. */
1506                 map_write( map, CMD(0xF0), chip->start );
1507                 /* FIXME - should have reset delay before continuing */
1508
1509                 ret = -EIO;
1510         }
1511
1512         chip->state = FL_READY;
1513         xip_enable(map, chip, adr);
1514         put_chip(map, chip, adr);
1515         spin_unlock(chip->mutex);
1516
1517         return ret;
1518 }
1519
1520
1521 static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr, int len, void *thunk)
1522 {
1523         struct cfi_private *cfi = map->fldrv_priv;
1524         unsigned long timeo = jiffies + HZ;
1525         DECLARE_WAITQUEUE(wait, current);
1526         int ret = 0;
1527
1528         adr += chip->start;
1529
1530         spin_lock(chip->mutex);
1531         ret = get_chip(map, chip, adr, FL_ERASING);
1532         if (ret) {
1533                 spin_unlock(chip->mutex);
1534                 return ret;
1535         }
1536
1537         DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): ERASE 0x%.8lx\n",
1538                __func__, adr );
1539
1540         XIP_INVAL_CACHED_RANGE(map, adr, len);
1541         ENABLE_VPP(map);
1542         xip_disable(map, chip, adr);
1543
1544         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1545         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1546         cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1547         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
1548         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
1549         map_write(map, CMD(0x30), adr);
1550
1551         chip->state = FL_ERASING;
1552         chip->erase_suspended = 0;
1553         chip->in_progress_block_addr = adr;
1554
1555         INVALIDATE_CACHE_UDELAY(map, chip,
1556                                 adr, len,
1557                                 chip->erase_time*500);
1558
1559         timeo = jiffies + (HZ*20);
1560
1561         for (;;) {
1562                 if (chip->state != FL_ERASING) {
1563                         /* Someone's suspended the erase. Sleep */
1564                         set_current_state(TASK_UNINTERRUPTIBLE);
1565                         add_wait_queue(&chip->wq, &wait);
1566                         spin_unlock(chip->mutex);
1567                         schedule();
1568                         remove_wait_queue(&chip->wq, &wait);
1569                         spin_lock(chip->mutex);
1570                         continue;
1571                 }
1572                 if (chip->erase_suspended) {
1573                         /* This erase was suspended and resumed.
1574                            Adjust the timeout */
1575                         timeo = jiffies + (HZ*20); /* FIXME */
1576                         chip->erase_suspended = 0;
1577                 }
1578
1579                 if (chip_ready(map, adr)) {
1580                         xip_enable(map, chip, adr);
1581                         break;
1582                 }
1583
1584                 if (time_after(jiffies, timeo)) {
1585                         xip_enable(map, chip, adr);
1586                         printk(KERN_WARNING "MTD %s(): software timeout\n",
1587                                 __func__ );
1588                         break;
1589                 }
1590
1591                 /* Latency issues. Drop the lock, wait a while and retry */
1592                 UDELAY(map, chip, adr, 1000000/HZ);
1593         }
1594         /* Did we succeed? */
1595         if (!chip_good(map, adr, map_word_ff(map))) {
1596                 /* reset on all failures. */
1597                 map_write( map, CMD(0xF0), chip->start );
1598                 /* FIXME - should have reset delay before continuing */
1599
1600                 ret = -EIO;
1601         }
1602
1603         chip->state = FL_READY;
1604         put_chip(map, chip, adr);
1605         spin_unlock(chip->mutex);
1606         return ret;
1607 }
1608
1609
1610 int cfi_amdstd_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
1611 {
1612         unsigned long ofs, len;
1613         int ret;
1614
1615         ofs = instr->addr;
1616         len = instr->len;
1617
1618         ret = cfi_varsize_frob(mtd, do_erase_oneblock, ofs, len, NULL);
1619         if (ret)
1620                 return ret;
1621
1622         instr->state = MTD_ERASE_DONE;
1623         mtd_erase_callback(instr);
1624
1625         return 0;
1626 }
1627
1628
1629 static int cfi_amdstd_erase_chip(struct mtd_info *mtd, struct erase_info *instr)
1630 {
1631         struct map_info *map = mtd->priv;
1632         struct cfi_private *cfi = map->fldrv_priv;
1633         int ret = 0;
1634
1635         if (instr->addr != 0)
1636                 return -EINVAL;
1637
1638         if (instr->len != mtd->size)
1639                 return -EINVAL;
1640
1641         ret = do_erase_chip(map, &cfi->chips[0]);
1642         if (ret)
1643                 return ret;
1644
1645         instr->state = MTD_ERASE_DONE;
1646         mtd_erase_callback(instr);
1647
1648         return 0;
1649 }
1650
1651 static int do_atmel_lock(struct map_info *map, struct flchip *chip,
1652                          unsigned long adr, int len, void *thunk)
1653 {
1654         struct cfi_private *cfi = map->fldrv_priv;
1655         int ret;
1656
1657         spin_lock(chip->mutex);
1658         ret = get_chip(map, chip, adr + chip->start, FL_LOCKING);
1659         if (ret)
1660                 goto out_unlock;
1661         chip->state = FL_LOCKING;
1662
1663         DEBUG(MTD_DEBUG_LEVEL3, "MTD %s(): LOCK 0x%08lx len %d\n",
1664               __func__, adr, len);
1665
1666         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1667                          cfi->device_type, NULL);
1668         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1669                          cfi->device_type, NULL);
1670         cfi_send_gen_cmd(0x80, cfi->addr_unlock1, chip->start, map, cfi,
1671                          cfi->device_type, NULL);
1672         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1673                          cfi->device_type, NULL);
1674         cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
1675                          cfi->device_type, NULL);
1676         map_write(map, CMD(0x40), chip->start + adr);
1677
1678         chip->state = FL_READY;
1679         put_chip(map, chip, adr + chip->start);
1680         ret = 0;
1681
1682 out_unlock:
1683         spin_unlock(chip->mutex);
1684         return ret;
1685 }
1686
1687 static int do_atmel_unlock(struct map_info *map, struct flchip *chip,
1688                            unsigned long adr, int len, void *thunk)
1689 {
1690         struct cfi_private *cfi = map->fldrv_priv;
1691         int ret;
1692
1693         spin_lock(chip->mutex);
1694         ret = get_chip(map, chip, adr + chip->start, FL_UNLOCKING);
1695         if (ret)
1696                 goto out_unlock;
1697         chip->state = FL_UNLOCKING;
1698
1699         DEBUG(MTD_DEBUG_LEVEL3, "MTD %s(): LOCK 0x%08lx len %d\n",
1700               __func__, adr, len);
1701
1702         cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
1703                          cfi->device_type, NULL);
1704         map_write(map, CMD(0x70), adr);
1705
1706         chip->state = FL_READY;
1707         put_chip(map, chip, adr + chip->start);
1708         ret = 0;
1709
1710 out_unlock:
1711         spin_unlock(chip->mutex);
1712         return ret;
1713 }
1714
1715 static int cfi_atmel_lock(struct mtd_info *mtd, loff_t ofs, size_t len)
1716 {
1717         return cfi_varsize_frob(mtd, do_atmel_lock, ofs, len, NULL);
1718 }
1719
1720 static int cfi_atmel_unlock(struct mtd_info *mtd, loff_t ofs, size_t len)
1721 {
1722         return cfi_varsize_frob(mtd, do_atmel_unlock, ofs, len, NULL);
1723 }
1724
1725
1726 static void cfi_amdstd_sync (struct mtd_info *mtd)
1727 {
1728         struct map_info *map = mtd->priv;
1729         struct cfi_private *cfi = map->fldrv_priv;
1730         int i;
1731         struct flchip *chip;
1732         int ret = 0;
1733         DECLARE_WAITQUEUE(wait, current);
1734
1735         for (i=0; !ret && i<cfi->numchips; i++) {
1736                 chip = &cfi->chips[i];
1737
1738         retry:
1739                 spin_lock(chip->mutex);
1740
1741                 switch(chip->state) {
1742                 case FL_READY:
1743                 case FL_STATUS:
1744                 case FL_CFI_QUERY:
1745                 case FL_JEDEC_QUERY:
1746                         chip->oldstate = chip->state;
1747                         chip->state = FL_SYNCING;
1748                         /* No need to wake_up() on this state change -
1749                          * as the whole point is that nobody can do anything
1750                          * with the chip now anyway.
1751                          */
1752                 case FL_SYNCING:
1753                         spin_unlock(chip->mutex);
1754                         break;
1755
1756                 default:
1757                         /* Not an idle state */
1758                         add_wait_queue(&chip->wq, &wait);
1759
1760                         spin_unlock(chip->mutex);
1761
1762                         schedule();
1763
1764                         remove_wait_queue(&chip->wq, &wait);
1765
1766                         goto retry;
1767                 }
1768         }
1769
1770         /* Unlock the chips again */
1771
1772         for (i--; i >=0; i--) {
1773                 chip = &cfi->chips[i];
1774
1775                 spin_lock(chip->mutex);
1776
1777                 if (chip->state == FL_SYNCING) {
1778                         chip->state = chip->oldstate;
1779                         wake_up(&chip->wq);
1780                 }
1781                 spin_unlock(chip->mutex);
1782         }
1783 }
1784
1785
1786 static int cfi_amdstd_suspend(struct mtd_info *mtd)
1787 {
1788         struct map_info *map = mtd->priv;
1789         struct cfi_private *cfi = map->fldrv_priv;
1790         int i;
1791         struct flchip *chip;
1792         int ret = 0;
1793
1794         for (i=0; !ret && i<cfi->numchips; i++) {
1795                 chip = &cfi->chips[i];
1796
1797                 spin_lock(chip->mutex);
1798
1799                 switch(chip->state) {
1800                 case FL_READY:
1801                 case FL_STATUS:
1802                 case FL_CFI_QUERY:
1803                 case FL_JEDEC_QUERY:
1804                         chip->oldstate = chip->state;
1805                         chip->state = FL_PM_SUSPENDED;
1806                         /* No need to wake_up() on this state change -
1807                          * as the whole point is that nobody can do anything
1808                          * with the chip now anyway.
1809                          */
1810                 case FL_PM_SUSPENDED:
1811                         break;
1812
1813                 default:
1814                         ret = -EAGAIN;
1815                         break;
1816                 }
1817                 spin_unlock(chip->mutex);
1818         }
1819
1820         /* Unlock the chips again */
1821
1822         if (ret) {
1823                 for (i--; i >=0; i--) {
1824                         chip = &cfi->chips[i];
1825
1826                         spin_lock(chip->mutex);
1827
1828                         if (chip->state == FL_PM_SUSPENDED) {
1829                                 chip->state = chip->oldstate;
1830                                 wake_up(&chip->wq);
1831                         }
1832                         spin_unlock(chip->mutex);
1833                 }
1834         }
1835
1836         return ret;
1837 }
1838
1839
1840 static void cfi_amdstd_resume(struct mtd_info *mtd)
1841 {
1842         struct map_info *map = mtd->priv;
1843         struct cfi_private *cfi = map->fldrv_priv;
1844         int i;
1845         struct flchip *chip;
1846
1847         for (i=0; i<cfi->numchips; i++) {
1848
1849                 chip = &cfi->chips[i];
1850
1851                 spin_lock(chip->mutex);
1852
1853                 if (chip->state == FL_PM_SUSPENDED) {
1854                         chip->state = FL_READY;
1855                         map_write(map, CMD(0xF0), chip->start);
1856                         wake_up(&chip->wq);
1857                 }
1858                 else
1859                         printk(KERN_ERR "Argh. Chip not in PM_SUSPENDED state upon resume()\n");
1860
1861                 spin_unlock(chip->mutex);
1862         }
1863 }
1864
1865 static void cfi_amdstd_destroy(struct mtd_info *mtd)
1866 {
1867         struct map_info *map = mtd->priv;
1868         struct cfi_private *cfi = map->fldrv_priv;
1869
1870         kfree(cfi->cmdset_priv);
1871         kfree(cfi->cfiq);
1872         kfree(cfi);
1873         kfree(mtd->eraseregions);
1874 }
1875
1876 MODULE_LICENSE("GPL");
1877 MODULE_AUTHOR("Crossnet Co. <info@crossnet.co.jp> et al.");
1878 MODULE_DESCRIPTION("MTD chip driver for AMD/Fujitsu flash chips");