diff options
author | Wenyou Yang <wenyou.yang@atmel.com> | 2016-05-09 02:51:18 -0400 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2016-05-25 23:06:28 -0400 |
commit | 53b74ed2d0b4170764bf6d4cba6b786be1cab846 (patch) | |
tree | 2910d57ff00dc12aaeb96eda651c2eefdc3910df | |
parent | e5366a266a8cd4cd6b0fe66876462cca2e1c6a89 (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.txt | 2 | ||||
-rw-r--r-- | drivers/mtd/nand/atmel_nand.c | 35 | ||||
-rw-r--r-- | drivers/mtd/nand/atmel_nand_nfc.h | 3 |
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 | ||
40 | Nand Flash Controller(NFC) is an optional sub-node | 40 | Nand Flash Controller(NFC) is an optional sub-node |
41 | Required properties: | 41 | Required 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 | ||
70 | struct 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 | }; |
134 | static struct atmel_nfc nand_nfc; | 129 | static 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 | ||
1827 | static void nfc_select_chip(struct mtd_info *mtd, int chip) | 1822 | static 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 | ||
2462 | static const struct atmel_nand_nfc_caps sama5d3_nfc_caps = { | ||
2463 | .rb_mask = NFC_SR_RB_EDGE0, | ||
2464 | }; | ||
2465 | |||
2466 | static const struct atmel_nand_nfc_caps sama5d4_nfc_caps = { | ||
2467 | .rb_mask = NFC_SR_RB_EDGE3, | ||
2468 | }; | ||
2469 | |||
2470 | static const struct of_device_id atmel_nand_nfc_match[] = { | 2452 | static 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 | }; |
2475 | MODULE_DEVICE_TABLE(of, atmel_nand_nfc_match); | 2456 | MODULE_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 |