blob: 0850a16bf4c71abd657481c936c37b76fac6c519 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#include <common.h>
2#include <malloc.h>
3#include <asm/arch/pxa_dma.h>
4#include <power/asr1802s_freq.h>
5#include <linux/mtd/mtd.h>
6#include <linux/mtd/nand.h>
7#include <mtd/pxa3xx_bbm.h>
8#include <asm/arch/cpu.h>
9#include <asm/io.h>
10#include "asr_qspi.h"
11
12#define SPINAND_SUPPORT_DTR (1 << 7)
13
14#define qspi_writel(val, addr) __raw_writel((val), addr)
15#define qspi_readl(addr) __raw_readl(addr)
16
17#define PMUA_QSPI_CLK_RES_CTRL_CLK_FC_REQ BIT_12
18#define PMUA_QSPI_CLK_RES_CTRL_CLK_DIV_MSK (0x7 << 9)
19#define PMUA_QSPI_CLK_RES_CTRL_CLK_DIV_BASE 9
20#define PMUA_QSPI_CLK_RES_CTRL_CLK_SEL_MSK (0x7 << 6)
21#define PMUA_QSPI_CLK_RES_CTRL_CLK_SEL_BASE 6
22#define PMUA_QSPI_CLK_RES_CTRL_CLK_EN BIT_4
23#define PMUA_QSPI_CLK_RES_CTRL_AXICLK_EN BIT_3
24#define PMUA_QSPI_CLK_RES_CTRL_CLK_RST BIT_1
25#define PMUA_QSPI_CLK_RES_CTRL_AXI_RST BIT_0
26
27struct qspi_host qspi_host;
28//static DMA_DESCRIPTOR dma_desc __attribute__ ((aligned (16)));
29//static u8 *tx_desc = &dma_desc;
30/* qspi write with check*/
31
32static inline void qspi_writel_check(struct qspi_host *host, u32 val,
33 int reg, u32 mask)
34{
35 u32 tmp;
36
37 qspi_writel(val, reg);
38 val &= ~mask;
39 do {
40 tmp = qspi_readl(reg);
41 tmp &= ~mask;
42 if (tmp == val)
43 break;
44 } while (1);
45}
46
47/* qspi write check with auto-clear field */
48static inline void qspi_writel_clear(struct qspi_host *host, u32 val,
49 int reg, u32 mask)
50{
51 u32 tmp;
52
53 qspi_writel(val, reg);
54 val &= ~mask;
55 do {
56 tmp = qspi_readl(reg);
57 tmp &= ~mask;
58 if (!(tmp & val))
59 break;
60 } while (1);
61}
62
63/*
64 * Error Flag may happen for write access to RBCT/SFAR register,
65 * need retry for these two register
66 */
67static void qspi_write_rbct(struct qspi_host *host, u32 val)
68{
69 u32 fr;
70
71 do {
72 qspi_writel_check(host, val, QSPI0_RBCT, QSPI_RBCT_RESV);
73 fr = qspi_readl(QSPI0_FR);
74 if (!(fr & QSPI_FR_IPIEF))
75 break;
76
77 fr &= QSPI_FR_IPIEF;
78 qspi_writel(fr, QSPI0_FR);
79 } while (1);
80}
81
82static void qspi_write_sfar(struct qspi_host *host, u32 val)
83{
84 u32 fr;
85
86 do {
87 qspi_writel_check(host, val, QSPI0_SFAR, 0x0);
88 fr = qspi_readl(QSPI0_FR);
89 if (!(fr & QSPI_FR_IPIEF))
90 break;
91
92 fr &= QSPI_FR_IPIEF;
93 qspi_writel(fr, QSPI0_FR);
94 } while (1);
95}
96
97static void qspi_config_mfp(int cs)
98{
99 if (cs == QSPI_CS_A1) {
100 qspi_writel(0xd000, 0xd401e2c4); // QSPI_DAT3
101 qspi_writel(0x1000, 0xd401e2c8); // QSPI_DAT2
102 qspi_writel(0x1000, 0xd401e2cc); // QSPI_DAT1
103 qspi_writel(0x1000, 0xd401e2d0); // QSPI_DAT0
104 qspi_writel(0x1000, 0xd401e2d4); // QSPI_CLK
105 qspi_writel(0x1000, 0xd401e2d8); // QSPI_CS1
106 }
107}
108
109static void qspi_enter_mode(struct qspi_host *host, u32 mode)
110{
111 u32 mcr;
112
113 mcr = qspi_readl(QSPI0_MCR);
114 if (mode == QSPI_NORMAL_MODE)
115 mcr &= ~QSPI_MCR_MDIS;
116 else if (mode == QSPI_DISABLE_MODE)
117 mcr |= QSPI_MCR_MDIS;
118 qspi_writel_check(host, mcr, QSPI0_MCR, QSPI_MCR_RESV);
119}
120
121void qspi_init_ahb(int lut, int page_size)
122{
123#if 0
124 //Top index of BUFs
125 qspi_writel(0x20, QSPI0_BUF0IND);
126 qspi_writel(0x40, QSPI0_BUF1IND);
127 qspi_writel(0x60, QSPI0_BUF2IND);
128
129 //128Byte, master ID?
130 qspi_writel(0x00001001, QSPI0_BUF0CR);
131 qspi_writel(0x1006, QSPI0_BUF1CR);
132 qspi_writel(0x1003, QSPI0_BUF2CR);
133 qspi_writel(0x80001002, QSPI0_BUF3CR);
134#else
135 u32 buf_cfg;
136 int data_size;
137 int i = 0;
138
139 do {
140 i++;
141 data_size = page_size/(1 << i);
142 if (data_size <= QSPI_AHB_BUFF_MAX_SIZE)
143 break;
144 } while(1);
145
146 buf_cfg = QSPI_BUF3CR_ALLMST |
147 (data_size / 8) << QSPI_BUF3CR_ADATSZ_SHIFT;
148
149 if (cpu_is_asr1903()) {
150 /*
151 * Config the ahb buffer
152 * Disable BUF1~BUF2, use BUF0 for all masters
153 */
154 qspi_writel((512/8 - 1) * 8, QSPI0_BUF0IND); // other masters
155 qspi_writel(512, QSPI0_BUF1IND);
156 qspi_writel(512, QSPI0_BUF2IND);
157
158 /* AHB Master port */
159 qspi_writel(buf_cfg, QSPI0_BUF0CR);
160 qspi_writel(0xe, QSPI0_BUF1CR);
161 qspi_writel(0xe, QSPI0_BUF2CR);
162 qspi_writel(0xe, QSPI0_BUF3CR);
163 } else {
164 /*
165 * Config the ahb buffer
166 * Disable BUF0~BUF1, use BUF3 for all masters
167 */
168 qspi_writel(0, QSPI0_BUF0IND);
169 qspi_writel(0, QSPI0_BUF1IND);
170 qspi_writel(0, QSPI0_BUF2IND);
171
172 /* AHB Master port */
173 qspi_writel(0xe, QSPI0_BUF0CR);
174 qspi_writel(0xe, QSPI0_BUF1CR);
175 qspi_writel(0xe, QSPI0_BUF2CR);
176 qspi_writel(buf_cfg, QSPI0_BUF3CR); // other masters
177 }
178#endif
179 qspi_writel(lut << QSPI_BFGENCR_SEQID_SHIFT, QSPI0_BFGENCR);
180 printf("AHB data transfer size: %d\n", data_size);
181}
182
183static void qspi_lock_lut(void)
184{
185 u32 lckcr;
186
187 lckcr = qspi_readl(QSPI0_LCKCR);
188 if (lckcr & 0x1)
189 return;
190 qspi_writel(0x5af05af0, QSPI0_LUTKEY);
191 qspi_writel(0x1, QSPI0_LCKCR);
192}
193
194static void qspi_unlock_lut(void)
195{
196 u32 lckcr;
197
198 lckcr = qspi_readl(QSPI0_LCKCR);
199 if (lckcr & 0x2)
200 return;
201
202 qspi_writel(0x5af05af0, QSPI0_LUTKEY);
203 qspi_writel(0x2, QSPI0_LCKCR);
204}
205
206static void qspi_config_lookup_tbl(struct spi_flash_chip *chip,
207 struct spi_flash_cmd_cfg *cmd_cfg,
208 u8 mode, int seq_id)
209{
210 u32 lut_value;
211 u16 lut_entry[8];
212 u8 pins[] = {0, QSPI_PAD_1X, QSPI_PAD_2X, 0, QSPI_PAD_4X};
213 u8 seq = 0, i;
214 u8 mode_instr, dummy_cycles, addr_bytes;
215 int lut_addr;
216
217 /* Set Lookup table entry: CMD, ADDR, MODE, DUMMY, DATA, etc */
218 if (chip->qpi_enabled)
219 lut_entry[seq++] =
220 (cmd_cfg->cmd_dtr ?
221 QSPI_INSTR_CMD_DDR : QSPI_INSTR_CMD) << 10 |
222 QSPI_PAD_4X << 8 | cmd_cfg->opcode;
223 else
224 lut_entry[seq++] =
225 (cmd_cfg->cmd_dtr ?
226 QSPI_INSTR_CMD_DDR : QSPI_INSTR_CMD) << 10 |
227 QSPI_PAD_1X << 8 | cmd_cfg->opcode;
228
229 if (cmd_cfg->addr_bytes) {
230 if (chip->en_addr_4byte && cmd_cfg->addr_bytes == 3)
231 addr_bytes = 4;
232 else
233 addr_bytes = cmd_cfg->addr_bytes;
234
235 lut_entry[seq++] =
236 (cmd_cfg->addr_dtr ?
237 QSPI_INSTR_ADDR_DDR : QSPI_INSTR_ADDR) << 10 |
238 pins[cmd_cfg->addr_pins] << 8 | addr_bytes*8;
239 if (addr_bytes == 1)
240 lut_entry[seq - 1] |= 0x4000;
241 }
242
243 if (cmd_cfg->mode_bits) {
244 if (cmd_cfg->mode_bits == 2) {
245 mode_instr = (cmd_cfg->mode_dtr ?
246 QSPI_INSTR_MODE2_DDR : QSPI_INSTR_MODE2);
247 mode &= 0x3;
248 } else if (cmd_cfg->mode_bits == 4) {
249 mode_instr = (cmd_cfg->mode_dtr ?
250 QSPI_INSTR_MODE4_DDR : QSPI_INSTR_MODE4);
251 mode &= 0xf;
252 } else {
253 mode_instr = (cmd_cfg->mode_dtr ?
254 QSPI_INSTR_MODE_DDR : QSPI_INSTR_MODE);
255 }
256 lut_entry[seq++] = mode_instr << 10 |
257 pins[cmd_cfg->mode_pins] << 8 |
258 mode;
259 }
260
261 if (cmd_cfg->dummy_pins) {
262 if (chip->qpi_enabled)
263 dummy_cycles = chip->qpi_dummy;
264 else
265 dummy_cycles = cmd_cfg->dummy_cycles;
266 lut_entry[seq++] = QSPI_INSTR_DUMMY << 10 |
267 pins[cmd_cfg->dummy_pins] << 8 |
268 dummy_cycles;
269 }
270
271 if (cmd_cfg->data_pins) {
272 if (cmd_cfg->type == CMD_W_RX_DATA) {
273 lut_entry[seq++] =
274 (cmd_cfg->data_dtr ?
275 QSPI_INSTR_READ_DDR : QSPI_INSTR_READ) << 10 |
276 pins[cmd_cfg->data_pins] << 8;
277 /* Add JMP_ON_CS for read */
278 lut_entry[seq++] = QSPI_INSTR_JMP_ON_CS << 10;
279
280 } else if (cmd_cfg->type == CMD_W_TX_DATA) {
281 lut_entry[seq++] =
282 (cmd_cfg->data_dtr ?
283 QSPI_INSTR_WRITE_DDR : QSPI_INSTR_WRITE) << 10 |
284 pins[cmd_cfg->data_pins] << 8;
285 } else {
286 printf("err: type of cmd %d is wrong in table\r\n",
287 cmd_cfg->opcode);
288 return;
289 }
290 }
291
292 /* Add stop at the end */
293 lut_entry[seq++] = QSPI_INSTR_STOP << 10;
294 /*
295 * lut read back value may be different from write,
296 * so add extra read to make sure write take effect
297 */
298 for (i = 0; i < seq/2; i++) {
299 lut_addr = QSPI0_LUT0 + seq_id*0x10 + i*0x4;
300 lut_value = lut_entry[i*2] | (lut_entry[i*2 + 1] << 16);
301
302 qspi_writel(lut_value, lut_addr);
303 lut_value = qspi_readl(lut_addr);
304 }
305
306 if (seq % 2) {
307 lut_addr = QSPI0_LUT0 + seq_id*0x10 + (seq/2)*0x4;
308 lut_value =lut_entry[seq - 1];
309
310 qspi_writel(lut_value, lut_addr);
311 lut_value = qspi_readl(lut_addr);
312 }
313
314// for (i = 0; i < seq; i++)
315// printf("seq=%d, lut_entry[%d]=0x%x\n\r", seq, i, lut_entry[i]);
316 return;
317}
318
319static int qspi_update_shared_lut(struct spi_flash_chip *chip,
320 struct spi_flash_cmd *cmd)
321{
322 struct spi_flash_cmd_cfg *cmd_cfg = cmd->cmd_cfg;
323 u32 seq_id = QSPI_LUT_SEQID1;
324
325 qspi_config_lookup_tbl(chip, cmd_cfg, cmd->mode, seq_id);
326 return seq_id;
327}
328
329/*
330 * Reserved for future optimization
331 * Pre-init some lookup tables for special commands to accelerate
332 */
333static int qspi_preinit_lookup_tbl(struct spi_flash_chip *chip)
334{
335 struct spi_flash_cmd_cfg *cmd_cfg = chip->table;
336 int lut_map = 0;
337
338 for (; cmd_cfg->opcode != 0x0; cmd_cfg++) {
339 if (cmd_cfg->seq_id != -1) {
340 if (lut_map & 1 << cmd_cfg->seq_id) {
341 printf("err: LUT %d already used\n",
342 cmd_cfg->seq_id);
343 return -1;
344 }
345
346 qspi_config_lookup_tbl(chip, cmd_cfg, 0xff,
347 cmd_cfg->seq_id);
348 lut_map |= 1 << cmd_cfg->seq_id;
349 }
350 }
351
352 chip->host->lut_map = lut_map;
353 printf("Fixed LUT bit-map: 0x%x\n", lut_map);
354 return 0;
355}
356
357static int qspi_enable_xip(struct spi_flash_chip *chip,
358 struct spi_flash_cmd_cfg *cmd_cfg)
359{
360 struct qspi_host *host = chip->host;
361
362 qspi_config_lookup_tbl(chip, cmd_cfg, 0xff, QSPI_LUT_SEQID0);
363
364 qspi_enter_mode(host, QSPI_DISABLE_MODE);
365 qspi_init_ahb(QSPI_LUT_SEQID0, chip->page_size);
366 qspi_enter_mode(host, QSPI_NORMAL_MODE);
367
368 if (host->use_xip) {
369 chip->xip_read = 1;
370 printf("XIP Read mode enabled\n");
371 } else {
372 chip->xip_read = 0;
373 printf("IPS Read mode enabled\n");
374 }
375
376 return 0;
377}
378
379static void qspi_invalid_ahb(struct qspi_host *host)
380{
381 u32 reg;
382
383 /* qspi softreset first */
384 reg = qspi_readl(QSPI0_MCR);
385 reg |= QSPI_MCR_SWRSTHD | QSPI_MCR_SWRSTSD;
386 qspi_writel_check(host, reg, QSPI0_MCR, QSPI_MCR_RESV);
387
388 /* Test show no delay is needed */
389 udelay(1);
390
391 reg &= ~(QSPI_MCR_SWRSTHD | QSPI_MCR_SWRSTSD);
392 qspi_writel_check(host, reg, QSPI0_MCR, QSPI_MCR_RESV);
393}
394
395static void qspi_clk_enable(void)
396{
397 PMUA->QSPI_CLK_RES_CTRL |= 0x1 << 4 | 0x1 << 3;;
398 PMUA->QSPI_CLK_RES_CTRL |= 0x3;
399}
400
401static void qspi_clk_disable(void)
402{
403 PMUA->QSPI_CLK_RES_CTRL &= ~(0x1 << 4 | 0x1 << 3);
404}
405
406static int qspi_set_func_clk_fc(struct qspi_host *host, int mhz)
407{
408 uint32_t timeout = 5*1000;
409 uint32_t reg;
410 int sel, div;
411
412 /* for dtr, qspi pmu clk must be 4x bus clk */
413 if (host->has_dtr)
414 mhz = mhz << 2;
415
416 if (cpu_is_asr1806()) {
417 /* enable PLL1_DIV23 */
418 APBSPARE->PLL3_SW_CTRL |= 0x7;
419 } else if (cpu_is_asr1903()) {
420 /* enable PLL1_DIV23/PLL1_DIV13/PLL1_DIV11 */
421 APBSPARE->apb_spare12_reg |= BIT_16 | BIT_17 | BIT_18;
422 }
423
424 /* Enabled QSPI clock, then take out of reset */
425 PMUA->QSPI_CLK_RES_CTRL |= (PMUA_QSPI_CLK_RES_CTRL_CLK_EN |
426 PMUA_QSPI_CLK_RES_CTRL_AXICLK_EN);
427 PMUA->QSPI_CLK_RES_CTRL |= (PMUA_QSPI_CLK_RES_CTRL_CLK_RST |
428 PMUA_QSPI_CLK_RES_CTRL_AXI_RST);
429
430 if (mhz >= 416) {
431 sel = 0;
432 div = 0;
433 } else if (mhz >= 312) {
434 div = 0;
435 if (cpu_is_asr1906())
436 sel = 1;
437 else
438 sel = 2;
439 } else if (mhz >= 208) {
440 sel = 0;
441 div = 1;
442 } else if (mhz >= 104) {
443 sel = 0;
444 div = 3;
445 } else if (mhz >= 78) {
446 if (cpu_is_asr1906()) {
447 sel = 1;
448 div = 3;
449 } else {
450 sel = 2;
451 div = 3;
452 }
453 } else if (mhz >= 52) {
454 sel = 0;
455 div = 7;
456 } else {
457 /* default 13M */
458 if (cpu_is_asr1906()) {
459 sel = 7;
460 div = 3;
461 } else {
462 sel = 5;
463 div = 7;
464 }
465 }
466 PMUA->QSPI_CLK_RES_CTRL &= ~(PMUA_QSPI_CLK_RES_CTRL_CLK_DIV_MSK |
467 PMUA_QSPI_CLK_RES_CTRL_CLK_SEL_MSK);
468 PMUA->QSPI_CLK_RES_CTRL |=
469 (div << PMUA_QSPI_CLK_RES_CTRL_CLK_DIV_BASE |
470 sel << PMUA_QSPI_CLK_RES_CTRL_CLK_SEL_BASE);
471 PMUA->QSPI_CLK_RES_CTRL |= BIT_12;
472 do {
473 reg = PMUA->QSPI_CLK_RES_CTRL;
474 if (!(reg & BIT_12))
475 break;
476
477 udelay(1);
478 timeout--;
479 if (!timeout) {
480 printf("err: qspi fc timeout!\n");
481 return -1;
482 }
483 } while (1);
484
485 return 0;
486}
487
488static void qspi_set_func_clk_nofc(int mhz)
489{
490 int clk_sel;
491 int freq;
492
493 /* Default qspi clock is divided by 4 in PMU */
494 freq = mhz << 2;
495 freq *= 1000000;
496 if (freq >= 416000000)
497 clk_sel = QSPI_FUNC_CLK_416MHZ;
498 else if (freq >= 312000000)
499 clk_sel = QSPI_FUNC_CLK_312MHZ;
500 else if (freq >= 208000000)
501 clk_sel = QSPI_FUNC_CLK_208MHZ;
502 else if (freq >= 156000000)
503 clk_sel = QSPI_FUNC_CLK_156MHZ;
504 else if (freq >= 104000000)
505 clk_sel = QSPI_FUNC_CLK_104MHZ;
506 else if (freq >= 78000000)
507 clk_sel = QSPI_FUNC_CLK_78MHZ;
508 else if (freq >= 52000000)
509 clk_sel = QSPI_FUNC_CLK_52MHZ;
510 else
511 clk_sel = QSPI_FUNC_CLK_26MHZ;
512 qspi_clk_disable();
513 PMUA->QSPI_CLK_RES_CTRL &= ~(0x7 << 6);
514 PMUA->QSPI_CLK_RES_CTRL |= clk_sel << 6;
515 qspi_clk_enable();
516}
517
518static int qspi_config_dqs_clk(struct qspi_host *host, int dcode)
519{
520 uint32_t reg;
521
522 reg = qspi_readl(QSPI0_MCR);
523 if (dcode <= 0 || dcode > 255) {
524 reg &= ~(QSPI_MCR_DQS_EN | QSPI_MCR_DQS_LP_EN |
525 QSPI_MCR_DQS_INV_EN);
526 qspi_writel(reg, QSPI0_MCR);
527 return 0;
528 }
529
530 /* DQS enabled, use sample point N/1 */
531 qspi_writel(0x0, QSPI0_SMPR);
532
533 reg |= QSPI_MCR_DQS_EN | QSPI_MCR_DQS_LP_EN | QSPI_MCR_DQS_INV_EN;
534 qspi_writel(reg, QSPI0_MCR);
535
536 reg = qspi_readl(QSPI0_SOCCR);
537 reg |= QSPI_SOCCR_DLINE_EN;
538 qspi_writel(reg, QSPI0_SOCCR);
539
540 reg = qspi_readl(QSPI0_DLACR);
541 reg &= ~QSPI_DLACR_DLINE_STEP_MASK;
542 reg = 0x7 << QSPI_DLACR_DLINE_STEP_SHIFT;
543 reg |= dcode & QSPI_DLACR_DLINE_CODE_MASK;
544 qspi_writel(reg, QSPI0_DLACR);
545
546 qspi_invalid_ahb(host);
547 return 1;
548}
549
550static void qspi_set_func_clk(struct qspi_host *host, int mhz, int use_dtr,
551 int tclqv, int tset, int thold)
552{
553 uint32_t t = 1000000 / mhz; /* in ps */
554 uint32_t reg;
555 int delay = 0;
556 int dcode;
557
558 if (cpu_is_asr1806() || cpu_is_asr1906() || cpu_is_asr1903())
559 qspi_set_func_clk_fc(host, mhz);
560 else
561 qspi_set_func_clk_nofc(mhz);
562
563 qspi_enter_mode(host, QSPI_DISABLE_MODE);
564
565 if (tclqv == 0) {
566 tclqv = 8;
567 tset = thold = 2;
568 }
569
570 delay = (tclqv + tset + 1) * 1000;
571 if (delay <= t)
572 reg = 0; /* sample point N1 */
573 else
574 reg = QSPI_SMPR_FSPHS; /* sample point I1 */
575
576 if (use_dtr) {
577 int ddr_point;
578
579 delay -= t/2;
580 if (delay > 0)
581 ddr_point = (delay + t/8 - 1) / (t/8);
582 else
583 ddr_point = 0;
584 reg |= ddr_point << QSPI_SMPR_DDRSMP_SHIFT;
585 } else if (host->support_dqs && mhz > 52) {
586 /*
587 * Do not use QDS for DDR, since SDR/DDR can not share
588 * same delay code.
589 * If DQS enabled, must use sample point N/1, clear SMPR.
590 *
591 * delay step: 52ps
592 */
593 delay = tclqv * 1000 - t/2;
594 dcode = delay / 52;
595 if (qspi_config_dqs_clk(host, dcode))
596 reg = 0;
597 }
598
599 qspi_writel(reg, QSPI0_SMPR);
600 reg = qspi_readl(QSPI0_SMPR);
601 printf("QSPI_SMPR=0x%x t=%d tclqv=%d delay=%d\n",
602 reg, t, tclqv, delay);
603
604 /* set tx hold time */
605 reg = 0x202;
606 if (use_dtr)
607 reg |= QSPI_FLSHCR_TDH_HALF_2X;
608 qspi_writel(reg, QSPI0_FLSHCR);
609
610 /* Module enabled */
611 qspi_enter_mode(host, QSPI_NORMAL_MODE);
612
613 host->bus_clk = mhz;
614 printf("Bus clock: %dMHz QSPI_CLK_RES_CTRL: 0x%x\n",
615 mhz, PMUA->QSPI_CLK_RES_CTRL);
616}
617
618void asr_qspi_disable_dqs(void)
619{
620 struct qspi_host *host = &qspi_host;
621 uint32_t reg;
622
623 if (!host->support_dqs)
624 return;
625
626 qspi_enter_mode(host, QSPI_DISABLE_MODE);
627
628 reg = qspi_readl(QSPI0_MCR);
629 reg &= ~(QSPI_MCR_DQS_EN | QSPI_MCR_DQS_LP_EN |
630 QSPI_MCR_DQS_INV_EN);
631 qspi_writel(reg, QSPI0_MCR);
632
633 qspi_enter_mode(host, QSPI_NORMAL_MODE);
634
635 qspi_invalid_ahb(host);
636 return;
637}
638
639static void qspi_enable_dma(struct qspi_host *host)
640{
641 uint32_t resr;
642
643 resr = qspi_readl(QSPI0_RSER);
644 resr |= QSPI_RSER_TBFDE;
645 qspi_writel_check(host, resr, QSPI0_RSER, QSPI_RSER_RESV);
646}
647
648static void qspi_disable_dma(struct qspi_host *host)
649{
650 uint32_t resr;
651
652 resr = qspi_readl(QSPI0_RSER);
653 resr &= ~QSPI_RSER_TBFDE;
654 qspi_writel_check(host, resr, QSPI0_RSER, QSPI_RSER_RESV);
655}
656
657static void qspi_config_interrupt(struct qspi_host *host)
658{
659 uint32_t resr;
660
661 resr = qspi_readl(QSPI0_RSER);
662 resr |= QSPI_RSER_ILLINIE | QSPI_RSER_ABSEIE | QSPI_RSER_AITIE |
663 QSPI_RSER_AIBSIE | QSPI_RSER_ABOIE |QSPI_RSER_IUEIE |
664 QSPI_RSER_IPIEIE | QSPI_RSER_IPGEIE;
665
666 qspi_writel_check(host, resr, QSPI0_RSER, QSPI_RSER_RESV);
667}
668
669static void qspi_enable_interrupt(struct qspi_host *host)
670{
671 struct spi_flash_cmd *cmd = host->cmd;
672 uint32_t resr;
673
674 resr = qspi_readl(QSPI0_RSER);
675
676 resr |= QSPI_RSER_TFIE;
677 if (cmd->n_tx) {
678 resr |= QSPI_RSER_TBUIE;
679 if (!host->use_dma && host->bytes_left > 0) {
680 resr |= QSPI_RSER_TBFIE;
681 }
682 } else if (cmd->n_rx) {
683 resr |= QSPI_RSER_RBOIE | QSPI_RSER_RBDIE;
684 }
685
686 qspi_writel_check(host, resr, QSPI0_RSER, QSPI_RSER_RESV);
687}
688
689static void qspi_disable_interrupt(struct qspi_host *host)
690{
691 struct spi_flash_cmd *cmd = host->cmd;
692 uint32_t resr;
693 (void)host;
694
695 resr = qspi_readl(QSPI0_RSER);
696
697 resr &= ~QSPI_RSER_TFIE;
698 if (cmd->n_tx)
699 resr &= ~(QSPI_RSER_TBUIE | QSPI_RSER_TBFIE);
700 else if (cmd->n_rx)
701 resr &= ~(QSPI_RSER_RBOIE | QSPI_RSER_RBDIE);
702
703 if (host->use_dma)
704 resr &= ~QSPI_RSER_TBFDE;
705
706 qspi_writel_check(host, resr, QSPI0_RSER, QSPI_RSER_RESV);
707}
708
709static int qspi_fill_to_txbuff(struct qspi_host *host)
710{
711 struct spi_flash_cmd *cmd = host->cmd;
712 int left_bytes = host->bytes_left;
713 int total_cnt;
714 u32 reg;
715 u32 data;
716
717 if (!cmd) {
718 printf("err: receive tx interrupt while no cmd sent\n");
719 return 1;
720 }
721
722 total_cnt = ALIGN(cmd->n_tx, QSPI_TX_BUFF_POP_MIN);
723
724 while (left_bytes > 0) {
725 qspi_writel(QSPI_FR_TBFF, QSPI0_SR);
726 reg = qspi_readl(QSPI0_SR);
727 if (reg & QSPI_FR_TBFF)
728 break;
729
730 data = 0;
731 if (cmd->n_tx - total_cnt + left_bytes >= 4)
732 data = (*(u32 *)&cmd->tx_buf[total_cnt - left_bytes]);
733 else if (cmd->n_tx - total_cnt + left_bytes > 0)
734 memcpy(&data, &cmd->tx_buf[total_cnt - left_bytes],
735 left_bytes);
736 qspi_writel(data, QSPI0_TBDR);
737 left_bytes -= 4;
738 }
739
740 host->bytes_left = left_bytes;
741 if (left_bytes <= 0)
742 return 0;
743 return 1;
744}
745
746static void qspi_read_from_rxbuff(struct qspi_host *host)
747{
748 struct spi_flash_cmd *cmd = host->cmd;
749 int left_bytes = host->bytes_left;
750 u32 sr;
751 u32 data;
752 int i;
753
754 while (left_bytes > 0) {
755 sr = qspi_readl(QSPI0_FR);
756 if (!(sr & QSPI_FR_RBDF))
757 break;
758
759 /* Check RXWE flag for data comming */
760 for (i = 0; i <= host->wmrk; i++) {
761 data = qspi_readl(QSPI0_RBDR0 + i*4);
762 //printf("i=%d data=0x%x\n", i , data);
763 if (left_bytes >= 4)
764 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
765 &data, 4);
766 else
767 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
768 &data, left_bytes);
769 left_bytes -= 4;
770 }
771
772 /* Set RBDF to trigger RX Buffer POP */
773 qspi_writel(QSPI_FR_RBDF, QSPI0_FR);
774 }
775
776 host->bytes_left = left_bytes;
777 return;
778}
779
780static void qspi_xfer_done(struct qspi_host *host)
781{
782 struct spi_flash_cmd *cmd = host->cmd;
783 int left_bytes = host->bytes_left;
784 u32 rdbfl;
785 u32 data;
786 u32 i;
787
788 if (host->use_dma)
789 left_bytes = 0;
790
791 if (cmd->n_rx && left_bytes > 0) {
792 rdbfl = qspi_readl(QSPI0_RBSR);
793 rdbfl &= QSPI_RBSR_RDBFL_MASK;
794 rdbfl = rdbfl >> QSPI_RBSR_RDBFL_SHIFT;
795
796 for (i = 0; i <= rdbfl; i++) {
797 data = qspi_readl(QSPI0_RBDR0 + i*4);
798 if (left_bytes >= 4)
799 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
800 &data, 4);
801 else
802 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
803 &data, left_bytes);
804 left_bytes -= 4;
805 }
806
807 if (left_bytes > 0) {
808 printf("Error: Not read enough data: "
809 "left_bytes=%d, cmd->n_rx=%d\n",
810 left_bytes, cmd->n_rx);
811 }
812 }
813
814 host->bytes_left = left_bytes;
815 host->complete = 1;
816 return;
817}
818
819static void qspi_irq_handler(void *data)
820{
821 struct qspi_host *host = &qspi_host;
822 struct spi_flash_cmd *cmd = host->cmd;
823 u32 fr, resr;
824 (void)data;
825
826 fr = qspi_readl(QSPI0_FR);
827 qspi_writel(fr & ~QSPI_FR_RBDF, QSPI0_FR);
828 if (!cmd) {
829 printf("Interrupt happen while no cmd sent, fr=0x%x\n", fr);
830 return;
831 }
832
833 resr = qspi_readl(QSPI0_RSER);
834 qspi_writel_check(host, 0, QSPI0_RSER, QSPI_RSER_RESV);
835
836 if (fr & (QSPI_FR_ILLINE | QSPI_FR_IUEF | QSPI_FR_IPAEF |
837 QSPI_FR_IPIEF | QSPI_FR_IPGEF |
838 QSPI_FR_RBOF | QSPI_FR_TBUF)) {
839 if (fr & QSPI_FR_ILLINE)
840 printf("Err: Illegal Instruction Error Flag\n");
841 if (fr & QSPI_FR_IUEF)
842 printf("Err: IP Command Usage Error Flag\n");
843 if (fr & QSPI_FR_IPAEF)
844 printf("Err: IP Command Trigger during AHB Access Error Flag\n");
845 if (fr & QSPI_FR_IPIEF)
846 printf("Err: IP Command Trigger could not be executed Error Flag\n");
847 if (fr & QSPI_FR_IPGEF)
848 printf("Err: IP Command Trigger during AHB Grant Error Flag\n");
849 if (fr & QSPI_FR_RBOF)
850 printf("Error: RX Buffer Overflow\n");
851 if (fr & QSPI_FR_TBUF) {
852 int mcr;
853
854 mcr = qspi_readl(QSPI0_MCR);
855 mcr |= QSPI_MCR_CLR_TXF;
856 qspi_writel_clear(host, mcr, QSPI0_MCR,
857 ~QSPI_MCR_CLR_TXF);
858 cmd->error = -EAGAIN;
859 printf("Error: TX Buffer Underrun Flag\n");
860 }
861 host->complete = 1;
862 }
863
864 if (!host->use_dma && host->bytes_left > 0) {
865 if (cmd->n_tx && (fr & QSPI_FR_TBFF)) {
866 if (!qspi_fill_to_txbuff(host))
867 resr &= ~QSPI_RSER_TBFIE;
868 }
869 if (cmd->n_rx && (fr & QSPI_FR_RBDF))
870 qspi_read_from_rxbuff(host);
871 }
872
873 if (fr & QSPI_FR_TFF)
874 qspi_xfer_done(host);
875
876 qspi_writel_check(host, resr, QSPI0_RSER, QSPI_RSER_RESV);
877 return;
878}
879
880struct qspi_host * qspi_host_init(int cs, int mhz, int use_xip)
881{
882 struct qspi_host *host = &qspi_host;
883 u32 reg;
884
885 memset(host, 0, sizeof(struct qspi_host));
886 host->cs_addr[QSPI_CS_A1] = QSPI0_FLASH_A1_BASE;
887 host->cs_addr[QSPI_CS_A2] = QSPI0_FLASH_A2_BASE;
888 host->cs_addr[QSPI_CS_B1] = QSPI0_FLASH_B1_BASE;
889 host->cs_addr[QSPI_CS_B2] = QSPI0_FLASH_B2_BASE;
890
891 host->use_intr = 0;
892 host->en_tx_dma = 1;
893 host->use_xip = use_xip;
894
895 if (cpu_is_asr1806() || cpu_is_asr1903_b0()) {
896 host->has_dtr = 1;
897 host->support_dqs = 1;
898 }
899
900 qspi_config_mfp(cs);
901
902 /* Enable qspi clk, and release reset */
903 qspi_set_func_clk(host, mhz, 0, 0, 0, 0);
904
905 /* qspi softreset first */
906 qspi_invalid_ahb(host);
907
908 qspi_enter_mode(host, QSPI_DISABLE_MODE);
909
910 /* Give the default source address */
911 qspi_write_sfar(host, host->cs_addr[QSPI_CS_A1]);
912 qspi_writel_check(host, 0x0, QSPI0_SFACR, QSPI_SFACR_RESV);
913
914 //qspi_init_ahb(0); /* config ahb */
915
916 /* Set flash memory map */
917 qspi_writel(QSPI0_FLASH_A1_TOP & 0xfffffc00, QSPI0_SFA1AD);
918 qspi_writel(QSPI0_FLASH_A2_TOP & 0xfffffc00, QSPI0_SFA2AD);
919 qspi_writel(QSPI0_FLASH_B1_TOP & 0xfffffc00, QSPI0_SFB1AD);
920 qspi_writel(QSPI0_FLASH_B2_TOP & 0xfffffc00, QSPI0_SFB2AD);
921
922 /*
923 * ISD3FB, ISD2FB, ISD3FA, ISD2FA = 1; ENDIAN = 0x3; END_CFG=0x3
924 * DELAY_CLK4X_EN = 1
925 */
926 reg = qspi_readl(QSPI0_MCR);
927 reg &= ~(QSPI_MCR_END_CFD_MASK | QSPI_MCR_ISDX_MASK);
928 reg &= ~(QSPI_MCR_DQS_EN | QSPI_MCR_DQS_LP_EN | QSPI_MCR_DQS_INV_EN);
929 reg |= QSPI_MCR_END_CFD_LE | 0xf << QSPI_MCR_ISDX_SHIFT;
930 if (host->has_dtr)
931 reg |= QSPI_MCR_DDR_EN;
932 else
933 reg &= ~QSPI_MCR_DDR_EN;
934 qspi_writel_check(host, reg, QSPI0_MCR, QSPI_MCR_RESV);
935
936 /* Module enabled */
937 qspi_enter_mode(host, QSPI_NORMAL_MODE);
938
939 /* Read using the IP Bus registers QSPI_RBDR0 to QSPI_RBDR31*/
940 qspi_write_rbct(host, QSPI_RBCT_RXBRD);
941
942 //if (host->use_intr) {
943 // ISR_Connect(45, qspi_irq_handler, 0);
944 // INT_Enable(45, 0, 15);
945 //}
946
947 //printf("tx_desc: 0x%x\n", tx_desc);
948 printf("use_intr=%d en_tx_dma=%d use_xip=%d\n",
949 host->use_intr, host->en_tx_dma, host->use_xip);
950 return host;
951}
952
953static void qspi_wait_cmd_done(struct qspi_host *host)
954{
955 struct spi_flash_cmd *cmd = host->cmd;
956 u32 fr;
957
958 /*
959 * Known BUG:
960 * Poll QSPI register during TX may lead to bus hang, add
961 * a delay here for this requirement.
962 */
963 if (cmd->n_tx && !host->use_intr)
964 udelay(5);
965
966 do {
967 fr = qspi_readl(QSPI0_FR);
968 if (fr)
969 qspi_writel(fr, QSPI0_FR);
970
971 if (fr & QSPI_FR_ILLINE) {
972 printf("Err: Illegal Instruction Error Flag\n");
973 break;
974 }
975
976 if (fr & QSPI_FR_IUEF) {
977 printf("Err: IP Command Usage Error Flag\n");
978 break;
979 }
980
981 if (fr & QSPI_FR_IPAEF) {
982 printf("Err: IP Command Trigger during AHB Access Error Flag\n");
983 break;
984 }
985
986 if (fr & QSPI_FR_IPIEF) {
987 printf("Err: IP Command Trigger could not be executed Error Flag\n");
988 break;
989 }
990
991 if (fr & QSPI_FR_IPGEF) {
992 printf("Err: IP Command Trigger during AHB Grant Error Flag\n");
993 break;
994 }
995
996 if (fr & QSPI_FR_TFF) {
997 qspi_writel(0x1, QSPI0_FR);
998 break;
999 }
1000 } while(1);
1001
1002 if (cmd->rx_buf && (fr & QSPI_FR_RBOF))
1003 printf("Error: RX Buffer Overflow\n");
1004 if (cmd->tx_buf && (fr & QSPI_FR_TBUF)) {
1005 int mcr;
1006
1007 mcr = qspi_readl(QSPI0_MCR);
1008 mcr |= QSPI_MCR_CLR_TXF;
1009 qspi_writel_clear(host, mcr, QSPI0_MCR, ~QSPI_MCR_CLR_TXF);
1010 cmd->error = -EAGAIN;
1011 printf("Error: TX Buffer Underrun Flag\n");
1012 }
1013}
1014
1015static void qspi_poll_rx_buff(struct qspi_host *host)
1016{
1017 struct spi_flash_cmd *cmd = host->cmd;
1018 int left_bytes = host->bytes_left;
1019 u32 sr;
1020 u32 data;
1021 int rdbfl, i;
1022
1023 do {
1024 /* Check RXWE flag for data comming */
1025 sr = qspi_readl(QSPI0_FR);
1026 if (!(sr & QSPI_FR_RBDF))
1027 continue;
1028
1029 for (i = 0; i <= host->wmrk; i++) {
1030 data = qspi_readl(QSPI0_RBDR0 + i*4);
1031 if (left_bytes >= 4)
1032 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
1033 &data, 4);
1034 else
1035 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
1036 &data, left_bytes);
1037 left_bytes -= 4;
1038 }
1039
1040 /* Set RBDF to trigger RX Buffer POP */
1041 qspi_writel(QSPI_FR_RBDF, QSPI0_FR);
1042
1043 if (left_bytes < 0) {
1044 break;
1045 } else if ((left_bytes + 3)/4 < (host->wmrk + 1)) {
1046 /* Left bytes < wmrk will not trigger RXWE */
1047 break;
1048 }
1049 } while(1);
1050
1051 /* Wait cmd to be finished */
1052 qspi_wait_cmd_done(host);
1053 if (left_bytes > 0) {
1054 rdbfl = qspi_readl(QSPI0_RBSR);
1055 rdbfl = (rdbfl & QSPI_RBSR_RDBFL_MASK) >> QSPI_RBSR_RDBFL_SHIFT;
1056 for (i = 0; i <= rdbfl; i++) {
1057 data = qspi_readl(QSPI0_RBDR0 + i*4);
1058 if (left_bytes >= 4)
1059 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
1060 &data, 4);
1061 else
1062 memcpy(&cmd->rx_buf[cmd->n_rx - left_bytes],
1063 &data, left_bytes);
1064 left_bytes -= 4;
1065 }
1066 }
1067
1068 if (left_bytes > 0) {
1069 printf("Error: Not read enough data: left_bytes=%d, cmd->n_rx=%d\n",
1070 left_bytes, cmd->n_rx);
1071 }
1072 return;
1073}
1074
1075static void qspi_fill_tx_buff(struct qspi_host *host)
1076{
1077 struct spi_flash_cmd *cmd = host->cmd;
1078 int left_bytes = host->bytes_left;
1079 int total_cnt;
1080 u32 reg;
1081 u32 data;
1082
1083 total_cnt = ALIGN(cmd->n_tx, QSPI_TX_BUFF_POP_MIN);
1084
1085 while (left_bytes > 0) {
1086 reg = qspi_readl(QSPI0_SR);
1087 if (reg & QSPI_SR_TXFULL)
1088 continue;
1089
1090 data = 0;
1091 if (cmd->n_tx - total_cnt + left_bytes >= 4)
1092 data = (*(u32 *)&cmd->tx_buf[total_cnt - left_bytes]);
1093 else if (cmd->n_tx - total_cnt + left_bytes > 0)
1094 memcpy(&data, &cmd->tx_buf[total_cnt - left_bytes],
1095 left_bytes);
1096 qspi_writel(data, QSPI0_TBDR);
1097 left_bytes -= 4;
1098 }
1099
1100 host->bytes_left = left_bytes;
1101 qspi_wait_cmd_done(host);
1102 return;
1103}
1104
1105int qspi_cmd_done_pio(struct qspi_host *host)
1106{
1107 struct spi_flash_cmd *cmd = host->cmd;
1108
1109 /* receive rx data */
1110 if (cmd->n_rx)
1111 qspi_poll_rx_buff(host);
1112 else if (cmd->n_tx)
1113 qspi_fill_tx_buff(host);
1114 else
1115 qspi_wait_cmd_done(host);
1116
1117 return 0;
1118}
1119
1120int qspi_cmd_done_interrupt(struct qspi_host *host)
1121{
1122 while (!(host->complete));
1123
1124 qspi_disable_interrupt(host);
1125 return 0;
1126}
1127
1128int qspi_start_dma_xfer(struct qspi_host *host)
1129{
1130 struct spi_flash_cmd *cmd = host->cmd;
1131 //DMA_CMDx_T TX_data;
1132
1133 //TX_data.value = 0;
1134 //TX_data.bits.IncSrcAddr = 1;
1135 //TX_data.bits.FlowTrg = 1;
1136 //TX_data.bits.Width = 3;
1137 //TX_data.bits.MaxBurstSize = 3;
1138 //TX_data.bits.Length = host->bytes_left;
1139
1140 dmac_map_device_to_channel(QSPI_DMA_TX_DRCMR, QSPI_DMA_TX_CHANNEL); //TX
1141 dmac_user_aligment(QSPI_DMA_TX_CHANNEL);
1142
1143#if 0
1144 config_descriptor((u32 *)tx_desc, 0, (u32)cmd->tx_buf,
1145 QSPI0_TBDR, TX_data.value, 1);
1146 load_descriptor((void *)tx_desc, QSPI_DMA_TX_CHANNEL);
1147#else
1148// dma_set_mode(DMA_MODE_NONFETCH, QSPI_DMA_TX_CHANNEL);
1149// dma_set_reg_nf((u32)cmd->tx_buf, QSPI0_TBDR, &TX_data,
1150// QSPI_DMA_TX_CHANNEL);
1151#endif
1152 pxa_dma_write(QSPI0_TBDR - 4, (u32)cmd->tx_buf,
1153 host->bytes_left, QSPI_DMA_TX_CHANNEL);
1154
1155 flush_dcache_range((u32)cmd->tx_buf, (u32)cmd->tx_buf + cmd->n_tx);
1156 dmac_start_transfer(QSPI_DMA_TX_CHANNEL);
1157 return 0;
1158}
1159
1160static int qspi_check_dtr(struct spi_flash_chip *chip)
1161{
1162 return chip->host->has_dtr;
1163}
1164
1165static int qspi_setup_memmap_read(struct spi_flash_chip *chip,
1166 struct spi_flash_cmd_cfg *xip_cfg)
1167{
1168 /*
1169 * TODO:
1170 * Maybe change due to different vendor
1171 */
1172 qspi_enable_xip(chip, xip_cfg);
1173 if (qspi_preinit_lookup_tbl(chip) < 0) {
1174 pr_info("preinit_lookup_tbl failed, check cmd table\n");
1175 return -1;
1176 }
1177
1178 return 0;
1179}
1180
1181static int qspi_search_bbm_table(struct spi_flash_chip *chip, int addr)
1182{
1183 struct pxa3xx_bbm *pxa3xx_bbm = chip->mtd->bbm;
1184
1185 if (pxa3xx_bbm)
1186 addr = pxa3xx_bbm->search(chip->mtd, addr);
1187
1188 return addr;
1189}
1190
1191#ifdef CONFIG_SPINAND_BITFLIP_SCRUB
1192static int qspi_low_level_scrub(struct spi_flash_chip *chip, int page_addr,
1193 int corrected)
1194{
1195 struct pxa3xx_bbm *pxa3xx_bbm = chip->mtd->bbm;
1196
1197 if (pxa3xx_bbm && pxa3xx_bbm->scrub_read_disturb &&
1198 chip->refresh_threshold) {
1199 if (corrected >= chip->refresh_threshold)
1200 pxa3xx_bbm->scrub_read_disturb(chip->mtd,
1201 page_addr << chip->mtd->writesize_shift);
1202
1203 /* Do not report bit-flip if bbm enabled */
1204 corrected = 0;
1205 }
1206
1207 return corrected;
1208}
1209#endif
1210
1211static int qspi_ahb_read(struct spi_flash_chip *chip,
1212 u8 *buf, u32 from, u32 len)
1213{
1214 struct qspi_host *host = chip->host;
1215
1216 memcpy(buf, host->cs_addr[chip->cs] + from, len);
1217 return 0;
1218}
1219
1220static void qspi_prepare_recv(struct qspi_host *host)
1221{
1222 struct spi_flash_cmd *cmd = host->cmd;
1223 u32 reg;
1224 int wmrk;
1225
1226 /* Clear RX FIFO. Invalidate the RX Buffer */
1227 reg = qspi_readl(QSPI0_MCR);
1228 reg |= QSPI_MCR_CLR_RXF;
1229 qspi_writel_clear(host, reg, QSPI0_MCR, ~QSPI_MCR_CLR_RXF);
1230
1231 /* Set RX Buffer Watermark */
1232 if (cmd->n_rx <= (QSPI_RX_BUFF_MAX << 2))
1233 wmrk = (ALIGN(cmd->n_rx, 4) >> 2) - 1;
1234 else
1235 wmrk = 0x1; /* Water Mark: 16*4byte */
1236
1237 reg = qspi_readl(QSPI0_RBCT);
1238 reg &= ~QSPI_RBCT_WMRK_MASK;
1239 reg |= wmrk;
1240 qspi_write_rbct(host, reg);
1241
1242 host->wmrk = wmrk;
1243 host->bytes_left = cmd->n_rx;
1244}
1245
1246static void qspi_prepare_transmit(struct qspi_host *host)
1247{
1248 struct spi_flash_cmd *cmd = host->cmd;
1249 u32 reg;
1250 int wmrk;
1251
1252 /* Clear TX FIFO/Buffer */
1253 reg = qspi_readl(QSPI0_MCR);
1254 reg |= QSPI_MCR_CLR_TXF;
1255 qspi_writel_clear(host, reg, QSPI0_MCR, ~QSPI_MCR_CLR_TXF);
1256
1257 host->bytes_left = ALIGN(cmd->n_tx, QSPI_TX_BUFF_POP_MIN);
1258 if (host->en_tx_dma && host->bytes_left >= 32) {
1259 wmrk = 0x7; /* 32bytes watermark */
1260
1261 reg = qspi_readl(QSPI0_TBCT);
1262 reg &= ~0x1f;
1263 reg |= wmrk;
1264 qspi_writel_check(host, reg, QSPI0_TBCT, QSPI_TBCT_RESV);
1265
1266 host->wmrk = wmrk;
1267 host->use_dma = 1;
1268 } else {
1269 int i, left_bytes, tx_cnt;
1270
1271 /* Copy initial data into the circular buffer */
1272 host->use_dma = 0;
1273 tx_cnt = min(host->bytes_left >> 2, QSPI_TX_BUFF_MAX);
1274 for (i = 0; i < tx_cnt; i++) {
1275 int data = 0;
1276
1277 left_bytes = cmd->n_tx - (i << 2);
1278 if (left_bytes >= 4)
1279 data = (*(u32 *)&cmd->tx_buf[i << 2]);
1280 else if (left_bytes > 0)
1281 memcpy(&data, &cmd->tx_buf[i << 2], left_bytes);
1282
1283 qspi_writel(data, QSPI0_TBDR);
1284 }
1285 host->bytes_left -= tx_cnt << 2;
1286 }
1287}
1288
1289static int qspi_start_cmd(struct spi_flash_chip *chip,
1290 struct spi_flash_cmd *cmd)
1291{
1292 struct qspi_host *host = chip->host;
1293 struct spi_flash_cmd_cfg *cmd_cfg = cmd->cmd_cfg;
1294 u32 ipcr, sfar, fr, tmp;
1295 int seq_id = cmd_cfg->seq_id;
1296 int i;
1297
1298 do {
1299 tmp = qspi_readl(QSPI0_SR);
1300 if (!(tmp & QSPI_SR_BUSY))
1301 break;
1302 udelay(1);
1303 //printf("The controller is busy, 0x%x\n", tmp);
1304 } while (1);
1305
1306 host->cmd = cmd;
1307 host->bytes_left = 0;
1308 host->complete = 0;
1309 host->use_dma = 0;
1310
1311 if (seq_id < 0 || !(host->lut_map & 1 << seq_id))
1312 seq_id = qspi_update_shared_lut(chip, cmd);
1313
1314 /* Reset the IP sequence pointers */
1315 tmp = qspi_readl(QSPI0_SPTRCLR);
1316 tmp |= QSPI_SPTRCLR_IPPTRC;
1317 qspi_writel_clear(host, tmp, QSPI0_SPTRCLR, QSPI_SPTRCLR_RESV);
1318
1319 /* Set flash address to be accessed */
1320 sfar = 0;
1321 for (i = 0; i < cmd->n_addr; i++) {
1322 sfar <<= 8;
1323 sfar |= cmd->addr[i];
1324 }
1325 sfar += host->cs_addr[chip->cs];
1326 qspi_write_sfar(host, sfar);
1327
1328 /*
1329 * AHB memory-map to be changed, invalidate d-cache here
1330 * For spi-nand, only one-page mapped, use AHB_MAP_SIZE_PAGE
1331 * for this situation.
1332 */
1333 if (host->use_xip && (cmd->flag & RST_AHB_DOMAIN)) {
1334 int addr, size;
1335
1336 if (cmd->tx_buf) {
1337 addr = sfar;
1338 size = cmd->n_tx;
1339 } else if (cmd->flag & AHB_MAP_SIZE_PAGE) {
1340 addr = host->cs_addr[chip->cs];
1341 size = chip->page_size;
1342 } else {
1343 addr = sfar;
1344 size = chip->block_size;
1345 }
1346
1347 flush_dcache_range(addr, size);
1348 }
1349
1350 /* Clear FR before trigger command */
1351 fr = qspi_readl(QSPI0_FR);
1352 if (fr)
1353 qspi_writel(fr, QSPI0_FR);
1354
1355 /* Set SFACR to fix issue of 1-byte address command */
1356 if (cmd->n_addr == 1)
1357 qspi_writel_check(host, 0x8, QSPI0_SFACR, QSPI_SFACR_RESV);
1358 if (cmd->n_rx) {
1359 qspi_prepare_recv(host);
1360 } else if (cmd->n_tx) {
1361 qspi_prepare_transmit(host);
1362 if (host->use_dma) {
1363 qspi_enable_dma(host);
1364 qspi_start_dma_xfer(host);
1365 /*
1366 * Before trigger qspi to send data to externl bus,FIFO
1367 * need to have some data, or FIFO underflow error may happen.
1368 * DMA need some time to write data to TX FIFO, but
1369 * poll QSPI register may lead to bus hang(known bug), so we add
1370 * a delay here for this requirement.
1371 */
1372 udelay(5);
1373 }
1374 }
1375
1376 /* trigger command */
1377 ipcr = (seq_id << QSPI_IPCR_SEQID_SHIFT) & QSPI_IPCR_SEQID_MASK;
1378 if (cmd->rx_buf)
1379 ipcr |= (cmd->n_rx & 0xffff);
1380 else if (cmd->tx_buf)
1381 ipcr |= (cmd->n_tx & 0xffff);
1382 restart:
1383 qspi_writel(ipcr, QSPI0_IPCR);
1384
1385 if (cmd->n_tx && host->use_dma) {
1386 int timeout = 10000;
1387
1388 do {
1389 if (dmac_read_dcsr(QSPI_DMA_TX_CHANNEL) & DCSR_STOPSTATE) {
1390 /*
1391 * Add extra delay to make sure dma transfer
1392 * finished on APB bus
1393 */
1394 udelay(2);
1395 break;
1396 }
1397
1398 if (--timeout < 0) {
1399 fr = qspi_readl(QSPI0_FR);
1400 if (fr & (QSPI_FR_IPAEF | QSPI_FR_IPIEF |
1401 QSPI_FR_IPGEF)) {
1402 printf("qspi: cmd trigger failed, "
1403 "fr=0x%x. restart...\n", fr);
1404 qspi_writel(fr, QSPI0_FR);
1405 goto restart;
1406 }
1407
1408 DCSR(QSPI_DMA_TX_CHANNEL) &= ~DCSR_RUN;
1409 printf("err: qspi tx dma timeout\n");
1410 if (fr & (QSPI_FR_TBUF | QSPI_FR_TFF)) {
1411 cmd->error = -EAGAIN;
1412 pr_debug("TX Buffer Underrun, retry\n");
1413 break;
1414 }
1415 BUG();
1416 }
1417
1418 udelay(1);
1419 } while (1);
1420 }
1421
1422 fr = qspi_readl(QSPI0_FR);
1423 if (fr & (QSPI_FR_IPAEF | QSPI_FR_IPIEF | QSPI_FR_IPGEF)) {
1424 printf("qspi: cmd trigger failed, fr=0x%x. restart...\n", fr);
1425 qspi_writel(fr, QSPI0_FR);
1426 goto restart;
1427 }
1428
1429 if (host->use_intr) {
1430 qspi_enable_interrupt(host);
1431 qspi_cmd_done_interrupt(host);
1432 } else {
1433 if (host->use_dma) {
1434 qspi_wait_cmd_done(host);
1435 qspi_disable_dma(host);
1436 host->bytes_left = 0;
1437 } else {
1438 qspi_cmd_done_pio(host);
1439 }
1440 }
1441
1442 /* Resume SFACR */
1443 if (cmd->n_addr == 1)
1444 qspi_writel_check(host, 0x0, QSPI0_SFACR, QSPI_SFACR_RESV);
1445
1446 if (cmd->flag & RST_AHB_DOMAIN)
1447 qspi_invalid_ahb(host);
1448
1449 host->cmd = NULL;
1450 return cmd->error;
1451}
1452
1453int asr_qspi_probe_flash(int nand, int cs, int mhz,
1454 int rx_mode, int tx_mode)
1455{
1456 struct spi_flash_chip *chip;
1457 struct mtd_info *mtd;
1458 struct qspi_host *host;
1459 int ret;
1460
1461 host = qspi_host_init(cs, 13, 1);
1462 chip = kzalloc(sizeof(struct spi_flash_chip), GFP_KERNEL);
1463 if (!chip) {
1464 ret = -ENOMEM;
1465 goto err1;
1466 }
1467
1468 chip->host = host;
1469 chip->cs = cs >= QSPI_CS_MAX ? QSPI_CS_A1 : cs;
1470 chip->rx_mode = rx_mode;
1471 chip->tx_mode = tx_mode;
1472 chip->bus_clk = host->bus_clk;
1473 chip->issue_cmd = qspi_start_cmd;
1474 chip->memmap_read = qspi_ahb_read;
1475 chip->search_bbm_table = qspi_search_bbm_table;
1476#ifdef CONFIG_SPINAND_BITFLIP_SCRUB
1477 chip->low_level_scrub = qspi_low_level_scrub;
1478#endif
1479 chip->setup_memmap_read = qspi_setup_memmap_read;
1480 chip->check_dtr = qspi_check_dtr;
1481
1482 mtd = kzalloc(sizeof(struct mtd_info), GFP_KERNEL);
1483 if (!mtd) {
1484 ret = -ENOMEM;
1485 goto err2;
1486 }
1487
1488 mtd->priv = chip;
1489 chip->mtd = mtd;
1490
1491 /* Init rx_max_len/tx_max_len because spi_nand_scan_tail may need this */
1492 chip->tx_max_len = QSPI_TX_BUFF_MAX << 2;
1493 chip->rx_max_len = QSPI_RX_BUFF_MAX << 2;
1494 if (nand) {
1495 chip->name = "nand0";
1496 chip->options |= BBT_RELOCATION_IFBAD;
1497#ifdef CONFIG_BBM
1498 chip->scan_bbt = pxa3xx_scan_bbt;
1499 chip->block_bad = pxa3xx_block_bad;
1500 chip->block_markbad = pxa3xx_block_markbad;
1501#endif
1502#ifdef CONFIG_CMD_SPIFLASH_NAND
1503 spi_nand_scan_ident(mtd);
1504 spi_nand_scan_tail(mtd);
1505#endif
1506 } else {
1507 chip->name = "nor0";
1508#ifdef CONFIG_CMD_SPIFLASH_NOR
1509 spi_nor_scan_ident(mtd);
1510 spi_nor_scan_tail(mtd);
1511#endif
1512 }
1513
1514 if (chip->max_mhz && mhz > chip->max_mhz) {
1515 printf("warn: device max supported frequency is %d MHz!!!\n",
1516 chip->max_mhz);
1517 mhz = chip->max_mhz;
1518 }
1519
1520 qspi_set_func_clk(host, mhz, chip->options & SPINAND_SUPPORT_DTR,
1521 chip->tclqv, chip->tset, chip->thold);
1522
1523 if (!host->en_tx_dma)
1524 chip->tx_max_len = QSPI_TX_BUFF_MAX << 2;
1525 else
1526 chip->tx_max_len = chip->page_size;
1527
1528 if (chip->xip_read)
1529 chip->rx_max_len = chip->page_size;
1530 else
1531 chip->rx_max_len = QSPI_RX_BUFF_MAX << 2;
1532
1533#ifdef CONFIG_CMD_UBI
1534 add_mtd_device(mtd);
1535#endif
1536 return 0;
1537err3:
1538 kfree(mtd);
1539err2:
1540 kfree(chip);
1541err1:
1542 return ret;
1543}