1
2
3
4
5
6
7
8
9
10
11
12#include <common.h>
13#include <log.h>
14#include <dm/device_compat.h>
15#include <dm/devres.h>
16#include <linux/bitops.h>
17#include <linux/err.h>
18#include <linux/errno.h>
19#include <linux/log2.h>
20#include <linux/math64.h>
21#include <linux/sizes.h>
22
23#include <linux/mtd/mtd.h>
24#include <linux/mtd/spi-nor.h>
25#include <spi-mem.h>
26#include <spi.h>
27
28#include "sf_internal.h"
29
30
31
32
33
34
35
36
37#define HZ CONFIG_SYS_HZ
38
39#define DEFAULT_READY_WAIT_JIFFIES (40UL * HZ)
40
41static int spi_nor_read_write_reg(struct spi_nor *nor, struct spi_mem_op
42 *op, void *buf)
43{
44 if (op->data.dir == SPI_MEM_DATA_IN)
45 op->data.buf.in = buf;
46 else
47 op->data.buf.out = buf;
48 return spi_mem_exec_op(nor->spi, op);
49}
50
51static int spi_nor_read_reg(struct spi_nor *nor, u8 code, u8 *val, int len)
52{
53 struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(code, 1),
54 SPI_MEM_OP_NO_ADDR,
55 SPI_MEM_OP_NO_DUMMY,
56 SPI_MEM_OP_DATA_IN(len, NULL, 1));
57 int ret;
58
59 ret = spi_nor_read_write_reg(nor, &op, val);
60 if (ret < 0)
61 dev_dbg(nor->dev, "error %d reading %x\n", ret, code);
62
63 return ret;
64}
65
66static int spi_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
67{
68 struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 1),
69 SPI_MEM_OP_NO_ADDR,
70 SPI_MEM_OP_NO_DUMMY,
71 SPI_MEM_OP_DATA_OUT(len, NULL, 1));
72
73 return spi_nor_read_write_reg(nor, &op, buf);
74}
75
76static ssize_t spi_nor_read_data(struct spi_nor *nor, loff_t from, size_t len,
77 u_char *buf)
78{
79 struct spi_mem_op op =
80 SPI_MEM_OP(SPI_MEM_OP_CMD(nor->read_opcode, 1),
81 SPI_MEM_OP_ADDR(nor->addr_width, from, 1),
82 SPI_MEM_OP_DUMMY(nor->read_dummy, 1),
83 SPI_MEM_OP_DATA_IN(len, buf, 1));
84 size_t remaining = len;
85 int ret;
86
87
88 op.cmd.buswidth = spi_nor_get_protocol_inst_nbits(nor->read_proto);
89 op.addr.buswidth = spi_nor_get_protocol_addr_nbits(nor->read_proto);
90 op.dummy.buswidth = op.addr.buswidth;
91 op.data.buswidth = spi_nor_get_protocol_data_nbits(nor->read_proto);
92
93
94 op.dummy.nbytes = (nor->read_dummy * op.dummy.buswidth) / 8;
95
96 while (remaining) {
97 op.data.nbytes = remaining < UINT_MAX ? remaining : UINT_MAX;
98 ret = spi_mem_adjust_op_size(nor->spi, &op);
99 if (ret)
100 return ret;
101
102 ret = spi_mem_exec_op(nor->spi, &op);
103 if (ret)
104 return ret;
105
106 op.addr.val += op.data.nbytes;
107 remaining -= op.data.nbytes;
108 op.data.buf.in += op.data.nbytes;
109 }
110
111 return len;
112}
113
114static ssize_t spi_nor_write_data(struct spi_nor *nor, loff_t to, size_t len,
115 const u_char *buf)
116{
117 struct spi_mem_op op =
118 SPI_MEM_OP(SPI_MEM_OP_CMD(nor->program_opcode, 1),
119 SPI_MEM_OP_ADDR(nor->addr_width, to, 1),
120 SPI_MEM_OP_NO_DUMMY,
121 SPI_MEM_OP_DATA_OUT(len, buf, 1));
122 int ret;
123
124
125 op.cmd.buswidth = spi_nor_get_protocol_inst_nbits(nor->write_proto);
126 op.addr.buswidth = spi_nor_get_protocol_addr_nbits(nor->write_proto);
127 op.data.buswidth = spi_nor_get_protocol_data_nbits(nor->write_proto);
128
129 if (nor->program_opcode == SPINOR_OP_AAI_WP && nor->sst_write_second)
130 op.addr.nbytes = 0;
131
132 ret = spi_mem_adjust_op_size(nor->spi, &op);
133 if (ret)
134 return ret;
135 op.data.nbytes = len < op.data.nbytes ? len : op.data.nbytes;
136
137 ret = spi_mem_exec_op(nor->spi, &op);
138 if (ret)
139 return ret;
140
141 return op.data.nbytes;
142}
143
144
145
146
147
148
149static int read_sr(struct spi_nor *nor)
150{
151 int ret;
152 u8 val;
153
154 ret = nor->read_reg(nor, SPINOR_OP_RDSR, &val, 1);
155 if (ret < 0) {
156 pr_debug("error %d reading SR\n", (int)ret);
157 return ret;
158 }
159
160 return val;
161}
162
163
164
165
166
167
168static int read_fsr(struct spi_nor *nor)
169{
170 int ret;
171 u8 val;
172
173 ret = nor->read_reg(nor, SPINOR_OP_RDFSR, &val, 1);
174 if (ret < 0) {
175 pr_debug("error %d reading FSR\n", ret);
176 return ret;
177 }
178
179 return val;
180}
181
182
183
184
185
186
187#if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)
188static int read_cr(struct spi_nor *nor)
189{
190 int ret;
191 u8 val;
192
193 ret = nor->read_reg(nor, SPINOR_OP_RDCR, &val, 1);
194 if (ret < 0) {
195 dev_dbg(nor->dev, "error %d reading CR\n", ret);
196 return ret;
197 }
198
199 return val;
200}
201#endif
202
203
204
205
206
207static int write_sr(struct spi_nor *nor, u8 val)
208{
209 nor->cmd_buf[0] = val;
210 return nor->write_reg(nor, SPINOR_OP_WRSR, nor->cmd_buf, 1);
211}
212
213
214
215
216
217static int write_enable(struct spi_nor *nor)
218{
219 return nor->write_reg(nor, SPINOR_OP_WREN, NULL, 0);
220}
221
222
223
224
225static int write_disable(struct spi_nor *nor)
226{
227 return nor->write_reg(nor, SPINOR_OP_WRDI, NULL, 0);
228}
229
230static struct spi_nor *mtd_to_spi_nor(struct mtd_info *mtd)
231{
232 return mtd->priv;
233}
234
235#ifndef CONFIG_SPI_FLASH_BAR
236static u8 spi_nor_convert_opcode(u8 opcode, const u8 table[][2], size_t size)
237{
238 size_t i;
239
240 for (i = 0; i < size; i++)
241 if (table[i][0] == opcode)
242 return table[i][1];
243
244
245 return opcode;
246}
247
248static u8 spi_nor_convert_3to4_read(u8 opcode)
249{
250 static const u8 spi_nor_3to4_read[][2] = {
251 { SPINOR_OP_READ, SPINOR_OP_READ_4B },
252 { SPINOR_OP_READ_FAST, SPINOR_OP_READ_FAST_4B },
253 { SPINOR_OP_READ_1_1_2, SPINOR_OP_READ_1_1_2_4B },
254 { SPINOR_OP_READ_1_2_2, SPINOR_OP_READ_1_2_2_4B },
255 { SPINOR_OP_READ_1_1_4, SPINOR_OP_READ_1_1_4_4B },
256 { SPINOR_OP_READ_1_4_4, SPINOR_OP_READ_1_4_4_4B },
257 { SPINOR_OP_READ_1_1_8, SPINOR_OP_READ_1_1_8_4B },
258 { SPINOR_OP_READ_1_8_8, SPINOR_OP_READ_1_8_8_4B },
259
260 { SPINOR_OP_READ_1_1_1_DTR, SPINOR_OP_READ_1_1_1_DTR_4B },
261 { SPINOR_OP_READ_1_2_2_DTR, SPINOR_OP_READ_1_2_2_DTR_4B },
262 { SPINOR_OP_READ_1_4_4_DTR, SPINOR_OP_READ_1_4_4_DTR_4B },
263 };
264
265 return spi_nor_convert_opcode(opcode, spi_nor_3to4_read,
266 ARRAY_SIZE(spi_nor_3to4_read));
267}
268
269static u8 spi_nor_convert_3to4_program(u8 opcode)
270{
271 static const u8 spi_nor_3to4_program[][2] = {
272 { SPINOR_OP_PP, SPINOR_OP_PP_4B },
273 { SPINOR_OP_PP_1_1_4, SPINOR_OP_PP_1_1_4_4B },
274 { SPINOR_OP_PP_1_4_4, SPINOR_OP_PP_1_4_4_4B },
275 { SPINOR_OP_PP_1_1_8, SPINOR_OP_PP_1_1_8_4B },
276 { SPINOR_OP_PP_1_8_8, SPINOR_OP_PP_1_8_8_4B },
277 };
278
279 return spi_nor_convert_opcode(opcode, spi_nor_3to4_program,
280 ARRAY_SIZE(spi_nor_3to4_program));
281}
282
283static u8 spi_nor_convert_3to4_erase(u8 opcode)
284{
285 static const u8 spi_nor_3to4_erase[][2] = {
286 { SPINOR_OP_BE_4K, SPINOR_OP_BE_4K_4B },
287 { SPINOR_OP_BE_32K, SPINOR_OP_BE_32K_4B },
288 { SPINOR_OP_SE, SPINOR_OP_SE_4B },
289 };
290
291 return spi_nor_convert_opcode(opcode, spi_nor_3to4_erase,
292 ARRAY_SIZE(spi_nor_3to4_erase));
293}
294
295static void spi_nor_set_4byte_opcodes(struct spi_nor *nor,
296 const struct flash_info *info)
297{
298
299 switch (JEDEC_MFR(info)) {
300 case SNOR_MFR_SPANSION:
301
302 nor->erase_opcode = SPINOR_OP_SE;
303 nor->mtd.erasesize = info->sector_size;
304 break;
305
306 default:
307 break;
308 }
309
310 nor->read_opcode = spi_nor_convert_3to4_read(nor->read_opcode);
311 nor->program_opcode = spi_nor_convert_3to4_program(nor->program_opcode);
312 nor->erase_opcode = spi_nor_convert_3to4_erase(nor->erase_opcode);
313}
314#endif
315
316
317static int set_4byte(struct spi_nor *nor, const struct flash_info *info,
318 int enable)
319{
320 int status;
321 bool need_wren = false;
322 u8 cmd;
323
324 switch (JEDEC_MFR(info)) {
325 case SNOR_MFR_ST:
326 case SNOR_MFR_MICRON:
327
328 need_wren = true;
329 case SNOR_MFR_ISSI:
330 case SNOR_MFR_MACRONIX:
331 case SNOR_MFR_WINBOND:
332 if (need_wren)
333 write_enable(nor);
334
335 cmd = enable ? SPINOR_OP_EN4B : SPINOR_OP_EX4B;
336 status = nor->write_reg(nor, cmd, NULL, 0);
337 if (need_wren)
338 write_disable(nor);
339
340 if (!status && !enable &&
341 JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
342
343
344
345
346
347
348 write_enable(nor);
349 nor->cmd_buf[0] = 0;
350 nor->write_reg(nor, SPINOR_OP_WREAR, nor->cmd_buf, 1);
351 write_disable(nor);
352 }
353
354 return status;
355 default:
356
357 nor->cmd_buf[0] = enable << 7;
358 return nor->write_reg(nor, SPINOR_OP_BRWR, nor->cmd_buf, 1);
359 }
360}
361
362static int spi_nor_sr_ready(struct spi_nor *nor)
363{
364 int sr = read_sr(nor);
365
366 if (sr < 0)
367 return sr;
368
369 if (nor->flags & SNOR_F_USE_CLSR && sr & (SR_E_ERR | SR_P_ERR)) {
370 if (sr & SR_E_ERR)
371 dev_dbg(nor->dev, "Erase Error occurred\n");
372 else
373 dev_dbg(nor->dev, "Programming Error occurred\n");
374
375 nor->write_reg(nor, SPINOR_OP_CLSR, NULL, 0);
376 return -EIO;
377 }
378
379 return !(sr & SR_WIP);
380}
381
382static int spi_nor_fsr_ready(struct spi_nor *nor)
383{
384 int fsr = read_fsr(nor);
385
386 if (fsr < 0)
387 return fsr;
388
389 if (fsr & (FSR_E_ERR | FSR_P_ERR)) {
390 if (fsr & FSR_E_ERR)
391 dev_err(nor->dev, "Erase operation failed.\n");
392 else
393 dev_err(nor->dev, "Program operation failed.\n");
394
395 if (fsr & FSR_PT_ERR)
396 dev_err(nor->dev,
397 "Attempted to modify a protected sector.\n");
398
399 nor->write_reg(nor, SPINOR_OP_CLFSR, NULL, 0);
400 return -EIO;
401 }
402
403 return fsr & FSR_READY;
404}
405
406static int spi_nor_ready(struct spi_nor *nor)
407{
408 int sr, fsr;
409
410 sr = spi_nor_sr_ready(nor);
411 if (sr < 0)
412 return sr;
413 fsr = nor->flags & SNOR_F_USE_FSR ? spi_nor_fsr_ready(nor) : 1;
414 if (fsr < 0)
415 return fsr;
416 return sr && fsr;
417}
418
419
420
421
422
423static int spi_nor_wait_till_ready_with_timeout(struct spi_nor *nor,
424 unsigned long timeout)
425{
426 unsigned long timebase;
427 int ret;
428
429 timebase = get_timer(0);
430
431 while (get_timer(timebase) < timeout) {
432 ret = spi_nor_ready(nor);
433 if (ret < 0)
434 return ret;
435 if (ret)
436 return 0;
437 }
438
439 dev_err(nor->dev, "flash operation timed out\n");
440
441 return -ETIMEDOUT;
442}
443
444static int spi_nor_wait_till_ready(struct spi_nor *nor)
445{
446 return spi_nor_wait_till_ready_with_timeout(nor,
447 DEFAULT_READY_WAIT_JIFFIES);
448}
449
450#ifdef CONFIG_SPI_FLASH_BAR
451
452
453
454
455
456
457
458
459
460
461static int clean_bar(struct spi_nor *nor)
462{
463 u8 cmd, bank_sel = 0;
464
465 if (nor->bank_curr == 0)
466 return 0;
467 cmd = nor->bank_write_cmd;
468 nor->bank_curr = 0;
469 write_enable(nor);
470
471 return nor->write_reg(nor, cmd, &bank_sel, 1);
472}
473
474static int write_bar(struct spi_nor *nor, u32 offset)
475{
476 u8 cmd, bank_sel;
477 int ret;
478
479 bank_sel = offset / SZ_16M;
480 if (bank_sel == nor->bank_curr)
481 goto bar_end;
482
483 cmd = nor->bank_write_cmd;
484 write_enable(nor);
485 ret = nor->write_reg(nor, cmd, &bank_sel, 1);
486 if (ret < 0) {
487 debug("SF: fail to write bank register\n");
488 return ret;
489 }
490
491bar_end:
492 nor->bank_curr = bank_sel;
493 return nor->bank_curr;
494}
495
496static int read_bar(struct spi_nor *nor, const struct flash_info *info)
497{
498 u8 curr_bank = 0;
499 int ret;
500
501 switch (JEDEC_MFR(info)) {
502 case SNOR_MFR_SPANSION:
503 nor->bank_read_cmd = SPINOR_OP_BRRD;
504 nor->bank_write_cmd = SPINOR_OP_BRWR;
505 break;
506 default:
507 nor->bank_read_cmd = SPINOR_OP_RDEAR;
508 nor->bank_write_cmd = SPINOR_OP_WREAR;
509 }
510
511 ret = nor->read_reg(nor, nor->bank_read_cmd,
512 &curr_bank, 1);
513 if (ret) {
514 debug("SF: fail to read bank addr register\n");
515 return ret;
516 }
517 nor->bank_curr = curr_bank;
518
519 return 0;
520}
521#endif
522
523
524
525
526static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
527{
528 struct spi_mem_op op =
529 SPI_MEM_OP(SPI_MEM_OP_CMD(nor->erase_opcode, 1),
530 SPI_MEM_OP_ADDR(nor->addr_width, addr, 1),
531 SPI_MEM_OP_NO_DUMMY,
532 SPI_MEM_OP_NO_DATA);
533
534 if (nor->erase)
535 return nor->erase(nor, addr);
536
537
538
539
540
541 return spi_mem_exec_op(nor->spi, &op);
542}
543
544
545
546
547
548static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
549{
550 struct spi_nor *nor = mtd_to_spi_nor(mtd);
551 u32 addr, len, rem;
552 int ret;
553
554 dev_dbg(nor->dev, "at 0x%llx, len %lld\n", (long long)instr->addr,
555 (long long)instr->len);
556
557 if (!instr->len)
558 return 0;
559
560 div_u64_rem(instr->len, mtd->erasesize, &rem);
561 if (rem)
562 return -EINVAL;
563
564 addr = instr->addr;
565 len = instr->len;
566
567 while (len) {
568#ifdef CONFIG_SPI_FLASH_BAR
569 ret = write_bar(nor, addr);
570 if (ret < 0)
571 return ret;
572#endif
573 write_enable(nor);
574
575 ret = spi_nor_erase_sector(nor, addr);
576 if (ret)
577 goto erase_err;
578
579 addr += mtd->erasesize;
580 len -= mtd->erasesize;
581
582 ret = spi_nor_wait_till_ready(nor);
583 if (ret)
584 goto erase_err;
585 }
586
587erase_err:
588#ifdef CONFIG_SPI_FLASH_BAR
589 ret = clean_bar(nor);
590#endif
591 write_disable(nor);
592
593 return ret;
594}
595
596#if defined(CONFIG_SPI_FLASH_STMICRO) || defined(CONFIG_SPI_FLASH_SST)
597
598static int write_sr_and_check(struct spi_nor *nor, u8 status_new, u8 mask)
599{
600 int ret;
601
602 write_enable(nor);
603 ret = write_sr(nor, status_new);
604 if (ret)
605 return ret;
606
607 ret = spi_nor_wait_till_ready(nor);
608 if (ret)
609 return ret;
610
611 ret = read_sr(nor);
612 if (ret < 0)
613 return ret;
614
615 return ((ret & mask) != (status_new & mask)) ? -EIO : 0;
616}
617
618static void stm_get_locked_range(struct spi_nor *nor, u8 sr, loff_t *ofs,
619 uint64_t *len)
620{
621 struct mtd_info *mtd = &nor->mtd;
622 u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
623 int shift = ffs(mask) - 1;
624 int pow;
625
626 if (!(sr & mask)) {
627
628 *ofs = 0;
629 *len = 0;
630 } else {
631 pow = ((sr & mask) ^ mask) >> shift;
632 *len = mtd->size >> pow;
633 if (nor->flags & SNOR_F_HAS_SR_TB && sr & SR_TB)
634 *ofs = 0;
635 else
636 *ofs = mtd->size - *len;
637 }
638}
639
640
641
642
643
644static int stm_check_lock_status_sr(struct spi_nor *nor, loff_t ofs, u64 len,
645 u8 sr, bool locked)
646{
647 loff_t lock_offs;
648 uint64_t lock_len;
649
650 if (!len)
651 return 1;
652
653 stm_get_locked_range(nor, sr, &lock_offs, &lock_len);
654
655 if (locked)
656
657 return (ofs + len <= lock_offs + lock_len) && (ofs >= lock_offs);
658 else
659
660 return (ofs >= lock_offs + lock_len) || (ofs + len <= lock_offs);
661}
662
663static int stm_is_locked_sr(struct spi_nor *nor, loff_t ofs, uint64_t len,
664 u8 sr)
665{
666 return stm_check_lock_status_sr(nor, ofs, len, sr, true);
667}
668
669static int stm_is_unlocked_sr(struct spi_nor *nor, loff_t ofs, uint64_t len,
670 u8 sr)
671{
672 return stm_check_lock_status_sr(nor, ofs, len, sr, false);
673}
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707static int stm_lock(struct spi_nor *nor, loff_t ofs, uint64_t len)
708{
709 struct mtd_info *mtd = &nor->mtd;
710 int status_old, status_new;
711 u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
712 u8 shift = ffs(mask) - 1, pow, val;
713 loff_t lock_len;
714 bool can_be_top = true, can_be_bottom = nor->flags & SNOR_F_HAS_SR_TB;
715 bool use_top;
716
717 status_old = read_sr(nor);
718 if (status_old < 0)
719 return status_old;
720
721
722 if (stm_is_locked_sr(nor, ofs, len, status_old))
723 return 0;
724
725
726 if (!stm_is_locked_sr(nor, 0, ofs, status_old))
727 can_be_bottom = false;
728
729
730 if (!stm_is_locked_sr(nor, ofs + len, mtd->size - (ofs + len),
731 status_old))
732 can_be_top = false;
733
734 if (!can_be_bottom && !can_be_top)
735 return -EINVAL;
736
737
738 use_top = can_be_top;
739
740
741 if (use_top)
742 lock_len = mtd->size - ofs;
743 else
744 lock_len = ofs + len;
745
746
747
748
749
750
751
752
753
754
755 pow = ilog2(mtd->size) - ilog2(lock_len);
756 val = mask - (pow << shift);
757 if (val & ~mask)
758 return -EINVAL;
759
760 if (!(val & mask))
761 return -EINVAL;
762
763 status_new = (status_old & ~mask & ~SR_TB) | val;
764
765
766 status_new |= SR_SRWD;
767
768 if (!use_top)
769 status_new |= SR_TB;
770
771
772 if (status_new == status_old)
773 return 0;
774
775
776 if ((status_new & mask) < (status_old & mask))
777 return -EINVAL;
778
779 return write_sr_and_check(nor, status_new, mask);
780}
781
782
783
784
785
786
787static int stm_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len)
788{
789 struct mtd_info *mtd = &nor->mtd;
790 int status_old, status_new;
791 u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
792 u8 shift = ffs(mask) - 1, pow, val;
793 loff_t lock_len;
794 bool can_be_top = true, can_be_bottom = nor->flags & SNOR_F_HAS_SR_TB;
795 bool use_top;
796
797 status_old = read_sr(nor);
798 if (status_old < 0)
799 return status_old;
800
801
802 if (stm_is_unlocked_sr(nor, ofs, len, status_old))
803 return 0;
804
805
806 if (!stm_is_unlocked_sr(nor, 0, ofs, status_old))
807 can_be_top = false;
808
809
810 if (!stm_is_unlocked_sr(nor, ofs + len, mtd->size - (ofs + len),
811 status_old))
812 can_be_bottom = false;
813
814 if (!can_be_bottom && !can_be_top)
815 return -EINVAL;
816
817
818 use_top = can_be_top;
819
820
821 if (use_top)
822 lock_len = mtd->size - (ofs + len);
823 else
824 lock_len = ofs;
825
826
827
828
829
830
831
832
833
834
835 pow = ilog2(mtd->size) - order_base_2(lock_len);
836 if (lock_len == 0) {
837 val = 0;
838 } else {
839 val = mask - (pow << shift);
840
841 if (val & ~mask)
842 return -EINVAL;
843 }
844
845 status_new = (status_old & ~mask & ~SR_TB) | val;
846
847
848 if (lock_len == 0)
849 status_new &= ~SR_SRWD;
850
851 if (!use_top)
852 status_new |= SR_TB;
853
854
855 if (status_new == status_old)
856 return 0;
857
858
859 if ((status_new & mask) > (status_old & mask))
860 return -EINVAL;
861
862 return write_sr_and_check(nor, status_new, mask);
863}
864
865
866
867
868
869
870
871
872static int stm_is_locked(struct spi_nor *nor, loff_t ofs, uint64_t len)
873{
874 int status;
875
876 status = read_sr(nor);
877 if (status < 0)
878 return status;
879
880 return stm_is_locked_sr(nor, ofs, len, status);
881}
882#endif
883
884static const struct flash_info *spi_nor_read_id(struct spi_nor *nor)
885{
886 int tmp;
887 u8 id[SPI_NOR_MAX_ID_LEN];
888 const struct flash_info *info;
889
890 tmp = nor->read_reg(nor, SPINOR_OP_RDID, id, SPI_NOR_MAX_ID_LEN);
891 if (tmp < 0) {
892 dev_dbg(nor->dev, "error %d reading JEDEC ID\n", tmp);
893 return ERR_PTR(tmp);
894 }
895
896 info = spi_nor_ids;
897 for (; info->name; info++) {
898 if (info->id_len) {
899 if (!memcmp(info->id, id, info->id_len))
900 return info;
901 }
902 }
903
904 dev_err(nor->dev, "unrecognized JEDEC id bytes: %02x, %02x, %02x\n",
905 id[0], id[1], id[2]);
906 return ERR_PTR(-ENODEV);
907}
908
909static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
910 size_t *retlen, u_char *buf)
911{
912 struct spi_nor *nor = mtd_to_spi_nor(mtd);
913 int ret;
914
915 dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len);
916
917 while (len) {
918 loff_t addr = from;
919 size_t read_len = len;
920
921#ifdef CONFIG_SPI_FLASH_BAR
922 u32 remain_len;
923
924 ret = write_bar(nor, addr);
925 if (ret < 0)
926 return log_ret(ret);
927 remain_len = (SZ_16M * (nor->bank_curr + 1)) - addr;
928
929 if (len < remain_len)
930 read_len = len;
931 else
932 read_len = remain_len;
933#endif
934
935 ret = nor->read(nor, addr, read_len, buf);
936 if (ret == 0) {
937
938 ret = -EIO;
939 goto read_err;
940 }
941 if (ret < 0)
942 goto read_err;
943
944 *retlen += ret;
945 buf += ret;
946 from += ret;
947 len -= ret;
948 }
949 ret = 0;
950
951read_err:
952#ifdef CONFIG_SPI_FLASH_BAR
953 ret = clean_bar(nor);
954#endif
955 return ret;
956}
957
958#ifdef CONFIG_SPI_FLASH_SST
959
960
961
962
963
964
965
966
967
968
969
970#define SST26_BPR_8K_NUM 4
971#define SST26_MAX_BPR_REG_LEN (18 + 1)
972#define SST26_BOUND_REG_SIZE ((32 + SST26_BPR_8K_NUM * 8) * SZ_1K)
973
974enum lock_ctl {
975 SST26_CTL_LOCK,
976 SST26_CTL_UNLOCK,
977 SST26_CTL_CHECK
978};
979
980static bool sst26_process_bpr(u32 bpr_size, u8 *cmd, u32 bit, enum lock_ctl ctl)
981{
982 switch (ctl) {
983 case SST26_CTL_LOCK:
984 cmd[bpr_size - (bit / 8) - 1] |= BIT(bit % 8);
985 break;
986 case SST26_CTL_UNLOCK:
987 cmd[bpr_size - (bit / 8) - 1] &= ~BIT(bit % 8);
988 break;
989 case SST26_CTL_CHECK:
990 return !!(cmd[bpr_size - (bit / 8) - 1] & BIT(bit % 8));
991 }
992
993 return false;
994}
995
996
997
998
999
1000static int sst26_lock_ctl(struct spi_nor *nor, loff_t ofs, uint64_t len, enum lock_ctl ctl)
1001{
1002 struct mtd_info *mtd = &nor->mtd;
1003 u32 i, bpr_ptr, rptr_64k, lptr_64k, bpr_size;
1004 bool lower_64k = false, upper_64k = false;
1005 u8 bpr_buff[SST26_MAX_BPR_REG_LEN] = {};
1006 int ret;
1007
1008
1009 if ((ofs & (SZ_64K - 1)) || (len & (SZ_64K - 1))) {
1010 dev_err(nor->dev, "length or offset is not 64KiB allighned\n");
1011 return -EINVAL;
1012 }
1013
1014 if (ofs + len > mtd->size) {
1015 dev_err(nor->dev, "range is more than device size: %#llx + %#llx > %#llx\n",
1016 ofs, len, mtd->size);
1017 return -EINVAL;
1018 }
1019
1020
1021 if (mtd->size != SZ_2M &&
1022 mtd->size != SZ_4M &&
1023 mtd->size != SZ_8M)
1024 return -EINVAL;
1025
1026 bpr_size = 2 + (mtd->size / SZ_64K / 8);
1027
1028 ret = nor->read_reg(nor, SPINOR_OP_READ_BPR, bpr_buff, bpr_size);
1029 if (ret < 0) {
1030 dev_err(nor->dev, "fail to read block-protection register\n");
1031 return ret;
1032 }
1033
1034 rptr_64k = min_t(u32, ofs + len, mtd->size - SST26_BOUND_REG_SIZE);
1035 lptr_64k = max_t(u32, ofs, SST26_BOUND_REG_SIZE);
1036
1037 upper_64k = ((ofs + len) > (mtd->size - SST26_BOUND_REG_SIZE));
1038 lower_64k = (ofs < SST26_BOUND_REG_SIZE);
1039
1040
1041 bpr_ptr = lptr_64k / SZ_64K - 1;
1042
1043
1044 while (lptr_64k < rptr_64k) {
1045 if (sst26_process_bpr(bpr_size, bpr_buff, bpr_ptr, ctl))
1046 return EACCES;
1047
1048 bpr_ptr++;
1049 lptr_64k += SZ_64K;
1050 }
1051
1052
1053 bpr_ptr = (mtd->size - 2 * SST26_BOUND_REG_SIZE) / SZ_64K;
1054
1055
1056 if (lower_64k)
1057 if (sst26_process_bpr(bpr_size, bpr_buff, bpr_ptr, ctl))
1058 return EACCES;
1059
1060 bpr_ptr++;
1061
1062
1063 if (upper_64k)
1064 if (sst26_process_bpr(bpr_size, bpr_buff, bpr_ptr, ctl))
1065 return EACCES;
1066
1067 bpr_ptr++;
1068
1069
1070 for (i = 0; i < SST26_BPR_8K_NUM; i++) {
1071 if (lower_64k)
1072 if (sst26_process_bpr(bpr_size, bpr_buff, bpr_ptr, ctl))
1073 return EACCES;
1074
1075
1076 bpr_ptr += 2;
1077 }
1078
1079
1080 for (i = 0; i < SST26_BPR_8K_NUM; i++) {
1081 if (upper_64k)
1082 if (sst26_process_bpr(bpr_size, bpr_buff, bpr_ptr, ctl))
1083 return EACCES;
1084
1085
1086 bpr_ptr += 2;
1087 }
1088
1089
1090 if (ctl == SST26_CTL_CHECK)
1091 return 0;
1092
1093 ret = nor->write_reg(nor, SPINOR_OP_WRITE_BPR, bpr_buff, bpr_size);
1094 if (ret < 0) {
1095 dev_err(nor->dev, "fail to write block-protection register\n");
1096 return ret;
1097 }
1098
1099 return 0;
1100}
1101
1102static int sst26_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len)
1103{
1104 return sst26_lock_ctl(nor, ofs, len, SST26_CTL_UNLOCK);
1105}
1106
1107static int sst26_lock(struct spi_nor *nor, loff_t ofs, uint64_t len)
1108{
1109 return sst26_lock_ctl(nor, ofs, len, SST26_CTL_LOCK);
1110}
1111
1112
1113
1114
1115
1116static int sst26_is_locked(struct spi_nor *nor, loff_t ofs, uint64_t len)
1117{
1118
1119
1120
1121
1122
1123
1124 ofs -= ofs & (SZ_64K - 1);
1125 len = len & (SZ_64K - 1) ? (len & ~(SZ_64K - 1)) + SZ_64K : len;
1126
1127 return sst26_lock_ctl(nor, ofs, len, SST26_CTL_CHECK);
1128}
1129
1130static int sst_write_byteprogram(struct spi_nor *nor, loff_t to, size_t len,
1131 size_t *retlen, const u_char *buf)
1132{
1133 size_t actual;
1134 int ret = 0;
1135
1136 for (actual = 0; actual < len; actual++) {
1137 nor->program_opcode = SPINOR_OP_BP;
1138
1139 write_enable(nor);
1140
1141 ret = nor->write(nor, to, 1, buf + actual);
1142 if (ret < 0)
1143 goto sst_write_err;
1144 ret = spi_nor_wait_till_ready(nor);
1145 if (ret)
1146 goto sst_write_err;
1147 to++;
1148 }
1149
1150sst_write_err:
1151 write_disable(nor);
1152 return ret;
1153}
1154
1155static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
1156 size_t *retlen, const u_char *buf)
1157{
1158 struct spi_nor *nor = mtd_to_spi_nor(mtd);
1159 struct spi_slave *spi = nor->spi;
1160 size_t actual;
1161 int ret;
1162
1163 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len);
1164 if (spi->mode & SPI_TX_BYTE)
1165 return sst_write_byteprogram(nor, to, len, retlen, buf);
1166
1167 write_enable(nor);
1168
1169 nor->sst_write_second = false;
1170
1171 actual = to % 2;
1172
1173 if (actual) {
1174 nor->program_opcode = SPINOR_OP_BP;
1175
1176
1177 ret = nor->write(nor, to, 1, buf);
1178 if (ret < 0)
1179 goto sst_write_err;
1180 ret = spi_nor_wait_till_ready(nor);
1181 if (ret)
1182 goto sst_write_err;
1183 }
1184 to += actual;
1185
1186
1187 for (; actual < len - 1; actual += 2) {
1188 nor->program_opcode = SPINOR_OP_AAI_WP;
1189
1190
1191 ret = nor->write(nor, to, 2, buf + actual);
1192 if (ret < 0)
1193 goto sst_write_err;
1194 ret = spi_nor_wait_till_ready(nor);
1195 if (ret)
1196 goto sst_write_err;
1197 to += 2;
1198 nor->sst_write_second = true;
1199 }
1200 nor->sst_write_second = false;
1201
1202 write_disable(nor);
1203 ret = spi_nor_wait_till_ready(nor);
1204 if (ret)
1205 goto sst_write_err;
1206
1207
1208 if (actual != len) {
1209 write_enable(nor);
1210
1211 nor->program_opcode = SPINOR_OP_BP;
1212 ret = nor->write(nor, to, 1, buf + actual);
1213 if (ret < 0)
1214 goto sst_write_err;
1215 ret = spi_nor_wait_till_ready(nor);
1216 if (ret)
1217 goto sst_write_err;
1218 write_disable(nor);
1219 actual += 1;
1220 }
1221sst_write_err:
1222 *retlen += actual;
1223 return ret;
1224}
1225#endif
1226
1227
1228
1229
1230
1231static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
1232 size_t *retlen, const u_char *buf)
1233{
1234 struct spi_nor *nor = mtd_to_spi_nor(mtd);
1235 size_t page_offset, page_remain, i;
1236 ssize_t ret;
1237
1238#ifdef CONFIG_SPI_FLASH_SST
1239
1240 if (nor->info->flags & SST_WRITE)
1241 return sst_write(mtd, to, len, retlen, buf);
1242#endif
1243
1244 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len);
1245
1246 if (!len)
1247 return 0;
1248
1249 for (i = 0; i < len; ) {
1250 ssize_t written;
1251 loff_t addr = to + i;
1252
1253
1254
1255
1256
1257
1258 if (is_power_of_2(nor->page_size)) {
1259 page_offset = addr & (nor->page_size - 1);
1260 } else {
1261 u64 aux = addr;
1262
1263 page_offset = do_div(aux, nor->page_size);
1264 }
1265
1266 page_remain = min_t(size_t,
1267 nor->page_size - page_offset, len - i);
1268
1269#ifdef CONFIG_SPI_FLASH_BAR
1270 ret = write_bar(nor, addr);
1271 if (ret < 0)
1272 return ret;
1273#endif
1274 write_enable(nor);
1275 ret = nor->write(nor, addr, page_remain, buf + i);
1276 if (ret < 0)
1277 goto write_err;
1278 written = ret;
1279
1280 ret = spi_nor_wait_till_ready(nor);
1281 if (ret)
1282 goto write_err;
1283 *retlen += written;
1284 i += written;
1285 }
1286
1287write_err:
1288#ifdef CONFIG_SPI_FLASH_BAR
1289 ret = clean_bar(nor);
1290#endif
1291 return ret;
1292}
1293
1294#ifdef CONFIG_SPI_FLASH_MACRONIX
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305static int macronix_quad_enable(struct spi_nor *nor)
1306{
1307 int ret, val;
1308
1309 val = read_sr(nor);
1310 if (val < 0)
1311 return val;
1312 if (val & SR_QUAD_EN_MX)
1313 return 0;
1314
1315 write_enable(nor);
1316
1317 write_sr(nor, val | SR_QUAD_EN_MX);
1318
1319 ret = spi_nor_wait_till_ready(nor);
1320 if (ret)
1321 return ret;
1322
1323 ret = read_sr(nor);
1324 if (!(ret > 0 && (ret & SR_QUAD_EN_MX))) {
1325 dev_err(nor->dev, "Macronix Quad bit not set\n");
1326 return -EINVAL;
1327 }
1328
1329 return 0;
1330}
1331#endif
1332
1333#if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)
1334
1335
1336
1337
1338
1339
1340static int write_sr_cr(struct spi_nor *nor, u8 *sr_cr)
1341{
1342 int ret;
1343
1344 write_enable(nor);
1345
1346 ret = nor->write_reg(nor, SPINOR_OP_WRSR, sr_cr, 2);
1347 if (ret < 0) {
1348 dev_dbg(nor->dev,
1349 "error while writing configuration register\n");
1350 return -EINVAL;
1351 }
1352
1353 ret = spi_nor_wait_till_ready(nor);
1354 if (ret) {
1355 dev_dbg(nor->dev,
1356 "timeout while writing configuration register\n");
1357 return ret;
1358 }
1359
1360 return 0;
1361}
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376static int spansion_read_cr_quad_enable(struct spi_nor *nor)
1377{
1378 u8 sr_cr[2];
1379 int ret;
1380
1381
1382 ret = read_cr(nor);
1383 if (ret < 0) {
1384 dev_dbg(nor->dev,
1385 "error while reading configuration register\n");
1386 return -EINVAL;
1387 }
1388
1389 if (ret & CR_QUAD_EN_SPAN)
1390 return 0;
1391
1392 sr_cr[1] = ret | CR_QUAD_EN_SPAN;
1393
1394
1395 ret = read_sr(nor);
1396 if (ret < 0) {
1397 dev_dbg(nor->dev, "error while reading status register\n");
1398 return -EINVAL;
1399 }
1400 sr_cr[0] = ret;
1401
1402 ret = write_sr_cr(nor, sr_cr);
1403 if (ret)
1404 return ret;
1405
1406
1407 ret = read_cr(nor);
1408 if (!(ret > 0 && (ret & CR_QUAD_EN_SPAN))) {
1409 dev_dbg(nor->dev, "Spansion Quad bit not set\n");
1410 return -EINVAL;
1411 }
1412
1413 return 0;
1414}
1415
1416#if CONFIG_IS_ENABLED(SPI_FLASH_SFDP_SUPPORT)
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430static int spansion_no_read_cr_quad_enable(struct spi_nor *nor)
1431{
1432 u8 sr_cr[2];
1433 int ret;
1434
1435
1436 ret = read_sr(nor);
1437 if (ret < 0) {
1438 dev_dbg(nor->dev, "error while reading status register\n");
1439 return -EINVAL;
1440 }
1441 sr_cr[0] = ret;
1442 sr_cr[1] = CR_QUAD_EN_SPAN;
1443
1444 return write_sr_cr(nor, sr_cr);
1445}
1446
1447#endif
1448#endif
1449
1450struct spi_nor_read_command {
1451 u8 num_mode_clocks;
1452 u8 num_wait_states;
1453 u8 opcode;
1454 enum spi_nor_protocol proto;
1455};
1456
1457struct spi_nor_pp_command {
1458 u8 opcode;
1459 enum spi_nor_protocol proto;
1460};
1461
1462enum spi_nor_read_command_index {
1463 SNOR_CMD_READ,
1464 SNOR_CMD_READ_FAST,
1465 SNOR_CMD_READ_1_1_1_DTR,
1466
1467
1468 SNOR_CMD_READ_1_1_2,
1469 SNOR_CMD_READ_1_2_2,
1470 SNOR_CMD_READ_2_2_2,
1471 SNOR_CMD_READ_1_2_2_DTR,
1472
1473
1474 SNOR_CMD_READ_1_1_4,
1475 SNOR_CMD_READ_1_4_4,
1476 SNOR_CMD_READ_4_4_4,
1477 SNOR_CMD_READ_1_4_4_DTR,
1478
1479
1480 SNOR_CMD_READ_1_1_8,
1481 SNOR_CMD_READ_1_8_8,
1482 SNOR_CMD_READ_8_8_8,
1483 SNOR_CMD_READ_1_8_8_DTR,
1484
1485 SNOR_CMD_READ_MAX
1486};
1487
1488enum spi_nor_pp_command_index {
1489 SNOR_CMD_PP,
1490
1491
1492 SNOR_CMD_PP_1_1_4,
1493 SNOR_CMD_PP_1_4_4,
1494 SNOR_CMD_PP_4_4_4,
1495
1496
1497 SNOR_CMD_PP_1_1_8,
1498 SNOR_CMD_PP_1_8_8,
1499 SNOR_CMD_PP_8_8_8,
1500
1501 SNOR_CMD_PP_MAX
1502};
1503
1504struct spi_nor_flash_parameter {
1505 u64 size;
1506 u32 page_size;
1507
1508 struct spi_nor_hwcaps hwcaps;
1509 struct spi_nor_read_command reads[SNOR_CMD_READ_MAX];
1510 struct spi_nor_pp_command page_programs[SNOR_CMD_PP_MAX];
1511
1512 int (*quad_enable)(struct spi_nor *nor);
1513};
1514
1515static void
1516spi_nor_set_read_settings(struct spi_nor_read_command *read,
1517 u8 num_mode_clocks,
1518 u8 num_wait_states,
1519 u8 opcode,
1520 enum spi_nor_protocol proto)
1521{
1522 read->num_mode_clocks = num_mode_clocks;
1523 read->num_wait_states = num_wait_states;
1524 read->opcode = opcode;
1525 read->proto = proto;
1526}
1527
1528static void
1529spi_nor_set_pp_settings(struct spi_nor_pp_command *pp,
1530 u8 opcode,
1531 enum spi_nor_protocol proto)
1532{
1533 pp->opcode = opcode;
1534 pp->proto = proto;
1535}
1536
1537#if CONFIG_IS_ENABLED(SPI_FLASH_SFDP_SUPPORT)
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555static int spi_nor_read_sfdp(struct spi_nor *nor, u32 addr,
1556 size_t len, void *buf)
1557{
1558 u8 addr_width, read_opcode, read_dummy;
1559 int ret;
1560
1561 read_opcode = nor->read_opcode;
1562 addr_width = nor->addr_width;
1563 read_dummy = nor->read_dummy;
1564
1565 nor->read_opcode = SPINOR_OP_RDSFDP;
1566 nor->addr_width = 3;
1567 nor->read_dummy = 8;
1568
1569 while (len) {
1570 ret = nor->read(nor, addr, len, (u8 *)buf);
1571 if (!ret || ret > len) {
1572 ret = -EIO;
1573 goto read_err;
1574 }
1575 if (ret < 0)
1576 goto read_err;
1577
1578 buf += ret;
1579 addr += ret;
1580 len -= ret;
1581 }
1582 ret = 0;
1583
1584read_err:
1585 nor->read_opcode = read_opcode;
1586 nor->addr_width = addr_width;
1587 nor->read_dummy = read_dummy;
1588
1589 return ret;
1590}
1591
1592struct sfdp_parameter_header {
1593 u8 id_lsb;
1594 u8 minor;
1595 u8 major;
1596 u8 length;
1597 u8 parameter_table_pointer[3];
1598 u8 id_msb;
1599};
1600
1601#define SFDP_PARAM_HEADER_ID(p) (((p)->id_msb << 8) | (p)->id_lsb)
1602#define SFDP_PARAM_HEADER_PTP(p) \
1603 (((p)->parameter_table_pointer[2] << 16) | \
1604 ((p)->parameter_table_pointer[1] << 8) | \
1605 ((p)->parameter_table_pointer[0] << 0))
1606
1607#define SFDP_BFPT_ID 0xff00
1608#define SFDP_SECTOR_MAP_ID 0xff81
1609#define SFDP_SST_ID 0x01bf
1610
1611#define SFDP_SIGNATURE 0x50444653U
1612#define SFDP_JESD216_MAJOR 1
1613#define SFDP_JESD216_MINOR 0
1614#define SFDP_JESD216A_MINOR 5
1615#define SFDP_JESD216B_MINOR 6
1616
1617struct sfdp_header {
1618 u32 signature;
1619 u8 minor;
1620 u8 major;
1621 u8 nph;
1622 u8 unused;
1623
1624
1625 struct sfdp_parameter_header bfpt_header;
1626};
1627
1628
1629
1630
1631
1632
1633
1634#define BFPT_DWORD(i) ((i) - 1)
1635#define BFPT_DWORD_MAX 16
1636
1637
1638#define BFPT_DWORD_MAX_JESD216 9
1639
1640
1641#define BFPT_DWORD1_FAST_READ_1_1_2 BIT(16)
1642#define BFPT_DWORD1_ADDRESS_BYTES_MASK GENMASK(18, 17)
1643#define BFPT_DWORD1_ADDRESS_BYTES_3_ONLY (0x0UL << 17)
1644#define BFPT_DWORD1_ADDRESS_BYTES_3_OR_4 (0x1UL << 17)
1645#define BFPT_DWORD1_ADDRESS_BYTES_4_ONLY (0x2UL << 17)
1646#define BFPT_DWORD1_DTR BIT(19)
1647#define BFPT_DWORD1_FAST_READ_1_2_2 BIT(20)
1648#define BFPT_DWORD1_FAST_READ_1_4_4 BIT(21)
1649#define BFPT_DWORD1_FAST_READ_1_1_4 BIT(22)
1650
1651
1652#define BFPT_DWORD5_FAST_READ_2_2_2 BIT(0)
1653#define BFPT_DWORD5_FAST_READ_4_4_4 BIT(4)
1654
1655
1656#define BFPT_DWORD11_PAGE_SIZE_SHIFT 4
1657#define BFPT_DWORD11_PAGE_SIZE_MASK GENMASK(7, 4)
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692#define BFPT_DWORD15_QER_MASK GENMASK(22, 20)
1693#define BFPT_DWORD15_QER_NONE (0x0UL << 20)
1694#define BFPT_DWORD15_QER_SR2_BIT1_BUGGY (0x1UL << 20)
1695#define BFPT_DWORD15_QER_SR1_BIT6 (0x2UL << 20)
1696#define BFPT_DWORD15_QER_SR2_BIT7 (0x3UL << 20)
1697#define BFPT_DWORD15_QER_SR2_BIT1_NO_RD (0x4UL << 20)
1698#define BFPT_DWORD15_QER_SR2_BIT1 (0x5UL << 20)
1699
1700struct sfdp_bfpt {
1701 u32 dwords[BFPT_DWORD_MAX];
1702};
1703
1704
1705
1706static void
1707spi_nor_set_read_settings_from_bfpt(struct spi_nor_read_command *read,
1708 u16 half,
1709 enum spi_nor_protocol proto)
1710{
1711 read->num_mode_clocks = (half >> 5) & 0x07;
1712 read->num_wait_states = (half >> 0) & 0x1f;
1713 read->opcode = (half >> 8) & 0xff;
1714 read->proto = proto;
1715}
1716
1717struct sfdp_bfpt_read {
1718
1719 u32 hwcaps;
1720
1721
1722
1723
1724
1725 u32 supported_dword;
1726 u32 supported_bit;
1727
1728
1729
1730
1731
1732
1733 u32 settings_dword;
1734 u32 settings_shift;
1735
1736
1737 enum spi_nor_protocol proto;
1738};
1739
1740static const struct sfdp_bfpt_read sfdp_bfpt_reads[] = {
1741
1742 {
1743 SNOR_HWCAPS_READ_1_1_2,
1744 BFPT_DWORD(1), BIT(16),
1745 BFPT_DWORD(4), 0,
1746 SNOR_PROTO_1_1_2,
1747 },
1748
1749
1750 {
1751 SNOR_HWCAPS_READ_1_2_2,
1752 BFPT_DWORD(1), BIT(20),
1753 BFPT_DWORD(4), 16,
1754 SNOR_PROTO_1_2_2,
1755 },
1756
1757
1758 {
1759 SNOR_HWCAPS_READ_2_2_2,
1760 BFPT_DWORD(5), BIT(0),
1761 BFPT_DWORD(6), 16,
1762 SNOR_PROTO_2_2_2,
1763 },
1764
1765
1766 {
1767 SNOR_HWCAPS_READ_1_1_4,
1768 BFPT_DWORD(1), BIT(22),
1769 BFPT_DWORD(3), 16,
1770 SNOR_PROTO_1_1_4,
1771 },
1772
1773
1774 {
1775 SNOR_HWCAPS_READ_1_4_4,
1776 BFPT_DWORD(1), BIT(21),
1777 BFPT_DWORD(3), 0,
1778 SNOR_PROTO_1_4_4,
1779 },
1780
1781
1782 {
1783 SNOR_HWCAPS_READ_4_4_4,
1784 BFPT_DWORD(5), BIT(4),
1785 BFPT_DWORD(7), 16,
1786 SNOR_PROTO_4_4_4,
1787 },
1788};
1789
1790struct sfdp_bfpt_erase {
1791
1792
1793
1794
1795 u32 dword;
1796 u32 shift;
1797};
1798
1799static const struct sfdp_bfpt_erase sfdp_bfpt_erases[] = {
1800
1801 {BFPT_DWORD(8), 0},
1802
1803
1804 {BFPT_DWORD(8), 16},
1805
1806
1807 {BFPT_DWORD(9), 0},
1808
1809
1810 {BFPT_DWORD(9), 16},
1811};
1812
1813static int spi_nor_hwcaps_read2cmd(u32 hwcaps);
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845static int spi_nor_parse_bfpt(struct spi_nor *nor,
1846 const struct sfdp_parameter_header *bfpt_header,
1847 struct spi_nor_flash_parameter *params)
1848{
1849 struct mtd_info *mtd = &nor->mtd;
1850 struct sfdp_bfpt bfpt;
1851 size_t len;
1852 int i, cmd, err;
1853 u32 addr;
1854 u16 half;
1855
1856
1857 if (bfpt_header->length < BFPT_DWORD_MAX_JESD216)
1858 return -EINVAL;
1859
1860
1861 len = min_t(size_t, sizeof(bfpt),
1862 bfpt_header->length * sizeof(u32));
1863 addr = SFDP_PARAM_HEADER_PTP(bfpt_header);
1864 memset(&bfpt, 0, sizeof(bfpt));
1865 err = spi_nor_read_sfdp(nor, addr, len, &bfpt);
1866 if (err < 0)
1867 return err;
1868
1869
1870 for (i = 0; i < BFPT_DWORD_MAX; i++)
1871 bfpt.dwords[i] = le32_to_cpu(bfpt.dwords[i]);
1872
1873
1874 switch (bfpt.dwords[BFPT_DWORD(1)] & BFPT_DWORD1_ADDRESS_BYTES_MASK) {
1875 case BFPT_DWORD1_ADDRESS_BYTES_3_ONLY:
1876 nor->addr_width = 3;
1877 break;
1878
1879 case BFPT_DWORD1_ADDRESS_BYTES_4_ONLY:
1880 nor->addr_width = 4;
1881 break;
1882
1883 default:
1884 break;
1885 }
1886
1887
1888 params->size = bfpt.dwords[BFPT_DWORD(2)];
1889 if (params->size & BIT(31)) {
1890 params->size &= ~BIT(31);
1891
1892
1893
1894
1895
1896
1897 if (params->size > 63)
1898 return -EINVAL;
1899
1900 params->size = 1ULL << params->size;
1901 } else {
1902 params->size++;
1903 }
1904 params->size >>= 3;
1905
1906
1907 for (i = 0; i < ARRAY_SIZE(sfdp_bfpt_reads); i++) {
1908 const struct sfdp_bfpt_read *rd = &sfdp_bfpt_reads[i];
1909 struct spi_nor_read_command *read;
1910
1911 if (!(bfpt.dwords[rd->supported_dword] & rd->supported_bit)) {
1912 params->hwcaps.mask &= ~rd->hwcaps;
1913 continue;
1914 }
1915
1916 params->hwcaps.mask |= rd->hwcaps;
1917 cmd = spi_nor_hwcaps_read2cmd(rd->hwcaps);
1918 read = ¶ms->reads[cmd];
1919 half = bfpt.dwords[rd->settings_dword] >> rd->settings_shift;
1920 spi_nor_set_read_settings_from_bfpt(read, half, rd->proto);
1921 }
1922
1923
1924 for (i = 0; i < ARRAY_SIZE(sfdp_bfpt_erases); i++) {
1925 const struct sfdp_bfpt_erase *er = &sfdp_bfpt_erases[i];
1926 u32 erasesize;
1927 u8 opcode;
1928
1929 half = bfpt.dwords[er->dword] >> er->shift;
1930 erasesize = half & 0xff;
1931
1932
1933 if (!erasesize)
1934 continue;
1935
1936 erasesize = 1U << erasesize;
1937 opcode = (half >> 8) & 0xff;
1938#ifdef CONFIG_SPI_FLASH_USE_4K_SECTORS
1939 if (erasesize == SZ_4K) {
1940 nor->erase_opcode = opcode;
1941 mtd->erasesize = erasesize;
1942 break;
1943 }
1944#endif
1945 if (!mtd->erasesize || mtd->erasesize < erasesize) {
1946 nor->erase_opcode = opcode;
1947 mtd->erasesize = erasesize;
1948 }
1949 }
1950
1951
1952 if (bfpt_header->length < BFPT_DWORD_MAX)
1953 return 0;
1954
1955
1956 params->page_size = bfpt.dwords[BFPT_DWORD(11)];
1957 params->page_size &= BFPT_DWORD11_PAGE_SIZE_MASK;
1958 params->page_size >>= BFPT_DWORD11_PAGE_SIZE_SHIFT;
1959 params->page_size = 1U << params->page_size;
1960
1961
1962 switch (bfpt.dwords[BFPT_DWORD(15)] & BFPT_DWORD15_QER_MASK) {
1963 case BFPT_DWORD15_QER_NONE:
1964 params->quad_enable = NULL;
1965 break;
1966#if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)
1967 case BFPT_DWORD15_QER_SR2_BIT1_BUGGY:
1968 case BFPT_DWORD15_QER_SR2_BIT1_NO_RD:
1969 params->quad_enable = spansion_no_read_cr_quad_enable;
1970 break;
1971#endif
1972#ifdef CONFIG_SPI_FLASH_MACRONIX
1973 case BFPT_DWORD15_QER_SR1_BIT6:
1974 params->quad_enable = macronix_quad_enable;
1975 break;
1976#endif
1977#if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)
1978 case BFPT_DWORD15_QER_SR2_BIT1:
1979 params->quad_enable = spansion_read_cr_quad_enable;
1980 break;
1981#endif
1982 default:
1983 return -EINVAL;
1984 }
1985
1986 return 0;
1987}
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997static int
1998spi_nor_parse_microchip_sfdp(struct spi_nor *nor,
1999 const struct sfdp_parameter_header *param_header)
2000{
2001 size_t size;
2002 u32 addr;
2003 int ret;
2004
2005 size = param_header->length * sizeof(u32);
2006 addr = SFDP_PARAM_HEADER_PTP(param_header);
2007
2008 nor->manufacturer_sfdp = devm_kmalloc(nor->dev, size, GFP_KERNEL);
2009 if (!nor->manufacturer_sfdp)
2010 return -ENOMEM;
2011
2012 ret = spi_nor_read_sfdp(nor, addr, size, nor->manufacturer_sfdp);
2013
2014 return ret;
2015}
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031static int spi_nor_parse_sfdp(struct spi_nor *nor,
2032 struct spi_nor_flash_parameter *params)
2033{
2034 const struct sfdp_parameter_header *param_header, *bfpt_header;
2035 struct sfdp_parameter_header *param_headers = NULL;
2036 struct sfdp_header header;
2037 size_t psize;
2038 int i, err;
2039
2040
2041 err = spi_nor_read_sfdp(nor, 0, sizeof(header), &header);
2042 if (err < 0)
2043 return err;
2044
2045
2046 if (le32_to_cpu(header.signature) != SFDP_SIGNATURE ||
2047 header.major != SFDP_JESD216_MAJOR)
2048 return -EINVAL;
2049
2050
2051
2052
2053
2054 bfpt_header = &header.bfpt_header;
2055 if (SFDP_PARAM_HEADER_ID(bfpt_header) != SFDP_BFPT_ID ||
2056 bfpt_header->major != SFDP_JESD216_MAJOR)
2057 return -EINVAL;
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070 if (header.nph) {
2071 psize = header.nph * sizeof(*param_headers);
2072
2073 param_headers = kmalloc(psize, GFP_KERNEL);
2074 if (!param_headers)
2075 return -ENOMEM;
2076
2077 err = spi_nor_read_sfdp(nor, sizeof(header),
2078 psize, param_headers);
2079 if (err < 0) {
2080 dev_err(nor->dev,
2081 "failed to read SFDP parameter headers\n");
2082 goto exit;
2083 }
2084 }
2085
2086
2087
2088
2089
2090 for (i = 0; i < header.nph; i++) {
2091 param_header = ¶m_headers[i];
2092
2093 if (SFDP_PARAM_HEADER_ID(param_header) == SFDP_BFPT_ID &&
2094 param_header->major == SFDP_JESD216_MAJOR &&
2095 (param_header->minor > bfpt_header->minor ||
2096 (param_header->minor == bfpt_header->minor &&
2097 param_header->length > bfpt_header->length)))
2098 bfpt_header = param_header;
2099 }
2100
2101 err = spi_nor_parse_bfpt(nor, bfpt_header, params);
2102 if (err)
2103 goto exit;
2104
2105
2106 for (i = 0; i < header.nph; i++) {
2107 param_header = ¶m_headers[i];
2108
2109 switch (SFDP_PARAM_HEADER_ID(param_header)) {
2110 case SFDP_SECTOR_MAP_ID:
2111 dev_info(nor->dev,
2112 "non-uniform erase sector maps are not supported yet.\n");
2113 break;
2114
2115 case SFDP_SST_ID:
2116 err = spi_nor_parse_microchip_sfdp(nor, param_header);
2117 break;
2118
2119 default:
2120 break;
2121 }
2122
2123 if (err) {
2124 dev_warn(nor->dev,
2125 "Failed to parse optional parameter table: %04x\n",
2126 SFDP_PARAM_HEADER_ID(param_header));
2127
2128
2129
2130
2131
2132
2133 err = 0;
2134 }
2135 }
2136
2137exit:
2138 kfree(param_headers);
2139 return err;
2140}
2141#else
2142static int spi_nor_parse_sfdp(struct spi_nor *nor,
2143 struct spi_nor_flash_parameter *params)
2144{
2145 return -EINVAL;
2146}
2147#endif
2148
2149static int spi_nor_init_params(struct spi_nor *nor,
2150 const struct flash_info *info,
2151 struct spi_nor_flash_parameter *params)
2152{
2153
2154 memset(params, 0, sizeof(*params));
2155
2156
2157 params->size = info->sector_size * info->n_sectors;
2158 params->page_size = info->page_size;
2159
2160
2161 params->hwcaps.mask |= SNOR_HWCAPS_READ;
2162 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ],
2163 0, 0, SPINOR_OP_READ,
2164 SNOR_PROTO_1_1_1);
2165
2166 if (!(info->flags & SPI_NOR_NO_FR)) {
2167 params->hwcaps.mask |= SNOR_HWCAPS_READ_FAST;
2168 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_FAST],
2169 0, 8, SPINOR_OP_READ_FAST,
2170 SNOR_PROTO_1_1_1);
2171 }
2172
2173 if (info->flags & SPI_NOR_DUAL_READ) {
2174 params->hwcaps.mask |= SNOR_HWCAPS_READ_1_1_2;
2175 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_1_1_2],
2176 0, 8, SPINOR_OP_READ_1_1_2,
2177 SNOR_PROTO_1_1_2);
2178 }
2179
2180 if (info->flags & SPI_NOR_QUAD_READ) {
2181 params->hwcaps.mask |= SNOR_HWCAPS_READ_1_1_4;
2182 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_1_1_4],
2183 0, 8, SPINOR_OP_READ_1_1_4,
2184 SNOR_PROTO_1_1_4);
2185 }
2186
2187 if (info->flags & SPI_NOR_OCTAL_READ) {
2188 params->hwcaps.mask |= SNOR_HWCAPS_READ_1_1_8;
2189 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_1_1_8],
2190 0, 8, SPINOR_OP_READ_1_1_8,
2191 SNOR_PROTO_1_1_8);
2192 }
2193
2194
2195 params->hwcaps.mask |= SNOR_HWCAPS_PP;
2196 spi_nor_set_pp_settings(¶ms->page_programs[SNOR_CMD_PP],
2197 SPINOR_OP_PP, SNOR_PROTO_1_1_1);
2198
2199 if (info->flags & SPI_NOR_QUAD_READ) {
2200 params->hwcaps.mask |= SNOR_HWCAPS_PP_1_1_4;
2201 spi_nor_set_pp_settings(¶ms->page_programs[SNOR_CMD_PP_1_1_4],
2202 SPINOR_OP_PP_1_1_4, SNOR_PROTO_1_1_4);
2203 }
2204
2205
2206 if (params->hwcaps.mask & (SNOR_HWCAPS_READ_QUAD |
2207 SNOR_HWCAPS_PP_QUAD)) {
2208 switch (JEDEC_MFR(info)) {
2209#ifdef CONFIG_SPI_FLASH_MACRONIX
2210 case SNOR_MFR_MACRONIX:
2211 params->quad_enable = macronix_quad_enable;
2212 break;
2213#endif
2214 case SNOR_MFR_ST:
2215 case SNOR_MFR_MICRON:
2216 break;
2217
2218 default:
2219#if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)
2220
2221 params->quad_enable = spansion_read_cr_quad_enable;
2222#endif
2223 break;
2224 }
2225 }
2226
2227
2228 nor->addr_width = 0;
2229 nor->mtd.erasesize = 0;
2230 if ((info->flags & (SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)) &&
2231 !(info->flags & SPI_NOR_SKIP_SFDP)) {
2232 struct spi_nor_flash_parameter sfdp_params;
2233
2234 memcpy(&sfdp_params, params, sizeof(sfdp_params));
2235 if (spi_nor_parse_sfdp(nor, &sfdp_params)) {
2236 nor->addr_width = 0;
2237 nor->mtd.erasesize = 0;
2238 } else {
2239 memcpy(params, &sfdp_params, sizeof(*params));
2240 }
2241 }
2242
2243 return 0;
2244}
2245
2246static int spi_nor_hwcaps2cmd(u32 hwcaps, const int table[][2], size_t size)
2247{
2248 size_t i;
2249
2250 for (i = 0; i < size; i++)
2251 if (table[i][0] == (int)hwcaps)
2252 return table[i][1];
2253
2254 return -EINVAL;
2255}
2256
2257static int spi_nor_hwcaps_read2cmd(u32 hwcaps)
2258{
2259 static const int hwcaps_read2cmd[][2] = {
2260 { SNOR_HWCAPS_READ, SNOR_CMD_READ },
2261 { SNOR_HWCAPS_READ_FAST, SNOR_CMD_READ_FAST },
2262 { SNOR_HWCAPS_READ_1_1_1_DTR, SNOR_CMD_READ_1_1_1_DTR },
2263 { SNOR_HWCAPS_READ_1_1_2, SNOR_CMD_READ_1_1_2 },
2264 { SNOR_HWCAPS_READ_1_2_2, SNOR_CMD_READ_1_2_2 },
2265 { SNOR_HWCAPS_READ_2_2_2, SNOR_CMD_READ_2_2_2 },
2266 { SNOR_HWCAPS_READ_1_2_2_DTR, SNOR_CMD_READ_1_2_2_DTR },
2267 { SNOR_HWCAPS_READ_1_1_4, SNOR_CMD_READ_1_1_4 },
2268 { SNOR_HWCAPS_READ_1_4_4, SNOR_CMD_READ_1_4_4 },
2269 { SNOR_HWCAPS_READ_4_4_4, SNOR_CMD_READ_4_4_4 },
2270 { SNOR_HWCAPS_READ_1_4_4_DTR, SNOR_CMD_READ_1_4_4_DTR },
2271 { SNOR_HWCAPS_READ_1_1_8, SNOR_CMD_READ_1_1_8 },
2272 { SNOR_HWCAPS_READ_1_8_8, SNOR_CMD_READ_1_8_8 },
2273 { SNOR_HWCAPS_READ_8_8_8, SNOR_CMD_READ_8_8_8 },
2274 { SNOR_HWCAPS_READ_1_8_8_DTR, SNOR_CMD_READ_1_8_8_DTR },
2275 };
2276
2277 return spi_nor_hwcaps2cmd(hwcaps, hwcaps_read2cmd,
2278 ARRAY_SIZE(hwcaps_read2cmd));
2279}
2280
2281static int spi_nor_hwcaps_pp2cmd(u32 hwcaps)
2282{
2283 static const int hwcaps_pp2cmd[][2] = {
2284 { SNOR_HWCAPS_PP, SNOR_CMD_PP },
2285 { SNOR_HWCAPS_PP_1_1_4, SNOR_CMD_PP_1_1_4 },
2286 { SNOR_HWCAPS_PP_1_4_4, SNOR_CMD_PP_1_4_4 },
2287 { SNOR_HWCAPS_PP_4_4_4, SNOR_CMD_PP_4_4_4 },
2288 { SNOR_HWCAPS_PP_1_1_8, SNOR_CMD_PP_1_1_8 },
2289 { SNOR_HWCAPS_PP_1_8_8, SNOR_CMD_PP_1_8_8 },
2290 { SNOR_HWCAPS_PP_8_8_8, SNOR_CMD_PP_8_8_8 },
2291 };
2292
2293 return spi_nor_hwcaps2cmd(hwcaps, hwcaps_pp2cmd,
2294 ARRAY_SIZE(hwcaps_pp2cmd));
2295}
2296
2297static int spi_nor_select_read(struct spi_nor *nor,
2298 const struct spi_nor_flash_parameter *params,
2299 u32 shared_hwcaps)
2300{
2301 int cmd, best_match = fls(shared_hwcaps & SNOR_HWCAPS_READ_MASK) - 1;
2302 const struct spi_nor_read_command *read;
2303
2304 if (best_match < 0)
2305 return -EINVAL;
2306
2307 cmd = spi_nor_hwcaps_read2cmd(BIT(best_match));
2308 if (cmd < 0)
2309 return -EINVAL;
2310
2311 read = ¶ms->reads[cmd];
2312 nor->read_opcode = read->opcode;
2313 nor->read_proto = read->proto;
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325 nor->read_dummy = read->num_mode_clocks + read->num_wait_states;
2326 return 0;
2327}
2328
2329static int spi_nor_select_pp(struct spi_nor *nor,
2330 const struct spi_nor_flash_parameter *params,
2331 u32 shared_hwcaps)
2332{
2333 int cmd, best_match = fls(shared_hwcaps & SNOR_HWCAPS_PP_MASK) - 1;
2334 const struct spi_nor_pp_command *pp;
2335
2336 if (best_match < 0)
2337 return -EINVAL;
2338
2339 cmd = spi_nor_hwcaps_pp2cmd(BIT(best_match));
2340 if (cmd < 0)
2341 return -EINVAL;
2342
2343 pp = ¶ms->page_programs[cmd];
2344 nor->program_opcode = pp->opcode;
2345 nor->write_proto = pp->proto;
2346 return 0;
2347}
2348
2349static int spi_nor_select_erase(struct spi_nor *nor,
2350 const struct flash_info *info)
2351{
2352 struct mtd_info *mtd = &nor->mtd;
2353
2354
2355 if (mtd->erasesize)
2356 return 0;
2357
2358#ifdef CONFIG_SPI_FLASH_USE_4K_SECTORS
2359
2360 if (info->flags & SECT_4K) {
2361 nor->erase_opcode = SPINOR_OP_BE_4K;
2362 mtd->erasesize = 4096;
2363 } else if (info->flags & SECT_4K_PMC) {
2364 nor->erase_opcode = SPINOR_OP_BE_4K_PMC;
2365 mtd->erasesize = 4096;
2366 } else
2367#endif
2368 {
2369 nor->erase_opcode = SPINOR_OP_SE;
2370 mtd->erasesize = info->sector_size;
2371 }
2372 return 0;
2373}
2374
2375static int spi_nor_setup(struct spi_nor *nor, const struct flash_info *info,
2376 const struct spi_nor_flash_parameter *params,
2377 const struct spi_nor_hwcaps *hwcaps)
2378{
2379 u32 ignored_mask, shared_mask;
2380 bool enable_quad_io;
2381 int err;
2382
2383
2384
2385
2386
2387 shared_mask = hwcaps->mask & params->hwcaps.mask;
2388
2389
2390 ignored_mask = (SNOR_HWCAPS_READ_2_2_2 |
2391 SNOR_HWCAPS_READ_4_4_4 |
2392 SNOR_HWCAPS_READ_8_8_8 |
2393 SNOR_HWCAPS_PP_4_4_4 |
2394 SNOR_HWCAPS_PP_8_8_8);
2395 if (shared_mask & ignored_mask) {
2396 dev_dbg(nor->dev,
2397 "SPI n-n-n protocols are not supported yet.\n");
2398 shared_mask &= ~ignored_mask;
2399 }
2400
2401
2402 err = spi_nor_select_read(nor, params, shared_mask);
2403 if (err) {
2404 dev_dbg(nor->dev,
2405 "can't select read settings supported by both the SPI controller and memory.\n");
2406 return err;
2407 }
2408
2409
2410 err = spi_nor_select_pp(nor, params, shared_mask);
2411 if (err) {
2412 dev_dbg(nor->dev,
2413 "can't select write settings supported by both the SPI controller and memory.\n");
2414 return err;
2415 }
2416
2417
2418 err = spi_nor_select_erase(nor, info);
2419 if (err) {
2420 dev_dbg(nor->dev,
2421 "can't select erase settings supported by both the SPI controller and memory.\n");
2422 return err;
2423 }
2424
2425
2426 enable_quad_io = (spi_nor_get_protocol_width(nor->read_proto) == 4 ||
2427 spi_nor_get_protocol_width(nor->write_proto) == 4);
2428 if (enable_quad_io && params->quad_enable)
2429 nor->quad_enable = params->quad_enable;
2430 else
2431 nor->quad_enable = NULL;
2432
2433 return 0;
2434}
2435
2436static int spi_nor_init(struct spi_nor *nor)
2437{
2438 int err;
2439
2440
2441
2442
2443
2444 if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL ||
2445 JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
2446 JEDEC_MFR(nor->info) == SNOR_MFR_SST ||
2447 nor->info->flags & SPI_NOR_HAS_LOCK) {
2448 write_enable(nor);
2449 write_sr(nor, 0);
2450 spi_nor_wait_till_ready(nor);
2451 }
2452
2453 if (nor->quad_enable) {
2454 err = nor->quad_enable(nor);
2455 if (err) {
2456 dev_dbg(nor->dev, "quad mode not supported\n");
2457 return err;
2458 }
2459 }
2460
2461 if (nor->addr_width == 4 &&
2462 (JEDEC_MFR(nor->info) != SNOR_MFR_SPANSION) &&
2463 !(nor->info->flags & SPI_NOR_4B_OPCODES)) {
2464
2465
2466
2467
2468
2469
2470
2471 if (nor->flags & SNOR_F_BROKEN_RESET)
2472 printf("enabling reset hack; may not recover from unexpected reboots\n");
2473 set_4byte(nor, nor->info, 1);
2474 }
2475
2476 return 0;
2477}
2478
2479int spi_nor_scan(struct spi_nor *nor)
2480{
2481 struct spi_nor_flash_parameter params;
2482 const struct flash_info *info = NULL;
2483 struct mtd_info *mtd = &nor->mtd;
2484 struct spi_nor_hwcaps hwcaps = {
2485 .mask = SNOR_HWCAPS_READ |
2486 SNOR_HWCAPS_READ_FAST |
2487 SNOR_HWCAPS_PP,
2488 };
2489 struct spi_slave *spi = nor->spi;
2490 int ret;
2491
2492
2493 nor->reg_proto = SNOR_PROTO_1_1_1;
2494 nor->read_proto = SNOR_PROTO_1_1_1;
2495 nor->write_proto = SNOR_PROTO_1_1_1;
2496 nor->read = spi_nor_read_data;
2497 nor->write = spi_nor_write_data;
2498 nor->read_reg = spi_nor_read_reg;
2499 nor->write_reg = spi_nor_write_reg;
2500
2501 if (spi->mode & SPI_RX_OCTAL) {
2502 hwcaps.mask |= SNOR_HWCAPS_READ_1_1_8;
2503
2504 if (spi->mode & SPI_TX_OCTAL)
2505 hwcaps.mask |= (SNOR_HWCAPS_READ_1_8_8 |
2506 SNOR_HWCAPS_PP_1_1_8 |
2507 SNOR_HWCAPS_PP_1_8_8);
2508 } else if (spi->mode & SPI_RX_QUAD) {
2509 hwcaps.mask |= SNOR_HWCAPS_READ_1_1_4;
2510
2511 if (spi->mode & SPI_TX_QUAD)
2512 hwcaps.mask |= (SNOR_HWCAPS_READ_1_4_4 |
2513 SNOR_HWCAPS_PP_1_1_4 |
2514 SNOR_HWCAPS_PP_1_4_4);
2515 } else if (spi->mode & SPI_RX_DUAL) {
2516 hwcaps.mask |= SNOR_HWCAPS_READ_1_1_2;
2517
2518 if (spi->mode & SPI_TX_DUAL)
2519 hwcaps.mask |= SNOR_HWCAPS_READ_1_2_2;
2520 }
2521
2522 info = spi_nor_read_id(nor);
2523 if (IS_ERR_OR_NULL(info))
2524 return -ENOENT;
2525
2526 ret = spi_nor_init_params(nor, info, ¶ms);
2527 if (ret)
2528 return ret;
2529
2530 if (!mtd->name)
2531 mtd->name = info->name;
2532 mtd->priv = nor;
2533 mtd->type = MTD_NORFLASH;
2534 mtd->writesize = 1;
2535 mtd->flags = MTD_CAP_NORFLASH;
2536 mtd->size = params.size;
2537 mtd->_erase = spi_nor_erase;
2538 mtd->_read = spi_nor_read;
2539 mtd->_write = spi_nor_write;
2540
2541#if defined(CONFIG_SPI_FLASH_STMICRO) || defined(CONFIG_SPI_FLASH_SST)
2542
2543 if (JEDEC_MFR(info) == SNOR_MFR_ST ||
2544 JEDEC_MFR(info) == SNOR_MFR_MICRON ||
2545 JEDEC_MFR(info) == SNOR_MFR_SST ||
2546 info->flags & SPI_NOR_HAS_LOCK) {
2547 nor->flash_lock = stm_lock;
2548 nor->flash_unlock = stm_unlock;
2549 nor->flash_is_locked = stm_is_locked;
2550 }
2551#endif
2552
2553#ifdef CONFIG_SPI_FLASH_SST
2554
2555
2556
2557
2558 if (info->flags & SPI_NOR_HAS_SST26LOCK) {
2559 nor->flash_lock = sst26_lock;
2560 nor->flash_unlock = sst26_unlock;
2561 nor->flash_is_locked = sst26_is_locked;
2562 }
2563#endif
2564
2565 if (info->flags & USE_FSR)
2566 nor->flags |= SNOR_F_USE_FSR;
2567 if (info->flags & SPI_NOR_HAS_TB)
2568 nor->flags |= SNOR_F_HAS_SR_TB;
2569 if (info->flags & NO_CHIP_ERASE)
2570 nor->flags |= SNOR_F_NO_OP_CHIP_ERASE;
2571 if (info->flags & USE_CLSR)
2572 nor->flags |= SNOR_F_USE_CLSR;
2573
2574 if (info->flags & SPI_NOR_NO_ERASE)
2575 mtd->flags |= MTD_NO_ERASE;
2576
2577 nor->page_size = params.page_size;
2578 mtd->writebufsize = nor->page_size;
2579
2580
2581 if ((info->flags & SPI_NOR_NO_FR) || (spi->mode & SPI_RX_SLOW))
2582 params.hwcaps.mask &= ~SNOR_HWCAPS_READ_FAST;
2583
2584
2585
2586
2587
2588
2589
2590
2591 ret = spi_nor_setup(nor, info, ¶ms, &hwcaps);
2592 if (ret)
2593 return ret;
2594
2595 if (nor->addr_width) {
2596
2597 } else if (info->addr_width) {
2598 nor->addr_width = info->addr_width;
2599 } else if (mtd->size > SZ_16M) {
2600#ifndef CONFIG_SPI_FLASH_BAR
2601
2602 nor->addr_width = 4;
2603 if (JEDEC_MFR(info) == SNOR_MFR_SPANSION ||
2604 info->flags & SPI_NOR_4B_OPCODES)
2605 spi_nor_set_4byte_opcodes(nor, info);
2606#else
2607
2608 nor->addr_width = 3;
2609 ret = read_bar(nor, info);
2610 if (ret < 0)
2611 return ret;
2612#endif
2613 } else {
2614 nor->addr_width = 3;
2615 }
2616
2617 if (nor->addr_width > SPI_NOR_MAX_ADDR_WIDTH) {
2618 dev_dbg(nor->dev, "address width is too large: %u\n",
2619 nor->addr_width);
2620 return -EINVAL;
2621 }
2622
2623
2624 nor->info = info;
2625 ret = spi_nor_init(nor);
2626 if (ret)
2627 return ret;
2628
2629 nor->name = mtd->name;
2630 nor->size = mtd->size;
2631 nor->erase_size = mtd->erasesize;
2632 nor->sector_size = mtd->erasesize;
2633
2634#ifndef CONFIG_SPL_BUILD
2635 printf("SF: Detected %s with page size ", nor->name);
2636 print_size(nor->page_size, ", erase size ");
2637 print_size(nor->erase_size, ", total ");
2638 print_size(nor->size, "");
2639 puts("\n");
2640#endif
2641
2642 return 0;
2643}
2644