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