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