1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/delay.h>
17#include <linux/io.h>
18#include <linux/nmi.h>
19
20#include "internals.h"
21
22
23
24
25
26
27
28static uint8_t nand_read_byte(struct nand_chip *chip)
29{
30 return readb(chip->legacy.IO_ADDR_R);
31}
32
33
34
35
36
37
38
39
40static uint8_t nand_read_byte16(struct nand_chip *chip)
41{
42 return (uint8_t) cpu_to_le16(readw(chip->legacy.IO_ADDR_R));
43}
44
45
46
47
48
49
50
51
52static void nand_select_chip(struct nand_chip *chip, int chipnr)
53{
54 switch (chipnr) {
55 case -1:
56 chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
57 0 | NAND_CTRL_CHANGE);
58 break;
59 case 0:
60 break;
61
62 default:
63 BUG();
64 }
65}
66
67
68
69
70
71
72
73
74static void nand_write_byte(struct nand_chip *chip, uint8_t byte)
75{
76 chip->legacy.write_buf(chip, &byte, 1);
77}
78
79
80
81
82
83
84
85
86static void nand_write_byte16(struct nand_chip *chip, uint8_t byte)
87{
88 uint16_t word = byte;
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 chip->legacy.write_buf(chip, (uint8_t *)&word, 2);
107}
108
109
110
111
112
113
114
115
116
117static void nand_write_buf(struct nand_chip *chip, const uint8_t *buf, int len)
118{
119 iowrite8_rep(chip->legacy.IO_ADDR_W, buf, len);
120}
121
122
123
124
125
126
127
128
129
130static void nand_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
131{
132 ioread8_rep(chip->legacy.IO_ADDR_R, buf, len);
133}
134
135
136
137
138
139
140
141
142
143static void nand_write_buf16(struct nand_chip *chip, const uint8_t *buf,
144 int len)
145{
146 u16 *p = (u16 *) buf;
147
148 iowrite16_rep(chip->legacy.IO_ADDR_W, p, len >> 1);
149}
150
151
152
153
154
155
156
157
158
159static void nand_read_buf16(struct nand_chip *chip, uint8_t *buf, int len)
160{
161 u16 *p = (u16 *) buf;
162
163 ioread16_rep(chip->legacy.IO_ADDR_R, p, len >> 1);
164}
165
166
167
168
169
170
171
172
173
174static void panic_nand_wait_ready(struct nand_chip *chip, unsigned long timeo)
175{
176 int i;
177
178
179 for (i = 0; i < timeo; i++) {
180 if (chip->legacy.dev_ready(chip))
181 break;
182 touch_softlockup_watchdog();
183 mdelay(1);
184 }
185}
186
187
188
189
190
191
192
193void nand_wait_ready(struct nand_chip *chip)
194{
195 struct mtd_info *mtd = nand_to_mtd(chip);
196 unsigned long timeo = 400;
197
198 if (mtd->oops_panic_write)
199 return panic_nand_wait_ready(chip, timeo);
200
201
202 timeo = jiffies + msecs_to_jiffies(timeo);
203 do {
204 if (chip->legacy.dev_ready(chip))
205 return;
206 cond_resched();
207 } while (time_before(jiffies, timeo));
208
209 if (!chip->legacy.dev_ready(chip))
210 pr_warn_ratelimited("timeout while waiting for chip to become ready\n");
211}
212EXPORT_SYMBOL_GPL(nand_wait_ready);
213
214
215
216
217
218
219
220
221static void nand_wait_status_ready(struct nand_chip *chip, unsigned long timeo)
222{
223 int ret;
224
225 timeo = jiffies + msecs_to_jiffies(timeo);
226 do {
227 u8 status;
228
229 ret = nand_read_data_op(chip, &status, sizeof(status), true,
230 false);
231 if (ret)
232 return;
233
234 if (status & NAND_STATUS_READY)
235 break;
236 touch_softlockup_watchdog();
237 } while (time_before(jiffies, timeo));
238};
239
240
241
242
243
244
245
246
247
248
249
250static void nand_command(struct nand_chip *chip, unsigned int command,
251 int column, int page_addr)
252{
253 struct mtd_info *mtd = nand_to_mtd(chip);
254 int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
255
256
257 if (command == NAND_CMD_SEQIN) {
258 int readcmd;
259
260 if (column >= mtd->writesize) {
261
262 column -= mtd->writesize;
263 readcmd = NAND_CMD_READOOB;
264 } else if (column < 256) {
265
266 readcmd = NAND_CMD_READ0;
267 } else {
268 column -= 256;
269 readcmd = NAND_CMD_READ1;
270 }
271 chip->legacy.cmd_ctrl(chip, readcmd, ctrl);
272 ctrl &= ~NAND_CTRL_CHANGE;
273 }
274 if (command != NAND_CMD_NONE)
275 chip->legacy.cmd_ctrl(chip, command, ctrl);
276
277
278 ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
279
280 if (column != -1) {
281
282 if (chip->options & NAND_BUSWIDTH_16 &&
283 !nand_opcode_8bits(command))
284 column >>= 1;
285 chip->legacy.cmd_ctrl(chip, column, ctrl);
286 ctrl &= ~NAND_CTRL_CHANGE;
287 }
288 if (page_addr != -1) {
289 chip->legacy.cmd_ctrl(chip, page_addr, ctrl);
290 ctrl &= ~NAND_CTRL_CHANGE;
291 chip->legacy.cmd_ctrl(chip, page_addr >> 8, ctrl);
292 if (chip->options & NAND_ROW_ADDR_3)
293 chip->legacy.cmd_ctrl(chip, page_addr >> 16, ctrl);
294 }
295 chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
296 NAND_NCE | NAND_CTRL_CHANGE);
297
298
299
300
301
302 switch (command) {
303
304 case NAND_CMD_NONE:
305 case NAND_CMD_PAGEPROG:
306 case NAND_CMD_ERASE1:
307 case NAND_CMD_ERASE2:
308 case NAND_CMD_SEQIN:
309 case NAND_CMD_STATUS:
310 case NAND_CMD_READID:
311 case NAND_CMD_SET_FEATURES:
312 return;
313
314 case NAND_CMD_RESET:
315 if (chip->legacy.dev_ready)
316 break;
317 udelay(chip->legacy.chip_delay);
318 chip->legacy.cmd_ctrl(chip, NAND_CMD_STATUS,
319 NAND_CTRL_CLE | NAND_CTRL_CHANGE);
320 chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
321 NAND_NCE | NAND_CTRL_CHANGE);
322
323 nand_wait_status_ready(chip, 250);
324 return;
325
326
327 case NAND_CMD_READ0:
328
329
330
331
332
333
334 if (column == -1 && page_addr == -1)
335 return;
336 fallthrough;
337 default:
338
339
340
341
342 if (!chip->legacy.dev_ready) {
343 udelay(chip->legacy.chip_delay);
344 return;
345 }
346 }
347
348
349
350
351 ndelay(100);
352
353 nand_wait_ready(chip);
354}
355
356static void nand_ccs_delay(struct nand_chip *chip)
357{
358 const struct nand_sdr_timings *sdr =
359 nand_get_sdr_timings(nand_get_interface_config(chip));
360
361
362
363
364
365 if (!(chip->options & NAND_WAIT_TCCS))
366 return;
367
368
369
370
371
372 if (!IS_ERR(sdr) && nand_controller_can_setup_interface(chip))
373 ndelay(sdr->tCCS_min / 1000);
374 else
375 ndelay(500);
376}
377
378
379
380
381
382
383
384
385
386
387
388
389static void nand_command_lp(struct nand_chip *chip, unsigned int command,
390 int column, int page_addr)
391{
392 struct mtd_info *mtd = nand_to_mtd(chip);
393
394
395 if (command == NAND_CMD_READOOB) {
396 column += mtd->writesize;
397 command = NAND_CMD_READ0;
398 }
399
400
401 if (command != NAND_CMD_NONE)
402 chip->legacy.cmd_ctrl(chip, command,
403 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
404
405 if (column != -1 || page_addr != -1) {
406 int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
407
408
409 if (column != -1) {
410
411 if (chip->options & NAND_BUSWIDTH_16 &&
412 !nand_opcode_8bits(command))
413 column >>= 1;
414 chip->legacy.cmd_ctrl(chip, column, ctrl);
415 ctrl &= ~NAND_CTRL_CHANGE;
416
417
418 if (!nand_opcode_8bits(command))
419 chip->legacy.cmd_ctrl(chip, column >> 8, ctrl);
420 }
421 if (page_addr != -1) {
422 chip->legacy.cmd_ctrl(chip, page_addr, ctrl);
423 chip->legacy.cmd_ctrl(chip, page_addr >> 8,
424 NAND_NCE | NAND_ALE);
425 if (chip->options & NAND_ROW_ADDR_3)
426 chip->legacy.cmd_ctrl(chip, page_addr >> 16,
427 NAND_NCE | NAND_ALE);
428 }
429 }
430 chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
431 NAND_NCE | NAND_CTRL_CHANGE);
432
433
434
435
436
437 switch (command) {
438
439 case NAND_CMD_NONE:
440 case NAND_CMD_CACHEDPROG:
441 case NAND_CMD_PAGEPROG:
442 case NAND_CMD_ERASE1:
443 case NAND_CMD_ERASE2:
444 case NAND_CMD_SEQIN:
445 case NAND_CMD_STATUS:
446 case NAND_CMD_READID:
447 case NAND_CMD_SET_FEATURES:
448 return;
449
450 case NAND_CMD_RNDIN:
451 nand_ccs_delay(chip);
452 return;
453
454 case NAND_CMD_RESET:
455 if (chip->legacy.dev_ready)
456 break;
457 udelay(chip->legacy.chip_delay);
458 chip->legacy.cmd_ctrl(chip, NAND_CMD_STATUS,
459 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
460 chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
461 NAND_NCE | NAND_CTRL_CHANGE);
462
463 nand_wait_status_ready(chip, 250);
464 return;
465
466 case NAND_CMD_RNDOUT:
467
468 chip->legacy.cmd_ctrl(chip, NAND_CMD_RNDOUTSTART,
469 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
470 chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
471 NAND_NCE | NAND_CTRL_CHANGE);
472
473 nand_ccs_delay(chip);
474 return;
475
476 case NAND_CMD_READ0:
477
478
479
480
481
482
483 if (column == -1 && page_addr == -1)
484 return;
485
486 chip->legacy.cmd_ctrl(chip, NAND_CMD_READSTART,
487 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
488 chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
489 NAND_NCE | NAND_CTRL_CHANGE);
490 fallthrough;
491 default:
492
493
494
495
496 if (!chip->legacy.dev_ready) {
497 udelay(chip->legacy.chip_delay);
498 return;
499 }
500 }
501
502
503
504
505
506 ndelay(100);
507
508 nand_wait_ready(chip);
509}
510
511
512
513
514
515
516
517
518
519
520int nand_get_set_features_notsupp(struct nand_chip *chip, int addr,
521 u8 *subfeature_param)
522{
523 return -ENOTSUPP;
524}
525EXPORT_SYMBOL(nand_get_set_features_notsupp);
526
527
528
529
530
531
532
533static int nand_wait(struct nand_chip *chip)
534{
535 struct mtd_info *mtd = nand_to_mtd(chip);
536 unsigned long timeo = 400;
537 u8 status;
538 int ret;
539
540
541
542
543
544 ndelay(100);
545
546 ret = nand_status_op(chip, NULL);
547 if (ret)
548 return ret;
549
550 if (mtd->oops_panic_write) {
551 panic_nand_wait(chip, timeo);
552 } else {
553 timeo = jiffies + msecs_to_jiffies(timeo);
554 do {
555 if (chip->legacy.dev_ready) {
556 if (chip->legacy.dev_ready(chip))
557 break;
558 } else {
559 ret = nand_read_data_op(chip, &status,
560 sizeof(status), true,
561 false);
562 if (ret)
563 return ret;
564
565 if (status & NAND_STATUS_READY)
566 break;
567 }
568 cond_resched();
569 } while (time_before(jiffies, timeo));
570 }
571
572 ret = nand_read_data_op(chip, &status, sizeof(status), true, false);
573 if (ret)
574 return ret;
575
576
577 WARN_ON(!(status & NAND_STATUS_READY));
578 return status;
579}
580
581void nand_legacy_set_defaults(struct nand_chip *chip)
582{
583 unsigned int busw = chip->options & NAND_BUSWIDTH_16;
584
585 if (nand_has_exec_op(chip))
586 return;
587
588
589 if (!chip->legacy.chip_delay)
590 chip->legacy.chip_delay = 20;
591
592
593 if (!chip->legacy.cmdfunc)
594 chip->legacy.cmdfunc = nand_command;
595
596
597 if (chip->legacy.waitfunc == NULL)
598 chip->legacy.waitfunc = nand_wait;
599
600 if (!chip->legacy.select_chip)
601 chip->legacy.select_chip = nand_select_chip;
602
603
604 if (!chip->legacy.read_byte || chip->legacy.read_byte == nand_read_byte)
605 chip->legacy.read_byte = busw ? nand_read_byte16 : nand_read_byte;
606 if (!chip->legacy.write_buf || chip->legacy.write_buf == nand_write_buf)
607 chip->legacy.write_buf = busw ? nand_write_buf16 : nand_write_buf;
608 if (!chip->legacy.write_byte || chip->legacy.write_byte == nand_write_byte)
609 chip->legacy.write_byte = busw ? nand_write_byte16 : nand_write_byte;
610 if (!chip->legacy.read_buf || chip->legacy.read_buf == nand_read_buf)
611 chip->legacy.read_buf = busw ? nand_read_buf16 : nand_read_buf;
612}
613
614void nand_legacy_adjust_cmdfunc(struct nand_chip *chip)
615{
616 struct mtd_info *mtd = nand_to_mtd(chip);
617
618
619 if (mtd->writesize > 512 && chip->legacy.cmdfunc == nand_command)
620 chip->legacy.cmdfunc = nand_command_lp;
621}
622
623int nand_legacy_check_hooks(struct nand_chip *chip)
624{
625
626
627
628
629 if (nand_has_exec_op(chip))
630 return 0;
631
632
633
634
635
636
637 if ((!chip->legacy.cmdfunc || !chip->legacy.select_chip) &&
638 !chip->legacy.cmd_ctrl) {
639 pr_err("->legacy.cmd_ctrl() should be provided\n");
640 return -EINVAL;
641 }
642
643 return 0;
644}
645