mtd: fix a huge latency problem in the MTD CFI and LPDDR flash drivers.
[linux-2.6.git] / drivers / mtd / chips / cfi_cmdset_0001.c
1 /*
2  * Common Flash Interface support:
3  *   Intel Extended Vendor Command Set (ID 0x0001)
4  *
5  * (C) 2000 Red Hat. GPL'd
6  *
7  *
8  * 10/10/2000   Nicolas Pitre <nico@fluxnic.net>
9  *      - completely revamped method functions so they are aware and
10  *        independent of the flash geometry (buswidth, interleave, etc.)
11  *      - scalability vs code size is completely set at compile-time
12  *        (see include/linux/mtd/cfi.h for selection)
13  *      - optimized write buffer method
14  * 02/05/2002   Christopher Hoover <ch@hpl.hp.com>/<ch@murgatroid.com>
15  *      - reworked lock/unlock/erase support for var size flash
16  * 21/03/2007   Rodolfo Giometti <giometti@linux.it>
17  *      - auto unlock sectors on resume for auto locking flash on power up
18  */
19
20 #include <linux/module.h>
21 #include <linux/types.h>
22 #include <linux/kernel.h>
23 #include <linux/sched.h>
24 #include <linux/init.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/reboot.h>
33 #include <linux/bitmap.h>
34 #include <linux/mtd/xip.h>
35 #include <linux/mtd/map.h>
36 #include <linux/mtd/mtd.h>
37 #include <linux/mtd/compatmac.h>
38 #include <linux/mtd/cfi.h>
39
40 /* #define CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE */
41 /* #define CMDSET0001_DISABLE_WRITE_SUSPEND */
42
43 // debugging, turns off buffer write mode if set to 1
44 #define FORCE_WORD_WRITE 0
45
46 /* Intel chips */
47 #define I82802AB        0x00ad
48 #define I82802AC        0x00ac
49 #define PF38F4476       0x881c
50 /* STMicroelectronics chips */
51 #define M50LPW080       0x002F
52 #define M50FLW080A      0x0080
53 #define M50FLW080B      0x0081
54 /* Atmel chips */
55 #define AT49BV640D      0x02de
56 #define AT49BV640DT     0x02db
57
58 static int cfi_intelext_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
59 static int cfi_intelext_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
60 static int cfi_intelext_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
61 static int cfi_intelext_writev(struct mtd_info *, const struct kvec *, unsigned long, loff_t, size_t *);
62 static int cfi_intelext_erase_varsize(struct mtd_info *, struct erase_info *);
63 static void cfi_intelext_sync (struct mtd_info *);
64 static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
65 static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
66 #ifdef CONFIG_MTD_OTP
67 static int cfi_intelext_read_fact_prot_reg (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
68 static int cfi_intelext_read_user_prot_reg (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
69 static int cfi_intelext_write_user_prot_reg (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
70 static int cfi_intelext_lock_user_prot_reg (struct mtd_info *, loff_t, size_t);
71 static int cfi_intelext_get_fact_prot_info (struct mtd_info *,
72                                             struct otp_info *, size_t);
73 static int cfi_intelext_get_user_prot_info (struct mtd_info *,
74                                             struct otp_info *, size_t);
75 #endif
76 static int cfi_intelext_suspend (struct mtd_info *);
77 static void cfi_intelext_resume (struct mtd_info *);
78 static int cfi_intelext_reboot (struct notifier_block *, unsigned long, void *);
79
80 static void cfi_intelext_destroy(struct mtd_info *);
81
82 struct mtd_info *cfi_cmdset_0001(struct map_info *, int);
83
84 static struct mtd_info *cfi_intelext_setup (struct mtd_info *);
85 static int cfi_intelext_partition_fixup(struct mtd_info *, struct cfi_private **);
86
87 static int cfi_intelext_point (struct mtd_info *mtd, loff_t from, size_t len,
88                      size_t *retlen, void **virt, resource_size_t *phys);
89 static void cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
90
91 static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long adr, int mode);
92 static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode);
93 static void put_chip(struct map_info *map, struct flchip *chip, unsigned long adr);
94 #include "fwh_lock.h"
95
96
97
98 /*
99  *  *********** SETUP AND PROBE BITS  ***********
100  */
101
102 static struct mtd_chip_driver cfi_intelext_chipdrv = {
103         .probe          = NULL, /* Not usable directly */
104         .destroy        = cfi_intelext_destroy,
105         .name           = "cfi_cmdset_0001",
106         .module         = THIS_MODULE
107 };
108
109 /* #define DEBUG_LOCK_BITS */
110 /* #define DEBUG_CFI_FEATURES */
111
112 #ifdef DEBUG_CFI_FEATURES
113 static void cfi_tell_features(struct cfi_pri_intelext *extp)
114 {
115         int i;
116         printk("  Extended Query version %c.%c\n", extp->MajorVersion, extp->MinorVersion);
117         printk("  Feature/Command Support:      %4.4X\n", extp->FeatureSupport);
118         printk("     - Chip Erase:              %s\n", extp->FeatureSupport&1?"supported":"unsupported");
119         printk("     - Suspend Erase:           %s\n", extp->FeatureSupport&2?"supported":"unsupported");
120         printk("     - Suspend Program:         %s\n", extp->FeatureSupport&4?"supported":"unsupported");
121         printk("     - Legacy Lock/Unlock:      %s\n", extp->FeatureSupport&8?"supported":"unsupported");
122         printk("     - Queued Erase:            %s\n", extp->FeatureSupport&16?"supported":"unsupported");
123         printk("     - Instant block lock:      %s\n", extp->FeatureSupport&32?"supported":"unsupported");
124         printk("     - Protection Bits:         %s\n", extp->FeatureSupport&64?"supported":"unsupported");
125         printk("     - Page-mode read:          %s\n", extp->FeatureSupport&128?"supported":"unsupported");
126         printk("     - Synchronous read:        %s\n", extp->FeatureSupport&256?"supported":"unsupported");
127         printk("     - Simultaneous operations: %s\n", extp->FeatureSupport&512?"supported":"unsupported");
128         printk("     - Extended Flash Array:    %s\n", extp->FeatureSupport&1024?"supported":"unsupported");
129         for (i=11; i<32; i++) {
130                 if (extp->FeatureSupport & (1<<i))
131                         printk("     - Unknown Bit %X:      supported\n", i);
132         }
133
134         printk("  Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);
135         printk("     - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");
136         for (i=1; i<8; i++) {
137                 if (extp->SuspendCmdSupport & (1<<i))
138                         printk("     - Unknown Bit %X:               supported\n", i);
139         }
140
141         printk("  Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);
142         printk("     - Lock Bit Active:      %s\n", extp->BlkStatusRegMask&1?"yes":"no");
143         printk("     - Lock-Down Bit Active: %s\n", extp->BlkStatusRegMask&2?"yes":"no");
144         for (i=2; i<3; i++) {
145                 if (extp->BlkStatusRegMask & (1<<i))
146                         printk("     - Unknown Bit %X Active: yes\n",i);
147         }
148         printk("     - EFA Lock Bit:         %s\n", extp->BlkStatusRegMask&16?"yes":"no");
149         printk("     - EFA Lock-Down Bit:    %s\n", extp->BlkStatusRegMask&32?"yes":"no");
150         for (i=6; i<16; i++) {
151                 if (extp->BlkStatusRegMask & (1<<i))
152                         printk("     - Unknown Bit %X Active: yes\n",i);
153         }
154
155         printk("  Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",
156                extp->VccOptimal >> 4, extp->VccOptimal & 0xf);
157         if (extp->VppOptimal)
158                 printk("  Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",
159                        extp->VppOptimal >> 4, extp->VppOptimal & 0xf);
160 }
161 #endif
162
163 /* Atmel chips don't use the same PRI format as Intel chips */
164 static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
165 {
166         struct map_info *map = mtd->priv;
167         struct cfi_private *cfi = map->fldrv_priv;
168         struct cfi_pri_intelext *extp = cfi->cmdset_priv;
169         struct cfi_pri_atmel atmel_pri;
170         uint32_t features = 0;
171
172         /* Reverse byteswapping */
173         extp->FeatureSupport = cpu_to_le32(extp->FeatureSupport);
174         extp->BlkStatusRegMask = cpu_to_le16(extp->BlkStatusRegMask);
175         extp->ProtRegAddr = cpu_to_le16(extp->ProtRegAddr);
176
177         memcpy(&atmel_pri, extp, sizeof(atmel_pri));
178         memset((char *)extp + 5, 0, sizeof(*extp) - 5);
179
180         printk(KERN_ERR "atmel Features: %02x\n", atmel_pri.Features);
181
182         if (atmel_pri.Features & 0x01) /* chip erase supported */
183                 features |= (1<<0);
184         if (atmel_pri.Features & 0x02) /* erase suspend supported */
185                 features |= (1<<1);
186         if (atmel_pri.Features & 0x04) /* program suspend supported */
187                 features |= (1<<2);
188         if (atmel_pri.Features & 0x08) /* simultaneous operations supported */
189                 features |= (1<<9);
190         if (atmel_pri.Features & 0x20) /* page mode read supported */
191                 features |= (1<<7);
192         if (atmel_pri.Features & 0x40) /* queued erase supported */
193                 features |= (1<<4);
194         if (atmel_pri.Features & 0x80) /* Protection bits supported */
195                 features |= (1<<6);
196
197         extp->FeatureSupport = features;
198
199         /* burst write mode not supported */
200         cfi->cfiq->BufWriteTimeoutTyp = 0;
201         cfi->cfiq->BufWriteTimeoutMax = 0;
202 }
203
204 static void fixup_at49bv640dx_lock(struct mtd_info *mtd, void *param)
205 {
206         struct map_info *map = mtd->priv;
207         struct cfi_private *cfi = map->fldrv_priv;
208         struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
209
210         cfip->FeatureSupport |= (1 << 5);
211         mtd->flags |= MTD_POWERUP_LOCK;
212 }
213
214 #ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
215 /* Some Intel Strata Flash prior to FPO revision C has bugs in this area */
216 static void fixup_intel_strataflash(struct mtd_info *mtd, void* param)
217 {
218         struct map_info *map = mtd->priv;
219         struct cfi_private *cfi = map->fldrv_priv;
220         struct cfi_pri_intelext *extp = cfi->cmdset_priv;
221
222         printk(KERN_WARNING "cfi_cmdset_0001: Suspend "
223                             "erase on write disabled.\n");
224         extp->SuspendCmdSupport &= ~1;
225 }
226 #endif
227
228 #ifdef CMDSET0001_DISABLE_WRITE_SUSPEND
229 static void fixup_no_write_suspend(struct mtd_info *mtd, void* param)
230 {
231         struct map_info *map = mtd->priv;
232         struct cfi_private *cfi = map->fldrv_priv;
233         struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
234
235         if (cfip && (cfip->FeatureSupport&4)) {
236                 cfip->FeatureSupport &= ~4;
237                 printk(KERN_WARNING "cfi_cmdset_0001: write suspend disabled\n");
238         }
239 }
240 #endif
241
242 static void fixup_st_m28w320ct(struct mtd_info *mtd, void* param)
243 {
244         struct map_info *map = mtd->priv;
245         struct cfi_private *cfi = map->fldrv_priv;
246
247         cfi->cfiq->BufWriteTimeoutTyp = 0;      /* Not supported */
248         cfi->cfiq->BufWriteTimeoutMax = 0;      /* Not supported */
249 }
250
251 static void fixup_st_m28w320cb(struct mtd_info *mtd, void* param)
252 {
253         struct map_info *map = mtd->priv;
254         struct cfi_private *cfi = map->fldrv_priv;
255
256         /* Note this is done after the region info is endian swapped */
257         cfi->cfiq->EraseRegionInfo[1] =
258                 (cfi->cfiq->EraseRegionInfo[1] & 0xffff0000) | 0x3e;
259 };
260
261 static void fixup_use_point(struct mtd_info *mtd, void *param)
262 {
263         struct map_info *map = mtd->priv;
264         if (!mtd->point && map_is_linear(map)) {
265                 mtd->point   = cfi_intelext_point;
266                 mtd->unpoint = cfi_intelext_unpoint;
267         }
268 }
269
270 static void fixup_use_write_buffers(struct mtd_info *mtd, void *param)
271 {
272         struct map_info *map = mtd->priv;
273         struct cfi_private *cfi = map->fldrv_priv;
274         if (cfi->cfiq->BufWriteTimeoutTyp) {
275                 printk(KERN_INFO "Using buffer write method\n" );
276                 mtd->write = cfi_intelext_write_buffers;
277                 mtd->writev = cfi_intelext_writev;
278         }
279 }
280
281 /*
282  * Some chips power-up with all sectors locked by default.
283  */
284 static void fixup_unlock_powerup_lock(struct mtd_info *mtd, void *param)
285 {
286         struct map_info *map = mtd->priv;
287         struct cfi_private *cfi = map->fldrv_priv;
288         struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
289
290         if (cfip->FeatureSupport&32) {
291                 printk(KERN_INFO "Using auto-unlock on power-up/resume\n" );
292                 mtd->flags |= MTD_POWERUP_LOCK;
293         }
294 }
295
296 static struct cfi_fixup cfi_fixup_table[] = {
297         { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
298         { CFI_MFR_ATMEL, AT49BV640D, fixup_at49bv640dx_lock, NULL },
299         { CFI_MFR_ATMEL, AT49BV640DT, fixup_at49bv640dx_lock, NULL },
300 #ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
301         { CFI_MFR_ANY, CFI_ID_ANY, fixup_intel_strataflash, NULL },
302 #endif
303 #ifdef CMDSET0001_DISABLE_WRITE_SUSPEND
304         { CFI_MFR_ANY, CFI_ID_ANY, fixup_no_write_suspend, NULL },
305 #endif
306 #if !FORCE_WORD_WRITE
307         { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL },
308 #endif
309         { CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL },
310         { CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL },
311         { CFI_MFR_INTEL, CFI_ID_ANY, fixup_unlock_powerup_lock, NULL, },
312         { 0, 0, NULL, NULL }
313 };
314
315 static struct cfi_fixup jedec_fixup_table[] = {
316         { CFI_MFR_INTEL, I82802AB,   fixup_use_fwh_lock, NULL, },
317         { CFI_MFR_INTEL, I82802AC,   fixup_use_fwh_lock, NULL, },
318         { CFI_MFR_ST,    M50LPW080,  fixup_use_fwh_lock, NULL, },
319         { CFI_MFR_ST,    M50FLW080A, fixup_use_fwh_lock, NULL, },
320         { CFI_MFR_ST,    M50FLW080B, fixup_use_fwh_lock, NULL, },
321         { 0, 0, NULL, NULL }
322 };
323 static struct cfi_fixup fixup_table[] = {
324         /* The CFI vendor ids and the JEDEC vendor IDs appear
325          * to be common.  It is like the devices id's are as
326          * well.  This table is to pick all cases where
327          * we know that is the case.
328          */
329         { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_point, NULL },
330         { 0, 0, NULL, NULL }
331 };
332
333 static void cfi_fixup_major_minor(struct cfi_private *cfi,
334                                                 struct cfi_pri_intelext *extp)
335 {
336         if (cfi->mfr == CFI_MFR_INTEL &&
337                         cfi->id == PF38F4476 && extp->MinorVersion == '3')
338                 extp->MinorVersion = '1';
339 }
340
341 static inline struct cfi_pri_intelext *
342 read_pri_intelext(struct map_info *map, __u16 adr)
343 {
344         struct cfi_private *cfi = map->fldrv_priv;
345         struct cfi_pri_intelext *extp;
346         unsigned int extra_size = 0;
347         unsigned int extp_size = sizeof(*extp);
348
349  again:
350         extp = (struct cfi_pri_intelext *)cfi_read_pri(map, adr, extp_size, "Intel/Sharp");
351         if (!extp)
352                 return NULL;
353
354         cfi_fixup_major_minor(cfi, extp);
355
356         if (extp->MajorVersion != '1' ||
357             (extp->MinorVersion < '0' || extp->MinorVersion > '5')) {
358                 printk(KERN_ERR "  Unknown Intel/Sharp Extended Query "
359                        "version %c.%c.\n",  extp->MajorVersion,
360                        extp->MinorVersion);
361                 kfree(extp);
362                 return NULL;
363         }
364
365         /* Do some byteswapping if necessary */
366         extp->FeatureSupport = le32_to_cpu(extp->FeatureSupport);
367         extp->BlkStatusRegMask = le16_to_cpu(extp->BlkStatusRegMask);
368         extp->ProtRegAddr = le16_to_cpu(extp->ProtRegAddr);
369
370         if (extp->MinorVersion >= '0') {
371                 extra_size = 0;
372
373                 /* Protection Register info */
374                 extra_size += (extp->NumProtectionFields - 1) *
375                               sizeof(struct cfi_intelext_otpinfo);
376         }
377
378         if (extp->MinorVersion >= '1') {
379                 /* Burst Read info */
380                 extra_size += 2;
381                 if (extp_size < sizeof(*extp) + extra_size)
382                         goto need_more;
383                 extra_size += extp->extra[extra_size - 1];
384         }
385
386         if (extp->MinorVersion >= '3') {
387                 int nb_parts, i;
388
389                 /* Number of hardware-partitions */
390                 extra_size += 1;
391                 if (extp_size < sizeof(*extp) + extra_size)
392                         goto need_more;
393                 nb_parts = extp->extra[extra_size - 1];
394
395                 /* skip the sizeof(partregion) field in CFI 1.4 */
396                 if (extp->MinorVersion >= '4')
397                         extra_size += 2;
398
399                 for (i = 0; i < nb_parts; i++) {
400                         struct cfi_intelext_regioninfo *rinfo;
401                         rinfo = (struct cfi_intelext_regioninfo *)&extp->extra[extra_size];
402                         extra_size += sizeof(*rinfo);
403                         if (extp_size < sizeof(*extp) + extra_size)
404                                 goto need_more;
405                         rinfo->NumIdentPartitions=le16_to_cpu(rinfo->NumIdentPartitions);
406                         extra_size += (rinfo->NumBlockTypes - 1)
407                                       * sizeof(struct cfi_intelext_blockinfo);
408                 }
409
410                 if (extp->MinorVersion >= '4')
411                         extra_size += sizeof(struct cfi_intelext_programming_regioninfo);
412
413                 if (extp_size < sizeof(*extp) + extra_size) {
414                         need_more:
415                         extp_size = sizeof(*extp) + extra_size;
416                         kfree(extp);
417                         if (extp_size > 4096) {
418                                 printk(KERN_ERR
419                                         "%s: cfi_pri_intelext is too fat\n",
420                                         __func__);
421                                 return NULL;
422                         }
423                         goto again;
424                 }
425         }
426
427         return extp;
428 }
429
430 struct mtd_info *cfi_cmdset_0001(struct map_info *map, int primary)
431 {
432         struct cfi_private *cfi = map->fldrv_priv;
433         struct mtd_info *mtd;
434         int i;
435
436         mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
437         if (!mtd) {
438                 printk(KERN_ERR "Failed to allocate memory for MTD device\n");
439                 return NULL;
440         }
441         mtd->priv = map;
442         mtd->type = MTD_NORFLASH;
443
444         /* Fill in the default mtd operations */
445         mtd->erase   = cfi_intelext_erase_varsize;
446         mtd->read    = cfi_intelext_read;
447         mtd->write   = cfi_intelext_write_words;
448         mtd->sync    = cfi_intelext_sync;
449         mtd->lock    = cfi_intelext_lock;
450         mtd->unlock  = cfi_intelext_unlock;
451         mtd->suspend = cfi_intelext_suspend;
452         mtd->resume  = cfi_intelext_resume;
453         mtd->flags   = MTD_CAP_NORFLASH;
454         mtd->name    = map->name;
455         mtd->writesize = 1;
456
457         mtd->reboot_notifier.notifier_call = cfi_intelext_reboot;
458
459         if (cfi->cfi_mode == CFI_MODE_CFI) {
460                 /*
461                  * It's a real CFI chip, not one for which the probe
462                  * routine faked a CFI structure. So we read the feature
463                  * table from it.
464                  */
465                 __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
466                 struct cfi_pri_intelext *extp;
467
468                 extp = read_pri_intelext(map, adr);
469                 if (!extp) {
470                         kfree(mtd);
471                         return NULL;
472                 }
473
474                 /* Install our own private info structure */
475                 cfi->cmdset_priv = extp;
476
477                 cfi_fixup(mtd, cfi_fixup_table);
478
479 #ifdef DEBUG_CFI_FEATURES
480                 /* Tell the user about it in lots of lovely detail */
481                 cfi_tell_features(extp);
482 #endif
483
484                 if(extp->SuspendCmdSupport & 1) {
485                         printk(KERN_NOTICE "cfi_cmdset_0001: Erase suspend on write enabled\n");
486                 }
487         }
488         else if (cfi->cfi_mode == CFI_MODE_JEDEC) {
489                 /* Apply jedec specific fixups */
490                 cfi_fixup(mtd, jedec_fixup_table);
491         }
492         /* Apply generic fixups */
493         cfi_fixup(mtd, fixup_table);
494
495         for (i=0; i< cfi->numchips; i++) {
496                 if (cfi->cfiq->WordWriteTimeoutTyp)
497                         cfi->chips[i].word_write_time =
498                                 1<<cfi->cfiq->WordWriteTimeoutTyp;
499                 else
500                         cfi->chips[i].word_write_time = 50000;
501
502                 if (cfi->cfiq->BufWriteTimeoutTyp)
503                         cfi->chips[i].buffer_write_time =
504                                 1<<cfi->cfiq->BufWriteTimeoutTyp;
505                 /* No default; if it isn't specified, we won't use it */
506
507                 if (cfi->cfiq->BlockEraseTimeoutTyp)
508                         cfi->chips[i].erase_time =
509                                 1000<<cfi->cfiq->BlockEraseTimeoutTyp;
510                 else
511                         cfi->chips[i].erase_time = 2000000;
512
513                 if (cfi->cfiq->WordWriteTimeoutTyp &&
514                     cfi->cfiq->WordWriteTimeoutMax)
515                         cfi->chips[i].word_write_time_max =
516                                 1<<(cfi->cfiq->WordWriteTimeoutTyp +
517                                     cfi->cfiq->WordWriteTimeoutMax);
518                 else
519                         cfi->chips[i].word_write_time_max = 50000 * 8;
520
521                 if (cfi->cfiq->BufWriteTimeoutTyp &&
522                     cfi->cfiq->BufWriteTimeoutMax)
523                         cfi->chips[i].buffer_write_time_max =
524                                 1<<(cfi->cfiq->BufWriteTimeoutTyp +
525                                     cfi->cfiq->BufWriteTimeoutMax);
526
527                 if (cfi->cfiq->BlockEraseTimeoutTyp &&
528                     cfi->cfiq->BlockEraseTimeoutMax)
529                         cfi->chips[i].erase_time_max =
530                                 1000<<(cfi->cfiq->BlockEraseTimeoutTyp +
531                                        cfi->cfiq->BlockEraseTimeoutMax);
532                 else
533                         cfi->chips[i].erase_time_max = 2000000 * 8;
534
535                 cfi->chips[i].ref_point_counter = 0;
536                 init_waitqueue_head(&(cfi->chips[i].wq));
537         }
538
539         map->fldrv = &cfi_intelext_chipdrv;
540
541         return cfi_intelext_setup(mtd);
542 }
543 struct mtd_info *cfi_cmdset_0003(struct map_info *map, int primary) __attribute__((alias("cfi_cmdset_0001")));
544 struct mtd_info *cfi_cmdset_0200(struct map_info *map, int primary) __attribute__((alias("cfi_cmdset_0001")));
545 EXPORT_SYMBOL_GPL(cfi_cmdset_0001);
546 EXPORT_SYMBOL_GPL(cfi_cmdset_0003);
547 EXPORT_SYMBOL_GPL(cfi_cmdset_0200);
548
549 static struct mtd_info *cfi_intelext_setup(struct mtd_info *mtd)
550 {
551         struct map_info *map = mtd->priv;
552         struct cfi_private *cfi = map->fldrv_priv;
553         unsigned long offset = 0;
554         int i,j;
555         unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
556
557         //printk(KERN_DEBUG "number of CFI chips: %d\n", cfi->numchips);
558
559         mtd->size = devsize * cfi->numchips;
560
561         mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
562         mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info)
563                         * mtd->numeraseregions, GFP_KERNEL);
564         if (!mtd->eraseregions) {
565                 printk(KERN_ERR "Failed to allocate memory for MTD erase region info\n");
566                 goto setup_err;
567         }
568
569         for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
570                 unsigned long ernum, ersize;
571                 ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
572                 ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
573
574                 if (mtd->erasesize < ersize) {
575                         mtd->erasesize = ersize;
576                 }
577                 for (j=0; j<cfi->numchips; j++) {
578                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
579                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
580                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
581                         mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap = kmalloc(ernum / 8 + 1, GFP_KERNEL);
582                 }
583                 offset += (ersize * ernum);
584         }
585
586         if (offset != devsize) {
587                 /* Argh */
588                 printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);
589                 goto setup_err;
590         }
591
592         for (i=0; i<mtd->numeraseregions;i++){
593                 printk(KERN_DEBUG "erase region %d: offset=0x%llx,size=0x%x,blocks=%d\n",
594                        i,(unsigned long long)mtd->eraseregions[i].offset,
595                        mtd->eraseregions[i].erasesize,
596                        mtd->eraseregions[i].numblocks);
597         }
598
599 #ifdef CONFIG_MTD_OTP
600         mtd->read_fact_prot_reg = cfi_intelext_read_fact_prot_reg;
601         mtd->read_user_prot_reg = cfi_intelext_read_user_prot_reg;
602         mtd->write_user_prot_reg = cfi_intelext_write_user_prot_reg;
603         mtd->lock_user_prot_reg = cfi_intelext_lock_user_prot_reg;
604         mtd->get_fact_prot_info = cfi_intelext_get_fact_prot_info;
605         mtd->get_user_prot_info = cfi_intelext_get_user_prot_info;
606 #endif
607
608         /* This function has the potential to distort the reality
609            a bit and therefore should be called last. */
610         if (cfi_intelext_partition_fixup(mtd, &cfi) != 0)
611                 goto setup_err;
612
613         __module_get(THIS_MODULE);
614         register_reboot_notifier(&mtd->reboot_notifier);
615         return mtd;
616
617  setup_err:
618         kfree(mtd->eraseregions);
619         kfree(mtd);
620         kfree(cfi->cmdset_priv);
621         return NULL;
622 }
623
624 static int cfi_intelext_partition_fixup(struct mtd_info *mtd,
625                                         struct cfi_private **pcfi)
626 {
627         struct map_info *map = mtd->priv;
628         struct cfi_private *cfi = *pcfi;
629         struct cfi_pri_intelext *extp = cfi->cmdset_priv;
630
631         /*
632          * Probing of multi-partition flash chips.
633          *
634          * To support multiple partitions when available, we simply arrange
635          * for each of them to have their own flchip structure even if they
636          * are on the same physical chip.  This means completely recreating
637          * a new cfi_private structure right here which is a blatent code
638          * layering violation, but this is still the least intrusive
639          * arrangement at this point. This can be rearranged in the future
640          * if someone feels motivated enough.  --nico
641          */
642         if (extp && extp->MajorVersion == '1' && extp->MinorVersion >= '3'
643             && extp->FeatureSupport & (1 << 9)) {
644                 struct cfi_private *newcfi;
645                 struct flchip *chip;
646                 struct flchip_shared *shared;
647                 int offs, numregions, numparts, partshift, numvirtchips, i, j;
648
649                 /* Protection Register info */
650                 offs = (extp->NumProtectionFields - 1) *
651                        sizeof(struct cfi_intelext_otpinfo);
652
653                 /* Burst Read info */
654                 offs += extp->extra[offs+1]+2;
655
656                 /* Number of partition regions */
657                 numregions = extp->extra[offs];
658                 offs += 1;
659
660                 /* skip the sizeof(partregion) field in CFI 1.4 */
661                 if (extp->MinorVersion >= '4')
662                         offs += 2;
663
664                 /* Number of hardware partitions */
665                 numparts = 0;
666                 for (i = 0; i < numregions; i++) {
667                         struct cfi_intelext_regioninfo *rinfo;
668                         rinfo = (struct cfi_intelext_regioninfo *)&extp->extra[offs];
669                         numparts += rinfo->NumIdentPartitions;
670                         offs += sizeof(*rinfo)
671                                 + (rinfo->NumBlockTypes - 1) *
672                                   sizeof(struct cfi_intelext_blockinfo);
673                 }
674
675                 if (!numparts)
676                         numparts = 1;
677
678                 /* Programming Region info */
679                 if (extp->MinorVersion >= '4') {
680                         struct cfi_intelext_programming_regioninfo *prinfo;
681                         prinfo = (struct cfi_intelext_programming_regioninfo *)&extp->extra[offs];
682                         mtd->writesize = cfi->interleave << prinfo->ProgRegShift;
683                         mtd->flags &= ~MTD_BIT_WRITEABLE;
684                         printk(KERN_DEBUG "%s: program region size/ctrl_valid/ctrl_inval = %d/%d/%d\n",
685                                map->name, mtd->writesize,
686                                cfi->interleave * prinfo->ControlValid,
687                                cfi->interleave * prinfo->ControlInvalid);
688                 }
689
690                 /*
691                  * All functions below currently rely on all chips having
692                  * the same geometry so we'll just assume that all hardware
693                  * partitions are of the same size too.
694                  */
695                 partshift = cfi->chipshift - __ffs(numparts);
696
697                 if ((1 << partshift) < mtd->erasesize) {
698                         printk( KERN_ERR
699                                 "%s: bad number of hw partitions (%d)\n",
700                                 __func__, numparts);
701                         return -EINVAL;
702                 }
703
704                 numvirtchips = cfi->numchips * numparts;
705                 newcfi = kmalloc(sizeof(struct cfi_private) + numvirtchips * sizeof(struct flchip), GFP_KERNEL);
706                 if (!newcfi)
707                         return -ENOMEM;
708                 shared = kmalloc(sizeof(struct flchip_shared) * cfi->numchips, GFP_KERNEL);
709                 if (!shared) {
710                         kfree(newcfi);
711                         return -ENOMEM;
712                 }
713                 memcpy(newcfi, cfi, sizeof(struct cfi_private));
714                 newcfi->numchips = numvirtchips;
715                 newcfi->chipshift = partshift;
716
717                 chip = &newcfi->chips[0];
718                 for (i = 0; i < cfi->numchips; i++) {
719                         shared[i].writing = shared[i].erasing = NULL;
720                         spin_lock_init(&shared[i].lock);
721                         for (j = 0; j < numparts; j++) {
722                                 *chip = cfi->chips[i];
723                                 chip->start += j << partshift;
724                                 chip->priv = &shared[i];
725                                 /* those should be reset too since
726                                    they create memory references. */
727                                 init_waitqueue_head(&chip->wq);
728                                 mutex_init(&chip->mutex);
729                                 chip++;
730                         }
731                 }
732
733                 printk(KERN_DEBUG "%s: %d set(s) of %d interleaved chips "
734                                   "--> %d partitions of %d KiB\n",
735                                   map->name, cfi->numchips, cfi->interleave,
736                                   newcfi->numchips, 1<<(newcfi->chipshift-10));
737
738                 map->fldrv_priv = newcfi;
739                 *pcfi = newcfi;
740                 kfree(cfi);
741         }
742
743         return 0;
744 }
745
746 /*
747  *  *********** CHIP ACCESS FUNCTIONS ***********
748  */
749 static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long adr, int mode)
750 {
751         DECLARE_WAITQUEUE(wait, current);
752         struct cfi_private *cfi = map->fldrv_priv;
753         map_word status, status_OK = CMD(0x80), status_PWS = CMD(0x01);
754         struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
755         unsigned long timeo = jiffies + HZ;
756
757         /* Prevent setting state FL_SYNCING for chip in suspended state. */
758         if (mode == FL_SYNCING && chip->oldstate != FL_READY)
759                 goto sleep;
760
761         switch (chip->state) {
762
763         case FL_STATUS:
764                 for (;;) {
765                         status = map_read(map, adr);
766                         if (map_word_andequal(map, status, status_OK, status_OK))
767                                 break;
768
769                         /* At this point we're fine with write operations
770                            in other partitions as they don't conflict. */
771                         if (chip->priv && map_word_andequal(map, status, status_PWS, status_PWS))
772                                 break;
773
774                         mutex_unlock(&chip->mutex);
775                         cfi_udelay(1);
776                         mutex_lock(&chip->mutex);
777                         /* Someone else might have been playing with it. */
778                         return -EAGAIN;
779                 }
780                 /* Fall through */
781         case FL_READY:
782         case FL_CFI_QUERY:
783         case FL_JEDEC_QUERY:
784                 return 0;
785
786         case FL_ERASING:
787                 if (!cfip ||
788                     !(cfip->FeatureSupport & 2) ||
789                     !(mode == FL_READY || mode == FL_POINT ||
790                      (mode == FL_WRITING && (cfip->SuspendCmdSupport & 1))))
791                         goto sleep;
792
793
794                 /* Erase suspend */
795                 map_write(map, CMD(0xB0), adr);
796
797                 /* If the flash has finished erasing, then 'erase suspend'
798                  * appears to make some (28F320) flash devices switch to
799                  * 'read' mode.  Make sure that we switch to 'read status'
800                  * mode so we get the right data. --rmk
801                  */
802                 map_write(map, CMD(0x70), adr);
803                 chip->oldstate = FL_ERASING;
804                 chip->state = FL_ERASE_SUSPENDING;
805                 chip->erase_suspended = 1;
806                 for (;;) {
807                         status = map_read(map, adr);
808                         if (map_word_andequal(map, status, status_OK, status_OK))
809                                 break;
810
811                         if (time_after(jiffies, timeo)) {
812                                 /* Urgh. Resume and pretend we weren't here.  */
813                                 map_write(map, CMD(0xd0), adr);
814                                 /* Make sure we're in 'read status' mode if it had finished */
815                                 map_write(map, CMD(0x70), adr);
816                                 chip->state = FL_ERASING;
817                                 chip->oldstate = FL_READY;
818                                 printk(KERN_ERR "%s: Chip not ready after erase "
819                                        "suspended: status = 0x%lx\n", map->name, status.x[0]);
820                                 return -EIO;
821                         }
822
823                         mutex_unlock(&chip->mutex);
824                         cfi_udelay(1);
825                         mutex_lock(&chip->mutex);
826                         /* Nobody will touch it while it's in state FL_ERASE_SUSPENDING.
827                            So we can just loop here. */
828                 }
829                 chip->state = FL_STATUS;
830                 return 0;
831
832         case FL_XIP_WHILE_ERASING:
833                 if (mode != FL_READY && mode != FL_POINT &&
834                     (mode != FL_WRITING || !cfip || !(cfip->SuspendCmdSupport&1)))
835                         goto sleep;
836                 chip->oldstate = chip->state;
837                 chip->state = FL_READY;
838                 return 0;
839
840         case FL_SHUTDOWN:
841                 /* The machine is rebooting now,so no one can get chip anymore */
842                 return -EIO;
843         case FL_POINT:
844                 /* Only if there's no operation suspended... */
845                 if (mode == FL_READY && chip->oldstate == FL_READY)
846                         return 0;
847                 /* Fall through */
848         default:
849         sleep:
850                 set_current_state(TASK_UNINTERRUPTIBLE);
851                 add_wait_queue(&chip->wq, &wait);
852                 mutex_unlock(&chip->mutex);
853                 schedule();
854                 remove_wait_queue(&chip->wq, &wait);
855                 mutex_lock(&chip->mutex);
856                 return -EAGAIN;
857         }
858 }
859
860 static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode)
861 {
862         int ret;
863         DECLARE_WAITQUEUE(wait, current);
864
865  retry:
866         if (chip->priv &&
867             (mode == FL_WRITING || mode == FL_ERASING || mode == FL_OTP_WRITE
868             || mode == FL_SHUTDOWN) && chip->state != FL_SYNCING) {
869                 /*
870                  * OK. We have possibility for contention on the write/erase
871                  * operations which are global to the real chip and not per
872                  * partition.  So let's fight it over in the partition which
873                  * currently has authority on the operation.
874                  *
875                  * The rules are as follows:
876                  *
877                  * - any write operation must own shared->writing.
878                  *
879                  * - any erase operation must own _both_ shared->writing and
880                  *   shared->erasing.
881                  *
882                  * - contention arbitration is handled in the owner's context.
883                  *
884                  * The 'shared' struct can be read and/or written only when
885                  * its lock is taken.
886                  */
887                 struct flchip_shared *shared = chip->priv;
888                 struct flchip *contender;
889                 spin_lock(&shared->lock);
890                 contender = shared->writing;
891                 if (contender && contender != chip) {
892                         /*
893                          * The engine to perform desired operation on this
894                          * partition is already in use by someone else.
895                          * Let's fight over it in the context of the chip
896                          * currently using it.  If it is possible to suspend,
897                          * that other partition will do just that, otherwise
898                          * it'll happily send us to sleep.  In any case, when
899                          * get_chip returns success we're clear to go ahead.
900                          */
901                         ret = mutex_trylock(&contender->mutex);
902                         spin_unlock(&shared->lock);
903                         if (!ret)
904                                 goto retry;
905                         mutex_unlock(&chip->mutex);
906                         ret = chip_ready(map, contender, contender->start, mode);
907                         mutex_lock(&chip->mutex);
908
909                         if (ret == -EAGAIN) {
910                                 mutex_unlock(&contender->mutex);
911                                 goto retry;
912                         }
913                         if (ret) {
914                                 mutex_unlock(&contender->mutex);
915                                 return ret;
916                         }
917                         spin_lock(&shared->lock);
918
919                         /* We should not own chip if it is already
920                          * in FL_SYNCING state. Put contender and retry. */
921                         if (chip->state == FL_SYNCING) {
922                                 put_chip(map, contender, contender->start);
923                                 mutex_unlock(&contender->mutex);
924                                 goto retry;
925                         }
926                         mutex_unlock(&contender->mutex);
927                 }
928
929                 /* Check if we already have suspended erase
930                  * on this chip. Sleep. */
931                 if (mode == FL_ERASING && shared->erasing
932                     && shared->erasing->oldstate == FL_ERASING) {
933                         spin_unlock(&shared->lock);
934                         set_current_state(TASK_UNINTERRUPTIBLE);
935                         add_wait_queue(&chip->wq, &wait);
936                         mutex_unlock(&chip->mutex);
937                         schedule();
938                         remove_wait_queue(&chip->wq, &wait);
939                         mutex_lock(&chip->mutex);
940                         goto retry;
941                 }
942
943                 /* We now own it */
944                 shared->writing = chip;
945                 if (mode == FL_ERASING)
946                         shared->erasing = chip;
947                 spin_unlock(&shared->lock);
948         }
949         ret = chip_ready(map, chip, adr, mode);
950         if (ret == -EAGAIN)
951                 goto retry;
952
953         return ret;
954 }
955
956 static void put_chip(struct map_info *map, struct flchip *chip, unsigned long adr)
957 {
958         struct cfi_private *cfi = map->fldrv_priv;
959
960         if (chip->priv) {
961                 struct flchip_shared *shared = chip->priv;
962                 spin_lock(&shared->lock);
963                 if (shared->writing == chip && chip->oldstate == FL_READY) {
964                         /* We own the ability to write, but we're done */
965                         shared->writing = shared->erasing;
966                         if (shared->writing && shared->writing != chip) {
967                                 /* give back ownership to who we loaned it from */
968                                 struct flchip *loaner = shared->writing;
969                                 mutex_lock(&loaner->mutex);
970                                 spin_unlock(&shared->lock);
971                                 mutex_unlock(&chip->mutex);
972                                 put_chip(map, loaner, loaner->start);
973                                 mutex_lock(&chip->mutex);
974                                 mutex_unlock(&loaner->mutex);
975                                 wake_up(&chip->wq);
976                                 return;
977                         }
978                         shared->erasing = NULL;
979                         shared->writing = NULL;
980                 } else if (shared->erasing == chip && shared->writing != chip) {
981                         /*
982                          * We own the ability to erase without the ability
983                          * to write, which means the erase was suspended
984                          * and some other partition is currently writing.
985                          * Don't let the switch below mess things up since
986                          * we don't have ownership to resume anything.
987                          */
988                         spin_unlock(&shared->lock);
989                         wake_up(&chip->wq);
990                         return;
991                 }
992                 spin_unlock(&shared->lock);
993         }
994
995         switch(chip->oldstate) {
996         case FL_ERASING:
997                 chip->state = chip->oldstate;
998                 /* What if one interleaved chip has finished and the
999                    other hasn't? The old code would leave the finished
1000                    one in READY mode. That's bad, and caused -EROFS
1001                    errors to be returned from do_erase_oneblock because
1002                    that's the only bit it checked for at the time.
1003                    As the state machine appears to explicitly allow
1004                    sending the 0x70 (Read Status) command to an erasing
1005                    chip and expecting it to be ignored, that's what we
1006                    do. */
1007                 map_write(map, CMD(0xd0), adr);
1008                 map_write(map, CMD(0x70), adr);
1009                 chip->oldstate = FL_READY;
1010                 chip->state = FL_ERASING;
1011                 break;
1012
1013         case FL_XIP_WHILE_ERASING:
1014                 chip->state = chip->oldstate;
1015                 chip->oldstate = FL_READY;
1016                 break;
1017
1018         case FL_READY:
1019         case FL_STATUS:
1020         case FL_JEDEC_QUERY:
1021                 /* We should really make set_vpp() count, rather than doing this */
1022                 DISABLE_VPP(map);
1023                 break;
1024         default:
1025                 printk(KERN_ERR "%s: put_chip() called with oldstate %d!!\n", map->name, chip->oldstate);
1026         }
1027         wake_up(&chip->wq);
1028 }
1029
1030 #ifdef CONFIG_MTD_XIP
1031
1032 /*
1033  * No interrupt what so ever can be serviced while the flash isn't in array
1034  * mode.  This is ensured by the xip_disable() and xip_enable() functions
1035  * enclosing any code path where the flash is known not to be in array mode.
1036  * And within a XIP disabled code path, only functions marked with __xipram
1037  * may be called and nothing else (it's a good thing to inspect generated
1038  * assembly to make sure inline functions were actually inlined and that gcc
1039  * didn't emit calls to its own support functions). Also configuring MTD CFI
1040  * support to a single buswidth and a single interleave is also recommended.
1041  */
1042
1043 static void xip_disable(struct map_info *map, struct flchip *chip,
1044                         unsigned long adr)
1045 {
1046         /* TODO: chips with no XIP use should ignore and return */
1047         (void) map_read(map, adr); /* ensure mmu mapping is up to date */
1048         local_irq_disable();
1049 }
1050
1051 static void __xipram xip_enable(struct map_info *map, struct flchip *chip,
1052                                 unsigned long adr)
1053 {
1054         struct cfi_private *cfi = map->fldrv_priv;
1055         if (chip->state != FL_POINT && chip->state != FL_READY) {
1056                 map_write(map, CMD(0xff), adr);
1057                 chip->state = FL_READY;
1058         }
1059         (void) map_read(map, adr);
1060         xip_iprefetch();
1061         local_irq_enable();
1062 }
1063
1064 /*
1065  * When a delay is required for the flash operation to complete, the
1066  * xip_wait_for_operation() function is polling for both the given timeout
1067  * and pending (but still masked) hardware interrupts.  Whenever there is an
1068  * interrupt pending then the flash erase or write operation is suspended,
1069  * array mode restored and interrupts unmasked.  Task scheduling might also
1070  * happen at that point.  The CPU eventually returns from the interrupt or
1071  * the call to schedule() and the suspended flash operation is resumed for
1072  * the remaining of the delay period.
1073  *
1074  * Warning: this function _will_ fool interrupt latency tracing tools.
1075  */
1076
1077 static int __xipram xip_wait_for_operation(
1078                 struct map_info *map, struct flchip *chip,
1079                 unsigned long adr, unsigned int chip_op_time_max)
1080 {
1081         struct cfi_private *cfi = map->fldrv_priv;
1082         struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
1083         map_word status, OK = CMD(0x80);
1084         unsigned long usec, suspended, start, done;
1085         flstate_t oldstate, newstate;
1086
1087         start = xip_currtime();
1088         usec = chip_op_time_max;
1089         if (usec == 0)
1090                 usec = 500000;
1091         done = 0;
1092
1093         do {
1094                 cpu_relax();
1095                 if (xip_irqpending() && cfip &&
1096                     ((chip->state == FL_ERASING && (cfip->FeatureSupport&2)) ||
1097                      (chip->state == FL_WRITING && (cfip->FeatureSupport&4))) &&
1098                     (cfi_interleave_is_1(cfi) || chip->oldstate == FL_READY)) {
1099                         /*
1100                          * Let's suspend the erase or write operation when
1101                          * supported.  Note that we currently don't try to
1102                          * suspend interleaved chips if there is already
1103                          * another operation suspended (imagine what happens
1104                          * when one chip was already done with the current
1105                          * operation while another chip suspended it, then
1106                          * we resume the whole thing at once).  Yes, it
1107                          * can happen!
1108                          */
1109                         usec -= done;
1110                         map_write(map, CMD(0xb0), adr);
1111                         map_write(map, CMD(0x70), adr);
1112                         suspended = xip_currtime();
1113                         do {
1114                                 if (xip_elapsed_since(suspended) > 100000) {
1115                                         /*
1116                                          * The chip doesn't want to suspend
1117                                          * after waiting for 100 msecs.
1118                                          * This is a critical error but there
1119                                          * is not much we can do here.
1120                                          */
1121                                         return -EIO;
1122                                 }
1123                                 status = map_read(map, adr);
1124                         } while (!map_word_andequal(map, status, OK, OK));
1125
1126                         /* Suspend succeeded */
1127                         oldstate = chip->state;
1128                         if (oldstate == FL_ERASING) {
1129                                 if (!map_word_bitsset(map, status, CMD(0x40)))
1130                                         break;
1131                                 newstate = FL_XIP_WHILE_ERASING;
1132                                 chip->erase_suspended = 1;
1133                         } else {
1134                                 if (!map_word_bitsset(map, status, CMD(0x04)))
1135                                         break;
1136                                 newstate = FL_XIP_WHILE_WRITING;
1137                                 chip->write_suspended = 1;
1138                         }
1139                         chip->state = newstate;
1140                         map_write(map, CMD(0xff), adr);
1141                         (void) map_read(map, adr);
1142                         xip_iprefetch();
1143                         local_irq_enable();
1144                         mutex_unlock(&chip->mutex);
1145                         xip_iprefetch();
1146                         cond_resched();
1147
1148                         /*
1149                          * We're back.  However someone else might have
1150                          * decided to go write to the chip if we are in
1151                          * a suspended erase state.  If so let's wait
1152                          * until it's done.
1153                          */
1154                         mutex_lock(&chip->mutex);
1155                         while (chip->state != newstate) {
1156                                 DECLARE_WAITQUEUE(wait, current);
1157                                 set_current_state(TASK_UNINTERRUPTIBLE);
1158                                 add_wait_queue(&chip->wq, &wait);
1159                                 mutex_unlock(&chip->mutex);
1160                                 schedule();
1161                                 remove_wait_queue(&chip->wq, &wait);
1162                                 mutex_lock(&chip->mutex);
1163                         }
1164                         /* Disallow XIP again */
1165                         local_irq_disable();
1166
1167                         /* Resume the write or erase operation */
1168                         map_write(map, CMD(0xd0), adr);
1169                         map_write(map, CMD(0x70), adr);
1170                         chip->state = oldstate;
1171                         start = xip_currtime();
1172                 } else if (usec >= 1000000/HZ) {
1173                         /*
1174                          * Try to save on CPU power when waiting delay
1175                          * is at least a system timer tick period.
1176                          * No need to be extremely accurate here.
1177                          */
1178                         xip_cpu_idle();
1179                 }
1180                 status = map_read(map, adr);
1181                 done = xip_elapsed_since(start);
1182         } while (!map_word_andequal(map, status, OK, OK)
1183                  && done < usec);
1184
1185         return (done >= usec) ? -ETIME : 0;
1186 }
1187
1188 /*
1189  * The INVALIDATE_CACHED_RANGE() macro is normally used in parallel while
1190  * the flash is actively programming or erasing since we have to poll for
1191  * the operation to complete anyway.  We can't do that in a generic way with
1192  * a XIP setup so do it before the actual flash operation in this case
1193  * and stub it out from INVAL_CACHE_AND_WAIT.
1194  */
1195 #define XIP_INVAL_CACHED_RANGE(map, from, size)  \
1196         INVALIDATE_CACHED_RANGE(map, from, size)
1197
1198 #define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, usec, usec_max) \
1199         xip_wait_for_operation(map, chip, cmd_adr, usec_max)
1200
1201 #else
1202
1203 #define xip_disable(map, chip, adr)
1204 #define xip_enable(map, chip, adr)
1205 #define XIP_INVAL_CACHED_RANGE(x...)
1206 #define INVAL_CACHE_AND_WAIT inval_cache_and_wait_for_operation
1207
1208 static int inval_cache_and_wait_for_operation(
1209                 struct map_info *map, struct flchip *chip,
1210                 unsigned long cmd_adr, unsigned long inval_adr, int inval_len,
1211                 unsigned int chip_op_time, unsigned int chip_op_time_max)
1212 {
1213         struct cfi_private *cfi = map->fldrv_priv;
1214         map_word status, status_OK = CMD(0x80);
1215         int chip_state = chip->state;
1216         unsigned int timeo, sleep_time, reset_timeo;
1217
1218         mutex_unlock(&chip->mutex);
1219         if (inval_len)
1220                 INVALIDATE_CACHED_RANGE(map, inval_adr, inval_len);
1221         mutex_lock(&chip->mutex);
1222
1223         timeo = chip_op_time_max;
1224         if (!timeo)
1225                 timeo = 500000;
1226         reset_timeo = timeo;
1227         sleep_time = chip_op_time / 2;
1228
1229         for (;;) {
1230                 status = map_read(map, cmd_adr);
1231                 if (map_word_andequal(map, status, status_OK, status_OK))
1232                         break;
1233
1234                 if (!timeo) {
1235                         map_write(map, CMD(0x70), cmd_adr);
1236                         chip->state = FL_STATUS;
1237                         return -ETIME;
1238                 }
1239
1240                 /* OK Still waiting. Drop the lock, wait a while and retry. */
1241                 mutex_unlock(&chip->mutex);
1242                 if (sleep_time >= 1000000/HZ) {
1243                         /*
1244                          * Half of the normal delay still remaining
1245                          * can be performed with a sleeping delay instead
1246                          * of busy waiting.
1247                          */
1248                         msleep(sleep_time/1000);
1249                         timeo -= sleep_time;
1250                         sleep_time = 1000000/HZ;
1251                 } else {
1252                         udelay(1);
1253                         cond_resched();
1254                         timeo--;
1255                 }
1256                 mutex_lock(&chip->mutex);
1257
1258                 while (chip->state != chip_state) {
1259                         /* Someone's suspended the operation: sleep */
1260                         DECLARE_WAITQUEUE(wait, current);
1261                         set_current_state(TASK_UNINTERRUPTIBLE);
1262                         add_wait_queue(&chip->wq, &wait);
1263                         mutex_unlock(&chip->mutex);
1264                         schedule();
1265                         remove_wait_queue(&chip->wq, &wait);
1266                         mutex_lock(&chip->mutex);
1267                 }
1268                 if (chip->erase_suspended && chip_state == FL_ERASING)  {
1269                         /* Erase suspend occured while sleep: reset timeout */
1270                         timeo = reset_timeo;
1271                         chip->erase_suspended = 0;
1272                 }
1273                 if (chip->write_suspended && chip_state == FL_WRITING)  {
1274                         /* Write suspend occured while sleep: reset timeout */
1275                         timeo = reset_timeo;
1276                         chip->write_suspended = 0;
1277                 }
1278         }
1279
1280         /* Done and happy. */
1281         chip->state = FL_STATUS;
1282         return 0;
1283 }
1284
1285 #endif
1286
1287 #define WAIT_TIMEOUT(map, chip, adr, udelay, udelay_max) \
1288         INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, udelay, udelay_max);
1289
1290
1291 static int do_point_onechip (struct map_info *map, struct flchip *chip, loff_t adr, size_t len)
1292 {
1293         unsigned long cmd_addr;
1294         struct cfi_private *cfi = map->fldrv_priv;
1295         int ret = 0;
1296
1297         adr += chip->start;
1298
1299         /* Ensure cmd read/writes are aligned. */
1300         cmd_addr = adr & ~(map_bankwidth(map)-1);
1301
1302         mutex_lock(&chip->mutex);
1303
1304         ret = get_chip(map, chip, cmd_addr, FL_POINT);
1305
1306         if (!ret) {
1307                 if (chip->state != FL_POINT && chip->state != FL_READY)
1308                         map_write(map, CMD(0xff), cmd_addr);
1309
1310                 chip->state = FL_POINT;
1311                 chip->ref_point_counter++;
1312         }
1313         mutex_unlock(&chip->mutex);
1314
1315         return ret;
1316 }
1317
1318 static int cfi_intelext_point(struct mtd_info *mtd, loff_t from, size_t len,
1319                 size_t *retlen, void **virt, resource_size_t *phys)
1320 {
1321         struct map_info *map = mtd->priv;
1322         struct cfi_private *cfi = map->fldrv_priv;
1323         unsigned long ofs, last_end = 0;
1324         int chipnum;
1325         int ret = 0;
1326
1327         if (!map->virt || (from + len > mtd->size))
1328                 return -EINVAL;
1329
1330         /* Now lock the chip(s) to POINT state */
1331
1332         /* ofs: offset within the first chip that the first read should start */
1333         chipnum = (from >> cfi->chipshift);
1334         ofs = from - (chipnum << cfi->chipshift);
1335
1336         *virt = map->virt + cfi->chips[chipnum].start + ofs;
1337         *retlen = 0;
1338         if (phys)
1339                 *phys = map->phys + cfi->chips[chipnum].start + ofs;
1340
1341         while (len) {
1342                 unsigned long thislen;
1343
1344                 if (chipnum >= cfi->numchips)
1345                         break;
1346
1347                 /* We cannot point across chips that are virtually disjoint */
1348                 if (!last_end)
1349                         last_end = cfi->chips[chipnum].start;
1350                 else if (cfi->chips[chipnum].start != last_end)
1351                         break;
1352
1353                 if ((len + ofs -1) >> cfi->chipshift)
1354                         thislen = (1<<cfi->chipshift) - ofs;
1355                 else
1356                         thislen = len;
1357
1358                 ret = do_point_onechip(map, &cfi->chips[chipnum], ofs, thislen);
1359                 if (ret)
1360                         break;
1361
1362                 *retlen += thislen;
1363                 len -= thislen;
1364
1365                 ofs = 0;
1366                 last_end += 1 << cfi->chipshift;
1367                 chipnum++;
1368         }
1369         return 0;
1370 }
1371
1372 static void cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
1373 {
1374         struct map_info *map = mtd->priv;
1375         struct cfi_private *cfi = map->fldrv_priv;
1376         unsigned long ofs;
1377         int chipnum;
1378
1379         /* Now unlock the chip(s) POINT state */
1380
1381         /* ofs: offset within the first chip that the first read should start */
1382         chipnum = (from >> cfi->chipshift);
1383         ofs = from - (chipnum <<  cfi->chipshift);
1384
1385         while (len) {
1386                 unsigned long thislen;
1387                 struct flchip *chip;
1388
1389                 chip = &cfi->chips[chipnum];
1390                 if (chipnum >= cfi->numchips)
1391                         break;
1392
1393                 if ((len + ofs -1) >> cfi->chipshift)
1394                         thislen = (1<<cfi->chipshift) - ofs;
1395                 else
1396                         thislen = len;
1397
1398                 mutex_lock(&chip->mutex);
1399                 if (chip->state == FL_POINT) {
1400                         chip->ref_point_counter--;
1401                         if(chip->ref_point_counter == 0)
1402                                 chip->state = FL_READY;
1403                 } else
1404                         printk(KERN_ERR "%s: Warning: unpoint called on non pointed region\n", map->name); /* Should this give an error? */
1405
1406                 put_chip(map, chip, chip->start);
1407                 mutex_unlock(&chip->mutex);
1408
1409                 len -= thislen;
1410                 ofs = 0;
1411                 chipnum++;
1412         }
1413 }
1414
1415 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
1416 {
1417         unsigned long cmd_addr;
1418         struct cfi_private *cfi = map->fldrv_priv;
1419         int ret;
1420
1421         adr += chip->start;
1422
1423         /* Ensure cmd read/writes are aligned. */
1424         cmd_addr = adr & ~(map_bankwidth(map)-1);
1425
1426         mutex_lock(&chip->mutex);
1427         ret = get_chip(map, chip, cmd_addr, FL_READY);
1428         if (ret) {
1429                 mutex_unlock(&chip->mutex);
1430                 return ret;
1431         }
1432
1433         if (chip->state != FL_POINT && chip->state != FL_READY) {
1434                 map_write(map, CMD(0xff), cmd_addr);
1435
1436                 chip->state = FL_READY;
1437         }
1438
1439         map_copy_from(map, buf, adr, len);
1440
1441         put_chip(map, chip, cmd_addr);
1442
1443         mutex_unlock(&chip->mutex);
1444         return 0;
1445 }
1446
1447 static int cfi_intelext_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
1448 {
1449         struct map_info *map = mtd->priv;
1450         struct cfi_private *cfi = map->fldrv_priv;
1451         unsigned long ofs;
1452         int chipnum;
1453         int ret = 0;
1454
1455         /* ofs: offset within the first chip that the first read should start */
1456         chipnum = (from >> cfi->chipshift);
1457         ofs = from - (chipnum <<  cfi->chipshift);
1458
1459         *retlen = 0;
1460
1461         while (len) {
1462                 unsigned long thislen;
1463
1464                 if (chipnum >= cfi->numchips)
1465                         break;
1466
1467                 if ((len + ofs -1) >> cfi->chipshift)
1468                         thislen = (1<<cfi->chipshift) - ofs;
1469                 else
1470                         thislen = len;
1471
1472                 ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
1473                 if (ret)
1474                         break;
1475
1476                 *retlen += thislen;
1477                 len -= thislen;
1478                 buf += thislen;
1479
1480                 ofs = 0;
1481                 chipnum++;
1482         }
1483         return ret;
1484 }
1485
1486 static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
1487                                      unsigned long adr, map_word datum, int mode)
1488 {
1489         struct cfi_private *cfi = map->fldrv_priv;
1490         map_word status, write_cmd;
1491         int ret=0;
1492
1493         adr += chip->start;
1494
1495         switch (mode) {
1496         case FL_WRITING:
1497                 write_cmd = (cfi->cfiq->P_ID != 0x0200) ? CMD(0x40) : CMD(0x41);
1498                 break;
1499         case FL_OTP_WRITE:
1500                 write_cmd = CMD(0xc0);
1501                 break;
1502         default:
1503                 return -EINVAL;
1504         }
1505
1506         mutex_lock(&chip->mutex);
1507         ret = get_chip(map, chip, adr, mode);
1508         if (ret) {
1509                 mutex_unlock(&chip->mutex);
1510                 return ret;
1511         }
1512
1513         XIP_INVAL_CACHED_RANGE(map, adr, map_bankwidth(map));
1514         ENABLE_VPP(map);
1515         xip_disable(map, chip, adr);
1516         map_write(map, write_cmd, adr);
1517         map_write(map, datum, adr);
1518         chip->state = mode;
1519
1520         ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
1521                                    adr, map_bankwidth(map),
1522                                    chip->word_write_time,
1523                                    chip->word_write_time_max);
1524         if (ret) {
1525                 xip_enable(map, chip, adr);
1526                 printk(KERN_ERR "%s: word write error (status timeout)\n", map->name);
1527                 goto out;
1528         }
1529
1530         /* check for errors */
1531         status = map_read(map, adr);
1532         if (map_word_bitsset(map, status, CMD(0x1a))) {
1533                 unsigned long chipstatus = MERGESTATUS(status);
1534
1535                 /* reset status */
1536                 map_write(map, CMD(0x50), adr);
1537                 map_write(map, CMD(0x70), adr);
1538                 xip_enable(map, chip, adr);
1539
1540                 if (chipstatus & 0x02) {
1541                         ret = -EROFS;
1542                 } else if (chipstatus & 0x08) {
1543                         printk(KERN_ERR "%s: word write error (bad VPP)\n", map->name);
1544                         ret = -EIO;
1545                 } else {
1546                         printk(KERN_ERR "%s: word write error (status 0x%lx)\n", map->name, chipstatus);
1547                         ret = -EINVAL;
1548                 }
1549
1550                 goto out;
1551         }
1552
1553         xip_enable(map, chip, adr);
1554  out:   put_chip(map, chip, adr);
1555         mutex_unlock(&chip->mutex);
1556         return ret;
1557 }
1558
1559
1560 static int cfi_intelext_write_words (struct mtd_info *mtd, loff_t to , size_t len, size_t *retlen, const u_char *buf)
1561 {
1562         struct map_info *map = mtd->priv;
1563         struct cfi_private *cfi = map->fldrv_priv;
1564         int ret = 0;
1565         int chipnum;
1566         unsigned long ofs;
1567
1568         *retlen = 0;
1569         if (!len)
1570                 return 0;
1571
1572         chipnum = to >> cfi->chipshift;
1573         ofs = to  - (chipnum << cfi->chipshift);
1574
1575         /* If it's not bus-aligned, do the first byte write */
1576         if (ofs & (map_bankwidth(map)-1)) {
1577                 unsigned long bus_ofs = ofs & ~(map_bankwidth(map)-1);
1578                 int gap = ofs - bus_ofs;
1579                 int n;
1580                 map_word datum;
1581
1582                 n = min_t(int, len, map_bankwidth(map)-gap);
1583                 datum = map_word_ff(map);
1584                 datum = map_word_load_partial(map, datum, buf, gap, n);
1585
1586                 ret = do_write_oneword(map, &cfi->chips[chipnum],
1587                                                bus_ofs, datum, FL_WRITING);
1588                 if (ret)
1589                         return ret;
1590
1591                 len -= n;
1592                 ofs += n;
1593                 buf += n;
1594                 (*retlen) += n;
1595
1596                 if (ofs >> cfi->chipshift) {
1597                         chipnum ++;
1598                         ofs = 0;
1599                         if (chipnum == cfi->numchips)
1600                                 return 0;
1601                 }
1602         }
1603
1604         while(len >= map_bankwidth(map)) {
1605                 map_word datum = map_word_load(map, buf);
1606
1607                 ret = do_write_oneword(map, &cfi->chips[chipnum],
1608                                        ofs, datum, FL_WRITING);
1609                 if (ret)
1610                         return ret;
1611
1612                 ofs += map_bankwidth(map);
1613                 buf += map_bankwidth(map);
1614                 (*retlen) += map_bankwidth(map);
1615                 len -= map_bankwidth(map);
1616
1617                 if (ofs >> cfi->chipshift) {
1618                         chipnum ++;
1619                         ofs = 0;
1620                         if (chipnum == cfi->numchips)
1621                                 return 0;
1622                 }
1623         }
1624
1625         if (len & (map_bankwidth(map)-1)) {
1626                 map_word datum;
1627
1628                 datum = map_word_ff(map);
1629                 datum = map_word_load_partial(map, datum, buf, 0, len);
1630
1631                 ret = do_write_oneword(map, &cfi->chips[chipnum],
1632                                        ofs, datum, FL_WRITING);
1633                 if (ret)
1634                         return ret;
1635
1636                 (*retlen) += len;
1637         }
1638
1639         return 0;
1640 }
1641
1642
1643 static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
1644                                     unsigned long adr, const struct kvec **pvec,
1645                                     unsigned long *pvec_seek, int len)
1646 {
1647         struct cfi_private *cfi = map->fldrv_priv;
1648         map_word status, write_cmd, datum;
1649         unsigned long cmd_adr;
1650         int ret, wbufsize, word_gap, words;
1651         const struct kvec *vec;
1652         unsigned long vec_seek;
1653         unsigned long initial_adr;
1654         int initial_len = len;
1655
1656         wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
1657         adr += chip->start;
1658         initial_adr = adr;
1659         cmd_adr = adr & ~(wbufsize-1);
1660
1661         /* Let's determine this according to the interleave only once */
1662         write_cmd = (cfi->cfiq->P_ID != 0x0200) ? CMD(0xe8) : CMD(0xe9);
1663
1664         mutex_lock(&chip->mutex);
1665         ret = get_chip(map, chip, cmd_adr, FL_WRITING);
1666         if (ret) {
1667                 mutex_unlock(&chip->mutex);
1668                 return ret;
1669         }
1670
1671         XIP_INVAL_CACHED_RANGE(map, initial_adr, initial_len);
1672         ENABLE_VPP(map);
1673         xip_disable(map, chip, cmd_adr);
1674
1675         /* ยง4.8 of the 28FxxxJ3A datasheet says "Any time SR.4 and/or SR.5 is set
1676            [...], the device will not accept any more Write to Buffer commands".
1677            So we must check here and reset those bits if they're set. Otherwise
1678            we're just pissing in the wind */
1679         if (chip->state != FL_STATUS) {
1680                 map_write(map, CMD(0x70), cmd_adr);
1681                 chip->state = FL_STATUS;
1682         }
1683         status = map_read(map, cmd_adr);
1684         if (map_word_bitsset(map, status, CMD(0x30))) {
1685                 xip_enable(map, chip, cmd_adr);
1686                 printk(KERN_WARNING "SR.4 or SR.5 bits set in buffer write (status %lx). Clearing.\n", status.x[0]);
1687                 xip_disable(map, chip, cmd_adr);
1688                 map_write(map, CMD(0x50), cmd_adr);
1689                 map_write(map, CMD(0x70), cmd_adr);
1690         }
1691
1692         chip->state = FL_WRITING_TO_BUFFER;
1693         map_write(map, write_cmd, cmd_adr);
1694         ret = WAIT_TIMEOUT(map, chip, cmd_adr, 0, 0);
1695         if (ret) {
1696                 /* Argh. Not ready for write to buffer */
1697                 map_word Xstatus = map_read(map, cmd_adr);
1698                 map_write(map, CMD(0x70), cmd_adr);
1699                 chip->state = FL_STATUS;
1700                 status = map_read(map, cmd_adr);
1701                 map_write(map, CMD(0x50), cmd_adr);
1702                 map_write(map, CMD(0x70), cmd_adr);
1703                 xip_enable(map, chip, cmd_adr);
1704                 printk(KERN_ERR "%s: Chip not ready for buffer write. Xstatus = %lx, status = %lx\n",
1705                                 map->name, Xstatus.x[0], status.x[0]);
1706                 goto out;
1707         }
1708
1709         /* Figure out the number of words to write */
1710         word_gap = (-adr & (map_bankwidth(map)-1));
1711         words = DIV_ROUND_UP(len - word_gap, map_bankwidth(map));
1712         if (!word_gap) {
1713                 words--;
1714         } else {
1715                 word_gap = map_bankwidth(map) - word_gap;
1716                 adr -= word_gap;
1717                 datum = map_word_ff(map);
1718         }
1719
1720         /* Write length of data to come */
1721         map_write(map, CMD(words), cmd_adr );
1722
1723         /* Write data */
1724         vec = *pvec;
1725         vec_seek = *pvec_seek;
1726         do {
1727                 int n = map_bankwidth(map) - word_gap;
1728                 if (n > vec->iov_len - vec_seek)
1729                         n = vec->iov_len - vec_seek;
1730                 if (n > len)
1731                         n = len;
1732
1733                 if (!word_gap && len < map_bankwidth(map))
1734                         datum = map_word_ff(map);
1735
1736                 datum = map_word_load_partial(map, datum,
1737                                               vec->iov_base + vec_seek,
1738                                               word_gap, n);
1739
1740                 len -= n;
1741                 word_gap += n;
1742                 if (!len || word_gap == map_bankwidth(map)) {
1743                         map_write(map, datum, adr);
1744                         adr += map_bankwidth(map);
1745                         word_gap = 0;
1746                 }
1747
1748                 vec_seek += n;
1749                 if (vec_seek == vec->iov_len) {
1750                         vec++;
1751                         vec_seek = 0;
1752                 }
1753         } while (len);
1754         *pvec = vec;
1755         *pvec_seek = vec_seek;
1756
1757         /* GO GO GO */
1758         map_write(map, CMD(0xd0), cmd_adr);
1759         chip->state = FL_WRITING;
1760
1761         ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr,
1762                                    initial_adr, initial_len,
1763                                    chip->buffer_write_time,
1764                                    chip->buffer_write_time_max);
1765         if (ret) {
1766                 map_write(map, CMD(0x70), cmd_adr);
1767                 chip->state = FL_STATUS;
1768                 xip_enable(map, chip, cmd_adr);
1769                 printk(KERN_ERR "%s: buffer write error (status timeout)\n", map->name);
1770                 goto out;
1771         }
1772
1773         /* check for errors */
1774         status = map_read(map, cmd_adr);
1775         if (map_word_bitsset(map, status, CMD(0x1a))) {
1776                 unsigned long chipstatus = MERGESTATUS(status);
1777
1778                 /* reset status */
1779                 map_write(map, CMD(0x50), cmd_adr);
1780                 map_write(map, CMD(0x70), cmd_adr);
1781                 xip_enable(map, chip, cmd_adr);
1782
1783                 if (chipstatus & 0x02) {
1784                         ret = -EROFS;
1785                 } else if (chipstatus & 0x08) {
1786                         printk(KERN_ERR "%s: buffer write error (bad VPP)\n", map->name);
1787                         ret = -EIO;
1788                 } else {
1789                         printk(KERN_ERR "%s: buffer write error (status 0x%lx)\n", map->name, chipstatus);
1790                         ret = -EINVAL;
1791                 }
1792
1793                 goto out;
1794         }
1795
1796         xip_enable(map, chip, cmd_adr);
1797  out:   put_chip(map, chip, cmd_adr);
1798         mutex_unlock(&chip->mutex);
1799         return ret;
1800 }
1801
1802 static int cfi_intelext_writev (struct mtd_info *mtd, const struct kvec *vecs,
1803                                 unsigned long count, loff_t to, size_t *retlen)
1804 {
1805         struct map_info *map = mtd->priv;
1806         struct cfi_private *cfi = map->fldrv_priv;
1807         int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
1808         int ret = 0;
1809         int chipnum;
1810         unsigned long ofs, vec_seek, i;
1811         size_t len = 0;
1812
1813         for (i = 0; i < count; i++)
1814                 len += vecs[i].iov_len;
1815
1816         *retlen = 0;
1817         if (!len)
1818                 return 0;
1819
1820         chipnum = to >> cfi->chipshift;
1821         ofs = to - (chipnum << cfi->chipshift);
1822         vec_seek = 0;
1823
1824         do {
1825                 /* We must not cross write block boundaries */
1826                 int size = wbufsize - (ofs & (wbufsize-1));
1827
1828                 if (size > len)
1829                         size = len;
1830                 ret = do_write_buffer(map, &cfi->chips[chipnum],
1831                                       ofs, &vecs, &vec_seek, size);
1832                 if (ret)
1833                         return ret;
1834
1835                 ofs += size;
1836                 (*retlen) += size;
1837                 len -= size;
1838
1839                 if (ofs >> cfi->chipshift) {
1840                         chipnum ++;
1841                         ofs = 0;
1842                         if (chipnum == cfi->numchips)
1843                                 return 0;
1844                 }
1845
1846                 /* Be nice and reschedule with the chip in a usable state for other
1847                    processes. */
1848                 cond_resched();
1849
1850         } while (len);
1851
1852         return 0;
1853 }
1854
1855 static int cfi_intelext_write_buffers (struct mtd_info *mtd, loff_t to,
1856                                        size_t len, size_t *retlen, const u_char *buf)
1857 {
1858         struct kvec vec;
1859
1860         vec.iov_base = (void *) buf;
1861         vec.iov_len = len;
1862
1863         return cfi_intelext_writev(mtd, &vec, 1, to, retlen);
1864 }
1865
1866 static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip,
1867                                       unsigned long adr, int len, void *thunk)
1868 {
1869         struct cfi_private *cfi = map->fldrv_priv;
1870         map_word status;
1871         int retries = 3;
1872         int ret;
1873
1874         adr += chip->start;
1875
1876  retry:
1877         mutex_lock(&chip->mutex);
1878         ret = get_chip(map, chip, adr, FL_ERASING);
1879         if (ret) {
1880                 mutex_unlock(&chip->mutex);
1881                 return ret;
1882         }
1883
1884         XIP_INVAL_CACHED_RANGE(map, adr, len);
1885         ENABLE_VPP(map);
1886         xip_disable(map, chip, adr);
1887
1888         /* Clear the status register first */
1889         map_write(map, CMD(0x50), adr);
1890
1891         /* Now erase */
1892         map_write(map, CMD(0x20), adr);
1893         map_write(map, CMD(0xD0), adr);
1894         chip->state = FL_ERASING;
1895         chip->erase_suspended = 0;
1896
1897         ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
1898                                    adr, len,
1899                                    chip->erase_time,
1900                                    chip->erase_time_max);
1901         if (ret) {
1902                 map_write(map, CMD(0x70), adr);
1903                 chip->state = FL_STATUS;
1904                 xip_enable(map, chip, adr);
1905                 printk(KERN_ERR "%s: block erase error: (status timeout)\n", map->name);
1906                 goto out;
1907         }
1908
1909         /* We've broken this before. It doesn't hurt to be safe */
1910         map_write(map, CMD(0x70), adr);
1911         chip->state = FL_STATUS;
1912         status = map_read(map, adr);
1913
1914         /* check for errors */
1915         if (map_word_bitsset(map, status, CMD(0x3a))) {
1916                 unsigned long chipstatus = MERGESTATUS(status);
1917
1918                 /* Reset the error bits */
1919                 map_write(map, CMD(0x50), adr);
1920                 map_write(map, CMD(0x70), adr);
1921                 xip_enable(map, chip, adr);
1922
1923                 if ((chipstatus & 0x30) == 0x30) {
1924                         printk(KERN_ERR "%s: block erase error: (bad command sequence, status 0x%lx)\n", map->name, chipstatus);
1925                         ret = -EINVAL;
1926                 } else if (chipstatus & 0x02) {
1927                         /* Protection bit set */
1928                         ret = -EROFS;
1929                 } else if (chipstatus & 0x8) {
1930                         /* Voltage */
1931                         printk(KERN_ERR "%s: block erase error: (bad VPP)\n", map->name);
1932                         ret = -EIO;
1933                 } else if (chipstatus & 0x20 && retries--) {
1934                         printk(KERN_DEBUG "block erase failed at 0x%08lx: status 0x%lx. Retrying...\n", adr, chipstatus);
1935                         put_chip(map, chip, adr);
1936                         mutex_unlock(&chip->mutex);
1937                         goto retry;
1938                 } else {
1939                         printk(KERN_ERR "%s: block erase failed at 0x%08lx (status 0x%lx)\n", map->name, adr, chipstatus);
1940                         ret = -EIO;
1941                 }
1942
1943                 goto out;
1944         }
1945
1946         xip_enable(map, chip, adr);
1947  out:   put_chip(map, chip, adr);
1948         mutex_unlock(&chip->mutex);
1949         return ret;
1950 }
1951
1952 static int cfi_intelext_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
1953 {
1954         unsigned long ofs, len;
1955         int ret;
1956
1957         ofs = instr->addr;
1958         len = instr->len;
1959
1960         ret = cfi_varsize_frob(mtd, do_erase_oneblock, ofs, len, NULL);
1961         if (ret)
1962                 return ret;
1963
1964         instr->state = MTD_ERASE_DONE;
1965         mtd_erase_callback(instr);
1966
1967         return 0;
1968 }
1969
1970 static void cfi_intelext_sync (struct mtd_info *mtd)
1971 {
1972         struct map_info *map = mtd->priv;
1973         struct cfi_private *cfi = map->fldrv_priv;
1974         int i;
1975         struct flchip *chip;
1976         int ret = 0;
1977
1978         for (i=0; !ret && i<cfi->numchips; i++) {
1979                 chip = &cfi->chips[i];
1980
1981                 mutex_lock(&chip->mutex);
1982                 ret = get_chip(map, chip, chip->start, FL_SYNCING);
1983
1984                 if (!ret) {
1985                         chip->oldstate = chip->state;
1986                         chip->state = FL_SYNCING;
1987                         /* No need to wake_up() on this state change -
1988                          * as the whole point is that nobody can do anything
1989                          * with the chip now anyway.
1990                          */
1991                 }
1992                 mutex_unlock(&chip->mutex);
1993         }
1994
1995         /* Unlock the chips again */
1996
1997         for (i--; i >=0; i--) {
1998                 chip = &cfi->chips[i];
1999
2000                 mutex_lock(&chip->mutex);
2001
2002                 if (chip->state == FL_SYNCING) {
2003                         chip->state = chip->oldstate;
2004                         chip->oldstate = FL_READY;
2005                         wake_up(&chip->wq);
2006                 }
2007                 mutex_unlock(&chip->mutex);
2008         }
2009 }
2010
2011 static int __xipram do_getlockstatus_oneblock(struct map_info *map,
2012                                                 struct flchip *chip,
2013                                                 unsigned long adr,
2014                                                 int len, void *thunk)
2015 {
2016         struct cfi_private *cfi = map->fldrv_priv;
2017         int status, ofs_factor = cfi->interleave * cfi->device_type;
2018
2019         adr += chip->start;
2020         xip_disable(map, chip, adr+(2*ofs_factor));
2021         map_write(map, CMD(0x90), adr+(2*ofs_factor));
2022         chip->state = FL_JEDEC_QUERY;
2023         status = cfi_read_query(map, adr+(2*ofs_factor));
2024         xip_enable(map, chip, 0);
2025         return status;
2026 }
2027
2028 #ifdef DEBUG_LOCK_BITS
2029 static int __xipram do_printlockstatus_oneblock(struct map_info *map,
2030                                                 struct flchip *chip,
2031                                                 unsigned long adr,
2032                                                 int len, void *thunk)
2033 {
2034         printk(KERN_DEBUG "block status register for 0x%08lx is %x\n",
2035                adr, do_getlockstatus_oneblock(map, chip, adr, len, thunk));
2036         return 0;
2037 }
2038 #endif
2039
2040 #define DO_XXLOCK_ONEBLOCK_LOCK         ((void *) 1)
2041 #define DO_XXLOCK_ONEBLOCK_UNLOCK       ((void *) 2)
2042
2043 static int __xipram do_xxlock_oneblock(struct map_info *map, struct flchip *chip,
2044                                        unsigned long adr, int len, void *thunk)
2045 {
2046         struct cfi_private *cfi = map->fldrv_priv;
2047         struct cfi_pri_intelext *extp = cfi->cmdset_priv;
2048         int udelay;
2049         int ret;
2050
2051         adr += chip->start;
2052
2053         mutex_lock(&chip->mutex);
2054         ret = get_chip(map, chip, adr, FL_LOCKING);
2055         if (ret) {
2056                 mutex_unlock(&chip->mutex);
2057                 return ret;
2058         }
2059
2060         ENABLE_VPP(map);
2061         xip_disable(map, chip, adr);
2062
2063         map_write(map, CMD(0x60), adr);
2064         if (thunk == DO_XXLOCK_ONEBLOCK_LOCK) {
2065                 map_write(map, CMD(0x01), adr);
2066                 chip->state = FL_LOCKING;
2067         } else if (thunk == DO_XXLOCK_ONEBLOCK_UNLOCK) {
2068                 map_write(map, CMD(0xD0), adr);
2069                 chip->state = FL_UNLOCKING;
2070         } else
2071                 BUG();
2072
2073         /*
2074          * If Instant Individual Block Locking supported then no need
2075          * to delay.
2076          */
2077         udelay = (!extp || !(extp->FeatureSupport & (1 << 5))) ? 1000000/HZ : 0;
2078
2079         ret = WAIT_TIMEOUT(map, chip, adr, udelay, udelay * 100);
2080         if (ret) {
2081                 map_write(map, CMD(0x70), adr);
2082                 chip->state = FL_STATUS;
2083                 xip_enable(map, chip, adr);
2084                 printk(KERN_ERR "%s: block unlock error: (status timeout)\n", map->name);
2085                 goto out;
2086         }
2087
2088         xip_enable(map, chip, adr);
2089 out:    put_chip(map, chip, adr);
2090         mutex_unlock(&chip->mutex);
2091         return ret;
2092 }
2093
2094 static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2095 {
2096         int ret;
2097
2098 #ifdef DEBUG_LOCK_BITS
2099         printk(KERN_DEBUG "%s: lock status before, ofs=0x%08llx, len=0x%08X\n",
2100                __func__, ofs, len);
2101         cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2102                 ofs, len, NULL);
2103 #endif
2104
2105         ret = cfi_varsize_frob(mtd, do_xxlock_oneblock,
2106                 ofs, len, DO_XXLOCK_ONEBLOCK_LOCK);
2107
2108 #ifdef DEBUG_LOCK_BITS
2109         printk(KERN_DEBUG "%s: lock status after, ret=%d\n",
2110                __func__, ret);
2111         cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2112                 ofs, len, NULL);
2113 #endif
2114
2115         return ret;
2116 }
2117
2118 static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2119 {
2120         int ret;
2121
2122 #ifdef DEBUG_LOCK_BITS
2123         printk(KERN_DEBUG "%s: lock status before, ofs=0x%08llx, len=0x%08X\n",
2124                __func__, ofs, len);
2125         cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2126                 ofs, len, NULL);
2127 #endif
2128
2129         ret = cfi_varsize_frob(mtd, do_xxlock_oneblock,
2130                                         ofs, len, DO_XXLOCK_ONEBLOCK_UNLOCK);
2131
2132 #ifdef DEBUG_LOCK_BITS
2133         printk(KERN_DEBUG "%s: lock status after, ret=%d\n",
2134                __func__, ret);
2135         cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2136                 ofs, len, NULL);
2137 #endif
2138
2139         return ret;
2140 }
2141
2142 #ifdef CONFIG_MTD_OTP
2143
2144 typedef int (*otp_op_t)(struct map_info *map, struct flchip *chip,
2145                         u_long data_offset, u_char *buf, u_int size,
2146                         u_long prot_offset, u_int groupno, u_int groupsize);
2147
2148 static int __xipram
2149 do_otp_read(struct map_info *map, struct flchip *chip, u_long offset,
2150             u_char *buf, u_int size, u_long prot, u_int grpno, u_int grpsz)
2151 {
2152         struct cfi_private *cfi = map->fldrv_priv;
2153         int ret;
2154
2155         mutex_lock(&chip->mutex);
2156         ret = get_chip(map, chip, chip->start, FL_JEDEC_QUERY);
2157         if (ret) {
2158                 mutex_unlock(&chip->mutex);
2159                 return ret;
2160         }
2161
2162         /* let's ensure we're not reading back cached data from array mode */
2163         INVALIDATE_CACHED_RANGE(map, chip->start + offset, size);
2164
2165         xip_disable(map, chip, chip->start);
2166         if (chip->state != FL_JEDEC_QUERY) {
2167                 map_write(map, CMD(0x90), chip->start);
2168                 chip->state = FL_JEDEC_QUERY;
2169         }
2170         map_copy_from(map, buf, chip->start + offset, size);
2171         xip_enable(map, chip, chip->start);
2172
2173         /* then ensure we don't keep OTP data in the cache */
2174         INVALIDATE_CACHED_RANGE(map, chip->start + offset, size);
2175
2176         put_chip(map, chip, chip->start);
2177         mutex_unlock(&chip->mutex);
2178         return 0;
2179 }
2180
2181 static int
2182 do_otp_write(struct map_info *map, struct flchip *chip, u_long offset,
2183              u_char *buf, u_int size, u_long prot, u_int grpno, u_int grpsz)
2184 {
2185         int ret;
2186
2187         while (size) {
2188                 unsigned long bus_ofs = offset & ~(map_bankwidth(map)-1);
2189                 int gap = offset - bus_ofs;
2190                 int n = min_t(int, size, map_bankwidth(map)-gap);
2191                 map_word datum = map_word_ff(map);
2192
2193                 datum = map_word_load_partial(map, datum, buf, gap, n);
2194                 ret = do_write_oneword(map, chip, bus_ofs, datum, FL_OTP_WRITE);
2195                 if (ret)
2196                         return ret;
2197
2198                 offset += n;
2199                 buf += n;
2200                 size -= n;
2201         }
2202
2203         return 0;
2204 }
2205
2206 static int
2207 do_otp_lock(struct map_info *map, struct flchip *chip, u_long offset,
2208             u_char *buf, u_int size, u_long prot, u_int grpno, u_int grpsz)
2209 {
2210         struct cfi_private *cfi = map->fldrv_priv;
2211         map_word datum;
2212
2213         /* make sure area matches group boundaries */
2214         if (size != grpsz)
2215                 return -EXDEV;
2216
2217         datum = map_word_ff(map);
2218         datum = map_word_clr(map, datum, CMD(1 << grpno));
2219         return do_write_oneword(map, chip, prot, datum, FL_OTP_WRITE);
2220 }
2221
2222 static int cfi_intelext_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
2223                                  size_t *retlen, u_char *buf,
2224                                  otp_op_t action, int user_regs)
2225 {
2226         struct map_info *map = mtd->priv;
2227         struct cfi_private *cfi = map->fldrv_priv;
2228         struct cfi_pri_intelext *extp = cfi->cmdset_priv;
2229         struct flchip *chip;
2230         struct cfi_intelext_otpinfo *otp;
2231         u_long devsize, reg_prot_offset, data_offset;
2232         u_int chip_num, chip_step, field, reg_fact_size, reg_user_size;
2233         u_int groups, groupno, groupsize, reg_fact_groups, reg_user_groups;
2234         int ret;
2235
2236         *retlen = 0;
2237
2238         /* Check that we actually have some OTP registers */
2239         if (!extp || !(extp->FeatureSupport & 64) || !extp->NumProtectionFields)
2240                 return -ENODATA;
2241
2242         /* we need real chips here not virtual ones */
2243         devsize = (1 << cfi->cfiq->DevSize) * cfi->interleave;
2244         chip_step = devsize >> cfi->chipshift;
2245         chip_num = 0;
2246
2247         /* Some chips have OTP located in the _top_ partition only.
2248            For example: Intel 28F256L18T (T means top-parameter device) */
2249         if (cfi->mfr == CFI_MFR_INTEL) {
2250                 switch (cfi->id) {
2251                 case 0x880b:
2252                 case 0x880c:
2253                 case 0x880d:
2254                         chip_num = chip_step - 1;
2255                 }
2256         }
2257
2258         for ( ; chip_num < cfi->numchips; chip_num += chip_step) {
2259                 chip = &cfi->chips[chip_num];
2260                 otp = (struct cfi_intelext_otpinfo *)&extp->extra[0];
2261
2262                 /* first OTP region */
2263                 field = 0;
2264                 reg_prot_offset = extp->ProtRegAddr;
2265                 reg_fact_groups = 1;
2266                 reg_fact_size = 1 << extp->FactProtRegSize;
2267                 reg_user_groups = 1;
2268                 reg_user_size = 1 << extp->UserProtRegSize;
2269
2270                 while (len > 0) {
2271                         /* flash geometry fixup */
2272                         data_offset = reg_prot_offset + 1;
2273                         data_offset *= cfi->interleave * cfi->device_type;
2274                         reg_prot_offset *= cfi->interleave * cfi->device_type;
2275                         reg_fact_size *= cfi->interleave;
2276                         reg_user_size *= cfi->interleave;
2277
2278                         if (user_regs) {
2279                                 groups = reg_user_groups;
2280                                 groupsize = reg_user_size;
2281                                 /* skip over factory reg area */
2282                                 groupno = reg_fact_groups;
2283                                 data_offset += reg_fact_groups * reg_fact_size;
2284                         } else {
2285                                 groups = reg_fact_groups;
2286                                 groupsize = reg_fact_size;
2287                                 groupno = 0;
2288                         }
2289
2290                         while (len > 0 && groups > 0) {
2291                                 if (!action) {
2292                                         /*
2293                                          * Special case: if action is NULL
2294                                          * we fill buf with otp_info records.
2295                                          */
2296                                         struct otp_info *otpinfo;
2297                                         map_word lockword;
2298                                         len -= sizeof(struct otp_info);
2299                                         if (len <= 0)
2300                                                 return -ENOSPC;
2301                                         ret = do_otp_read(map, chip,
2302                                                           reg_prot_offset,
2303                                                           (u_char *)&lockword,
2304                                                           map_bankwidth(map),
2305                                                           0, 0,  0);
2306                                         if (ret)
2307                                                 return ret;
2308                                         otpinfo = (struct otp_info *)buf;
2309                                         otpinfo->start = from;
2310                                         otpinfo->length = groupsize;
2311                                         otpinfo->locked =
2312                                            !map_word_bitsset(map, lockword,
2313                                                              CMD(1 << groupno));
2314                                         from += groupsize;
2315                                         buf += sizeof(*otpinfo);
2316                                         *retlen += sizeof(*otpinfo);
2317                                 } else if (from >= groupsize) {
2318                                         from -= groupsize;
2319                                         data_offset += groupsize;
2320                                 } else {
2321                                         int size = groupsize;
2322                                         data_offset += from;
2323                                         size -= from;
2324                                         from = 0;
2325                                         if (size > len)
2326                                                 size = len;
2327                                         ret = action(map, chip, data_offset,
2328                                                      buf, size, reg_prot_offset,
2329                                                      groupno, groupsize);
2330                                         if (ret < 0)
2331                                                 return ret;
2332                                         buf += size;
2333                                         len -= size;
2334                                         *retlen += size;
2335                                         data_offset += size;
2336                                 }
2337                                 groupno++;
2338                                 groups--;
2339                         }
2340
2341                         /* next OTP region */
2342                         if (++field == extp->NumProtectionFields)
2343                                 break;
2344                         reg_prot_offset = otp->ProtRegAddr;
2345                         reg_fact_groups = otp->FactGroups;
2346                         reg_fact_size = 1 << otp->FactProtRegSize;
2347                         reg_user_groups = otp->UserGroups;
2348                         reg_user_size = 1 << otp->UserProtRegSize;
2349                         otp++;
2350                 }
2351         }
2352
2353         return 0;
2354 }
2355
2356 static int cfi_intelext_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
2357                                            size_t len, size_t *retlen,
2358                                             u_char *buf)
2359 {
2360         return cfi_intelext_otp_walk(mtd, from, len, retlen,
2361                                      buf, do_otp_read, 0);
2362 }
2363
2364 static int cfi_intelext_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
2365                                            size_t len, size_t *retlen,
2366                                             u_char *buf)
2367 {
2368         return cfi_intelext_otp_walk(mtd, from, len, retlen,
2369                                      buf, do_otp_read, 1);
2370 }
2371
2372 static int cfi_intelext_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
2373                                             size_t len, size_t *retlen,
2374                                              u_char *buf)
2375 {
2376         return cfi_intelext_otp_walk(mtd, from, len, retlen,
2377                                      buf, do_otp_write, 1);
2378 }
2379
2380 static int cfi_intelext_lock_user_prot_reg(struct mtd_info *mtd,
2381                                            loff_t from, size_t len)
2382 {
2383         size_t retlen;
2384         return cfi_intelext_otp_walk(mtd, from, len, &retlen,
2385                                      NULL, do_otp_lock, 1);
2386 }
2387
2388 static int cfi_intelext_get_fact_prot_info(struct mtd_info *mtd,
2389                                            struct otp_info *buf, size_t len)
2390 {
2391         size_t retlen;
2392         int ret;
2393
2394         ret = cfi_intelext_otp_walk(mtd, 0, len, &retlen, (u_char *)buf, NULL, 0);
2395         return ret ? : retlen;
2396 }
2397
2398 static int cfi_intelext_get_user_prot_info(struct mtd_info *mtd,
2399                                            struct otp_info *buf, size_t len)
2400 {
2401         size_t retlen;
2402         int ret;
2403
2404         ret = cfi_intelext_otp_walk(mtd, 0, len, &retlen, (u_char *)buf, NULL, 1);
2405         return ret ? : retlen;
2406 }
2407
2408 #endif
2409
2410 static void cfi_intelext_save_locks(struct mtd_info *mtd)
2411 {
2412         struct mtd_erase_region_info *region;
2413         int block, status, i;
2414         unsigned long adr;
2415         size_t len;
2416
2417         for (i = 0; i < mtd->numeraseregions; i++) {
2418                 region = &mtd->eraseregions[i];
2419                 if (!region->lockmap)
2420                         continue;
2421
2422                 for (block = 0; block < region->numblocks; block++){
2423                         len = region->erasesize;
2424                         adr = region->offset + block * len;
2425
2426                         status = cfi_varsize_frob(mtd,
2427                                         do_getlockstatus_oneblock, adr, len, NULL);
2428                         if (status)
2429                                 set_bit(block, region->lockmap);
2430                         else
2431                                 clear_bit(block, region->lockmap);
2432                 }
2433         }
2434 }
2435
2436 static int cfi_intelext_suspend(struct mtd_info *mtd)
2437 {
2438         struct map_info *map = mtd->priv;
2439         struct cfi_private *cfi = map->fldrv_priv;
2440         struct cfi_pri_intelext *extp = cfi->cmdset_priv;
2441         int i;
2442         struct flchip *chip;
2443         int ret = 0;
2444
2445         if ((mtd->flags & MTD_POWERUP_LOCK)
2446             && extp && (extp->FeatureSupport & (1 << 5)))
2447                 cfi_intelext_save_locks(mtd);
2448
2449         for (i=0; !ret && i<cfi->numchips; i++) {
2450                 chip = &cfi->chips[i];
2451
2452                 mutex_lock(&chip->mutex);
2453
2454                 switch (chip->state) {
2455                 case FL_READY:
2456                 case FL_STATUS:
2457                 case FL_CFI_QUERY:
2458                 case FL_JEDEC_QUERY:
2459                         if (chip->oldstate == FL_READY) {
2460                                 /* place the chip in a known state before suspend */
2461                                 map_write(map, CMD(0xFF), cfi->chips[i].start);
2462                                 chip->oldstate = chip->state;
2463                                 chip->state = FL_PM_SUSPENDED;
2464                                 /* No need to wake_up() on this state change -
2465                                  * as the whole point is that nobody can do anything
2466                                  * with the chip now anyway.
2467                                  */
2468                         } else {
2469                                 /* There seems to be an operation pending. We must wait for it. */
2470                                 printk(KERN_NOTICE "Flash device refused suspend due to pending operation (oldstate %d)\n", chip->oldstate);
2471                                 ret = -EAGAIN;
2472                         }
2473                         break;
2474                 default:
2475                         /* Should we actually wait? Once upon a time these routines weren't
2476                            allowed to. Or should we return -EAGAIN, because the upper layers
2477                            ought to have already shut down anything which was using the device
2478                            anyway? The latter for now. */
2479                         printk(KERN_NOTICE "Flash device refused suspend due to active operation (state %d)\n", chip->oldstate);
2480                         ret = -EAGAIN;
2481                 case FL_PM_SUSPENDED:
2482                         break;
2483                 }
2484                 mutex_unlock(&chip->mutex);
2485         }
2486
2487         /* Unlock the chips again */
2488
2489         if (ret) {
2490                 for (i--; i >=0; i--) {
2491                         chip = &cfi->chips[i];
2492
2493                         mutex_lock(&chip->mutex);
2494
2495                         if (chip->state == FL_PM_SUSPENDED) {
2496                                 /* No need to force it into a known state here,
2497                                    because we're returning failure, and it didn't
2498                                    get power cycled */
2499                                 chip->state = chip->oldstate;
2500                                 chip->oldstate = FL_READY;
2501                                 wake_up(&chip->wq);
2502                         }
2503                         mutex_unlock(&chip->mutex);
2504                 }
2505         }
2506
2507         return ret;
2508 }
2509
2510 static void cfi_intelext_restore_locks(struct mtd_info *mtd)
2511 {
2512         struct mtd_erase_region_info *region;
2513         int block, i;
2514         unsigned long adr;
2515         size_t len;
2516
2517         for (i = 0; i < mtd->numeraseregions; i++) {
2518                 region = &mtd->eraseregions[i];
2519                 if (!region->lockmap)
2520                         continue;
2521
2522                 for (block = 0; block < region->numblocks; block++) {
2523                         len = region->erasesize;
2524                         adr = region->offset + block * len;
2525
2526                         if (!test_bit(block, region->lockmap))
2527                                 cfi_intelext_unlock(mtd, adr, len);
2528                 }
2529         }
2530 }
2531
2532 static void cfi_intelext_resume(struct mtd_info *mtd)
2533 {
2534         struct map_info *map = mtd->priv;
2535         struct cfi_private *cfi = map->fldrv_priv;
2536         struct cfi_pri_intelext *extp = cfi->cmdset_priv;
2537         int i;
2538         struct flchip *chip;
2539
2540         for (i=0; i<cfi->numchips; i++) {
2541
2542                 chip = &cfi->chips[i];
2543
2544                 mutex_lock(&chip->mutex);
2545
2546                 /* Go to known state. Chip may have been power cycled */
2547                 if (chip->state == FL_PM_SUSPENDED) {
2548                         map_write(map, CMD(0xFF), cfi->chips[i].start);
2549                         chip->oldstate = chip->state = FL_READY;
2550                         wake_up(&chip->wq);
2551                 }
2552
2553                 mutex_unlock(&chip->mutex);
2554         }
2555
2556         if ((mtd->flags & MTD_POWERUP_LOCK)
2557             && extp && (extp->FeatureSupport & (1 << 5)))
2558                 cfi_intelext_restore_locks(mtd);
2559 }
2560
2561 static int cfi_intelext_reset(struct mtd_info *mtd)
2562 {
2563         struct map_info *map = mtd->priv;
2564         struct cfi_private *cfi = map->fldrv_priv;
2565         int i, ret;
2566
2567         for (i=0; i < cfi->numchips; i++) {
2568                 struct flchip *chip = &cfi->chips[i];
2569
2570                 /* force the completion of any ongoing operation
2571                    and switch to array mode so any bootloader in
2572                    flash is accessible for soft reboot. */
2573                 mutex_lock(&chip->mutex);
2574                 ret = get_chip(map, chip, chip->start, FL_SHUTDOWN);
2575                 if (!ret) {
2576                         map_write(map, CMD(0xff), chip->start);
2577                         chip->state = FL_SHUTDOWN;
2578                         put_chip(map, chip, chip->start);
2579                 }
2580                 mutex_unlock(&chip->mutex);
2581         }
2582
2583         return 0;
2584 }
2585
2586 static int cfi_intelext_reboot(struct notifier_block *nb, unsigned long val,
2587                                void *v)
2588 {
2589         struct mtd_info *mtd;
2590
2591         mtd = container_of(nb, struct mtd_info, reboot_notifier);
2592         cfi_intelext_reset(mtd);
2593         return NOTIFY_DONE;
2594 }
2595
2596 static void cfi_intelext_destroy(struct mtd_info *mtd)
2597 {
2598         struct map_info *map = mtd->priv;
2599         struct cfi_private *cfi = map->fldrv_priv;
2600         struct mtd_erase_region_info *region;
2601         int i;
2602         cfi_intelext_reset(mtd);
2603         unregister_reboot_notifier(&mtd->reboot_notifier);
2604         kfree(cfi->cmdset_priv);
2605         kfree(cfi->cfiq);
2606         kfree(cfi->chips[0].priv);
2607         kfree(cfi);
2608         for (i = 0; i < mtd->numeraseregions; i++) {
2609                 region = &mtd->eraseregions[i];
2610                 if (region->lockmap)
2611                         kfree(region->lockmap);
2612         }
2613         kfree(mtd->eraseregions);
2614 }
2615
2616 MODULE_LICENSE("GPL");
2617 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org> et al.");
2618 MODULE_DESCRIPTION("MTD chip driver for Intel/Sharp flash chips");
2619 MODULE_ALIAS("cfi_cmdset_0003");
2620 MODULE_ALIAS("cfi_cmdset_0200");