diff options
author | Yao Yuan <yao.yuan@freescale.com> | 2016-01-26 02:23:55 -0500 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2016-03-07 14:46:43 -0500 |
commit | 2012850be8e3324bf3420ea08e1d0ee75c8d134c (patch) | |
tree | 9786ad73e73cf196fbd352f3ca26ffc95ce918a1 | |
parent | 4607777c71be52c4e7c9cbcf8ecac4a452090d7d (diff) |
mtd: spi-nor: fsl-quadspi: add big-endian support
Add R/W functions for big- or little-endian registers:
The qSPI controller's endian is independent of the CPU core's endian.
So far, the qSPI have two versions for big-endian and little-endian.
Signed-off-by: Yuan Yao <yao.yuan@nxp.com>
Acked-by: Han xu <han.xu@freescale.com>
Acked-by: Han xu <han.xu@nxp.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-rw-r--r-- | drivers/mtd/spi-nor/fsl-quadspi.c | 157 |
1 files changed, 97 insertions, 60 deletions
diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c index 54640f1eb3a1..04e8a93e1a3a 100644 --- a/drivers/mtd/spi-nor/fsl-quadspi.c +++ b/drivers/mtd/spi-nor/fsl-quadspi.c | |||
@@ -275,6 +275,7 @@ struct fsl_qspi { | |||
275 | u32 clk_rate; | 275 | u32 clk_rate; |
276 | unsigned int chip_base_addr; /* We may support two chips. */ | 276 | unsigned int chip_base_addr; /* We may support two chips. */ |
277 | bool has_second_chip; | 277 | bool has_second_chip; |
278 | bool big_endian; | ||
278 | struct mutex lock; | 279 | struct mutex lock; |
279 | struct pm_qos_request pm_qos_req; | 280 | struct pm_qos_request pm_qos_req; |
280 | }; | 281 | }; |
@@ -300,6 +301,28 @@ static inline int needs_wakeup_wait_mode(struct fsl_qspi *q) | |||
300 | } | 301 | } |
301 | 302 | ||
302 | /* | 303 | /* |
304 | * R/W functions for big- or little-endian registers: | ||
305 | * The qSPI controller's endian is independent of the CPU core's endian. | ||
306 | * So far, although the CPU core is little-endian but the qSPI have two | ||
307 | * versions for big-endian and little-endian. | ||
308 | */ | ||
309 | static void qspi_writel(struct fsl_qspi *q, u32 val, void __iomem *addr) | ||
310 | { | ||
311 | if (q->big_endian) | ||
312 | iowrite32be(val, addr); | ||
313 | else | ||
314 | iowrite32(val, addr); | ||
315 | } | ||
316 | |||
317 | static u32 qspi_readl(struct fsl_qspi *q, void __iomem *addr) | ||
318 | { | ||
319 | if (q->big_endian) | ||
320 | return ioread32be(addr); | ||
321 | else | ||
322 | return ioread32(addr); | ||
323 | } | ||
324 | |||
325 | /* | ||
303 | * An IC bug makes us to re-arrange the 32-bit data. | 326 | * An IC bug makes us to re-arrange the 32-bit data. |
304 | * The following chips, such as IMX6SLX, have fixed this bug. | 327 | * The following chips, such as IMX6SLX, have fixed this bug. |
305 | */ | 328 | */ |
@@ -310,14 +333,14 @@ static inline u32 fsl_qspi_endian_xchg(struct fsl_qspi *q, u32 a) | |||
310 | 333 | ||
311 | static inline void fsl_qspi_unlock_lut(struct fsl_qspi *q) | 334 | static inline void fsl_qspi_unlock_lut(struct fsl_qspi *q) |
312 | { | 335 | { |
313 | writel(QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY); | 336 | qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY); |
314 | writel(QUADSPI_LCKER_UNLOCK, q->iobase + QUADSPI_LCKCR); | 337 | qspi_writel(q, QUADSPI_LCKER_UNLOCK, q->iobase + QUADSPI_LCKCR); |
315 | } | 338 | } |
316 | 339 | ||
317 | static inline void fsl_qspi_lock_lut(struct fsl_qspi *q) | 340 | static inline void fsl_qspi_lock_lut(struct fsl_qspi *q) |
318 | { | 341 | { |
319 | writel(QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY); | 342 | qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY); |
320 | writel(QUADSPI_LCKER_LOCK, q->iobase + QUADSPI_LCKCR); | 343 | qspi_writel(q, QUADSPI_LCKER_LOCK, q->iobase + QUADSPI_LCKCR); |
321 | } | 344 | } |
322 | 345 | ||
323 | static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id) | 346 | static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id) |
@@ -326,8 +349,8 @@ static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id) | |||
326 | u32 reg; | 349 | u32 reg; |
327 | 350 | ||
328 | /* clear interrupt */ | 351 | /* clear interrupt */ |
329 | reg = readl(q->iobase + QUADSPI_FR); | 352 | reg = qspi_readl(q, q->iobase + QUADSPI_FR); |
330 | writel(reg, q->iobase + QUADSPI_FR); | 353 | qspi_writel(q, reg, q->iobase + QUADSPI_FR); |
331 | 354 | ||
332 | if (reg & QUADSPI_FR_TFF_MASK) | 355 | if (reg & QUADSPI_FR_TFF_MASK) |
333 | complete(&q->c); | 356 | complete(&q->c); |
@@ -348,7 +371,7 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q) | |||
348 | 371 | ||
349 | /* Clear all the LUT table */ | 372 | /* Clear all the LUT table */ |
350 | for (i = 0; i < QUADSPI_LUT_NUM; i++) | 373 | for (i = 0; i < QUADSPI_LUT_NUM; i++) |
351 | writel(0, base + QUADSPI_LUT_BASE + i * 4); | 374 | qspi_writel(q, 0, base + QUADSPI_LUT_BASE + i * 4); |
352 | 375 | ||
353 | /* Quad Read */ | 376 | /* Quad Read */ |
354 | lut_base = SEQID_QUAD_READ * 4; | 377 | lut_base = SEQID_QUAD_READ * 4; |
@@ -364,14 +387,15 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q) | |||
364 | dummy = 8; | 387 | dummy = 8; |
365 | } | 388 | } |
366 | 389 | ||
367 | writel(LUT0(CMD, PAD1, cmd) | LUT1(ADDR, PAD1, addrlen), | 390 | qspi_writel(q, LUT0(CMD, PAD1, cmd) | LUT1(ADDR, PAD1, addrlen), |
368 | base + QUADSPI_LUT(lut_base)); | 391 | base + QUADSPI_LUT(lut_base)); |
369 | writel(LUT0(DUMMY, PAD1, dummy) | LUT1(FSL_READ, PAD4, rxfifo), | 392 | qspi_writel(q, LUT0(DUMMY, PAD1, dummy) | LUT1(FSL_READ, PAD4, rxfifo), |
370 | base + QUADSPI_LUT(lut_base + 1)); | 393 | base + QUADSPI_LUT(lut_base + 1)); |
371 | 394 | ||
372 | /* Write enable */ | 395 | /* Write enable */ |
373 | lut_base = SEQID_WREN * 4; | 396 | lut_base = SEQID_WREN * 4; |
374 | writel(LUT0(CMD, PAD1, SPINOR_OP_WREN), base + QUADSPI_LUT(lut_base)); | 397 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WREN), |
398 | base + QUADSPI_LUT(lut_base)); | ||
375 | 399 | ||
376 | /* Page Program */ | 400 | /* Page Program */ |
377 | lut_base = SEQID_PP * 4; | 401 | lut_base = SEQID_PP * 4; |
@@ -385,13 +409,15 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q) | |||
385 | addrlen = ADDR32BIT; | 409 | addrlen = ADDR32BIT; |
386 | } | 410 | } |
387 | 411 | ||
388 | writel(LUT0(CMD, PAD1, cmd) | LUT1(ADDR, PAD1, addrlen), | 412 | qspi_writel(q, LUT0(CMD, PAD1, cmd) | LUT1(ADDR, PAD1, addrlen), |
389 | base + QUADSPI_LUT(lut_base)); | 413 | base + QUADSPI_LUT(lut_base)); |
390 | writel(LUT0(FSL_WRITE, PAD1, 0), base + QUADSPI_LUT(lut_base + 1)); | 414 | qspi_writel(q, LUT0(FSL_WRITE, PAD1, 0), |
415 | base + QUADSPI_LUT(lut_base + 1)); | ||
391 | 416 | ||
392 | /* Read Status */ | 417 | /* Read Status */ |
393 | lut_base = SEQID_RDSR * 4; | 418 | lut_base = SEQID_RDSR * 4; |
394 | writel(LUT0(CMD, PAD1, SPINOR_OP_RDSR) | LUT1(FSL_READ, PAD1, 0x1), | 419 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDSR) | |
420 | LUT1(FSL_READ, PAD1, 0x1), | ||
395 | base + QUADSPI_LUT(lut_base)); | 421 | base + QUADSPI_LUT(lut_base)); |
396 | 422 | ||
397 | /* Erase a sector */ | 423 | /* Erase a sector */ |
@@ -400,40 +426,46 @@ static void fsl_qspi_init_lut(struct fsl_qspi *q) | |||
400 | cmd = q->nor[0].erase_opcode; | 426 | cmd = q->nor[0].erase_opcode; |
401 | addrlen = q->nor_size <= SZ_16M ? ADDR24BIT : ADDR32BIT; | 427 | addrlen = q->nor_size <= SZ_16M ? ADDR24BIT : ADDR32BIT; |
402 | 428 | ||
403 | writel(LUT0(CMD, PAD1, cmd) | LUT1(ADDR, PAD1, addrlen), | 429 | qspi_writel(q, LUT0(CMD, PAD1, cmd) | LUT1(ADDR, PAD1, addrlen), |
404 | base + QUADSPI_LUT(lut_base)); | 430 | base + QUADSPI_LUT(lut_base)); |
405 | 431 | ||
406 | /* Erase the whole chip */ | 432 | /* Erase the whole chip */ |
407 | lut_base = SEQID_CHIP_ERASE * 4; | 433 | lut_base = SEQID_CHIP_ERASE * 4; |
408 | writel(LUT0(CMD, PAD1, SPINOR_OP_CHIP_ERASE), | 434 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_CHIP_ERASE), |
409 | base + QUADSPI_LUT(lut_base)); | 435 | base + QUADSPI_LUT(lut_base)); |
410 | 436 | ||
411 | /* READ ID */ | 437 | /* READ ID */ |
412 | lut_base = SEQID_RDID * 4; | 438 | lut_base = SEQID_RDID * 4; |
413 | writel(LUT0(CMD, PAD1, SPINOR_OP_RDID) | LUT1(FSL_READ, PAD1, 0x8), | 439 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDID) | |
440 | LUT1(FSL_READ, PAD1, 0x8), | ||
414 | base + QUADSPI_LUT(lut_base)); | 441 | base + QUADSPI_LUT(lut_base)); |
415 | 442 | ||
416 | /* Write Register */ | 443 | /* Write Register */ |
417 | lut_base = SEQID_WRSR * 4; | 444 | lut_base = SEQID_WRSR * 4; |
418 | writel(LUT0(CMD, PAD1, SPINOR_OP_WRSR) | LUT1(FSL_WRITE, PAD1, 0x2), | 445 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WRSR) | |
446 | LUT1(FSL_WRITE, PAD1, 0x2), | ||
419 | base + QUADSPI_LUT(lut_base)); | 447 | base + QUADSPI_LUT(lut_base)); |
420 | 448 | ||
421 | /* Read Configuration Register */ | 449 | /* Read Configuration Register */ |
422 | lut_base = SEQID_RDCR * 4; | 450 | lut_base = SEQID_RDCR * 4; |
423 | writel(LUT0(CMD, PAD1, SPINOR_OP_RDCR) | LUT1(FSL_READ, PAD1, 0x1), | 451 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDCR) | |
452 | LUT1(FSL_READ, PAD1, 0x1), | ||
424 | base + QUADSPI_LUT(lut_base)); | 453 | base + QUADSPI_LUT(lut_base)); |
425 | 454 | ||
426 | /* Write disable */ | 455 | /* Write disable */ |
427 | lut_base = SEQID_WRDI * 4; | 456 | lut_base = SEQID_WRDI * 4; |
428 | writel(LUT0(CMD, PAD1, SPINOR_OP_WRDI), base + QUADSPI_LUT(lut_base)); | 457 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WRDI), |
458 | base + QUADSPI_LUT(lut_base)); | ||
429 | 459 | ||
430 | /* Enter 4 Byte Mode (Micron) */ | 460 | /* Enter 4 Byte Mode (Micron) */ |
431 | lut_base = SEQID_EN4B * 4; | 461 | lut_base = SEQID_EN4B * 4; |
432 | writel(LUT0(CMD, PAD1, SPINOR_OP_EN4B), base + QUADSPI_LUT(lut_base)); | 462 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_EN4B), |
463 | base + QUADSPI_LUT(lut_base)); | ||
433 | 464 | ||
434 | /* Enter 4 Byte Mode (Spansion) */ | 465 | /* Enter 4 Byte Mode (Spansion) */ |
435 | lut_base = SEQID_BRWR * 4; | 466 | lut_base = SEQID_BRWR * 4; |
436 | writel(LUT0(CMD, PAD1, SPINOR_OP_BRWR), base + QUADSPI_LUT(lut_base)); | 467 | qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_BRWR), |
468 | base + QUADSPI_LUT(lut_base)); | ||
437 | 469 | ||
438 | fsl_qspi_lock_lut(q); | 470 | fsl_qspi_lock_lut(q); |
439 | } | 471 | } |
@@ -488,15 +520,16 @@ fsl_qspi_runcmd(struct fsl_qspi *q, u8 cmd, unsigned int addr, int len) | |||
488 | q->chip_base_addr, addr, len, cmd); | 520 | q->chip_base_addr, addr, len, cmd); |
489 | 521 | ||
490 | /* save the reg */ | 522 | /* save the reg */ |
491 | reg = readl(base + QUADSPI_MCR); | 523 | reg = qspi_readl(q, base + QUADSPI_MCR); |
492 | 524 | ||
493 | writel(q->memmap_phy + q->chip_base_addr + addr, base + QUADSPI_SFAR); | 525 | qspi_writel(q, q->memmap_phy + q->chip_base_addr + addr, |
494 | writel(QUADSPI_RBCT_WMRK_MASK | QUADSPI_RBCT_RXBRD_USEIPS, | 526 | base + QUADSPI_SFAR); |
527 | qspi_writel(q, QUADSPI_RBCT_WMRK_MASK | QUADSPI_RBCT_RXBRD_USEIPS, | ||
495 | base + QUADSPI_RBCT); | 528 | base + QUADSPI_RBCT); |
496 | writel(reg | QUADSPI_MCR_CLR_RXF_MASK, base + QUADSPI_MCR); | 529 | qspi_writel(q, reg | QUADSPI_MCR_CLR_RXF_MASK, base + QUADSPI_MCR); |
497 | 530 | ||
498 | do { | 531 | do { |
499 | reg2 = readl(base + QUADSPI_SR); | 532 | reg2 = qspi_readl(q, base + QUADSPI_SR); |
500 | if (reg2 & (QUADSPI_SR_IP_ACC_MASK | QUADSPI_SR_AHB_ACC_MASK)) { | 533 | if (reg2 & (QUADSPI_SR_IP_ACC_MASK | QUADSPI_SR_AHB_ACC_MASK)) { |
501 | udelay(1); | 534 | udelay(1); |
502 | dev_dbg(q->dev, "The controller is busy, 0x%x\n", reg2); | 535 | dev_dbg(q->dev, "The controller is busy, 0x%x\n", reg2); |
@@ -507,21 +540,22 @@ fsl_qspi_runcmd(struct fsl_qspi *q, u8 cmd, unsigned int addr, int len) | |||
507 | 540 | ||
508 | /* trigger the LUT now */ | 541 | /* trigger the LUT now */ |
509 | seqid = fsl_qspi_get_seqid(q, cmd); | 542 | seqid = fsl_qspi_get_seqid(q, cmd); |
510 | writel((seqid << QUADSPI_IPCR_SEQID_SHIFT) | len, base + QUADSPI_IPCR); | 543 | qspi_writel(q, (seqid << QUADSPI_IPCR_SEQID_SHIFT) | len, |
544 | base + QUADSPI_IPCR); | ||
511 | 545 | ||
512 | /* Wait for the interrupt. */ | 546 | /* Wait for the interrupt. */ |
513 | if (!wait_for_completion_timeout(&q->c, msecs_to_jiffies(1000))) { | 547 | if (!wait_for_completion_timeout(&q->c, msecs_to_jiffies(1000))) { |
514 | dev_err(q->dev, | 548 | dev_err(q->dev, |
515 | "cmd 0x%.2x timeout, addr@%.8x, FR:0x%.8x, SR:0x%.8x\n", | 549 | "cmd 0x%.2x timeout, addr@%.8x, FR:0x%.8x, SR:0x%.8x\n", |
516 | cmd, addr, readl(base + QUADSPI_FR), | 550 | cmd, addr, qspi_readl(q, base + QUADSPI_FR), |
517 | readl(base + QUADSPI_SR)); | 551 | qspi_readl(q, base + QUADSPI_SR)); |
518 | err = -ETIMEDOUT; | 552 | err = -ETIMEDOUT; |
519 | } else { | 553 | } else { |
520 | err = 0; | 554 | err = 0; |
521 | } | 555 | } |
522 | 556 | ||
523 | /* restore the MCR */ | 557 | /* restore the MCR */ |
524 | writel(reg, base + QUADSPI_MCR); | 558 | qspi_writel(q, reg, base + QUADSPI_MCR); |
525 | 559 | ||
526 | return err; | 560 | return err; |
527 | } | 561 | } |
@@ -533,7 +567,7 @@ static void fsl_qspi_read_data(struct fsl_qspi *q, int len, u8 *rxbuf) | |||
533 | int i = 0; | 567 | int i = 0; |
534 | 568 | ||
535 | while (len > 0) { | 569 | while (len > 0) { |
536 | tmp = readl(q->iobase + QUADSPI_RBDR + i * 4); | 570 | tmp = qspi_readl(q, q->iobase + QUADSPI_RBDR + i * 4); |
537 | tmp = fsl_qspi_endian_xchg(q, tmp); | 571 | tmp = fsl_qspi_endian_xchg(q, tmp); |
538 | dev_dbg(q->dev, "chip addr:0x%.8x, rcv:0x%.8x\n", | 572 | dev_dbg(q->dev, "chip addr:0x%.8x, rcv:0x%.8x\n", |
539 | q->chip_base_addr, tmp); | 573 | q->chip_base_addr, tmp); |
@@ -561,9 +595,9 @@ static inline void fsl_qspi_invalid(struct fsl_qspi *q) | |||
561 | { | 595 | { |
562 | u32 reg; | 596 | u32 reg; |
563 | 597 | ||
564 | reg = readl(q->iobase + QUADSPI_MCR); | 598 | reg = qspi_readl(q, q->iobase + QUADSPI_MCR); |
565 | reg |= QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK; | 599 | reg |= QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK; |
566 | writel(reg, q->iobase + QUADSPI_MCR); | 600 | qspi_writel(q, reg, q->iobase + QUADSPI_MCR); |
567 | 601 | ||
568 | /* | 602 | /* |
569 | * The minimum delay : 1 AHB + 2 SFCK clocks. | 603 | * The minimum delay : 1 AHB + 2 SFCK clocks. |
@@ -572,7 +606,7 @@ static inline void fsl_qspi_invalid(struct fsl_qspi *q) | |||
572 | udelay(1); | 606 | udelay(1); |
573 | 607 | ||
574 | reg &= ~(QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK); | 608 | reg &= ~(QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK); |
575 | writel(reg, q->iobase + QUADSPI_MCR); | 609 | qspi_writel(q, reg, q->iobase + QUADSPI_MCR); |
576 | } | 610 | } |
577 | 611 | ||
578 | static int fsl_qspi_nor_write(struct fsl_qspi *q, struct spi_nor *nor, | 612 | static int fsl_qspi_nor_write(struct fsl_qspi *q, struct spi_nor *nor, |
@@ -586,20 +620,20 @@ static int fsl_qspi_nor_write(struct fsl_qspi *q, struct spi_nor *nor, | |||
586 | q->chip_base_addr, to, count); | 620 | q->chip_base_addr, to, count); |
587 | 621 | ||
588 | /* clear the TX FIFO. */ | 622 | /* clear the TX FIFO. */ |
589 | tmp = readl(q->iobase + QUADSPI_MCR); | 623 | tmp = qspi_readl(q, q->iobase + QUADSPI_MCR); |
590 | writel(tmp | QUADSPI_MCR_CLR_TXF_MASK, q->iobase + QUADSPI_MCR); | 624 | qspi_writel(q, tmp | QUADSPI_MCR_CLR_TXF_MASK, q->iobase + QUADSPI_MCR); |
591 | 625 | ||
592 | /* fill the TX data to the FIFO */ | 626 | /* fill the TX data to the FIFO */ |
593 | for (j = 0, i = ((count + 3) / 4); j < i; j++) { | 627 | for (j = 0, i = ((count + 3) / 4); j < i; j++) { |
594 | tmp = fsl_qspi_endian_xchg(q, *txbuf); | 628 | tmp = fsl_qspi_endian_xchg(q, *txbuf); |
595 | writel(tmp, q->iobase + QUADSPI_TBDR); | 629 | qspi_writel(q, tmp, q->iobase + QUADSPI_TBDR); |
596 | txbuf++; | 630 | txbuf++; |
597 | } | 631 | } |
598 | 632 | ||
599 | /* fill the TXFIFO upto 16 bytes for i.MX7d */ | 633 | /* fill the TXFIFO upto 16 bytes for i.MX7d */ |
600 | if (needs_fill_txfifo(q)) | 634 | if (needs_fill_txfifo(q)) |
601 | for (; i < 4; i++) | 635 | for (; i < 4; i++) |
602 | writel(tmp, q->iobase + QUADSPI_TBDR); | 636 | qspi_writel(q, tmp, q->iobase + QUADSPI_TBDR); |
603 | 637 | ||
604 | /* Trigger it */ | 638 | /* Trigger it */ |
605 | ret = fsl_qspi_runcmd(q, opcode, to, count); | 639 | ret = fsl_qspi_runcmd(q, opcode, to, count); |
@@ -615,10 +649,10 @@ static void fsl_qspi_set_map_addr(struct fsl_qspi *q) | |||
615 | int nor_size = q->nor_size; | 649 | int nor_size = q->nor_size; |
616 | void __iomem *base = q->iobase; | 650 | void __iomem *base = q->iobase; |
617 | 651 | ||
618 | writel(nor_size + q->memmap_phy, base + QUADSPI_SFA1AD); | 652 | qspi_writel(q, nor_size + q->memmap_phy, base + QUADSPI_SFA1AD); |
619 | writel(nor_size * 2 + q->memmap_phy, base + QUADSPI_SFA2AD); | 653 | qspi_writel(q, nor_size * 2 + q->memmap_phy, base + QUADSPI_SFA2AD); |
620 | writel(nor_size * 3 + q->memmap_phy, base + QUADSPI_SFB1AD); | 654 | qspi_writel(q, nor_size * 3 + q->memmap_phy, base + QUADSPI_SFB1AD); |
621 | writel(nor_size * 4 + q->memmap_phy, base + QUADSPI_SFB2AD); | 655 | qspi_writel(q, nor_size * 4 + q->memmap_phy, base + QUADSPI_SFB2AD); |
622 | } | 656 | } |
623 | 657 | ||
624 | /* | 658 | /* |
@@ -640,24 +674,26 @@ static void fsl_qspi_init_abh_read(struct fsl_qspi *q) | |||
640 | int seqid; | 674 | int seqid; |
641 | 675 | ||
642 | /* AHB configuration for access buffer 0/1/2 .*/ | 676 | /* AHB configuration for access buffer 0/1/2 .*/ |
643 | writel(QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF0CR); | 677 | qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF0CR); |
644 | writel(QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF1CR); | 678 | qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF1CR); |
645 | writel(QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF2CR); | 679 | qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF2CR); |
646 | /* | 680 | /* |
647 | * Set ADATSZ with the maximum AHB buffer size to improve the | 681 | * Set ADATSZ with the maximum AHB buffer size to improve the |
648 | * read performance. | 682 | * read performance. |
649 | */ | 683 | */ |
650 | writel(QUADSPI_BUF3CR_ALLMST_MASK | ((q->devtype_data->ahb_buf_size / 8) | 684 | qspi_writel(q, QUADSPI_BUF3CR_ALLMST_MASK | |
651 | << QUADSPI_BUF3CR_ADATSZ_SHIFT), base + QUADSPI_BUF3CR); | 685 | ((q->devtype_data->ahb_buf_size / 8) |
686 | << QUADSPI_BUF3CR_ADATSZ_SHIFT), | ||
687 | base + QUADSPI_BUF3CR); | ||
652 | 688 | ||
653 | /* We only use the buffer3 */ | 689 | /* We only use the buffer3 */ |
654 | writel(0, base + QUADSPI_BUF0IND); | 690 | qspi_writel(q, 0, base + QUADSPI_BUF0IND); |
655 | writel(0, base + QUADSPI_BUF1IND); | 691 | qspi_writel(q, 0, base + QUADSPI_BUF1IND); |
656 | writel(0, base + QUADSPI_BUF2IND); | 692 | qspi_writel(q, 0, base + QUADSPI_BUF2IND); |
657 | 693 | ||
658 | /* Set the default lut sequence for AHB Read. */ | 694 | /* Set the default lut sequence for AHB Read. */ |
659 | seqid = fsl_qspi_get_seqid(q, q->nor[0].read_opcode); | 695 | seqid = fsl_qspi_get_seqid(q, q->nor[0].read_opcode); |
660 | writel(seqid << QUADSPI_BFGENCR_SEQID_SHIFT, | 696 | qspi_writel(q, seqid << QUADSPI_BFGENCR_SEQID_SHIFT, |
661 | q->iobase + QUADSPI_BFGENCR); | 697 | q->iobase + QUADSPI_BFGENCR); |
662 | } | 698 | } |
663 | 699 | ||
@@ -713,7 +749,7 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q) | |||
713 | return ret; | 749 | return ret; |
714 | 750 | ||
715 | /* Reset the module */ | 751 | /* Reset the module */ |
716 | writel(QUADSPI_MCR_SWRSTSD_MASK | QUADSPI_MCR_SWRSTHD_MASK, | 752 | qspi_writel(q, QUADSPI_MCR_SWRSTSD_MASK | QUADSPI_MCR_SWRSTHD_MASK, |
717 | base + QUADSPI_MCR); | 753 | base + QUADSPI_MCR); |
718 | udelay(1); | 754 | udelay(1); |
719 | 755 | ||
@@ -721,24 +757,24 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q) | |||
721 | fsl_qspi_init_lut(q); | 757 | fsl_qspi_init_lut(q); |
722 | 758 | ||
723 | /* Disable the module */ | 759 | /* Disable the module */ |
724 | writel(QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK, | 760 | qspi_writel(q, QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK, |
725 | base + QUADSPI_MCR); | 761 | base + QUADSPI_MCR); |
726 | 762 | ||
727 | reg = readl(base + QUADSPI_SMPR); | 763 | reg = qspi_readl(q, base + QUADSPI_SMPR); |
728 | writel(reg & ~(QUADSPI_SMPR_FSDLY_MASK | 764 | qspi_writel(q, reg & ~(QUADSPI_SMPR_FSDLY_MASK |
729 | | QUADSPI_SMPR_FSPHS_MASK | 765 | | QUADSPI_SMPR_FSPHS_MASK |
730 | | QUADSPI_SMPR_HSENA_MASK | 766 | | QUADSPI_SMPR_HSENA_MASK |
731 | | QUADSPI_SMPR_DDRSMP_MASK), base + QUADSPI_SMPR); | 767 | | QUADSPI_SMPR_DDRSMP_MASK), base + QUADSPI_SMPR); |
732 | 768 | ||
733 | /* Enable the module */ | 769 | /* Enable the module */ |
734 | writel(QUADSPI_MCR_RESERVED_MASK | QUADSPI_MCR_END_CFG_MASK, | 770 | qspi_writel(q, QUADSPI_MCR_RESERVED_MASK | QUADSPI_MCR_END_CFG_MASK, |
735 | base + QUADSPI_MCR); | 771 | base + QUADSPI_MCR); |
736 | 772 | ||
737 | /* clear all interrupt status */ | 773 | /* clear all interrupt status */ |
738 | writel(0xffffffff, q->iobase + QUADSPI_FR); | 774 | qspi_writel(q, 0xffffffff, q->iobase + QUADSPI_FR); |
739 | 775 | ||
740 | /* enable the interrupt */ | 776 | /* enable the interrupt */ |
741 | writel(QUADSPI_RSER_TFIE, q->iobase + QUADSPI_RSER); | 777 | qspi_writel(q, QUADSPI_RSER_TFIE, q->iobase + QUADSPI_RSER); |
742 | 778 | ||
743 | return 0; | 779 | return 0; |
744 | } | 780 | } |
@@ -954,6 +990,7 @@ static int fsl_qspi_probe(struct platform_device *pdev) | |||
954 | if (IS_ERR(q->iobase)) | 990 | if (IS_ERR(q->iobase)) |
955 | return PTR_ERR(q->iobase); | 991 | return PTR_ERR(q->iobase); |
956 | 992 | ||
993 | q->big_endian = of_property_read_bool(np, "big-endian"); | ||
957 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 994 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
958 | "QuadSPI-memory"); | 995 | "QuadSPI-memory"); |
959 | if (!devm_request_mem_region(dev, res->start, resource_size(res), | 996 | if (!devm_request_mem_region(dev, res->start, resource_size(res), |
@@ -1101,8 +1138,8 @@ static int fsl_qspi_remove(struct platform_device *pdev) | |||
1101 | } | 1138 | } |
1102 | 1139 | ||
1103 | /* disable the hardware */ | 1140 | /* disable the hardware */ |
1104 | writel(QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR); | 1141 | qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR); |
1105 | writel(0x0, q->iobase + QUADSPI_RSER); | 1142 | qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER); |
1106 | 1143 | ||
1107 | mutex_destroy(&q->lock); | 1144 | mutex_destroy(&q->lock); |
1108 | 1145 | ||