[PATCH] W1: w1_netlink: New init/fini netlink callbacks.
[linux-2.6/verdex.git] / drivers / mtd / chips / cfi_cmdset_0020.c
blobc894f880157831f1d1c3524aa77d9a462d77dd60
1 /*
2 * Common Flash Interface support:
3 * ST Advanced Architecture Command Set (ID 0x0020)
5 * (C) 2000 Red Hat. GPL'd
7 * $Id: cfi_cmdset_0020.c,v 1.19 2005/07/13 15:52:45 dwmw2 Exp $
8 *
9 * 10/10/2000 Nicolas Pitre <nico@cam.org>
10 * - completely revamped method functions so they are aware and
11 * independent of the flash geometry (buswidth, interleave, etc.)
12 * - scalability vs code size is completely set at compile-time
13 * (see include/linux/mtd/cfi.h for selection)
14 * - optimized write buffer method
15 * 06/21/2002 Joern Engel <joern@wh.fh-wedel.de> and others
16 * - modified Intel Command Set 0x0001 to support ST Advanced Architecture
17 * (command set 0x0020)
18 * - added a writev function
19 * 07/13/2005 Joern Engel <joern@wh.fh-wedel.de>
20 * - Plugged memory leak in cfi_staa_writev().
23 #include <linux/version.h>
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>
32 #include <linux/errno.h>
33 #include <linux/slab.h>
34 #include <linux/delay.h>
35 #include <linux/interrupt.h>
36 #include <linux/mtd/map.h>
37 #include <linux/mtd/cfi.h>
38 #include <linux/mtd/mtd.h>
39 #include <linux/mtd/compatmac.h>
42 static int cfi_staa_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);
43 static int cfi_staa_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
44 static int cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
45 unsigned long count, loff_t to, size_t *retlen);
46 static int cfi_staa_erase_varsize(struct mtd_info *, struct erase_info *);
47 static void cfi_staa_sync (struct mtd_info *);
48 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, size_t len);
49 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, size_t len);
50 static int cfi_staa_suspend (struct mtd_info *);
51 static void cfi_staa_resume (struct mtd_info *);
53 static void cfi_staa_destroy(struct mtd_info *);
55 struct mtd_info *cfi_cmdset_0020(struct map_info *, int);
57 static struct mtd_info *cfi_staa_setup (struct map_info *);
59 static struct mtd_chip_driver cfi_staa_chipdrv = {
60 .probe = NULL, /* Not usable directly */
61 .destroy = cfi_staa_destroy,
62 .name = "cfi_cmdset_0020",
63 .module = THIS_MODULE
66 /* #define DEBUG_LOCK_BITS */
67 //#define DEBUG_CFI_FEATURES
69 #ifdef DEBUG_CFI_FEATURES
70 static void cfi_tell_features(struct cfi_pri_intelext *extp)
72 int i;
73 printk(" Feature/Command Support: %4.4X\n", extp->FeatureSupport);
74 printk(" - Chip Erase: %s\n", extp->FeatureSupport&1?"supported":"unsupported");
75 printk(" - Suspend Erase: %s\n", extp->FeatureSupport&2?"supported":"unsupported");
76 printk(" - Suspend Program: %s\n", extp->FeatureSupport&4?"supported":"unsupported");
77 printk(" - Legacy Lock/Unlock: %s\n", extp->FeatureSupport&8?"supported":"unsupported");
78 printk(" - Queued Erase: %s\n", extp->FeatureSupport&16?"supported":"unsupported");
79 printk(" - Instant block lock: %s\n", extp->FeatureSupport&32?"supported":"unsupported");
80 printk(" - Protection Bits: %s\n", extp->FeatureSupport&64?"supported":"unsupported");
81 printk(" - Page-mode read: %s\n", extp->FeatureSupport&128?"supported":"unsupported");
82 printk(" - Synchronous read: %s\n", extp->FeatureSupport&256?"supported":"unsupported");
83 for (i=9; i<32; i++) {
84 if (extp->FeatureSupport & (1<<i))
85 printk(" - Unknown Bit %X: supported\n", i);
88 printk(" Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);
89 printk(" - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");
90 for (i=1; i<8; i++) {
91 if (extp->SuspendCmdSupport & (1<<i))
92 printk(" - Unknown Bit %X: supported\n", i);
95 printk(" Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);
96 printk(" - Lock Bit Active: %s\n", extp->BlkStatusRegMask&1?"yes":"no");
97 printk(" - Valid Bit Active: %s\n", extp->BlkStatusRegMask&2?"yes":"no");
98 for (i=2; i<16; i++) {
99 if (extp->BlkStatusRegMask & (1<<i))
100 printk(" - Unknown Bit %X Active: yes\n",i);
103 printk(" Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",
104 extp->VccOptimal >> 8, extp->VccOptimal & 0xf);
105 if (extp->VppOptimal)
106 printk(" Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",
107 extp->VppOptimal >> 8, extp->VppOptimal & 0xf);
109 #endif
111 /* This routine is made available to other mtd code via
112 * inter_module_register. It must only be accessed through
113 * inter_module_get which will bump the use count of this module. The
114 * addresses passed back in cfi are valid as long as the use count of
115 * this module is non-zero, i.e. between inter_module_get and
116 * inter_module_put. Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
118 struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
120 struct cfi_private *cfi = map->fldrv_priv;
121 int i;
123 if (cfi->cfi_mode) {
125 * It's a real CFI chip, not one for which the probe
126 * routine faked a CFI structure. So we read the feature
127 * table from it.
129 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
130 struct cfi_pri_intelext *extp;
132 extp = (struct cfi_pri_intelext*)cfi_read_pri(map, adr, sizeof(*extp), "ST Microelectronics");
133 if (!extp)
134 return NULL;
136 /* Do some byteswapping if necessary */
137 extp->FeatureSupport = cfi32_to_cpu(extp->FeatureSupport);
138 extp->BlkStatusRegMask = cfi32_to_cpu(extp->BlkStatusRegMask);
140 #ifdef DEBUG_CFI_FEATURES
141 /* Tell the user about it in lots of lovely detail */
142 cfi_tell_features(extp);
143 #endif
145 /* Install our own private info structure */
146 cfi->cmdset_priv = extp;
149 for (i=0; i< cfi->numchips; i++) {
150 cfi->chips[i].word_write_time = 128;
151 cfi->chips[i].buffer_write_time = 128;
152 cfi->chips[i].erase_time = 1024;
155 return cfi_staa_setup(map);
158 static struct mtd_info *cfi_staa_setup(struct map_info *map)
160 struct cfi_private *cfi = map->fldrv_priv;
161 struct mtd_info *mtd;
162 unsigned long offset = 0;
163 int i,j;
164 unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
166 mtd = kmalloc(sizeof(*mtd), GFP_KERNEL);
167 //printk(KERN_DEBUG "number of CFI chips: %d\n", cfi->numchips);
169 if (!mtd) {
170 printk(KERN_ERR "Failed to allocate memory for MTD device\n");
171 kfree(cfi->cmdset_priv);
172 return NULL;
175 memset(mtd, 0, sizeof(*mtd));
176 mtd->priv = map;
177 mtd->type = MTD_NORFLASH;
178 mtd->size = devsize * cfi->numchips;
180 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
181 mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info)
182 * mtd->numeraseregions, GFP_KERNEL);
183 if (!mtd->eraseregions) {
184 printk(KERN_ERR "Failed to allocate memory for MTD erase region info\n");
185 kfree(cfi->cmdset_priv);
186 kfree(mtd);
187 return NULL;
190 for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
191 unsigned long ernum, ersize;
192 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
193 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
195 if (mtd->erasesize < ersize) {
196 mtd->erasesize = ersize;
198 for (j=0; j<cfi->numchips; j++) {
199 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
200 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
201 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
203 offset += (ersize * ernum);
206 if (offset != devsize) {
207 /* Argh */
208 printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);
209 kfree(mtd->eraseregions);
210 kfree(cfi->cmdset_priv);
211 kfree(mtd);
212 return NULL;
215 for (i=0; i<mtd->numeraseregions;i++){
216 printk(KERN_DEBUG "%d: offset=0x%x,size=0x%x,blocks=%d\n",
217 i,mtd->eraseregions[i].offset,
218 mtd->eraseregions[i].erasesize,
219 mtd->eraseregions[i].numblocks);
222 /* Also select the correct geometry setup too */
223 mtd->erase = cfi_staa_erase_varsize;
224 mtd->read = cfi_staa_read;
225 mtd->write = cfi_staa_write_buffers;
226 mtd->writev = cfi_staa_writev;
227 mtd->sync = cfi_staa_sync;
228 mtd->lock = cfi_staa_lock;
229 mtd->unlock = cfi_staa_unlock;
230 mtd->suspend = cfi_staa_suspend;
231 mtd->resume = cfi_staa_resume;
232 mtd->flags = MTD_CAP_NORFLASH;
233 mtd->flags |= MTD_ECC; /* FIXME: Not all STMicro flashes have this */
234 mtd->eccsize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */
235 map->fldrv = &cfi_staa_chipdrv;
236 __module_get(THIS_MODULE);
237 mtd->name = map->name;
238 return mtd;
242 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
244 map_word status, status_OK;
245 unsigned long timeo;
246 DECLARE_WAITQUEUE(wait, current);
247 int suspended = 0;
248 unsigned long cmd_addr;
249 struct cfi_private *cfi = map->fldrv_priv;
251 adr += chip->start;
253 /* Ensure cmd read/writes are aligned. */
254 cmd_addr = adr & ~(map_bankwidth(map)-1);
256 /* Let's determine this according to the interleave only once */
257 status_OK = CMD(0x80);
259 timeo = jiffies + HZ;
260 retry:
261 spin_lock_bh(chip->mutex);
263 /* Check that the chip's ready to talk to us.
264 * If it's in FL_ERASING state, suspend it and make it talk now.
266 switch (chip->state) {
267 case FL_ERASING:
268 if (!(((struct cfi_pri_intelext *)cfi->cmdset_priv)->FeatureSupport & 2))
269 goto sleep; /* We don't support erase suspend */
271 map_write (map, CMD(0xb0), cmd_addr);
272 /* If the flash has finished erasing, then 'erase suspend'
273 * appears to make some (28F320) flash devices switch to
274 * 'read' mode. Make sure that we switch to 'read status'
275 * mode so we get the right data. --rmk
277 map_write(map, CMD(0x70), cmd_addr);
278 chip->oldstate = FL_ERASING;
279 chip->state = FL_ERASE_SUSPENDING;
280 // printk("Erase suspending at 0x%lx\n", cmd_addr);
281 for (;;) {
282 status = map_read(map, cmd_addr);
283 if (map_word_andequal(map, status, status_OK, status_OK))
284 break;
286 if (time_after(jiffies, timeo)) {
287 /* Urgh */
288 map_write(map, CMD(0xd0), cmd_addr);
289 /* make sure we're in 'read status' mode */
290 map_write(map, CMD(0x70), cmd_addr);
291 chip->state = FL_ERASING;
292 spin_unlock_bh(chip->mutex);
293 printk(KERN_ERR "Chip not ready after erase "
294 "suspended: status = 0x%lx\n", status.x[0]);
295 return -EIO;
298 spin_unlock_bh(chip->mutex);
299 cfi_udelay(1);
300 spin_lock_bh(chip->mutex);
303 suspended = 1;
304 map_write(map, CMD(0xff), cmd_addr);
305 chip->state = FL_READY;
306 break;
308 #if 0
309 case FL_WRITING:
310 /* Not quite yet */
311 #endif
313 case FL_READY:
314 break;
316 case FL_CFI_QUERY:
317 case FL_JEDEC_QUERY:
318 map_write(map, CMD(0x70), cmd_addr);
319 chip->state = FL_STATUS;
321 case FL_STATUS:
322 status = map_read(map, cmd_addr);
323 if (map_word_andequal(map, status, status_OK, status_OK)) {
324 map_write(map, CMD(0xff), cmd_addr);
325 chip->state = FL_READY;
326 break;
329 /* Urgh. Chip not yet ready to talk to us. */
330 if (time_after(jiffies, timeo)) {
331 spin_unlock_bh(chip->mutex);
332 printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %lx\n", status.x[0]);
333 return -EIO;
336 /* Latency issues. Drop the lock, wait a while and retry */
337 spin_unlock_bh(chip->mutex);
338 cfi_udelay(1);
339 goto retry;
341 default:
342 sleep:
343 /* Stick ourselves on a wait queue to be woken when
344 someone changes the status */
345 set_current_state(TASK_UNINTERRUPTIBLE);
346 add_wait_queue(&chip->wq, &wait);
347 spin_unlock_bh(chip->mutex);
348 schedule();
349 remove_wait_queue(&chip->wq, &wait);
350 timeo = jiffies + HZ;
351 goto retry;
354 map_copy_from(map, buf, adr, len);
356 if (suspended) {
357 chip->state = chip->oldstate;
358 /* What if one interleaved chip has finished and the
359 other hasn't? The old code would leave the finished
360 one in READY mode. That's bad, and caused -EROFS
361 errors to be returned from do_erase_oneblock because
362 that's the only bit it checked for at the time.
363 As the state machine appears to explicitly allow
364 sending the 0x70 (Read Status) command to an erasing
365 chip and expecting it to be ignored, that's what we
366 do. */
367 map_write(map, CMD(0xd0), cmd_addr);
368 map_write(map, CMD(0x70), cmd_addr);
371 wake_up(&chip->wq);
372 spin_unlock_bh(chip->mutex);
373 return 0;
376 static int cfi_staa_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
378 struct map_info *map = mtd->priv;
379 struct cfi_private *cfi = map->fldrv_priv;
380 unsigned long ofs;
381 int chipnum;
382 int ret = 0;
384 /* ofs: offset within the first chip that the first read should start */
385 chipnum = (from >> cfi->chipshift);
386 ofs = from - (chipnum << cfi->chipshift);
388 *retlen = 0;
390 while (len) {
391 unsigned long thislen;
393 if (chipnum >= cfi->numchips)
394 break;
396 if ((len + ofs -1) >> cfi->chipshift)
397 thislen = (1<<cfi->chipshift) - ofs;
398 else
399 thislen = len;
401 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
402 if (ret)
403 break;
405 *retlen += thislen;
406 len -= thislen;
407 buf += thislen;
409 ofs = 0;
410 chipnum++;
412 return ret;
415 static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
416 unsigned long adr, const u_char *buf, int len)
418 struct cfi_private *cfi = map->fldrv_priv;
419 map_word status, status_OK;
420 unsigned long cmd_adr, timeo;
421 DECLARE_WAITQUEUE(wait, current);
422 int wbufsize, z;
424 /* M58LW064A requires bus alignment for buffer wriets -- saw */
425 if (adr & (map_bankwidth(map)-1))
426 return -EINVAL;
428 wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
429 adr += chip->start;
430 cmd_adr = adr & ~(wbufsize-1);
432 /* Let's determine this according to the interleave only once */
433 status_OK = CMD(0x80);
435 timeo = jiffies + HZ;
436 retry:
438 #ifdef DEBUG_CFI_FEATURES
439 printk("%s: chip->state[%d]\n", __FUNCTION__, chip->state);
440 #endif
441 spin_lock_bh(chip->mutex);
443 /* Check that the chip's ready to talk to us.
444 * Later, we can actually think about interrupting it
445 * if it's in FL_ERASING state.
446 * Not just yet, though.
448 switch (chip->state) {
449 case FL_READY:
450 break;
452 case FL_CFI_QUERY:
453 case FL_JEDEC_QUERY:
454 map_write(map, CMD(0x70), cmd_adr);
455 chip->state = FL_STATUS;
456 #ifdef DEBUG_CFI_FEATURES
457 printk("%s: 1 status[%x]\n", __FUNCTION__, map_read(map, cmd_adr));
458 #endif
460 case FL_STATUS:
461 status = map_read(map, cmd_adr);
462 if (map_word_andequal(map, status, status_OK, status_OK))
463 break;
464 /* Urgh. Chip not yet ready to talk to us. */
465 if (time_after(jiffies, timeo)) {
466 spin_unlock_bh(chip->mutex);
467 printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %lx, status = %lx\n",
468 status.x[0], map_read(map, cmd_adr).x[0]);
469 return -EIO;
472 /* Latency issues. Drop the lock, wait a while and retry */
473 spin_unlock_bh(chip->mutex);
474 cfi_udelay(1);
475 goto retry;
477 default:
478 /* Stick ourselves on a wait queue to be woken when
479 someone changes the status */
480 set_current_state(TASK_UNINTERRUPTIBLE);
481 add_wait_queue(&chip->wq, &wait);
482 spin_unlock_bh(chip->mutex);
483 schedule();
484 remove_wait_queue(&chip->wq, &wait);
485 timeo = jiffies + HZ;
486 goto retry;
489 ENABLE_VPP(map);
490 map_write(map, CMD(0xe8), cmd_adr);
491 chip->state = FL_WRITING_TO_BUFFER;
493 z = 0;
494 for (;;) {
495 status = map_read(map, cmd_adr);
496 if (map_word_andequal(map, status, status_OK, status_OK))
497 break;
499 spin_unlock_bh(chip->mutex);
500 cfi_udelay(1);
501 spin_lock_bh(chip->mutex);
503 if (++z > 100) {
504 /* Argh. Not ready for write to buffer */
505 DISABLE_VPP(map);
506 map_write(map, CMD(0x70), cmd_adr);
507 chip->state = FL_STATUS;
508 spin_unlock_bh(chip->mutex);
509 printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %lx\n", status.x[0]);
510 return -EIO;
514 /* Write length of data to come */
515 map_write(map, CMD(len/map_bankwidth(map)-1), cmd_adr );
517 /* Write data */
518 for (z = 0; z < len;
519 z += map_bankwidth(map), buf += map_bankwidth(map)) {
520 map_word d;
521 d = map_word_load(map, buf);
522 map_write(map, d, adr+z);
524 /* GO GO GO */
525 map_write(map, CMD(0xd0), cmd_adr);
526 chip->state = FL_WRITING;
528 spin_unlock_bh(chip->mutex);
529 cfi_udelay(chip->buffer_write_time);
530 spin_lock_bh(chip->mutex);
532 timeo = jiffies + (HZ/2);
533 z = 0;
534 for (;;) {
535 if (chip->state != FL_WRITING) {
536 /* Someone's suspended the write. Sleep */
537 set_current_state(TASK_UNINTERRUPTIBLE);
538 add_wait_queue(&chip->wq, &wait);
539 spin_unlock_bh(chip->mutex);
540 schedule();
541 remove_wait_queue(&chip->wq, &wait);
542 timeo = jiffies + (HZ / 2); /* FIXME */
543 spin_lock_bh(chip->mutex);
544 continue;
547 status = map_read(map, cmd_adr);
548 if (map_word_andequal(map, status, status_OK, status_OK))
549 break;
551 /* OK Still waiting */
552 if (time_after(jiffies, timeo)) {
553 /* clear status */
554 map_write(map, CMD(0x50), cmd_adr);
555 /* put back into read status register mode */
556 map_write(map, CMD(0x70), adr);
557 chip->state = FL_STATUS;
558 DISABLE_VPP(map);
559 spin_unlock_bh(chip->mutex);
560 printk(KERN_ERR "waiting for chip to be ready timed out in bufwrite\n");
561 return -EIO;
564 /* Latency issues. Drop the lock, wait a while and retry */
565 spin_unlock_bh(chip->mutex);
566 cfi_udelay(1);
567 z++;
568 spin_lock_bh(chip->mutex);
570 if (!z) {
571 chip->buffer_write_time--;
572 if (!chip->buffer_write_time)
573 chip->buffer_write_time++;
575 if (z > 1)
576 chip->buffer_write_time++;
578 /* Done and happy. */
579 DISABLE_VPP(map);
580 chip->state = FL_STATUS;
582 /* check for errors: 'lock bit', 'VPP', 'dead cell'/'unerased cell' or 'incorrect cmd' -- saw */
583 if (map_word_bitsset(map, status, CMD(0x3a))) {
584 #ifdef DEBUG_CFI_FEATURES
585 printk("%s: 2 status[%lx]\n", __FUNCTION__, status.x[0]);
586 #endif
587 /* clear status */
588 map_write(map, CMD(0x50), cmd_adr);
589 /* put back into read status register mode */
590 map_write(map, CMD(0x70), adr);
591 wake_up(&chip->wq);
592 spin_unlock_bh(chip->mutex);
593 return map_word_bitsset(map, status, CMD(0x02)) ? -EROFS : -EIO;
595 wake_up(&chip->wq);
596 spin_unlock_bh(chip->mutex);
598 return 0;
601 static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
602 size_t len, size_t *retlen, const u_char *buf)
604 struct map_info *map = mtd->priv;
605 struct cfi_private *cfi = map->fldrv_priv;
606 int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
607 int ret = 0;
608 int chipnum;
609 unsigned long ofs;
611 *retlen = 0;
612 if (!len)
613 return 0;
615 chipnum = to >> cfi->chipshift;
616 ofs = to - (chipnum << cfi->chipshift);
618 #ifdef DEBUG_CFI_FEATURES
619 printk("%s: map_bankwidth(map)[%x]\n", __FUNCTION__, map_bankwidth(map));
620 printk("%s: chipnum[%x] wbufsize[%x]\n", __FUNCTION__, chipnum, wbufsize);
621 printk("%s: ofs[%x] len[%x]\n", __FUNCTION__, ofs, len);
622 #endif
624 /* Write buffer is worth it only if more than one word to write... */
625 while (len > 0) {
626 /* We must not cross write block boundaries */
627 int size = wbufsize - (ofs & (wbufsize-1));
629 if (size > len)
630 size = len;
632 ret = do_write_buffer(map, &cfi->chips[chipnum],
633 ofs, buf, size);
634 if (ret)
635 return ret;
637 ofs += size;
638 buf += size;
639 (*retlen) += size;
640 len -= size;
642 if (ofs >> cfi->chipshift) {
643 chipnum ++;
644 ofs = 0;
645 if (chipnum == cfi->numchips)
646 return 0;
650 return 0;
654 * Writev for ECC-Flashes is a little more complicated. We need to maintain
655 * a small buffer for this.
656 * XXX: If the buffer size is not a multiple of 2, this will break
658 #define ECCBUF_SIZE (mtd->eccsize)
659 #define ECCBUF_DIV(x) ((x) & ~(ECCBUF_SIZE - 1))
660 #define ECCBUF_MOD(x) ((x) & (ECCBUF_SIZE - 1))
661 static int
662 cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
663 unsigned long count, loff_t to, size_t *retlen)
665 unsigned long i;
666 size_t totlen = 0, thislen;
667 int ret = 0;
668 size_t buflen = 0;
669 static char *buffer;
671 if (!ECCBUF_SIZE) {
672 /* We should fall back to a general writev implementation.
673 * Until that is written, just break.
675 return -EIO;
677 buffer = kmalloc(ECCBUF_SIZE, GFP_KERNEL);
678 if (!buffer)
679 return -ENOMEM;
681 for (i=0; i<count; i++) {
682 size_t elem_len = vecs[i].iov_len;
683 void *elem_base = vecs[i].iov_base;
684 if (!elem_len) /* FIXME: Might be unnecessary. Check that */
685 continue;
686 if (buflen) { /* cut off head */
687 if (buflen + elem_len < ECCBUF_SIZE) { /* just accumulate */
688 memcpy(buffer+buflen, elem_base, elem_len);
689 buflen += elem_len;
690 continue;
692 memcpy(buffer+buflen, elem_base, ECCBUF_SIZE-buflen);
693 ret = mtd->write(mtd, to, ECCBUF_SIZE, &thislen, buffer);
694 totlen += thislen;
695 if (ret || thislen != ECCBUF_SIZE)
696 goto write_error;
697 elem_len -= thislen-buflen;
698 elem_base += thislen-buflen;
699 to += ECCBUF_SIZE;
701 if (ECCBUF_DIV(elem_len)) { /* write clean aligned data */
702 ret = mtd->write(mtd, to, ECCBUF_DIV(elem_len), &thislen, elem_base);
703 totlen += thislen;
704 if (ret || thislen != ECCBUF_DIV(elem_len))
705 goto write_error;
706 to += thislen;
708 buflen = ECCBUF_MOD(elem_len); /* cut off tail */
709 if (buflen) {
710 memset(buffer, 0xff, ECCBUF_SIZE);
711 memcpy(buffer, elem_base + thislen, buflen);
714 if (buflen) { /* flush last page, even if not full */
715 /* This is sometimes intended behaviour, really */
716 ret = mtd->write(mtd, to, buflen, &thislen, buffer);
717 totlen += thislen;
718 if (ret || thislen != ECCBUF_SIZE)
719 goto write_error;
721 write_error:
722 if (retlen)
723 *retlen = totlen;
724 kfree(buffer);
725 return ret;
729 static inline int do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
731 struct cfi_private *cfi = map->fldrv_priv;
732 map_word status, status_OK;
733 unsigned long timeo;
734 int retries = 3;
735 DECLARE_WAITQUEUE(wait, current);
736 int ret = 0;
738 adr += chip->start;
740 /* Let's determine this according to the interleave only once */
741 status_OK = CMD(0x80);
743 timeo = jiffies + HZ;
744 retry:
745 spin_lock_bh(chip->mutex);
747 /* Check that the chip's ready to talk to us. */
748 switch (chip->state) {
749 case FL_CFI_QUERY:
750 case FL_JEDEC_QUERY:
751 case FL_READY:
752 map_write(map, CMD(0x70), adr);
753 chip->state = FL_STATUS;
755 case FL_STATUS:
756 status = map_read(map, adr);
757 if (map_word_andequal(map, status, status_OK, status_OK))
758 break;
760 /* Urgh. Chip not yet ready to talk to us. */
761 if (time_after(jiffies, timeo)) {
762 spin_unlock_bh(chip->mutex);
763 printk(KERN_ERR "waiting for chip to be ready timed out in erase\n");
764 return -EIO;
767 /* Latency issues. Drop the lock, wait a while and retry */
768 spin_unlock_bh(chip->mutex);
769 cfi_udelay(1);
770 goto retry;
772 default:
773 /* Stick ourselves on a wait queue to be woken when
774 someone changes the status */
775 set_current_state(TASK_UNINTERRUPTIBLE);
776 add_wait_queue(&chip->wq, &wait);
777 spin_unlock_bh(chip->mutex);
778 schedule();
779 remove_wait_queue(&chip->wq, &wait);
780 timeo = jiffies + HZ;
781 goto retry;
784 ENABLE_VPP(map);
785 /* Clear the status register first */
786 map_write(map, CMD(0x50), adr);
788 /* Now erase */
789 map_write(map, CMD(0x20), adr);
790 map_write(map, CMD(0xD0), adr);
791 chip->state = FL_ERASING;
793 spin_unlock_bh(chip->mutex);
794 msleep(1000);
795 spin_lock_bh(chip->mutex);
797 /* FIXME. Use a timer to check this, and return immediately. */
798 /* Once the state machine's known to be working I'll do that */
800 timeo = jiffies + (HZ*20);
801 for (;;) {
802 if (chip->state != FL_ERASING) {
803 /* Someone's suspended the erase. Sleep */
804 set_current_state(TASK_UNINTERRUPTIBLE);
805 add_wait_queue(&chip->wq, &wait);
806 spin_unlock_bh(chip->mutex);
807 schedule();
808 remove_wait_queue(&chip->wq, &wait);
809 timeo = jiffies + (HZ*20); /* FIXME */
810 spin_lock_bh(chip->mutex);
811 continue;
814 status = map_read(map, adr);
815 if (map_word_andequal(map, status, status_OK, status_OK))
816 break;
818 /* OK Still waiting */
819 if (time_after(jiffies, timeo)) {
820 map_write(map, CMD(0x70), adr);
821 chip->state = FL_STATUS;
822 printk(KERN_ERR "waiting for erase to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
823 DISABLE_VPP(map);
824 spin_unlock_bh(chip->mutex);
825 return -EIO;
828 /* Latency issues. Drop the lock, wait a while and retry */
829 spin_unlock_bh(chip->mutex);
830 cfi_udelay(1);
831 spin_lock_bh(chip->mutex);
834 DISABLE_VPP(map);
835 ret = 0;
837 /* We've broken this before. It doesn't hurt to be safe */
838 map_write(map, CMD(0x70), adr);
839 chip->state = FL_STATUS;
840 status = map_read(map, adr);
842 /* check for lock bit */
843 if (map_word_bitsset(map, status, CMD(0x3a))) {
844 unsigned char chipstatus = status.x[0];
845 if (!map_word_equal(map, status, CMD(chipstatus))) {
846 int i, w;
847 for (w=0; w<map_words(map); w++) {
848 for (i = 0; i<cfi_interleave(cfi); i++) {
849 chipstatus |= status.x[w] >> (cfi->device_type * 8);
852 printk(KERN_WARNING "Status is not identical for all chips: 0x%lx. Merging to give 0x%02x\n",
853 status.x[0], chipstatus);
855 /* Reset the error bits */
856 map_write(map, CMD(0x50), adr);
857 map_write(map, CMD(0x70), adr);
859 if ((chipstatus & 0x30) == 0x30) {
860 printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%x\n", chipstatus);
861 ret = -EIO;
862 } else if (chipstatus & 0x02) {
863 /* Protection bit set */
864 ret = -EROFS;
865 } else if (chipstatus & 0x8) {
866 /* Voltage */
867 printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%x\n", chipstatus);
868 ret = -EIO;
869 } else if (chipstatus & 0x20) {
870 if (retries--) {
871 printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x. Retrying...\n", adr, chipstatus);
872 timeo = jiffies + HZ;
873 chip->state = FL_STATUS;
874 spin_unlock_bh(chip->mutex);
875 goto retry;
877 printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, chipstatus);
878 ret = -EIO;
882 wake_up(&chip->wq);
883 spin_unlock_bh(chip->mutex);
884 return ret;
887 int cfi_staa_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
888 { struct map_info *map = mtd->priv;
889 struct cfi_private *cfi = map->fldrv_priv;
890 unsigned long adr, len;
891 int chipnum, ret = 0;
892 int i, first;
893 struct mtd_erase_region_info *regions = mtd->eraseregions;
895 if (instr->addr > mtd->size)
896 return -EINVAL;
898 if ((instr->len + instr->addr) > mtd->size)
899 return -EINVAL;
901 /* Check that both start and end of the requested erase are
902 * aligned with the erasesize at the appropriate addresses.
905 i = 0;
907 /* Skip all erase regions which are ended before the start of
908 the requested erase. Actually, to save on the calculations,
909 we skip to the first erase region which starts after the
910 start of the requested erase, and then go back one.
913 while (i < mtd->numeraseregions && instr->addr >= regions[i].offset)
914 i++;
915 i--;
917 /* OK, now i is pointing at the erase region in which this
918 erase request starts. Check the start of the requested
919 erase range is aligned with the erase size which is in
920 effect here.
923 if (instr->addr & (regions[i].erasesize-1))
924 return -EINVAL;
926 /* Remember the erase region we start on */
927 first = i;
929 /* Next, check that the end of the requested erase is aligned
930 * with the erase region at that address.
933 while (i<mtd->numeraseregions && (instr->addr + instr->len) >= regions[i].offset)
934 i++;
936 /* As before, drop back one to point at the region in which
937 the address actually falls
939 i--;
941 if ((instr->addr + instr->len) & (regions[i].erasesize-1))
942 return -EINVAL;
944 chipnum = instr->addr >> cfi->chipshift;
945 adr = instr->addr - (chipnum << cfi->chipshift);
946 len = instr->len;
948 i=first;
950 while(len) {
951 ret = do_erase_oneblock(map, &cfi->chips[chipnum], adr);
953 if (ret)
954 return ret;
956 adr += regions[i].erasesize;
957 len -= regions[i].erasesize;
959 if (adr % (1<< cfi->chipshift) == ((regions[i].offset + (regions[i].erasesize * regions[i].numblocks)) %( 1<< cfi->chipshift)))
960 i++;
962 if (adr >> cfi->chipshift) {
963 adr = 0;
964 chipnum++;
966 if (chipnum >= cfi->numchips)
967 break;
971 instr->state = MTD_ERASE_DONE;
972 mtd_erase_callback(instr);
974 return 0;
977 static void cfi_staa_sync (struct mtd_info *mtd)
979 struct map_info *map = mtd->priv;
980 struct cfi_private *cfi = map->fldrv_priv;
981 int i;
982 struct flchip *chip;
983 int ret = 0;
984 DECLARE_WAITQUEUE(wait, current);
986 for (i=0; !ret && i<cfi->numchips; i++) {
987 chip = &cfi->chips[i];
989 retry:
990 spin_lock_bh(chip->mutex);
992 switch(chip->state) {
993 case FL_READY:
994 case FL_STATUS:
995 case FL_CFI_QUERY:
996 case FL_JEDEC_QUERY:
997 chip->oldstate = chip->state;
998 chip->state = FL_SYNCING;
999 /* No need to wake_up() on this state change -
1000 * as the whole point is that nobody can do anything
1001 * with the chip now anyway.
1003 case FL_SYNCING:
1004 spin_unlock_bh(chip->mutex);
1005 break;
1007 default:
1008 /* Not an idle state */
1009 add_wait_queue(&chip->wq, &wait);
1011 spin_unlock_bh(chip->mutex);
1012 schedule();
1013 remove_wait_queue(&chip->wq, &wait);
1015 goto retry;
1019 /* Unlock the chips again */
1021 for (i--; i >=0; i--) {
1022 chip = &cfi->chips[i];
1024 spin_lock_bh(chip->mutex);
1026 if (chip->state == FL_SYNCING) {
1027 chip->state = chip->oldstate;
1028 wake_up(&chip->wq);
1030 spin_unlock_bh(chip->mutex);
1034 static inline int do_lock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
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);
1041 adr += chip->start;
1043 /* Let's determine this according to the interleave only once */
1044 status_OK = CMD(0x80);
1046 timeo = jiffies + HZ;
1047 retry:
1048 spin_lock_bh(chip->mutex);
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;
1058 case FL_STATUS:
1059 status = map_read(map, adr);
1060 if (map_word_andequal(map, status, status_OK, status_OK))
1061 break;
1063 /* Urgh. Chip not yet ready to talk to us. */
1064 if (time_after(jiffies, timeo)) {
1065 spin_unlock_bh(chip->mutex);
1066 printk(KERN_ERR "waiting for chip to be ready timed out in lock\n");
1067 return -EIO;
1070 /* Latency issues. Drop the lock, wait a while and retry */
1071 spin_unlock_bh(chip->mutex);
1072 cfi_udelay(1);
1073 goto retry;
1075 default:
1076 /* Stick ourselves on a wait queue to be woken when
1077 someone changes the status */
1078 set_current_state(TASK_UNINTERRUPTIBLE);
1079 add_wait_queue(&chip->wq, &wait);
1080 spin_unlock_bh(chip->mutex);
1081 schedule();
1082 remove_wait_queue(&chip->wq, &wait);
1083 timeo = jiffies + HZ;
1084 goto retry;
1087 ENABLE_VPP(map);
1088 map_write(map, CMD(0x60), adr);
1089 map_write(map, CMD(0x01), adr);
1090 chip->state = FL_LOCKING;
1092 spin_unlock_bh(chip->mutex);
1093 msleep(1000);
1094 spin_lock_bh(chip->mutex);
1096 /* FIXME. Use a timer to check this, and return immediately. */
1097 /* Once the state machine's known to be working I'll do that */
1099 timeo = jiffies + (HZ*2);
1100 for (;;) {
1102 status = map_read(map, adr);
1103 if (map_word_andequal(map, status, status_OK, status_OK))
1104 break;
1106 /* OK Still waiting */
1107 if (time_after(jiffies, timeo)) {
1108 map_write(map, CMD(0x70), adr);
1109 chip->state = FL_STATUS;
1110 printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1111 DISABLE_VPP(map);
1112 spin_unlock_bh(chip->mutex);
1113 return -EIO;
1116 /* Latency issues. Drop the lock, wait a while and retry */
1117 spin_unlock_bh(chip->mutex);
1118 cfi_udelay(1);
1119 spin_lock_bh(chip->mutex);
1122 /* Done and happy. */
1123 chip->state = FL_STATUS;
1124 DISABLE_VPP(map);
1125 wake_up(&chip->wq);
1126 spin_unlock_bh(chip->mutex);
1127 return 0;
1129 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, size_t len)
1131 struct map_info *map = mtd->priv;
1132 struct cfi_private *cfi = map->fldrv_priv;
1133 unsigned long adr;
1134 int chipnum, ret = 0;
1135 #ifdef DEBUG_LOCK_BITS
1136 int ofs_factor = cfi->interleave * cfi->device_type;
1137 #endif
1139 if (ofs & (mtd->erasesize - 1))
1140 return -EINVAL;
1142 if (len & (mtd->erasesize -1))
1143 return -EINVAL;
1145 if ((len + ofs) > mtd->size)
1146 return -EINVAL;
1148 chipnum = ofs >> cfi->chipshift;
1149 adr = ofs - (chipnum << cfi->chipshift);
1151 while(len) {
1153 #ifdef DEBUG_LOCK_BITS
1154 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1155 printk("before lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1156 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1157 #endif
1159 ret = do_lock_oneblock(map, &cfi->chips[chipnum], adr);
1161 #ifdef DEBUG_LOCK_BITS
1162 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1163 printk("after lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1164 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1165 #endif
1167 if (ret)
1168 return ret;
1170 adr += mtd->erasesize;
1171 len -= mtd->erasesize;
1173 if (adr >> cfi->chipshift) {
1174 adr = 0;
1175 chipnum++;
1177 if (chipnum >= cfi->numchips)
1178 break;
1181 return 0;
1183 static inline int do_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1185 struct cfi_private *cfi = map->fldrv_priv;
1186 map_word status, status_OK;
1187 unsigned long timeo = jiffies + HZ;
1188 DECLARE_WAITQUEUE(wait, current);
1190 adr += chip->start;
1192 /* Let's determine this according to the interleave only once */
1193 status_OK = CMD(0x80);
1195 timeo = jiffies + HZ;
1196 retry:
1197 spin_lock_bh(chip->mutex);
1199 /* Check that the chip's ready to talk to us. */
1200 switch (chip->state) {
1201 case FL_CFI_QUERY:
1202 case FL_JEDEC_QUERY:
1203 case FL_READY:
1204 map_write(map, CMD(0x70), adr);
1205 chip->state = FL_STATUS;
1207 case FL_STATUS:
1208 status = map_read(map, adr);
1209 if (map_word_andequal(map, status, status_OK, status_OK))
1210 break;
1212 /* Urgh. Chip not yet ready to talk to us. */
1213 if (time_after(jiffies, timeo)) {
1214 spin_unlock_bh(chip->mutex);
1215 printk(KERN_ERR "waiting for chip to be ready timed out in unlock\n");
1216 return -EIO;
1219 /* Latency issues. Drop the lock, wait a while and retry */
1220 spin_unlock_bh(chip->mutex);
1221 cfi_udelay(1);
1222 goto retry;
1224 default:
1225 /* Stick ourselves on a wait queue to be woken when
1226 someone changes the status */
1227 set_current_state(TASK_UNINTERRUPTIBLE);
1228 add_wait_queue(&chip->wq, &wait);
1229 spin_unlock_bh(chip->mutex);
1230 schedule();
1231 remove_wait_queue(&chip->wq, &wait);
1232 timeo = jiffies + HZ;
1233 goto retry;
1236 ENABLE_VPP(map);
1237 map_write(map, CMD(0x60), adr);
1238 map_write(map, CMD(0xD0), adr);
1239 chip->state = FL_UNLOCKING;
1241 spin_unlock_bh(chip->mutex);
1242 msleep(1000);
1243 spin_lock_bh(chip->mutex);
1245 /* FIXME. Use a timer to check this, and return immediately. */
1246 /* Once the state machine's known to be working I'll do that */
1248 timeo = jiffies + (HZ*2);
1249 for (;;) {
1251 status = map_read(map, adr);
1252 if (map_word_andequal(map, status, status_OK, status_OK))
1253 break;
1255 /* OK Still waiting */
1256 if (time_after(jiffies, timeo)) {
1257 map_write(map, CMD(0x70), adr);
1258 chip->state = FL_STATUS;
1259 printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1260 DISABLE_VPP(map);
1261 spin_unlock_bh(chip->mutex);
1262 return -EIO;
1265 /* Latency issues. Drop the unlock, wait a while and retry */
1266 spin_unlock_bh(chip->mutex);
1267 cfi_udelay(1);
1268 spin_lock_bh(chip->mutex);
1271 /* Done and happy. */
1272 chip->state = FL_STATUS;
1273 DISABLE_VPP(map);
1274 wake_up(&chip->wq);
1275 spin_unlock_bh(chip->mutex);
1276 return 0;
1278 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, size_t len)
1280 struct map_info *map = mtd->priv;
1281 struct cfi_private *cfi = map->fldrv_priv;
1282 unsigned long adr;
1283 int chipnum, ret = 0;
1284 #ifdef DEBUG_LOCK_BITS
1285 int ofs_factor = cfi->interleave * cfi->device_type;
1286 #endif
1288 chipnum = ofs >> cfi->chipshift;
1289 adr = ofs - (chipnum << cfi->chipshift);
1291 #ifdef DEBUG_LOCK_BITS
1293 unsigned long temp_adr = adr;
1294 unsigned long temp_len = len;
1296 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1297 while (temp_len) {
1298 printk("before unlock %x: block status register is %x\n",temp_adr,cfi_read_query(map, temp_adr+(2*ofs_factor)));
1299 temp_adr += mtd->erasesize;
1300 temp_len -= mtd->erasesize;
1302 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1304 #endif
1306 ret = do_unlock_oneblock(map, &cfi->chips[chipnum], adr);
1308 #ifdef DEBUG_LOCK_BITS
1309 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1310 printk("after unlock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1311 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1312 #endif
1314 return ret;
1317 static int cfi_staa_suspend(struct mtd_info *mtd)
1319 struct map_info *map = mtd->priv;
1320 struct cfi_private *cfi = map->fldrv_priv;
1321 int i;
1322 struct flchip *chip;
1323 int ret = 0;
1325 for (i=0; !ret && i<cfi->numchips; i++) {
1326 chip = &cfi->chips[i];
1328 spin_lock_bh(chip->mutex);
1330 switch(chip->state) {
1331 case FL_READY:
1332 case FL_STATUS:
1333 case FL_CFI_QUERY:
1334 case FL_JEDEC_QUERY:
1335 chip->oldstate = chip->state;
1336 chip->state = FL_PM_SUSPENDED;
1337 /* No need to wake_up() on this state change -
1338 * as the whole point is that nobody can do anything
1339 * with the chip now anyway.
1341 case FL_PM_SUSPENDED:
1342 break;
1344 default:
1345 ret = -EAGAIN;
1346 break;
1348 spin_unlock_bh(chip->mutex);
1351 /* Unlock the chips again */
1353 if (ret) {
1354 for (i--; i >=0; i--) {
1355 chip = &cfi->chips[i];
1357 spin_lock_bh(chip->mutex);
1359 if (chip->state == FL_PM_SUSPENDED) {
1360 /* No need to force it into a known state here,
1361 because we're returning failure, and it didn't
1362 get power cycled */
1363 chip->state = chip->oldstate;
1364 wake_up(&chip->wq);
1366 spin_unlock_bh(chip->mutex);
1370 return ret;
1373 static void cfi_staa_resume(struct mtd_info *mtd)
1375 struct map_info *map = mtd->priv;
1376 struct cfi_private *cfi = map->fldrv_priv;
1377 int i;
1378 struct flchip *chip;
1380 for (i=0; i<cfi->numchips; i++) {
1382 chip = &cfi->chips[i];
1384 spin_lock_bh(chip->mutex);
1386 /* Go to known state. Chip may have been power cycled */
1387 if (chip->state == FL_PM_SUSPENDED) {
1388 map_write(map, CMD(0xFF), 0);
1389 chip->state = FL_READY;
1390 wake_up(&chip->wq);
1393 spin_unlock_bh(chip->mutex);
1397 static void cfi_staa_destroy(struct mtd_info *mtd)
1399 struct map_info *map = mtd->priv;
1400 struct cfi_private *cfi = map->fldrv_priv;
1401 kfree(cfi->cmdset_priv);
1402 kfree(cfi);
1405 static char im_name[]="cfi_cmdset_0020";
1407 static int __init cfi_staa_init(void)
1409 inter_module_register(im_name, THIS_MODULE, &cfi_cmdset_0020);
1410 return 0;
1413 static void __exit cfi_staa_exit(void)
1415 inter_module_unregister(im_name);
1418 module_init(cfi_staa_init);
1419 module_exit(cfi_staa_exit);
1421 MODULE_LICENSE("GPL");