drm/i915: kill mappable/fenceable disdinction
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / mtd / chips / cfi_cmdset_0020.c
blob314af1f5a370ec9d522820842f0054536dea0111
1 /*
2 * Common Flash Interface support:
3 * ST Advanced Architecture Command Set (ID 0x0020)
5 * (C) 2000 Red Hat. GPL'd
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().
21 #include <linux/module.h>
22 #include <linux/types.h>
23 #include <linux/kernel.h>
24 #include <linux/sched.h>
25 #include <linux/init.h>
26 #include <asm/io.h>
27 #include <asm/byteorder.h>
29 #include <linux/errno.h>
30 #include <linux/slab.h>
31 #include <linux/delay.h>
32 #include <linux/interrupt.h>
33 #include <linux/mtd/map.h>
34 #include <linux/mtd/cfi.h>
35 #include <linux/mtd/mtd.h>
38 static int cfi_staa_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);
39 static int cfi_staa_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
40 static int cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
41 unsigned long count, loff_t to, size_t *retlen);
42 static int cfi_staa_erase_varsize(struct mtd_info *, struct erase_info *);
43 static void cfi_staa_sync (struct mtd_info *);
44 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
45 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
46 static int cfi_staa_suspend (struct mtd_info *);
47 static void cfi_staa_resume (struct mtd_info *);
49 static void cfi_staa_destroy(struct mtd_info *);
51 struct mtd_info *cfi_cmdset_0020(struct map_info *, int);
53 static struct mtd_info *cfi_staa_setup (struct map_info *);
55 static struct mtd_chip_driver cfi_staa_chipdrv = {
56 .probe = NULL, /* Not usable directly */
57 .destroy = cfi_staa_destroy,
58 .name = "cfi_cmdset_0020",
59 .module = THIS_MODULE
62 /* #define DEBUG_LOCK_BITS */
63 //#define DEBUG_CFI_FEATURES
65 #ifdef DEBUG_CFI_FEATURES
66 static void cfi_tell_features(struct cfi_pri_intelext *extp)
68 int i;
69 printk(" Feature/Command Support: %4.4X\n", extp->FeatureSupport);
70 printk(" - Chip Erase: %s\n", extp->FeatureSupport&1?"supported":"unsupported");
71 printk(" - Suspend Erase: %s\n", extp->FeatureSupport&2?"supported":"unsupported");
72 printk(" - Suspend Program: %s\n", extp->FeatureSupport&4?"supported":"unsupported");
73 printk(" - Legacy Lock/Unlock: %s\n", extp->FeatureSupport&8?"supported":"unsupported");
74 printk(" - Queued Erase: %s\n", extp->FeatureSupport&16?"supported":"unsupported");
75 printk(" - Instant block lock: %s\n", extp->FeatureSupport&32?"supported":"unsupported");
76 printk(" - Protection Bits: %s\n", extp->FeatureSupport&64?"supported":"unsupported");
77 printk(" - Page-mode read: %s\n", extp->FeatureSupport&128?"supported":"unsupported");
78 printk(" - Synchronous read: %s\n", extp->FeatureSupport&256?"supported":"unsupported");
79 for (i=9; i<32; i++) {
80 if (extp->FeatureSupport & (1<<i))
81 printk(" - Unknown Bit %X: supported\n", i);
84 printk(" Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);
85 printk(" - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");
86 for (i=1; i<8; i++) {
87 if (extp->SuspendCmdSupport & (1<<i))
88 printk(" - Unknown Bit %X: supported\n", i);
91 printk(" Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);
92 printk(" - Lock Bit Active: %s\n", extp->BlkStatusRegMask&1?"yes":"no");
93 printk(" - Valid Bit Active: %s\n", extp->BlkStatusRegMask&2?"yes":"no");
94 for (i=2; i<16; i++) {
95 if (extp->BlkStatusRegMask & (1<<i))
96 printk(" - Unknown Bit %X Active: yes\n",i);
99 printk(" Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",
100 extp->VccOptimal >> 8, extp->VccOptimal & 0xf);
101 if (extp->VppOptimal)
102 printk(" Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",
103 extp->VppOptimal >> 8, extp->VppOptimal & 0xf);
105 #endif
107 /* This routine is made available to other mtd code via
108 * inter_module_register. It must only be accessed through
109 * inter_module_get which will bump the use count of this module. The
110 * addresses passed back in cfi are valid as long as the use count of
111 * this module is non-zero, i.e. between inter_module_get and
112 * inter_module_put. Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
114 struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
116 struct cfi_private *cfi = map->fldrv_priv;
117 int i;
119 if (cfi->cfi_mode) {
121 * It's a real CFI chip, not one for which the probe
122 * routine faked a CFI structure. So we read the feature
123 * table from it.
125 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
126 struct cfi_pri_intelext *extp;
128 extp = (struct cfi_pri_intelext*)cfi_read_pri(map, adr, sizeof(*extp), "ST Microelectronics");
129 if (!extp)
130 return NULL;
132 if (extp->MajorVersion != '1' ||
133 (extp->MinorVersion < '0' || extp->MinorVersion > '3')) {
134 printk(KERN_ERR " Unknown ST Microelectronics"
135 " Extended Query version %c.%c.\n",
136 extp->MajorVersion, extp->MinorVersion);
137 kfree(extp);
138 return NULL;
141 /* Do some byteswapping if necessary */
142 extp->FeatureSupport = cfi32_to_cpu(extp->FeatureSupport);
143 extp->BlkStatusRegMask = cfi32_to_cpu(extp->BlkStatusRegMask);
145 #ifdef DEBUG_CFI_FEATURES
146 /* Tell the user about it in lots of lovely detail */
147 cfi_tell_features(extp);
148 #endif
150 /* Install our own private info structure */
151 cfi->cmdset_priv = extp;
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));
162 return cfi_staa_setup(map);
164 EXPORT_SYMBOL_GPL(cfi_cmdset_0020);
166 static struct mtd_info *cfi_staa_setup(struct map_info *map)
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;
174 mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
175 //printk(KERN_DEBUG "number of CFI chips: %d\n", cfi->numchips);
177 if (!mtd) {
178 printk(KERN_ERR "Failed to allocate memory for MTD device\n");
179 kfree(cfi->cmdset_priv);
180 return NULL;
183 mtd->priv = map;
184 mtd->type = MTD_NORFLASH;
185 mtd->size = devsize * cfi->numchips;
187 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
188 mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info)
189 * mtd->numeraseregions, GFP_KERNEL);
190 if (!mtd->eraseregions) {
191 printk(KERN_ERR "Failed to allocate memory for MTD erase region info\n");
192 kfree(cfi->cmdset_priv);
193 kfree(mtd);
194 return NULL;
197 for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
198 unsigned long ernum, ersize;
199 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
200 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
202 if (mtd->erasesize < ersize) {
203 mtd->erasesize = ersize;
205 for (j=0; j<cfi->numchips; j++) {
206 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
207 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
208 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
210 offset += (ersize * ernum);
213 if (offset != devsize) {
214 /* Argh */
215 printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);
216 kfree(mtd->eraseregions);
217 kfree(cfi->cmdset_priv);
218 kfree(mtd);
219 return NULL;
222 for (i=0; i<mtd->numeraseregions;i++){
223 printk(KERN_DEBUG "%d: offset=0x%llx,size=0x%x,blocks=%d\n",
224 i, (unsigned long long)mtd->eraseregions[i].offset,
225 mtd->eraseregions[i].erasesize,
226 mtd->eraseregions[i].numblocks);
229 /* Also select the correct geometry setup too */
230 mtd->erase = cfi_staa_erase_varsize;
231 mtd->read = cfi_staa_read;
232 mtd->write = cfi_staa_write_buffers;
233 mtd->writev = cfi_staa_writev;
234 mtd->sync = cfi_staa_sync;
235 mtd->lock = cfi_staa_lock;
236 mtd->unlock = cfi_staa_unlock;
237 mtd->suspend = cfi_staa_suspend;
238 mtd->resume = cfi_staa_resume;
239 mtd->flags = MTD_CAP_NORFLASH & ~MTD_BIT_WRITEABLE;
240 mtd->writesize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */
241 map->fldrv = &cfi_staa_chipdrv;
242 __module_get(THIS_MODULE);
243 mtd->name = map->name;
244 return mtd;
248 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
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;
257 adr += chip->start;
259 /* Ensure cmd read/writes are aligned. */
260 cmd_addr = adr & ~(map_bankwidth(map)-1);
262 /* Let's determine this according to the interleave only once */
263 status_OK = CMD(0x80);
265 timeo = jiffies + HZ;
266 retry:
267 mutex_lock(&chip->mutex);
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.
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 */
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
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;
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 mutex_unlock(&chip->mutex);
299 printk(KERN_ERR "Chip not ready after erase "
300 "suspended: status = 0x%lx\n", status.x[0]);
301 return -EIO;
304 mutex_unlock(&chip->mutex);
305 cfi_udelay(1);
306 mutex_lock(&chip->mutex);
309 suspended = 1;
310 map_write(map, CMD(0xff), cmd_addr);
311 chip->state = FL_READY;
312 break;
314 #if 0
315 case FL_WRITING:
316 /* Not quite yet */
317 #endif
319 case FL_READY:
320 break;
322 case FL_CFI_QUERY:
323 case FL_JEDEC_QUERY:
324 map_write(map, CMD(0x70), cmd_addr);
325 chip->state = FL_STATUS;
327 case FL_STATUS:
328 status = map_read(map, cmd_addr);
329 if (map_word_andequal(map, status, status_OK, status_OK)) {
330 map_write(map, CMD(0xff), cmd_addr);
331 chip->state = FL_READY;
332 break;
335 /* Urgh. Chip not yet ready to talk to us. */
336 if (time_after(jiffies, timeo)) {
337 mutex_unlock(&chip->mutex);
338 printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %lx\n", status.x[0]);
339 return -EIO;
342 /* Latency issues. Drop the lock, wait a while and retry */
343 mutex_unlock(&chip->mutex);
344 cfi_udelay(1);
345 goto retry;
347 default:
348 sleep:
349 /* Stick ourselves on a wait queue to be woken when
350 someone changes the status */
351 set_current_state(TASK_UNINTERRUPTIBLE);
352 add_wait_queue(&chip->wq, &wait);
353 mutex_unlock(&chip->mutex);
354 schedule();
355 remove_wait_queue(&chip->wq, &wait);
356 timeo = jiffies + HZ;
357 goto retry;
360 map_copy_from(map, buf, adr, len);
362 if (suspended) {
363 chip->state = chip->oldstate;
364 /* What if one interleaved chip has finished and the
365 other hasn't? The old code would leave the finished
366 one in READY mode. That's bad, and caused -EROFS
367 errors to be returned from do_erase_oneblock because
368 that's the only bit it checked for at the time.
369 As the state machine appears to explicitly allow
370 sending the 0x70 (Read Status) command to an erasing
371 chip and expecting it to be ignored, that's what we
372 do. */
373 map_write(map, CMD(0xd0), cmd_addr);
374 map_write(map, CMD(0x70), cmd_addr);
377 wake_up(&chip->wq);
378 mutex_unlock(&chip->mutex);
379 return 0;
382 static int cfi_staa_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
384 struct map_info *map = mtd->priv;
385 struct cfi_private *cfi = map->fldrv_priv;
386 unsigned long ofs;
387 int chipnum;
388 int ret = 0;
390 /* ofs: offset within the first chip that the first read should start */
391 chipnum = (from >> cfi->chipshift);
392 ofs = from - (chipnum << cfi->chipshift);
394 *retlen = 0;
396 while (len) {
397 unsigned long thislen;
399 if (chipnum >= cfi->numchips)
400 break;
402 if ((len + ofs -1) >> cfi->chipshift)
403 thislen = (1<<cfi->chipshift) - ofs;
404 else
405 thislen = len;
407 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
408 if (ret)
409 break;
411 *retlen += thislen;
412 len -= thislen;
413 buf += thislen;
415 ofs = 0;
416 chipnum++;
418 return ret;
421 static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
422 unsigned long adr, const u_char *buf, int len)
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;
430 /* M58LW064A requires bus alignment for buffer wriets -- saw */
431 if (adr & (map_bankwidth(map)-1))
432 return -EINVAL;
434 wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
435 adr += chip->start;
436 cmd_adr = adr & ~(wbufsize-1);
438 /* Let's determine this according to the interleave only once */
439 status_OK = CMD(0x80);
441 timeo = jiffies + HZ;
442 retry:
444 #ifdef DEBUG_CFI_FEATURES
445 printk("%s: chip->state[%d]\n", __func__, chip->state);
446 #endif
447 mutex_lock(&chip->mutex);
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.
454 switch (chip->state) {
455 case FL_READY:
456 break;
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
466 case FL_STATUS:
467 status = map_read(map, cmd_adr);
468 if (map_word_andequal(map, status, status_OK, status_OK))
469 break;
470 /* Urgh. Chip not yet ready to talk to us. */
471 if (time_after(jiffies, timeo)) {
472 mutex_unlock(&chip->mutex);
473 printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %lx, status = %lx\n",
474 status.x[0], map_read(map, cmd_adr).x[0]);
475 return -EIO;
478 /* Latency issues. Drop the lock, wait a while and retry */
479 mutex_unlock(&chip->mutex);
480 cfi_udelay(1);
481 goto retry;
483 default:
484 /* Stick ourselves on a wait queue to be woken when
485 someone changes the status */
486 set_current_state(TASK_UNINTERRUPTIBLE);
487 add_wait_queue(&chip->wq, &wait);
488 mutex_unlock(&chip->mutex);
489 schedule();
490 remove_wait_queue(&chip->wq, &wait);
491 timeo = jiffies + HZ;
492 goto retry;
495 ENABLE_VPP(map);
496 map_write(map, CMD(0xe8), cmd_adr);
497 chip->state = FL_WRITING_TO_BUFFER;
499 z = 0;
500 for (;;) {
501 status = map_read(map, cmd_adr);
502 if (map_word_andequal(map, status, status_OK, status_OK))
503 break;
505 mutex_unlock(&chip->mutex);
506 cfi_udelay(1);
507 mutex_lock(&chip->mutex);
509 if (++z > 100) {
510 /* Argh. Not ready for write to buffer */
511 DISABLE_VPP(map);
512 map_write(map, CMD(0x70), cmd_adr);
513 chip->state = FL_STATUS;
514 mutex_unlock(&chip->mutex);
515 printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %lx\n", status.x[0]);
516 return -EIO;
520 /* Write length of data to come */
521 map_write(map, CMD(len/map_bankwidth(map)-1), cmd_adr );
523 /* Write data */
524 for (z = 0; z < len;
525 z += map_bankwidth(map), buf += map_bankwidth(map)) {
526 map_word d;
527 d = map_word_load(map, buf);
528 map_write(map, d, adr+z);
530 /* GO GO GO */
531 map_write(map, CMD(0xd0), cmd_adr);
532 chip->state = FL_WRITING;
534 mutex_unlock(&chip->mutex);
535 cfi_udelay(chip->buffer_write_time);
536 mutex_lock(&chip->mutex);
538 timeo = jiffies + (HZ/2);
539 z = 0;
540 for (;;) {
541 if (chip->state != FL_WRITING) {
542 /* Someone's suspended the write. Sleep */
543 set_current_state(TASK_UNINTERRUPTIBLE);
544 add_wait_queue(&chip->wq, &wait);
545 mutex_unlock(&chip->mutex);
546 schedule();
547 remove_wait_queue(&chip->wq, &wait);
548 timeo = jiffies + (HZ / 2); /* FIXME */
549 mutex_lock(&chip->mutex);
550 continue;
553 status = map_read(map, cmd_adr);
554 if (map_word_andequal(map, status, status_OK, status_OK))
555 break;
557 /* OK Still waiting */
558 if (time_after(jiffies, timeo)) {
559 /* clear status */
560 map_write(map, CMD(0x50), cmd_adr);
561 /* put back into read status register mode */
562 map_write(map, CMD(0x70), adr);
563 chip->state = FL_STATUS;
564 DISABLE_VPP(map);
565 mutex_unlock(&chip->mutex);
566 printk(KERN_ERR "waiting for chip to be ready timed out in bufwrite\n");
567 return -EIO;
570 /* Latency issues. Drop the lock, wait a while and retry */
571 mutex_unlock(&chip->mutex);
572 cfi_udelay(1);
573 z++;
574 mutex_lock(&chip->mutex);
576 if (!z) {
577 chip->buffer_write_time--;
578 if (!chip->buffer_write_time)
579 chip->buffer_write_time++;
581 if (z > 1)
582 chip->buffer_write_time++;
584 /* Done and happy. */
585 DISABLE_VPP(map);
586 chip->state = FL_STATUS;
588 /* check for errors: 'lock bit', 'VPP', 'dead cell'/'unerased cell' or 'incorrect cmd' -- saw */
589 if (map_word_bitsset(map, status, CMD(0x3a))) {
590 #ifdef DEBUG_CFI_FEATURES
591 printk("%s: 2 status[%lx]\n", __func__, status.x[0]);
592 #endif
593 /* clear status */
594 map_write(map, CMD(0x50), cmd_adr);
595 /* put back into read status register mode */
596 map_write(map, CMD(0x70), adr);
597 wake_up(&chip->wq);
598 mutex_unlock(&chip->mutex);
599 return map_word_bitsset(map, status, CMD(0x02)) ? -EROFS : -EIO;
601 wake_up(&chip->wq);
602 mutex_unlock(&chip->mutex);
604 return 0;
607 static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
608 size_t len, size_t *retlen, const u_char *buf)
610 struct map_info *map = mtd->priv;
611 struct cfi_private *cfi = map->fldrv_priv;
612 int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
613 int ret = 0;
614 int chipnum;
615 unsigned long ofs;
617 *retlen = 0;
618 if (!len)
619 return 0;
621 chipnum = to >> cfi->chipshift;
622 ofs = to - (chipnum << cfi->chipshift);
624 #ifdef DEBUG_CFI_FEATURES
625 printk("%s: map_bankwidth(map)[%x]\n", __func__, map_bankwidth(map));
626 printk("%s: chipnum[%x] wbufsize[%x]\n", __func__, chipnum, wbufsize);
627 printk("%s: ofs[%x] len[%x]\n", __func__, ofs, len);
628 #endif
630 /* Write buffer is worth it only if more than one word to write... */
631 while (len > 0) {
632 /* We must not cross write block boundaries */
633 int size = wbufsize - (ofs & (wbufsize-1));
635 if (size > len)
636 size = len;
638 ret = do_write_buffer(map, &cfi->chips[chipnum],
639 ofs, buf, size);
640 if (ret)
641 return ret;
643 ofs += size;
644 buf += size;
645 (*retlen) += size;
646 len -= size;
648 if (ofs >> cfi->chipshift) {
649 chipnum ++;
650 ofs = 0;
651 if (chipnum == cfi->numchips)
652 return 0;
656 return 0;
660 * Writev for ECC-Flashes is a little more complicated. We need to maintain
661 * a small buffer for this.
662 * XXX: If the buffer size is not a multiple of 2, this will break
664 #define ECCBUF_SIZE (mtd->writesize)
665 #define ECCBUF_DIV(x) ((x) & ~(ECCBUF_SIZE - 1))
666 #define ECCBUF_MOD(x) ((x) & (ECCBUF_SIZE - 1))
667 static int
668 cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
669 unsigned long count, loff_t to, size_t *retlen)
671 unsigned long i;
672 size_t totlen = 0, thislen;
673 int ret = 0;
674 size_t buflen = 0;
675 static char *buffer;
677 if (!ECCBUF_SIZE) {
678 /* We should fall back to a general writev implementation.
679 * Until that is written, just break.
681 return -EIO;
683 buffer = kmalloc(ECCBUF_SIZE, GFP_KERNEL);
684 if (!buffer)
685 return -ENOMEM;
687 for (i=0; i<count; i++) {
688 size_t elem_len = vecs[i].iov_len;
689 void *elem_base = vecs[i].iov_base;
690 if (!elem_len) /* FIXME: Might be unnecessary. Check that */
691 continue;
692 if (buflen) { /* cut off head */
693 if (buflen + elem_len < ECCBUF_SIZE) { /* just accumulate */
694 memcpy(buffer+buflen, elem_base, elem_len);
695 buflen += elem_len;
696 continue;
698 memcpy(buffer+buflen, elem_base, ECCBUF_SIZE-buflen);
699 ret = mtd->write(mtd, to, ECCBUF_SIZE, &thislen, buffer);
700 totlen += thislen;
701 if (ret || thislen != ECCBUF_SIZE)
702 goto write_error;
703 elem_len -= thislen-buflen;
704 elem_base += thislen-buflen;
705 to += ECCBUF_SIZE;
707 if (ECCBUF_DIV(elem_len)) { /* write clean aligned data */
708 ret = mtd->write(mtd, to, ECCBUF_DIV(elem_len), &thislen, elem_base);
709 totlen += thislen;
710 if (ret || thislen != ECCBUF_DIV(elem_len))
711 goto write_error;
712 to += thislen;
714 buflen = ECCBUF_MOD(elem_len); /* cut off tail */
715 if (buflen) {
716 memset(buffer, 0xff, ECCBUF_SIZE);
717 memcpy(buffer, elem_base + thislen, buflen);
720 if (buflen) { /* flush last page, even if not full */
721 /* This is sometimes intended behaviour, really */
722 ret = mtd->write(mtd, to, buflen, &thislen, buffer);
723 totlen += thislen;
724 if (ret || thislen != ECCBUF_SIZE)
725 goto write_error;
727 write_error:
728 if (retlen)
729 *retlen = totlen;
730 kfree(buffer);
731 return ret;
735 static inline int do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
737 struct cfi_private *cfi = map->fldrv_priv;
738 map_word status, status_OK;
739 unsigned long timeo;
740 int retries = 3;
741 DECLARE_WAITQUEUE(wait, current);
742 int ret = 0;
744 adr += chip->start;
746 /* Let's determine this according to the interleave only once */
747 status_OK = CMD(0x80);
749 timeo = jiffies + HZ;
750 retry:
751 mutex_lock(&chip->mutex);
753 /* Check that the chip's ready to talk to us. */
754 switch (chip->state) {
755 case FL_CFI_QUERY:
756 case FL_JEDEC_QUERY:
757 case FL_READY:
758 map_write(map, CMD(0x70), adr);
759 chip->state = FL_STATUS;
761 case FL_STATUS:
762 status = map_read(map, adr);
763 if (map_word_andequal(map, status, status_OK, status_OK))
764 break;
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;
773 /* Latency issues. Drop the lock, wait a while and retry */
774 mutex_unlock(&chip->mutex);
775 cfi_udelay(1);
776 goto retry;
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;
790 ENABLE_VPP(map);
791 /* Clear the status register first */
792 map_write(map, CMD(0x50), adr);
794 /* Now erase */
795 map_write(map, CMD(0x20), adr);
796 map_write(map, CMD(0xD0), adr);
797 chip->state = FL_ERASING;
799 mutex_unlock(&chip->mutex);
800 msleep(1000);
801 mutex_lock(&chip->mutex);
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 */
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;
820 status = map_read(map, adr);
821 if (map_word_andequal(map, status, status_OK, status_OK))
822 break;
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;
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);
840 DISABLE_VPP(map);
841 ret = 0;
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);
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);
858 printk(KERN_WARNING "Status is not identical for all chips: 0x%lx. Merging to give 0x%02x\n",
859 status.x[0], chipstatus);
861 /* Reset the error bits */
862 map_write(map, CMD(0x50), adr);
863 map_write(map, CMD(0x70), adr);
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;
883 printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, chipstatus);
884 ret = -EIO;
888 wake_up(&chip->wq);
889 mutex_unlock(&chip->mutex);
890 return ret;
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;
902 if (instr->addr > mtd->size)
903 return -EINVAL;
905 if ((instr->len + instr->addr) > mtd->size)
906 return -EINVAL;
908 /* Check that both start and end of the requested erase are
909 * aligned with the erasesize at the appropriate addresses.
912 i = 0;
914 /* Skip all erase regions which are ended before the start of
915 the requested erase. Actually, to save on the calculations,
916 we skip to the first erase region which starts after the
917 start of the requested erase, and then go back one.
920 while (i < mtd->numeraseregions && instr->addr >= regions[i].offset)
921 i++;
922 i--;
924 /* OK, now i is pointing at the erase region in which this
925 erase request starts. Check the start of the requested
926 erase range is aligned with the erase size which is in
927 effect here.
930 if (instr->addr & (regions[i].erasesize-1))
931 return -EINVAL;
933 /* Remember the erase region we start on */
934 first = i;
936 /* Next, check that the end of the requested erase is aligned
937 * with the erase region at that address.
940 while (i<mtd->numeraseregions && (instr->addr + instr->len) >= regions[i].offset)
941 i++;
943 /* As before, drop back one to point at the region in which
944 the address actually falls
946 i--;
948 if ((instr->addr + instr->len) & (regions[i].erasesize-1))
949 return -EINVAL;
951 chipnum = instr->addr >> cfi->chipshift;
952 adr = instr->addr - (chipnum << cfi->chipshift);
953 len = instr->len;
955 i=first;
957 while(len) {
958 ret = do_erase_oneblock(map, &cfi->chips[chipnum], adr);
960 if (ret)
961 return ret;
963 adr += regions[i].erasesize;
964 len -= regions[i].erasesize;
966 if (adr % (1<< cfi->chipshift) == (((unsigned long)regions[i].offset + (regions[i].erasesize * regions[i].numblocks)) %( 1<< cfi->chipshift)))
967 i++;
969 if (adr >> cfi->chipshift) {
970 adr = 0;
971 chipnum++;
973 if (chipnum >= cfi->numchips)
974 break;
978 instr->state = MTD_ERASE_DONE;
979 mtd_erase_callback(instr);
981 return 0;
984 static void cfi_staa_sync (struct mtd_info *mtd)
986 struct map_info *map = mtd->priv;
987 struct cfi_private *cfi = map->fldrv_priv;
988 int i;
989 struct flchip *chip;
990 int ret = 0;
991 DECLARE_WAITQUEUE(wait, current);
993 for (i=0; !ret && i<cfi->numchips; i++) {
994 chip = &cfi->chips[i];
996 retry:
997 mutex_lock(&chip->mutex);
999 switch(chip->state) {
1000 case FL_READY:
1001 case FL_STATUS:
1002 case FL_CFI_QUERY:
1003 case FL_JEDEC_QUERY:
1004 chip->oldstate = chip->state;
1005 chip->state = FL_SYNCING;
1006 /* No need to wake_up() on this state change -
1007 * as the whole point is that nobody can do anything
1008 * with the chip now anyway.
1010 case FL_SYNCING:
1011 mutex_unlock(&chip->mutex);
1012 break;
1014 default:
1015 /* Not an idle state */
1016 set_current_state(TASK_UNINTERRUPTIBLE);
1017 add_wait_queue(&chip->wq, &wait);
1019 mutex_unlock(&chip->mutex);
1020 schedule();
1021 remove_wait_queue(&chip->wq, &wait);
1023 goto retry;
1027 /* Unlock the chips again */
1029 for (i--; i >=0; i--) {
1030 chip = &cfi->chips[i];
1032 mutex_lock(&chip->mutex);
1034 if (chip->state == FL_SYNCING) {
1035 chip->state = chip->oldstate;
1036 wake_up(&chip->wq);
1038 mutex_unlock(&chip->mutex);
1042 static inline int do_lock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1044 struct cfi_private *cfi = map->fldrv_priv;
1045 map_word status, status_OK;
1046 unsigned long timeo = jiffies + HZ;
1047 DECLARE_WAITQUEUE(wait, current);
1049 adr += chip->start;
1051 /* Let's determine this according to the interleave only once */
1052 status_OK = CMD(0x80);
1054 timeo = jiffies + HZ;
1055 retry:
1056 mutex_lock(&chip->mutex);
1058 /* Check that the chip's ready to talk to us. */
1059 switch (chip->state) {
1060 case FL_CFI_QUERY:
1061 case FL_JEDEC_QUERY:
1062 case FL_READY:
1063 map_write(map, CMD(0x70), adr);
1064 chip->state = FL_STATUS;
1066 case FL_STATUS:
1067 status = map_read(map, adr);
1068 if (map_word_andequal(map, status, status_OK, status_OK))
1069 break;
1071 /* Urgh. Chip not yet ready to talk to us. */
1072 if (time_after(jiffies, timeo)) {
1073 mutex_unlock(&chip->mutex);
1074 printk(KERN_ERR "waiting for chip to be ready timed out in lock\n");
1075 return -EIO;
1078 /* Latency issues. Drop the lock, wait a while and retry */
1079 mutex_unlock(&chip->mutex);
1080 cfi_udelay(1);
1081 goto retry;
1083 default:
1084 /* Stick ourselves on a wait queue to be woken when
1085 someone changes the status */
1086 set_current_state(TASK_UNINTERRUPTIBLE);
1087 add_wait_queue(&chip->wq, &wait);
1088 mutex_unlock(&chip->mutex);
1089 schedule();
1090 remove_wait_queue(&chip->wq, &wait);
1091 timeo = jiffies + HZ;
1092 goto retry;
1095 ENABLE_VPP(map);
1096 map_write(map, CMD(0x60), adr);
1097 map_write(map, CMD(0x01), adr);
1098 chip->state = FL_LOCKING;
1100 mutex_unlock(&chip->mutex);
1101 msleep(1000);
1102 mutex_lock(&chip->mutex);
1104 /* FIXME. Use a timer to check this, and return immediately. */
1105 /* Once the state machine's known to be working I'll do that */
1107 timeo = jiffies + (HZ*2);
1108 for (;;) {
1110 status = map_read(map, adr);
1111 if (map_word_andequal(map, status, status_OK, status_OK))
1112 break;
1114 /* OK Still waiting */
1115 if (time_after(jiffies, timeo)) {
1116 map_write(map, CMD(0x70), adr);
1117 chip->state = FL_STATUS;
1118 printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1119 DISABLE_VPP(map);
1120 mutex_unlock(&chip->mutex);
1121 return -EIO;
1124 /* Latency issues. Drop the lock, wait a while and retry */
1125 mutex_unlock(&chip->mutex);
1126 cfi_udelay(1);
1127 mutex_lock(&chip->mutex);
1130 /* Done and happy. */
1131 chip->state = FL_STATUS;
1132 DISABLE_VPP(map);
1133 wake_up(&chip->wq);
1134 mutex_unlock(&chip->mutex);
1135 return 0;
1137 static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1139 struct map_info *map = mtd->priv;
1140 struct cfi_private *cfi = map->fldrv_priv;
1141 unsigned long adr;
1142 int chipnum, ret = 0;
1143 #ifdef DEBUG_LOCK_BITS
1144 int ofs_factor = cfi->interleave * cfi->device_type;
1145 #endif
1147 if (ofs & (mtd->erasesize - 1))
1148 return -EINVAL;
1150 if (len & (mtd->erasesize -1))
1151 return -EINVAL;
1153 if ((len + ofs) > mtd->size)
1154 return -EINVAL;
1156 chipnum = ofs >> cfi->chipshift;
1157 adr = ofs - (chipnum << cfi->chipshift);
1159 while(len) {
1161 #ifdef DEBUG_LOCK_BITS
1162 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1163 printk("before 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 ret = do_lock_oneblock(map, &cfi->chips[chipnum], adr);
1169 #ifdef DEBUG_LOCK_BITS
1170 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1171 printk("after lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1172 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1173 #endif
1175 if (ret)
1176 return ret;
1178 adr += mtd->erasesize;
1179 len -= mtd->erasesize;
1181 if (adr >> cfi->chipshift) {
1182 adr = 0;
1183 chipnum++;
1185 if (chipnum >= cfi->numchips)
1186 break;
1189 return 0;
1191 static inline int do_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1193 struct cfi_private *cfi = map->fldrv_priv;
1194 map_word status, status_OK;
1195 unsigned long timeo = jiffies + HZ;
1196 DECLARE_WAITQUEUE(wait, current);
1198 adr += chip->start;
1200 /* Let's determine this according to the interleave only once */
1201 status_OK = CMD(0x80);
1203 timeo = jiffies + HZ;
1204 retry:
1205 mutex_lock(&chip->mutex);
1207 /* Check that the chip's ready to talk to us. */
1208 switch (chip->state) {
1209 case FL_CFI_QUERY:
1210 case FL_JEDEC_QUERY:
1211 case FL_READY:
1212 map_write(map, CMD(0x70), adr);
1213 chip->state = FL_STATUS;
1215 case FL_STATUS:
1216 status = map_read(map, adr);
1217 if (map_word_andequal(map, status, status_OK, status_OK))
1218 break;
1220 /* Urgh. Chip not yet ready to talk to us. */
1221 if (time_after(jiffies, timeo)) {
1222 mutex_unlock(&chip->mutex);
1223 printk(KERN_ERR "waiting for chip to be ready timed out in unlock\n");
1224 return -EIO;
1227 /* Latency issues. Drop the lock, wait a while and retry */
1228 mutex_unlock(&chip->mutex);
1229 cfi_udelay(1);
1230 goto retry;
1232 default:
1233 /* Stick ourselves on a wait queue to be woken when
1234 someone changes the status */
1235 set_current_state(TASK_UNINTERRUPTIBLE);
1236 add_wait_queue(&chip->wq, &wait);
1237 mutex_unlock(&chip->mutex);
1238 schedule();
1239 remove_wait_queue(&chip->wq, &wait);
1240 timeo = jiffies + HZ;
1241 goto retry;
1244 ENABLE_VPP(map);
1245 map_write(map, CMD(0x60), adr);
1246 map_write(map, CMD(0xD0), adr);
1247 chip->state = FL_UNLOCKING;
1249 mutex_unlock(&chip->mutex);
1250 msleep(1000);
1251 mutex_lock(&chip->mutex);
1253 /* FIXME. Use a timer to check this, and return immediately. */
1254 /* Once the state machine's known to be working I'll do that */
1256 timeo = jiffies + (HZ*2);
1257 for (;;) {
1259 status = map_read(map, adr);
1260 if (map_word_andequal(map, status, status_OK, status_OK))
1261 break;
1263 /* OK Still waiting */
1264 if (time_after(jiffies, timeo)) {
1265 map_write(map, CMD(0x70), adr);
1266 chip->state = FL_STATUS;
1267 printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1268 DISABLE_VPP(map);
1269 mutex_unlock(&chip->mutex);
1270 return -EIO;
1273 /* Latency issues. Drop the unlock, wait a while and retry */
1274 mutex_unlock(&chip->mutex);
1275 cfi_udelay(1);
1276 mutex_lock(&chip->mutex);
1279 /* Done and happy. */
1280 chip->state = FL_STATUS;
1281 DISABLE_VPP(map);
1282 wake_up(&chip->wq);
1283 mutex_unlock(&chip->mutex);
1284 return 0;
1286 static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1288 struct map_info *map = mtd->priv;
1289 struct cfi_private *cfi = map->fldrv_priv;
1290 unsigned long adr;
1291 int chipnum, ret = 0;
1292 #ifdef DEBUG_LOCK_BITS
1293 int ofs_factor = cfi->interleave * cfi->device_type;
1294 #endif
1296 chipnum = ofs >> cfi->chipshift;
1297 adr = ofs - (chipnum << cfi->chipshift);
1299 #ifdef DEBUG_LOCK_BITS
1301 unsigned long temp_adr = adr;
1302 unsigned long temp_len = len;
1304 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1305 while (temp_len) {
1306 printk("before unlock %x: block status register is %x\n",temp_adr,cfi_read_query(map, temp_adr+(2*ofs_factor)));
1307 temp_adr += mtd->erasesize;
1308 temp_len -= mtd->erasesize;
1310 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1312 #endif
1314 ret = do_unlock_oneblock(map, &cfi->chips[chipnum], adr);
1316 #ifdef DEBUG_LOCK_BITS
1317 cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1318 printk("after unlock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1319 cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1320 #endif
1322 return ret;
1325 static int cfi_staa_suspend(struct mtd_info *mtd)
1327 struct map_info *map = mtd->priv;
1328 struct cfi_private *cfi = map->fldrv_priv;
1329 int i;
1330 struct flchip *chip;
1331 int ret = 0;
1333 for (i=0; !ret && i<cfi->numchips; i++) {
1334 chip = &cfi->chips[i];
1336 mutex_lock(&chip->mutex);
1338 switch(chip->state) {
1339 case FL_READY:
1340 case FL_STATUS:
1341 case FL_CFI_QUERY:
1342 case FL_JEDEC_QUERY:
1343 chip->oldstate = chip->state;
1344 chip->state = FL_PM_SUSPENDED;
1345 /* No need to wake_up() on this state change -
1346 * as the whole point is that nobody can do anything
1347 * with the chip now anyway.
1349 case FL_PM_SUSPENDED:
1350 break;
1352 default:
1353 ret = -EAGAIN;
1354 break;
1356 mutex_unlock(&chip->mutex);
1359 /* Unlock the chips again */
1361 if (ret) {
1362 for (i--; i >=0; i--) {
1363 chip = &cfi->chips[i];
1365 mutex_lock(&chip->mutex);
1367 if (chip->state == FL_PM_SUSPENDED) {
1368 /* No need to force it into a known state here,
1369 because we're returning failure, and it didn't
1370 get power cycled */
1371 chip->state = chip->oldstate;
1372 wake_up(&chip->wq);
1374 mutex_unlock(&chip->mutex);
1378 return ret;
1381 static void cfi_staa_resume(struct mtd_info *mtd)
1383 struct map_info *map = mtd->priv;
1384 struct cfi_private *cfi = map->fldrv_priv;
1385 int i;
1386 struct flchip *chip;
1388 for (i=0; i<cfi->numchips; i++) {
1390 chip = &cfi->chips[i];
1392 mutex_lock(&chip->mutex);
1394 /* Go to known state. Chip may have been power cycled */
1395 if (chip->state == FL_PM_SUSPENDED) {
1396 map_write(map, CMD(0xFF), 0);
1397 chip->state = FL_READY;
1398 wake_up(&chip->wq);
1401 mutex_unlock(&chip->mutex);
1405 static void cfi_staa_destroy(struct mtd_info *mtd)
1407 struct map_info *map = mtd->priv;
1408 struct cfi_private *cfi = map->fldrv_priv;
1409 kfree(cfi->cmdset_priv);
1410 kfree(cfi);
1413 MODULE_LICENSE("GPL");