Linux-libre 5.0.14-gnu
[librecmc/linux-libre.git] / drivers / mtd / chips / cfi_cmdset_0020.c
1 /*
2  * Common Flash Interface support:
3  *   ST Advanced Architecture Command Set (ID 0x0020)
4  *
5  * (C) 2000 Red Hat. GPL'd
6  *
7  * 10/10/2000   Nicolas Pitre <nico@fluxnic.net>
8  *      - completely revamped method functions so they are aware and
9  *        independent of the flash geometry (buswidth, interleave, etc.)
10  *      - scalability vs code size is completely set at compile-time
11  *        (see include/linux/mtd/cfi.h for selection)
12  *      - optimized write buffer method
13  * 06/21/2002   Joern Engel <joern@wh.fh-wedel.de> and others
14  *      - modified Intel Command Set 0x0001 to support ST Advanced Architecture
15  *        (command set 0x0020)
16  *      - added a writev function
17  * 07/13/2005   Joern Engel <joern@wh.fh-wedel.de>
18  *      - Plugged memory leak in cfi_staa_writev().
19  */
20
21 #include <linux/module.h>
22 #include <linux/types.h>
23 #include <linux/kernel.h>
24 #include <linux/sched.h>
25 #include <asm/io.h>
26 #include <asm/byteorder.h>
27
28 #include <linux/errno.h>
29 #include <linux/slab.h>
30 #include <linux/delay.h>
31 #include <linux/interrupt.h>
32 #include <linux/mtd/map.h>
33 #include <linux/mtd/cfi.h>
34 #include <linux/mtd/mtd.h>
35
36
37 static int cfi_staa_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);
38 static int cfi_staa_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
39 static int cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
40                 unsigned long count, loff_t to, size_t *retlen);
41 static int cfi_staa_erase_varsize(struct mtd_info *, struct erase_info *);
42 static void cfi_staa_sync (struct mtd_info *);
43 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
44 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
45 static int cfi_staa_suspend (struct mtd_info *);
46 static void cfi_staa_resume (struct mtd_info *);
47
48 static void cfi_staa_destroy(struct mtd_info *);
49
50 struct mtd_info *cfi_cmdset_0020(struct map_info *, int);
51
52 static struct mtd_info *cfi_staa_setup (struct map_info *);
53
54 static struct mtd_chip_driver cfi_staa_chipdrv = {
55         .probe          = NULL, /* Not usable directly */
56         .destroy        = cfi_staa_destroy,
57         .name           = "cfi_cmdset_0020",
58         .module         = THIS_MODULE
59 };
60
61 /* #define DEBUG_LOCK_BITS */
62 //#define DEBUG_CFI_FEATURES
63
64 #ifdef DEBUG_CFI_FEATURES
65 static void cfi_tell_features(struct cfi_pri_intelext *extp)
66 {
67         int i;
68         printk("  Feature/Command Support: %4.4X\n", extp->FeatureSupport);
69         printk("     - Chip Erase:         %s\n", extp->FeatureSupport&1?"supported":"unsupported");
70         printk("     - Suspend Erase:      %s\n", extp->FeatureSupport&2?"supported":"unsupported");
71         printk("     - Suspend Program:    %s\n", extp->FeatureSupport&4?"supported":"unsupported");
72         printk("     - Legacy Lock/Unlock: %s\n", extp->FeatureSupport&8?"supported":"unsupported");
73         printk("     - Queued Erase:       %s\n", extp->FeatureSupport&16?"supported":"unsupported");
74         printk("     - Instant block lock: %s\n", extp->FeatureSupport&32?"supported":"unsupported");
75         printk("     - Protection Bits:    %s\n", extp->FeatureSupport&64?"supported":"unsupported");
76         printk("     - Page-mode read:     %s\n", extp->FeatureSupport&128?"supported":"unsupported");
77         printk("     - Synchronous read:   %s\n", extp->FeatureSupport&256?"supported":"unsupported");
78         for (i=9; i<32; i++) {
79                 if (extp->FeatureSupport & (1<<i))
80                         printk("     - Unknown Bit %X:      supported\n", i);
81         }
82
83         printk("  Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);
84         printk("     - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");
85         for (i=1; i<8; i++) {
86                 if (extp->SuspendCmdSupport & (1<<i))
87                         printk("     - Unknown Bit %X:               supported\n", i);
88         }
89
90         printk("  Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);
91         printk("     - Lock Bit Active:      %s\n", extp->BlkStatusRegMask&1?"yes":"no");
92         printk("     - Valid Bit Active:     %s\n", extp->BlkStatusRegMask&2?"yes":"no");
93         for (i=2; i<16; i++) {
94                 if (extp->BlkStatusRegMask & (1<<i))
95                         printk("     - Unknown Bit %X Active: yes\n",i);
96         }
97
98         printk("  Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",
99                extp->VccOptimal >> 8, extp->VccOptimal & 0xf);
100         if (extp->VppOptimal)
101                 printk("  Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",
102                        extp->VppOptimal >> 8, extp->VppOptimal & 0xf);
103 }
104 #endif
105
106 /* This routine is made available to other mtd code via
107  * inter_module_register.  It must only be accessed through
108  * inter_module_get which will bump the use count of this module.  The
109  * addresses passed back in cfi are valid as long as the use count of
110  * this module is non-zero, i.e. between inter_module_get and
111  * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
112  */
113 struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
114 {
115         struct cfi_private *cfi = map->fldrv_priv;
116         int i;
117
118         if (cfi->cfi_mode) {
119                 /*
120                  * It's a real CFI chip, not one for which the probe
121                  * routine faked a CFI structure. So we read the feature
122                  * table from it.
123                  */
124                 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
125                 struct cfi_pri_intelext *extp;
126
127                 extp = (struct cfi_pri_intelext*)cfi_read_pri(map, adr, sizeof(*extp), "ST Microelectronics");
128                 if (!extp)
129                         return NULL;
130
131                 if (extp->MajorVersion != '1' ||
132                     (extp->MinorVersion < '0' || extp->MinorVersion > '3')) {
133                         printk(KERN_ERR "  Unknown ST Microelectronics"
134                                " Extended Query version %c.%c.\n",
135                                extp->MajorVersion, extp->MinorVersion);
136                         kfree(extp);
137                         return NULL;
138                 }
139
140                 /* Do some byteswapping if necessary */
141                 extp->FeatureSupport = cfi32_to_cpu(map, extp->FeatureSupport);
142                 extp->BlkStatusRegMask = cfi32_to_cpu(map,
143                                                 extp->BlkStatusRegMask);
144
145 #ifdef DEBUG_CFI_FEATURES
146                 /* Tell the user about it in lots of lovely detail */
147                 cfi_tell_features(extp);
148 #endif
149
150                 /* Install our own private info structure */
151                 cfi->cmdset_priv = extp;
152         }
153
154         for (i=0; i< cfi->numchips; i++) {
155                 cfi->chips[i].word_write_time = 128;
156                 cfi->chips[i].buffer_write_time = 128;
157                 cfi->chips[i].erase_time = 1024;
158                 cfi->chips[i].ref_point_counter = 0;
159                 init_waitqueue_head(&(cfi->chips[i].wq));
160         }
161
162         return cfi_staa_setup(map);
163 }
164 EXPORT_SYMBOL_GPL(cfi_cmdset_0020);
165
166 static struct mtd_info *cfi_staa_setup(struct map_info *map)
167 {
168         struct cfi_private *cfi = map->fldrv_priv;
169         struct mtd_info *mtd;
170         unsigned long offset = 0;
171         int i,j;
172         unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
173
174         mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
175         //printk(KERN_DEBUG "number of CFI chips: %d\n", cfi->numchips);
176
177         if (!mtd) {
178                 kfree(cfi->cmdset_priv);
179                 return NULL;
180         }
181
182         mtd->priv = map;
183         mtd->type = MTD_NORFLASH;
184         mtd->size = devsize * cfi->numchips;
185
186         mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
187         mtd->eraseregions = kmalloc_array(mtd->numeraseregions,
188                                           sizeof(struct mtd_erase_region_info),
189                                           GFP_KERNEL);
190         if (!mtd->eraseregions) {
191                 kfree(cfi->cmdset_priv);
192                 kfree(mtd);
193                 return NULL;
194         }
195
196         for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
197                 unsigned long ernum, ersize;
198                 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
199                 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
200
201                 if (mtd->erasesize < ersize) {
202                         mtd->erasesize = ersize;
203                 }
204                 for (j=0; j<cfi->numchips; j++) {
205                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
206                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
207                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
208                 }
209                 offset += (ersize * ernum);
210         }
211
212         if (offset != devsize) {
213                 /* Argh */
214                 printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);
215                 kfree(mtd->eraseregions);
216                 kfree(cfi->cmdset_priv);
217                 kfree(mtd);
218                 return NULL;
219         }
220
221         for (i=0; i<mtd->numeraseregions;i++){
222                 printk(KERN_DEBUG "%d: offset=0x%llx,size=0x%x,blocks=%d\n",
223                        i, (unsigned long long)mtd->eraseregions[i].offset,
224                        mtd->eraseregions[i].erasesize,
225                        mtd->eraseregions[i].numblocks);
226         }
227
228         /* Also select the correct geometry setup too */
229         mtd->_erase = cfi_staa_erase_varsize;
230         mtd->_read = cfi_staa_read;
231         mtd->_write = cfi_staa_write_buffers;
232         mtd->_writev = cfi_staa_writev;
233         mtd->_sync = cfi_staa_sync;
234         mtd->_lock = cfi_staa_lock;
235         mtd->_unlock = cfi_staa_unlock;
236         mtd->_suspend = cfi_staa_suspend;
237         mtd->_resume = cfi_staa_resume;
238         mtd->flags = MTD_CAP_NORFLASH & ~MTD_BIT_WRITEABLE;
239         mtd->writesize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */
240         mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
241         map->fldrv = &cfi_staa_chipdrv;
242         __module_get(THIS_MODULE);
243         mtd->name = map->name;
244         return mtd;
245 }
246
247
248 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
249 {
250         map_word status, status_OK;
251         unsigned long timeo;
252         DECLARE_WAITQUEUE(wait, current);
253         int suspended = 0;
254         unsigned long cmd_addr;
255         struct cfi_private *cfi = map->fldrv_priv;
256
257         adr += chip->start;
258
259         /* Ensure cmd read/writes are aligned. */
260         cmd_addr = adr & ~(map_bankwidth(map)-1);
261
262         /* Let's determine this according to the interleave only once */
263         status_OK = CMD(0x80);
264
265         timeo = jiffies + HZ;
266  retry:
267         mutex_lock(&chip->mutex);
268
269         /* Check that the chip's ready to talk to us.
270          * If it's in FL_ERASING state, suspend it and make it talk now.
271          */
272         switch (chip->state) {
273         case FL_ERASING:
274                 if (!(((struct cfi_pri_intelext *)cfi->cmdset_priv)->FeatureSupport & 2))
275                         goto sleep; /* We don't support erase suspend */
276
277                 map_write (map, CMD(0xb0), cmd_addr);
278                 /* If the flash has finished erasing, then 'erase suspend'
279                  * appears to make some (28F320) flash devices switch to
280                  * 'read' mode.  Make sure that we switch to 'read status'
281                  * mode so we get the right data. --rmk
282                  */
283                 map_write(map, CMD(0x70), cmd_addr);
284                 chip->oldstate = FL_ERASING;
285                 chip->state = FL_ERASE_SUSPENDING;
286                 //              printk("Erase suspending at 0x%lx\n", cmd_addr);
287                 for (;;) {
288                         status = map_read(map, cmd_addr);
289                         if (map_word_andequal(map, status, status_OK, status_OK))
290                                 break;
291
292                         if (time_after(jiffies, timeo)) {
293                                 /* Urgh */
294                                 map_write(map, CMD(0xd0), cmd_addr);
295                                 /* make sure we're in 'read status' mode */
296                                 map_write(map, CMD(0x70), cmd_addr);
297                                 chip->state = FL_ERASING;
298                                 wake_up(&chip->wq);
299                                 mutex_unlock(&chip->mutex);
300                                 printk(KERN_ERR "Chip not ready after erase "
301                                        "suspended: status = 0x%lx\n", status.x[0]);
302                                 return -EIO;
303                         }
304
305                         mutex_unlock(&chip->mutex);
306                         cfi_udelay(1);
307                         mutex_lock(&chip->mutex);
308                 }
309
310                 suspended = 1;
311                 map_write(map, CMD(0xff), cmd_addr);
312                 chip->state = FL_READY;
313                 break;
314
315 #if 0
316         case FL_WRITING:
317                 /* Not quite yet */
318 #endif
319
320         case FL_READY:
321                 break;
322
323         case FL_CFI_QUERY:
324         case FL_JEDEC_QUERY:
325                 map_write(map, CMD(0x70), cmd_addr);
326                 chip->state = FL_STATUS;
327                 /* Fall through */
328
329         case FL_STATUS:
330                 status = map_read(map, cmd_addr);
331                 if (map_word_andequal(map, status, status_OK, status_OK)) {
332                         map_write(map, CMD(0xff), cmd_addr);
333                         chip->state = FL_READY;
334                         break;
335                 }
336
337                 /* Urgh. Chip not yet ready to talk to us. */
338                 if (time_after(jiffies, timeo)) {
339                         mutex_unlock(&chip->mutex);
340                         printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %lx\n", status.x[0]);
341                         return -EIO;
342                 }
343
344                 /* Latency issues. Drop the lock, wait a while and retry */
345                 mutex_unlock(&chip->mutex);
346                 cfi_udelay(1);
347                 goto retry;
348
349         default:
350         sleep:
351                 /* Stick ourselves on a wait queue to be woken when
352                    someone changes the status */
353                 set_current_state(TASK_UNINTERRUPTIBLE);
354                 add_wait_queue(&chip->wq, &wait);
355                 mutex_unlock(&chip->mutex);
356                 schedule();
357                 remove_wait_queue(&chip->wq, &wait);
358                 timeo = jiffies + HZ;
359                 goto retry;
360         }
361
362         map_copy_from(map, buf, adr, len);
363
364         if (suspended) {
365                 chip->state = chip->oldstate;
366                 /* What if one interleaved chip has finished and the
367                    other hasn't? The old code would leave the finished
368                    one in READY mode. That's bad, and caused -EROFS
369                    errors to be returned from do_erase_oneblock because
370                    that's the only bit it checked for at the time.
371                    As the state machine appears to explicitly allow
372                    sending the 0x70 (Read Status) command to an erasing
373                    chip and expecting it to be ignored, that's what we
374                    do. */
375                 map_write(map, CMD(0xd0), cmd_addr);
376                 map_write(map, CMD(0x70), cmd_addr);
377         }
378
379         wake_up(&chip->wq);
380         mutex_unlock(&chip->mutex);
381         return 0;
382 }
383
384 static int cfi_staa_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
385 {
386         struct map_info *map = mtd->priv;
387         struct cfi_private *cfi = map->fldrv_priv;
388         unsigned long ofs;
389         int chipnum;
390         int ret = 0;
391
392         /* ofs: offset within the first chip that the first read should start */
393         chipnum = (from >> cfi->chipshift);
394         ofs = from - (chipnum <<  cfi->chipshift);
395
396         while (len) {
397                 unsigned long thislen;
398
399                 if (chipnum >= cfi->numchips)
400                         break;
401
402                 if ((len + ofs -1) >> cfi->chipshift)
403                         thislen = (1<<cfi->chipshift) - ofs;
404                 else
405                         thislen = len;
406
407                 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
408                 if (ret)
409                         break;
410
411                 *retlen += thislen;
412                 len -= thislen;
413                 buf += thislen;
414
415                 ofs = 0;
416                 chipnum++;
417         }
418         return ret;
419 }
420
421 static int do_write_buffer(struct map_info *map, struct flchip *chip,
422                                   unsigned long adr, const u_char *buf, int len)
423 {
424         struct cfi_private *cfi = map->fldrv_priv;
425         map_word status, status_OK;
426         unsigned long cmd_adr, timeo;
427         DECLARE_WAITQUEUE(wait, current);
428         int wbufsize, z;
429
430         /* M58LW064A requires bus alignment for buffer wriets -- saw */
431         if (adr & (map_bankwidth(map)-1))
432             return -EINVAL;
433
434         wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
435         adr += chip->start;
436         cmd_adr = adr & ~(wbufsize-1);
437
438         /* Let's determine this according to the interleave only once */
439         status_OK = CMD(0x80);
440
441         timeo = jiffies + HZ;
442  retry:
443
444 #ifdef DEBUG_CFI_FEATURES
445        printk("%s: chip->state[%d]\n", __func__, chip->state);
446 #endif
447         mutex_lock(&chip->mutex);
448
449         /* Check that the chip's ready to talk to us.
450          * Later, we can actually think about interrupting it
451          * if it's in FL_ERASING state.
452          * Not just yet, though.
453          */
454         switch (chip->state) {
455         case FL_READY:
456                 break;
457
458         case FL_CFI_QUERY:
459         case FL_JEDEC_QUERY:
460                 map_write(map, CMD(0x70), cmd_adr);
461                 chip->state = FL_STATUS;
462 #ifdef DEBUG_CFI_FEATURES
463         printk("%s: 1 status[%x]\n", __func__, map_read(map, cmd_adr));
464 #endif
465                 /* Fall through */
466
467         case FL_STATUS:
468                 status = map_read(map, cmd_adr);
469                 if (map_word_andequal(map, status, status_OK, status_OK))
470                         break;
471                 /* Urgh. Chip not yet ready to talk to us. */
472                 if (time_after(jiffies, timeo)) {
473                         mutex_unlock(&chip->mutex);
474                         printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %lx, status = %lx\n",
475                                status.x[0], map_read(map, cmd_adr).x[0]);
476                         return -EIO;
477                 }
478
479                 /* Latency issues. Drop the lock, wait a while and retry */
480                 mutex_unlock(&chip->mutex);
481                 cfi_udelay(1);
482                 goto retry;
483
484         default:
485                 /* Stick ourselves on a wait queue to be woken when
486                    someone changes the status */
487                 set_current_state(TASK_UNINTERRUPTIBLE);
488                 add_wait_queue(&chip->wq, &wait);
489                 mutex_unlock(&chip->mutex);
490                 schedule();
491                 remove_wait_queue(&chip->wq, &wait);
492                 timeo = jiffies + HZ;
493                 goto retry;
494         }
495
496         ENABLE_VPP(map);
497         map_write(map, CMD(0xe8), cmd_adr);
498         chip->state = FL_WRITING_TO_BUFFER;
499
500         z = 0;
501         for (;;) {
502                 status = map_read(map, cmd_adr);
503                 if (map_word_andequal(map, status, status_OK, status_OK))
504                         break;
505
506                 mutex_unlock(&chip->mutex);
507                 cfi_udelay(1);
508                 mutex_lock(&chip->mutex);
509
510                 if (++z > 100) {
511                         /* Argh. Not ready for write to buffer */
512                         DISABLE_VPP(map);
513                         map_write(map, CMD(0x70), cmd_adr);
514                         chip->state = FL_STATUS;
515                         mutex_unlock(&chip->mutex);
516                         printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %lx\n", status.x[0]);
517                         return -EIO;
518                 }
519         }
520
521         /* Write length of data to come */
522         map_write(map, CMD(len/map_bankwidth(map)-1), cmd_adr );
523
524         /* Write data */
525         for (z = 0; z < len;
526              z += map_bankwidth(map), buf += map_bankwidth(map)) {
527                 map_word d;
528                 d = map_word_load(map, buf);
529                 map_write(map, d, adr+z);
530         }
531         /* GO GO GO */
532         map_write(map, CMD(0xd0), cmd_adr);
533         chip->state = FL_WRITING;
534
535         mutex_unlock(&chip->mutex);
536         cfi_udelay(chip->buffer_write_time);
537         mutex_lock(&chip->mutex);
538
539         timeo = jiffies + (HZ/2);
540         z = 0;
541         for (;;) {
542                 if (chip->state != FL_WRITING) {
543                         /* Someone's suspended the write. Sleep */
544                         set_current_state(TASK_UNINTERRUPTIBLE);
545                         add_wait_queue(&chip->wq, &wait);
546                         mutex_unlock(&chip->mutex);
547                         schedule();
548                         remove_wait_queue(&chip->wq, &wait);
549                         timeo = jiffies + (HZ / 2); /* FIXME */
550                         mutex_lock(&chip->mutex);
551                         continue;
552                 }
553
554                 status = map_read(map, cmd_adr);
555                 if (map_word_andequal(map, status, status_OK, status_OK))
556                         break;
557
558                 /* OK Still waiting */
559                 if (time_after(jiffies, timeo)) {
560                         /* clear status */
561                         map_write(map, CMD(0x50), cmd_adr);
562                         /* put back into read status register mode */
563                         map_write(map, CMD(0x70), adr);
564                         chip->state = FL_STATUS;
565                         DISABLE_VPP(map);
566                         mutex_unlock(&chip->mutex);
567                         printk(KERN_ERR "waiting for chip to be ready timed out in bufwrite\n");
568                         return -EIO;
569                 }
570
571                 /* Latency issues. Drop the lock, wait a while and retry */
572                 mutex_unlock(&chip->mutex);
573                 cfi_udelay(1);
574                 z++;
575                 mutex_lock(&chip->mutex);
576         }
577         if (!z) {
578                 chip->buffer_write_time--;
579                 if (!chip->buffer_write_time)
580                         chip->buffer_write_time++;
581         }
582         if (z > 1)
583                 chip->buffer_write_time++;
584
585         /* Done and happy. */
586         DISABLE_VPP(map);
587         chip->state = FL_STATUS;
588
589         /* check for errors: 'lock bit', 'VPP', 'dead cell'/'unerased cell' or 'incorrect cmd' -- saw */
590         if (map_word_bitsset(map, status, CMD(0x3a))) {
591 #ifdef DEBUG_CFI_FEATURES
592                 printk("%s: 2 status[%lx]\n", __func__, status.x[0]);
593 #endif
594                 /* clear status */
595                 map_write(map, CMD(0x50), cmd_adr);
596                 /* put back into read status register mode */
597                 map_write(map, CMD(0x70), adr);
598                 wake_up(&chip->wq);
599                 mutex_unlock(&chip->mutex);
600                 return map_word_bitsset(map, status, CMD(0x02)) ? -EROFS : -EIO;
601         }
602         wake_up(&chip->wq);
603         mutex_unlock(&chip->mutex);
604
605         return 0;
606 }
607
608 static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
609                                        size_t len, size_t *retlen, const u_char *buf)
610 {
611         struct map_info *map = mtd->priv;
612         struct cfi_private *cfi = map->fldrv_priv;
613         int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
614         int ret = 0;
615         int chipnum;
616         unsigned long ofs;
617
618         chipnum = to >> cfi->chipshift;
619         ofs = to  - (chipnum << cfi->chipshift);
620
621 #ifdef DEBUG_CFI_FEATURES
622         printk("%s: map_bankwidth(map)[%x]\n", __func__, map_bankwidth(map));
623         printk("%s: chipnum[%x] wbufsize[%x]\n", __func__, chipnum, wbufsize);
624         printk("%s: ofs[%x] len[%x]\n", __func__, ofs, len);
625 #endif
626
627         /* Write buffer is worth it only if more than one word to write... */
628         while (len > 0) {
629                 /* We must not cross write block boundaries */
630                 int size = wbufsize - (ofs & (wbufsize-1));
631
632                 if (size > len)
633                     size = len;
634
635                 ret = do_write_buffer(map, &cfi->chips[chipnum],
636                                       ofs, buf, size);
637                 if (ret)
638                         return ret;
639
640                 ofs += size;
641                 buf += size;
642                 (*retlen) += size;
643                 len -= size;
644
645                 if (ofs >> cfi->chipshift) {
646                         chipnum ++;
647                         ofs = 0;
648                         if (chipnum == cfi->numchips)
649                                 return 0;
650                 }
651         }
652
653         return 0;
654 }
655
656 /*
657  * Writev for ECC-Flashes is a little more complicated. We need to maintain
658  * a small buffer for this.
659  * XXX: If the buffer size is not a multiple of 2, this will break
660  */
661 #define ECCBUF_SIZE (mtd->writesize)
662 #define ECCBUF_DIV(x) ((x) & ~(ECCBUF_SIZE - 1))
663 #define ECCBUF_MOD(x) ((x) &  (ECCBUF_SIZE - 1))
664 static int
665 cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
666                 unsigned long count, loff_t to, size_t *retlen)
667 {
668         unsigned long i;
669         size_t   totlen = 0, thislen;
670         int      ret = 0;
671         size_t   buflen = 0;
672         char *buffer;
673
674         if (!ECCBUF_SIZE) {
675                 /* We should fall back to a general writev implementation.
676                  * Until that is written, just break.
677                  */
678                 return -EIO;
679         }
680         buffer = kmalloc(ECCBUF_SIZE, GFP_KERNEL);
681         if (!buffer)
682                 return -ENOMEM;
683
684         for (i=0; i<count; i++) {
685                 size_t elem_len = vecs[i].iov_len;
686                 void *elem_base = vecs[i].iov_base;
687                 if (!elem_len) /* FIXME: Might be unnecessary. Check that */
688                         continue;
689                 if (buflen) { /* cut off head */
690                         if (buflen + elem_len < ECCBUF_SIZE) { /* just accumulate */
691                                 memcpy(buffer+buflen, elem_base, elem_len);
692                                 buflen += elem_len;
693                                 continue;
694                         }
695                         memcpy(buffer+buflen, elem_base, ECCBUF_SIZE-buflen);
696                         ret = mtd_write(mtd, to, ECCBUF_SIZE, &thislen,
697                                         buffer);
698                         totlen += thislen;
699                         if (ret || thislen != ECCBUF_SIZE)
700                                 goto write_error;
701                         elem_len -= thislen-buflen;
702                         elem_base += thislen-buflen;
703                         to += ECCBUF_SIZE;
704                 }
705                 if (ECCBUF_DIV(elem_len)) { /* write clean aligned data */
706                         ret = mtd_write(mtd, to, ECCBUF_DIV(elem_len),
707                                         &thislen, elem_base);
708                         totlen += thislen;
709                         if (ret || thislen != ECCBUF_DIV(elem_len))
710                                 goto write_error;
711                         to += thislen;
712                 }
713                 buflen = ECCBUF_MOD(elem_len); /* cut off tail */
714                 if (buflen) {
715                         memset(buffer, 0xff, ECCBUF_SIZE);
716                         memcpy(buffer, elem_base + thislen, buflen);
717                 }
718         }
719         if (buflen) { /* flush last page, even if not full */
720                 /* This is sometimes intended behaviour, really */
721                 ret = mtd_write(mtd, to, buflen, &thislen, buffer);
722                 totlen += thislen;
723                 if (ret || thislen != ECCBUF_SIZE)
724                         goto write_error;
725         }
726 write_error:
727         if (retlen)
728                 *retlen = totlen;
729         kfree(buffer);
730         return ret;
731 }
732
733
734 static inline int do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
735 {
736         struct cfi_private *cfi = map->fldrv_priv;
737         map_word status, status_OK;
738         unsigned long timeo;
739         int retries = 3;
740         DECLARE_WAITQUEUE(wait, current);
741         int ret = 0;
742
743         adr += chip->start;
744
745         /* Let's determine this according to the interleave only once */
746         status_OK = CMD(0x80);
747
748         timeo = jiffies + HZ;
749 retry:
750         mutex_lock(&chip->mutex);
751
752         /* Check that the chip's ready to talk to us. */
753         switch (chip->state) {
754         case FL_CFI_QUERY:
755         case FL_JEDEC_QUERY:
756         case FL_READY:
757                 map_write(map, CMD(0x70), adr);
758                 chip->state = FL_STATUS;
759                 /* Fall through */
760
761         case FL_STATUS:
762                 status = map_read(map, adr);
763                 if (map_word_andequal(map, status, status_OK, status_OK))
764                         break;
765
766                 /* Urgh. Chip not yet ready to talk to us. */
767                 if (time_after(jiffies, timeo)) {
768                         mutex_unlock(&chip->mutex);
769                         printk(KERN_ERR "waiting for chip to be ready timed out in erase\n");
770                         return -EIO;
771                 }
772
773                 /* Latency issues. Drop the lock, wait a while and retry */
774                 mutex_unlock(&chip->mutex);
775                 cfi_udelay(1);
776                 goto retry;
777
778         default:
779                 /* Stick ourselves on a wait queue to be woken when
780                    someone changes the status */
781                 set_current_state(TASK_UNINTERRUPTIBLE);
782                 add_wait_queue(&chip->wq, &wait);
783                 mutex_unlock(&chip->mutex);
784                 schedule();
785                 remove_wait_queue(&chip->wq, &wait);
786                 timeo = jiffies + HZ;
787                 goto retry;
788         }
789
790         ENABLE_VPP(map);
791         /* Clear the status register first */
792         map_write(map, CMD(0x50), adr);
793
794         /* Now erase */
795         map_write(map, CMD(0x20), adr);
796         map_write(map, CMD(0xD0), adr);
797         chip->state = FL_ERASING;
798
799         mutex_unlock(&chip->mutex);
800         msleep(1000);
801         mutex_lock(&chip->mutex);
802
803         /* FIXME. Use a timer to check this, and return immediately. */
804         /* Once the state machine's known to be working I'll do that */
805
806         timeo = jiffies + (HZ*20);
807         for (;;) {
808                 if (chip->state != FL_ERASING) {
809                         /* Someone's suspended the erase. Sleep */
810                         set_current_state(TASK_UNINTERRUPTIBLE);
811                         add_wait_queue(&chip->wq, &wait);
812                         mutex_unlock(&chip->mutex);
813                         schedule();
814                         remove_wait_queue(&chip->wq, &wait);
815                         timeo = jiffies + (HZ*20); /* FIXME */
816                         mutex_lock(&chip->mutex);
817                         continue;
818                 }
819
820                 status = map_read(map, adr);
821                 if (map_word_andequal(map, status, status_OK, status_OK))
822                         break;
823
824                 /* OK Still waiting */
825                 if (time_after(jiffies, timeo)) {
826                         map_write(map, CMD(0x70), adr);
827                         chip->state = FL_STATUS;
828                         printk(KERN_ERR "waiting for erase to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
829                         DISABLE_VPP(map);
830                         mutex_unlock(&chip->mutex);
831                         return -EIO;
832                 }
833
834                 /* Latency issues. Drop the lock, wait a while and retry */
835                 mutex_unlock(&chip->mutex);
836                 cfi_udelay(1);
837                 mutex_lock(&chip->mutex);
838         }
839
840         DISABLE_VPP(map);
841         ret = 0;
842
843         /* We've broken this before. It doesn't hurt to be safe */
844         map_write(map, CMD(0x70), adr);
845         chip->state = FL_STATUS;
846         status = map_read(map, adr);
847
848         /* check for lock bit */
849         if (map_word_bitsset(map, status, CMD(0x3a))) {
850                 unsigned char chipstatus = status.x[0];
851                 if (!map_word_equal(map, status, CMD(chipstatus))) {
852                         int i, w;
853                         for (w=0; w<map_words(map); w++) {
854                                 for (i = 0; i<cfi_interleave(cfi); i++) {
855                                         chipstatus |= status.x[w] >> (cfi->device_type * 8);
856                                 }
857                         }
858                         printk(KERN_WARNING "Status is not identical for all chips: 0x%lx. Merging to give 0x%02x\n",
859                                status.x[0], chipstatus);
860                 }
861                 /* Reset the error bits */
862                 map_write(map, CMD(0x50), adr);
863                 map_write(map, CMD(0x70), adr);
864
865                 if ((chipstatus & 0x30) == 0x30) {
866                         printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%x\n", chipstatus);
867                         ret = -EIO;
868                 } else if (chipstatus & 0x02) {
869                         /* Protection bit set */
870                         ret = -EROFS;
871                 } else if (chipstatus & 0x8) {
872                         /* Voltage */
873                         printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%x\n", chipstatus);
874                         ret = -EIO;
875                 } else if (chipstatus & 0x20) {
876                         if (retries--) {
877                                 printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x. Retrying...\n", adr, chipstatus);
878                                 timeo = jiffies + HZ;
879                                 chip->state = FL_STATUS;
880                                 mutex_unlock(&chip->mutex);
881                                 goto retry;
882                         }
883                         printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, chipstatus);
884                         ret = -EIO;
885                 }
886         }
887
888         wake_up(&chip->wq);
889         mutex_unlock(&chip->mutex);
890         return ret;
891 }
892
893 static int cfi_staa_erase_varsize(struct mtd_info *mtd,
894                                   struct erase_info *instr)
895 {       struct map_info *map = mtd->priv;
896         struct cfi_private *cfi = map->fldrv_priv;
897         unsigned long adr, len;
898         int chipnum, ret = 0;
899         int i, first;
900         struct mtd_erase_region_info *regions = mtd->eraseregions;
901
902         /* Check that both start and end of the requested erase are
903          * aligned with the erasesize at the appropriate addresses.
904          */
905
906         i = 0;
907
908         /* Skip all erase regions which are ended before the start of
909            the requested erase. Actually, to save on the calculations,
910            we skip to the first erase region which starts after the
911            start of the requested erase, and then go back one.
912         */
913
914         while (i < mtd->numeraseregions && instr->addr >= regions[i].offset)
915                i++;
916         i--;
917
918         /* OK, now i is pointing at the erase region in which this
919            erase request starts. Check the start of the requested
920            erase range is aligned with the erase size which is in
921            effect here.
922         */
923
924         if (instr->addr & (regions[i].erasesize-1))
925                 return -EINVAL;
926
927         /* Remember the erase region we start on */
928         first = i;
929
930         /* Next, check that the end of the requested erase is aligned
931          * with the erase region at that address.
932          */
933
934         while (i<mtd->numeraseregions && (instr->addr + instr->len) >= regions[i].offset)
935                 i++;
936
937         /* As before, drop back one to point at the region in which
938            the address actually falls
939         */
940         i--;
941
942         if ((instr->addr + instr->len) & (regions[i].erasesize-1))
943                 return -EINVAL;
944
945         chipnum = instr->addr >> cfi->chipshift;
946         adr = instr->addr - (chipnum << cfi->chipshift);
947         len = instr->len;
948
949         i=first;
950
951         while(len) {
952                 ret = do_erase_oneblock(map, &cfi->chips[chipnum], adr);
953
954                 if (ret)
955                         return ret;
956
957                 adr += regions[i].erasesize;
958                 len -= regions[i].erasesize;
959
960                 if (adr % (1<< cfi->chipshift) == (((unsigned long)regions[i].offset + (regions[i].erasesize * regions[i].numblocks)) %( 1<< cfi->chipshift)))
961                         i++;
962
963                 if (adr >> cfi->chipshift) {
964                         adr = 0;
965                         chipnum++;
966
967                         if (chipnum >= cfi->numchips)
968                                 break;
969                 }
970         }
971
972         return 0;
973 }
974
975 static void cfi_staa_sync (struct mtd_info *mtd)
976 {
977         struct map_info *map = mtd->priv;
978         struct cfi_private *cfi = map->fldrv_priv;
979         int i;
980         struct flchip *chip;
981         int ret = 0;
982         DECLARE_WAITQUEUE(wait, current);
983
984         for (i=0; !ret && i<cfi->numchips; i++) {
985                 chip = &cfi->chips[i];
986
987         retry:
988                 mutex_lock(&chip->mutex);
989
990                 switch(chip->state) {
991                 case FL_READY:
992                 case FL_STATUS:
993                 case FL_CFI_QUERY:
994                 case FL_JEDEC_QUERY:
995                         chip->oldstate = chip->state;
996                         chip->state = FL_SYNCING;
997                         /* No need to wake_up() on this state change -
998                          * as the whole point is that nobody can do anything
999                          * with the chip now anyway.
1000                          */
1001                         /* Fall through */
1002                 case FL_SYNCING:
1003                         mutex_unlock(&chip->mutex);
1004                         break;
1005
1006                 default:
1007                         /* Not an idle state */
1008                         set_current_state(TASK_UNINTERRUPTIBLE);
1009                         add_wait_queue(&chip->wq, &wait);
1010
1011                         mutex_unlock(&chip->mutex);
1012                         schedule();
1013                         remove_wait_queue(&chip->wq, &wait);
1014
1015                         goto retry;
1016                 }
1017         }
1018
1019         /* Unlock the chips again */
1020
1021         for (i--; i >=0; i--) {
1022                 chip = &cfi->chips[i];
1023
1024                 mutex_lock(&chip->mutex);
1025
1026                 if (chip->state == FL_SYNCING) {
1027                         chip->state = chip->oldstate;
1028                         wake_up(&chip->wq);
1029                 }
1030                 mutex_unlock(&chip->mutex);
1031         }
1032 }
1033
1034 static inline int do_lock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1035 {
1036         struct cfi_private *cfi = map->fldrv_priv;
1037         map_word status, status_OK;
1038         unsigned long timeo = jiffies + HZ;
1039         DECLARE_WAITQUEUE(wait, current);
1040
1041         adr += chip->start;
1042
1043         /* Let's determine this according to the interleave only once */
1044         status_OK = CMD(0x80);
1045
1046         timeo = jiffies + HZ;
1047 retry:
1048         mutex_lock(&chip->mutex);
1049
1050         /* Check that the chip's ready to talk to us. */
1051         switch (chip->state) {
1052         case FL_CFI_QUERY:
1053         case FL_JEDEC_QUERY:
1054         case FL_READY:
1055                 map_write(map, CMD(0x70), adr);
1056                 chip->state = FL_STATUS;
1057                 /* Fall through */
1058
1059         case FL_STATUS:
1060                 status = map_read(map, adr);
1061                 if (map_word_andequal(map, status, status_OK, status_OK))
1062                         break;
1063
1064                 /* Urgh. Chip not yet ready to talk to us. */
1065                 if (time_after(jiffies, timeo)) {
1066                         mutex_unlock(&chip->mutex);
1067                         printk(KERN_ERR "waiting for chip to be ready timed out in lock\n");
1068                         return -EIO;
1069                 }
1070
1071                 /* Latency issues. Drop the lock, wait a while and retry */
1072                 mutex_unlock(&chip->mutex);
1073                 cfi_udelay(1);
1074                 goto retry;
1075
1076         default:
1077                 /* Stick ourselves on a wait queue to be woken when
1078                    someone changes the status */
1079                 set_current_state(TASK_UNINTERRUPTIBLE);
1080                 add_wait_queue(&chip->wq, &wait);
1081                 mutex_unlock(&chip->mutex);
1082                 schedule();
1083                 remove_wait_queue(&chip->wq, &wait);
1084                 timeo = jiffies + HZ;
1085                 goto retry;
1086         }
1087
1088         ENABLE_VPP(map);
1089         map_write(map, CMD(0x60), adr);
1090         map_write(map, CMD(0x01), adr);
1091         chip->state = FL_LOCKING;
1092
1093         mutex_unlock(&chip->mutex);
1094         msleep(1000);
1095         mutex_lock(&chip->mutex);
1096
1097         /* FIXME. Use a timer to check this, and return immediately. */
1098         /* Once the state machine's known to be working I'll do that */
1099
1100         timeo = jiffies + (HZ*2);
1101         for (;;) {
1102
1103                 status = map_read(map, adr);
1104                 if (map_word_andequal(map, status, status_OK, status_OK))
1105                         break;
1106
1107                 /* OK Still waiting */
1108                 if (time_after(jiffies, timeo)) {
1109                         map_write(map, CMD(0x70), adr);
1110                         chip->state = FL_STATUS;
1111                         printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1112                         DISABLE_VPP(map);
1113                         mutex_unlock(&chip->mutex);
1114                         return -EIO;
1115                 }
1116
1117                 /* Latency issues. Drop the lock, wait a while and retry */
1118                 mutex_unlock(&chip->mutex);
1119                 cfi_udelay(1);
1120                 mutex_lock(&chip->mutex);
1121         }
1122
1123         /* Done and happy. */
1124         chip->state = FL_STATUS;
1125         DISABLE_VPP(map);
1126         wake_up(&chip->wq);
1127         mutex_unlock(&chip->mutex);
1128         return 0;
1129 }
1130 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1131 {
1132         struct map_info *map = mtd->priv;
1133         struct cfi_private *cfi = map->fldrv_priv;
1134         unsigned long adr;
1135         int chipnum, ret = 0;
1136 #ifdef DEBUG_LOCK_BITS
1137         int ofs_factor = cfi->interleave * cfi->device_type;
1138 #endif
1139
1140         if (ofs & (mtd->erasesize - 1))
1141                 return -EINVAL;
1142
1143         if (len & (mtd->erasesize -1))
1144                 return -EINVAL;
1145
1146         chipnum = ofs >> cfi->chipshift;
1147         adr = ofs - (chipnum << cfi->chipshift);
1148
1149         while(len) {
1150
1151 #ifdef DEBUG_LOCK_BITS
1152                 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1153                 printk("before lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1154                 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1155 #endif
1156
1157                 ret = do_lock_oneblock(map, &cfi->chips[chipnum], adr);
1158
1159 #ifdef DEBUG_LOCK_BITS
1160                 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1161                 printk("after lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1162                 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1163 #endif
1164
1165                 if (ret)
1166                         return ret;
1167
1168                 adr += mtd->erasesize;
1169                 len -= mtd->erasesize;
1170
1171                 if (adr >> cfi->chipshift) {
1172                         adr = 0;
1173                         chipnum++;
1174
1175                         if (chipnum >= cfi->numchips)
1176                                 break;
1177                 }
1178         }
1179         return 0;
1180 }
1181 static inline int do_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1182 {
1183         struct cfi_private *cfi = map->fldrv_priv;
1184         map_word status, status_OK;
1185         unsigned long timeo = jiffies + HZ;
1186         DECLARE_WAITQUEUE(wait, current);
1187
1188         adr += chip->start;
1189
1190         /* Let's determine this according to the interleave only once */
1191         status_OK = CMD(0x80);
1192
1193         timeo = jiffies + HZ;
1194 retry:
1195         mutex_lock(&chip->mutex);
1196
1197         /* Check that the chip's ready to talk to us. */
1198         switch (chip->state) {
1199         case FL_CFI_QUERY:
1200         case FL_JEDEC_QUERY:
1201         case FL_READY:
1202                 map_write(map, CMD(0x70), adr);
1203                 chip->state = FL_STATUS;
1204                 /* Fall through */
1205
1206         case FL_STATUS:
1207                 status = map_read(map, adr);
1208                 if (map_word_andequal(map, status, status_OK, status_OK))
1209                         break;
1210
1211                 /* Urgh. Chip not yet ready to talk to us. */
1212                 if (time_after(jiffies, timeo)) {
1213                         mutex_unlock(&chip->mutex);
1214                         printk(KERN_ERR "waiting for chip to be ready timed out in unlock\n");
1215                         return -EIO;
1216                 }
1217
1218                 /* Latency issues. Drop the lock, wait a while and retry */
1219                 mutex_unlock(&chip->mutex);
1220                 cfi_udelay(1);
1221                 goto retry;
1222
1223         default:
1224                 /* Stick ourselves on a wait queue to be woken when
1225                    someone changes the status */
1226                 set_current_state(TASK_UNINTERRUPTIBLE);
1227                 add_wait_queue(&chip->wq, &wait);
1228                 mutex_unlock(&chip->mutex);
1229                 schedule();
1230                 remove_wait_queue(&chip->wq, &wait);
1231                 timeo = jiffies + HZ;
1232                 goto retry;
1233         }
1234
1235         ENABLE_VPP(map);
1236         map_write(map, CMD(0x60), adr);
1237         map_write(map, CMD(0xD0), adr);
1238         chip->state = FL_UNLOCKING;
1239
1240         mutex_unlock(&chip->mutex);
1241         msleep(1000);
1242         mutex_lock(&chip->mutex);
1243
1244         /* FIXME. Use a timer to check this, and return immediately. */
1245         /* Once the state machine's known to be working I'll do that */
1246
1247         timeo = jiffies + (HZ*2);
1248         for (;;) {
1249
1250                 status = map_read(map, adr);
1251                 if (map_word_andequal(map, status, status_OK, status_OK))
1252                         break;
1253
1254                 /* OK Still waiting */
1255                 if (time_after(jiffies, timeo)) {
1256                         map_write(map, CMD(0x70), adr);
1257                         chip->state = FL_STATUS;
1258                         printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1259                         DISABLE_VPP(map);
1260                         mutex_unlock(&chip->mutex);
1261                         return -EIO;
1262                 }
1263
1264                 /* Latency issues. Drop the unlock, wait a while and retry */
1265                 mutex_unlock(&chip->mutex);
1266                 cfi_udelay(1);
1267                 mutex_lock(&chip->mutex);
1268         }
1269
1270         /* Done and happy. */
1271         chip->state = FL_STATUS;
1272         DISABLE_VPP(map);
1273         wake_up(&chip->wq);
1274         mutex_unlock(&chip->mutex);
1275         return 0;
1276 }
1277 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1278 {
1279         struct map_info *map = mtd->priv;
1280         struct cfi_private *cfi = map->fldrv_priv;
1281         unsigned long adr;
1282         int chipnum, ret = 0;
1283 #ifdef DEBUG_LOCK_BITS
1284         int ofs_factor = cfi->interleave * cfi->device_type;
1285 #endif
1286
1287         chipnum = ofs >> cfi->chipshift;
1288         adr = ofs - (chipnum << cfi->chipshift);
1289
1290 #ifdef DEBUG_LOCK_BITS
1291         {
1292                 unsigned long temp_adr = adr;
1293                 unsigned long temp_len = len;
1294
1295                 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1296                 while (temp_len) {
1297                         printk("before unlock %x: block status register is %x\n",temp_adr,cfi_read_query(map, temp_adr+(2*ofs_factor)));
1298                         temp_adr += mtd->erasesize;
1299                         temp_len -= mtd->erasesize;
1300                 }
1301                 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1302         }
1303 #endif
1304
1305         ret = do_unlock_oneblock(map, &cfi->chips[chipnum], adr);
1306
1307 #ifdef DEBUG_LOCK_BITS
1308         cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1309         printk("after unlock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1310         cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1311 #endif
1312
1313         return ret;
1314 }
1315
1316 static int cfi_staa_suspend(struct mtd_info *mtd)
1317 {
1318         struct map_info *map = mtd->priv;
1319         struct cfi_private *cfi = map->fldrv_priv;
1320         int i;
1321         struct flchip *chip;
1322         int ret = 0;
1323
1324         for (i=0; !ret && i<cfi->numchips; i++) {
1325                 chip = &cfi->chips[i];
1326
1327                 mutex_lock(&chip->mutex);
1328
1329                 switch(chip->state) {
1330                 case FL_READY:
1331                 case FL_STATUS:
1332                 case FL_CFI_QUERY:
1333                 case FL_JEDEC_QUERY:
1334                         chip->oldstate = chip->state;
1335                         chip->state = FL_PM_SUSPENDED;
1336                         /* No need to wake_up() on this state change -
1337                          * as the whole point is that nobody can do anything
1338                          * with the chip now anyway.
1339                          */
1340                 case FL_PM_SUSPENDED:
1341                         break;
1342
1343                 default:
1344                         ret = -EAGAIN;
1345                         break;
1346                 }
1347                 mutex_unlock(&chip->mutex);
1348         }
1349
1350         /* Unlock the chips again */
1351
1352         if (ret) {
1353                 for (i--; i >=0; i--) {
1354                         chip = &cfi->chips[i];
1355
1356                         mutex_lock(&chip->mutex);
1357
1358                         if (chip->state == FL_PM_SUSPENDED) {
1359                                 /* No need to force it into a known state here,
1360                                    because we're returning failure, and it didn't
1361                                    get power cycled */
1362                                 chip->state = chip->oldstate;
1363                                 wake_up(&chip->wq);
1364                         }
1365                         mutex_unlock(&chip->mutex);
1366                 }
1367         }
1368
1369         return ret;
1370 }
1371
1372 static void cfi_staa_resume(struct mtd_info *mtd)
1373 {
1374         struct map_info *map = mtd->priv;
1375         struct cfi_private *cfi = map->fldrv_priv;
1376         int i;
1377         struct flchip *chip;
1378
1379         for (i=0; i<cfi->numchips; i++) {
1380
1381                 chip = &cfi->chips[i];
1382
1383                 mutex_lock(&chip->mutex);
1384
1385                 /* Go to known state. Chip may have been power cycled */
1386                 if (chip->state == FL_PM_SUSPENDED) {
1387                         map_write(map, CMD(0xFF), 0);
1388                         chip->state = FL_READY;
1389                         wake_up(&chip->wq);
1390                 }
1391
1392                 mutex_unlock(&chip->mutex);
1393         }
1394 }
1395
1396 static void cfi_staa_destroy(struct mtd_info *mtd)
1397 {
1398         struct map_info *map = mtd->priv;
1399         struct cfi_private *cfi = map->fldrv_priv;
1400         kfree(cfi->cmdset_priv);
1401         kfree(cfi);
1402 }
1403
1404 MODULE_LICENSE("GPL");