aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWenyou Yang <wenyou.yang@atmel.com>2016-05-09 02:51:18 -0400
committerBrian Norris <computersforpeace@gmail.com>2016-05-25 23:06:28 -0400
commit53b74ed2d0b4170764bf6d4cba6b786be1cab846 (patch)
tree2910d57ff00dc12aaeb96eda651c2eefdc3910df
parente5366a266a8cd4cd6b0fe66876462cca2e1c6a89 (diff)
Revert "mtd: atmel_nand: Support variable RB_EDGE interrupts"
This reverts commit 5ddc7bd43ccc ("mtd: atmel_nand: Support variable RB_EDGE interrupts") Because for current SoCs, the RB_EDGE3(i.e. bit 27) of HSMC_SR register does not exist, the RB_EDGE0 (i.e. bit 24) is the ready/busy line edge status bit. It is a datasheet bug. Cc: <stable@vger.kernel.org> Fixes: commit 5ddc7bd43ccc ("mtd: atmel_nand: Support variable RB_EDGE interrupts") Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-rw-r--r--Documentation/devicetree/bindings/mtd/atmel-nand.txt2
-rw-r--r--drivers/mtd/nand/atmel_nand.c35
-rw-r--r--drivers/mtd/nand/atmel_nand_nfc.h3
3 files changed, 10 insertions, 30 deletions
diff --git a/Documentation/devicetree/bindings/mtd/atmel-nand.txt b/Documentation/devicetree/bindings/mtd/atmel-nand.txt
index d53aba98fbc9..3e7ee99d3949 100644
--- a/Documentation/devicetree/bindings/mtd/atmel-nand.txt
+++ b/Documentation/devicetree/bindings/mtd/atmel-nand.txt
@@ -39,7 +39,7 @@ Optional properties:
39 39
40Nand Flash Controller(NFC) is an optional sub-node 40Nand Flash Controller(NFC) is an optional sub-node
41Required properties: 41Required properties:
42- compatible : "atmel,sama5d3-nfc" or "atmel,sama5d4-nfc". 42- compatible : "atmel,sama5d3-nfc".
43- reg : should specify the address and size used for NFC command registers, 43- reg : should specify the address and size used for NFC command registers,
44 NFC registers and NFC SRAM. NFC SRAM address and size can be absent 44 NFC registers and NFC SRAM. NFC SRAM address and size can be absent
45 if don't want to use it. 45 if don't want to use it.
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index efc8ea250c1d..68b9160108c9 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -67,10 +67,6 @@ struct atmel_nand_caps {
67 uint8_t pmecc_max_correction; 67 uint8_t pmecc_max_correction;
68}; 68};
69 69
70struct atmel_nand_nfc_caps {
71 uint32_t rb_mask;
72};
73
74/* 70/*
75 * oob layout for large page size 71 * oob layout for large page size
76 * bad block info is on bytes 0 and 1 72 * bad block info is on bytes 0 and 1
@@ -129,7 +125,6 @@ struct atmel_nfc {
129 /* Point to the sram bank which include readed data via NFC */ 125 /* Point to the sram bank which include readed data via NFC */
130 void *data_in_sram; 126 void *data_in_sram;
131 bool will_write_sram; 127 bool will_write_sram;
132 const struct atmel_nand_nfc_caps *caps;
133}; 128};
134static struct atmel_nfc nand_nfc; 129static struct atmel_nfc nand_nfc;
135 130
@@ -1715,9 +1710,9 @@ static irqreturn_t hsmc_interrupt(int irq, void *dev_id)
1715 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_XFR_DONE); 1710 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_XFR_DONE);
1716 ret = IRQ_HANDLED; 1711 ret = IRQ_HANDLED;
1717 } 1712 }
1718 if (pending & host->nfc->caps->rb_mask) { 1713 if (pending & NFC_SR_RB_EDGE) {
1719 complete(&host->nfc->comp_ready); 1714 complete(&host->nfc->comp_ready);
1720 nfc_writel(host->nfc->hsmc_regs, IDR, host->nfc->caps->rb_mask); 1715 nfc_writel(host->nfc->hsmc_regs, IDR, NFC_SR_RB_EDGE);
1721 ret = IRQ_HANDLED; 1716 ret = IRQ_HANDLED;
1722 } 1717 }
1723 if (pending & NFC_SR_CMD_DONE) { 1718 if (pending & NFC_SR_CMD_DONE) {
@@ -1735,7 +1730,7 @@ static void nfc_prepare_interrupt(struct atmel_nand_host *host, u32 flag)
1735 if (flag & NFC_SR_XFR_DONE) 1730 if (flag & NFC_SR_XFR_DONE)
1736 init_completion(&host->nfc->comp_xfer_done); 1731 init_completion(&host->nfc->comp_xfer_done);
1737 1732
1738 if (flag & host->nfc->caps->rb_mask) 1733 if (flag & NFC_SR_RB_EDGE)
1739 init_completion(&host->nfc->comp_ready); 1734 init_completion(&host->nfc->comp_ready);
1740 1735
1741 if (flag & NFC_SR_CMD_DONE) 1736 if (flag & NFC_SR_CMD_DONE)
@@ -1753,7 +1748,7 @@ static int nfc_wait_interrupt(struct atmel_nand_host *host, u32 flag)
1753 if (flag & NFC_SR_XFR_DONE) 1748 if (flag & NFC_SR_XFR_DONE)
1754 comp[index++] = &host->nfc->comp_xfer_done; 1749 comp[index++] = &host->nfc->comp_xfer_done;
1755 1750
1756 if (flag & host->nfc->caps->rb_mask) 1751 if (flag & NFC_SR_RB_EDGE)
1757 comp[index++] = &host->nfc->comp_ready; 1752 comp[index++] = &host->nfc->comp_ready;
1758 1753
1759 if (flag & NFC_SR_CMD_DONE) 1754 if (flag & NFC_SR_CMD_DONE)
@@ -1821,7 +1816,7 @@ static int nfc_device_ready(struct mtd_info *mtd)
1821 dev_err(host->dev, "Lost the interrupt flags: 0x%08x\n", 1816 dev_err(host->dev, "Lost the interrupt flags: 0x%08x\n",
1822 mask & status); 1817 mask & status);
1823 1818
1824 return status & host->nfc->caps->rb_mask; 1819 return status & NFC_SR_RB_EDGE;
1825} 1820}
1826 1821
1827static void nfc_select_chip(struct mtd_info *mtd, int chip) 1822static void nfc_select_chip(struct mtd_info *mtd, int chip)
@@ -1994,8 +1989,8 @@ static void nfc_nand_command(struct mtd_info *mtd, unsigned int command,
1994 } 1989 }
1995 /* fall through */ 1990 /* fall through */
1996 default: 1991 default:
1997 nfc_prepare_interrupt(host, host->nfc->caps->rb_mask); 1992 nfc_prepare_interrupt(host, NFC_SR_RB_EDGE);
1998 nfc_wait_interrupt(host, host->nfc->caps->rb_mask); 1993 nfc_wait_interrupt(host, NFC_SR_RB_EDGE);
1999 } 1994 }
2000} 1995}
2001 1996
@@ -2426,11 +2421,6 @@ static int atmel_nand_nfc_probe(struct platform_device *pdev)
2426 } 2421 }
2427 } 2422 }
2428 2423
2429 nfc->caps = (const struct atmel_nand_nfc_caps *)
2430 of_device_get_match_data(&pdev->dev);
2431 if (!nfc->caps)
2432 return -ENODEV;
2433
2434 nfc_writel(nfc->hsmc_regs, IDR, 0xffffffff); 2424 nfc_writel(nfc->hsmc_regs, IDR, 0xffffffff);
2435 nfc_readl(nfc->hsmc_regs, SR); /* clear the NFC_SR */ 2425 nfc_readl(nfc->hsmc_regs, SR); /* clear the NFC_SR */
2436 2426
@@ -2459,17 +2449,8 @@ static int atmel_nand_nfc_remove(struct platform_device *pdev)
2459 return 0; 2449 return 0;
2460} 2450}
2461 2451
2462static const struct atmel_nand_nfc_caps sama5d3_nfc_caps = {
2463 .rb_mask = NFC_SR_RB_EDGE0,
2464};
2465
2466static const struct atmel_nand_nfc_caps sama5d4_nfc_caps = {
2467 .rb_mask = NFC_SR_RB_EDGE3,
2468};
2469
2470static const struct of_device_id atmel_nand_nfc_match[] = { 2452static const struct of_device_id atmel_nand_nfc_match[] = {
2471 { .compatible = "atmel,sama5d3-nfc", .data = &sama5d3_nfc_caps }, 2453 { .compatible = "atmel,sama5d3-nfc" },
2472 { .compatible = "atmel,sama5d4-nfc", .data = &sama5d4_nfc_caps },
2473 { /* sentinel */ } 2454 { /* sentinel */ }
2474}; 2455};
2475MODULE_DEVICE_TABLE(of, atmel_nand_nfc_match); 2456MODULE_DEVICE_TABLE(of, atmel_nand_nfc_match);
diff --git a/drivers/mtd/nand/atmel_nand_nfc.h b/drivers/mtd/nand/atmel_nand_nfc.h
index 0bbc1fa97dba..4d5d26221a7e 100644
--- a/drivers/mtd/nand/atmel_nand_nfc.h
+++ b/drivers/mtd/nand/atmel_nand_nfc.h
@@ -42,8 +42,7 @@
42#define NFC_SR_UNDEF (1 << 21) 42#define NFC_SR_UNDEF (1 << 21)
43#define NFC_SR_AWB (1 << 22) 43#define NFC_SR_AWB (1 << 22)
44#define NFC_SR_ASE (1 << 23) 44#define NFC_SR_ASE (1 << 23)
45#define NFC_SR_RB_EDGE0 (1 << 24) 45#define NFC_SR_RB_EDGE (1 << 24)
46#define NFC_SR_RB_EDGE3 (1 << 27)
47 46
48#define ATMEL_HSMC_NFC_IER 0x0c 47#define ATMEL_HSMC_NFC_IER 0x0c
49#define ATMEL_HSMC_NFC_IDR 0x10 48#define ATMEL_HSMC_NFC_IDR 0x10