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