aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYao Yuan <yao.yuan@freescale.com>2016-01-26 02:23:55 -0500
committerBrian Norris <computersforpeace@gmail.com>2016-03-07 14:46:43 -0500
commit2012850be8e3324bf3420ea08e1d0ee75c8d134c (patch)
tree9786ad73e73cf196fbd352f3ca26ffc95ce918a1
parent4607777c71be52c4e7c9cbcf8ecac4a452090d7d (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.c157
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 */
309static 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
317static 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
311static inline void fsl_qspi_unlock_lut(struct fsl_qspi *q) 334static 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
317static inline void fsl_qspi_lock_lut(struct fsl_qspi *q) 340static 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
323static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id) 346static 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
578static int fsl_qspi_nor_write(struct fsl_qspi *q, struct spi_nor *nor, 612static 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