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