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