aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/mtd/gpmc-nand.txt2
-rw-r--r--drivers/mtd/nand/omap2.c29
-rw-r--r--include/linux/platform_data/mtd-nand-omap2.h2
3 files changed, 21 insertions, 12 deletions
diff --git a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt
index ff3215d20343..3ee7e202657c 100644
--- a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt
+++ b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt
@@ -48,6 +48,7 @@ Optional properties:
48 locating ECC errors for BCHx algorithms. SoC devices which have 48 locating ECC errors for BCHx algorithms. SoC devices which have
49 ELM hardware engines should specify this device node in .dtsi 49 ELM hardware engines should specify this device node in .dtsi
50 Using ELM for ECC error correction frees some CPU cycles. 50 Using ELM for ECC error correction frees some CPU cycles.
51 - rb-gpios: GPIO specifier for the ready/busy# pin.
51 52
52For inline partition table parsing (optional): 53For inline partition table parsing (optional):
53 54
@@ -78,6 +79,7 @@ Example for an AM33xx board:
78 nand-bus-width = <16>; 79 nand-bus-width = <16>;
79 ti,nand-ecc-opt = "bch8"; 80 ti,nand-ecc-opt = "bch8";
80 ti,nand-xfer-type = "polled"; 81 ti,nand-xfer-type = "polled";
82 rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */
81 83
82 gpmc,sync-clk-ps = <0>; 84 gpmc,sync-clk-ps = <0>;
83 gpmc,cs-on-ns = <0>; 85 gpmc,cs-on-ns = <0>;
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 35b8f3359c17..e0b2b2f0fbde 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -12,6 +12,7 @@
12#include <linux/dmaengine.h> 12#include <linux/dmaengine.h>
13#include <linux/dma-mapping.h> 13#include <linux/dma-mapping.h>
14#include <linux/delay.h> 14#include <linux/delay.h>
15#include <linux/gpio/consumer.h>
15#include <linux/module.h> 16#include <linux/module.h>
16#include <linux/interrupt.h> 17#include <linux/interrupt.h>
17#include <linux/jiffies.h> 18#include <linux/jiffies.h>
@@ -182,6 +183,8 @@ struct omap_nand_info {
182 struct nand_ecclayout oobinfo; 183 struct nand_ecclayout oobinfo;
183 /* fields specific for BCHx_HW ECC scheme */ 184 /* fields specific for BCHx_HW ECC scheme */
184 struct device *elm_dev; 185 struct device *elm_dev;
186 /* NAND ready gpio */
187 struct gpio_desc *ready_gpiod;
185}; 188};
186 189
187static inline struct omap_nand_info *mtd_to_omap(struct mtd_info *mtd) 190static inline struct omap_nand_info *mtd_to_omap(struct mtd_info *mtd)
@@ -1023,21 +1026,16 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)
1023} 1026}
1024 1027
1025/** 1028/**
1026 * omap_dev_ready - calls the platform specific dev_ready function 1029 * omap_dev_ready - checks the NAND Ready GPIO line
1027 * @mtd: MTD device structure 1030 * @mtd: MTD device structure
1031 *
1032 * Returns true if ready and false if busy.
1028 */ 1033 */
1029static int omap_dev_ready(struct mtd_info *mtd) 1034static int omap_dev_ready(struct mtd_info *mtd)
1030{ 1035{
1031 unsigned int val = 0;
1032 struct omap_nand_info *info = mtd_to_omap(mtd); 1036 struct omap_nand_info *info = mtd_to_omap(mtd);
1033 1037
1034 val = readl(info->reg.gpmc_status); 1038 return gpiod_get_value(info->ready_gpiod);
1035
1036 if ((val & 0x100) == 0x100) {
1037 return 1;
1038 } else {
1039 return 0;
1040 }
1041} 1039}
1042 1040
1043/** 1041/**
@@ -1755,7 +1753,9 @@ static int omap_nand_probe(struct platform_device *pdev)
1755 info->gpmc_cs = pdata->cs; 1753 info->gpmc_cs = pdata->cs;
1756 info->reg = pdata->reg; 1754 info->reg = pdata->reg;
1757 info->ecc_opt = pdata->ecc_opt; 1755 info->ecc_opt = pdata->ecc_opt;
1758 info->dev_ready = pdata->dev_ready; 1756 if (pdata->dev_ready)
1757 dev_info(&pdev->dev, "pdata->dev_ready is deprecated\n");
1758
1759 info->xfer_type = pdata->xfer_type; 1759 info->xfer_type = pdata->xfer_type;
1760 info->devsize = pdata->devsize; 1760 info->devsize = pdata->devsize;
1761 info->elm_of_node = pdata->elm_of_node; 1761 info->elm_of_node = pdata->elm_of_node;
@@ -1787,6 +1787,13 @@ static int omap_nand_probe(struct platform_device *pdev)
1787 nand_chip->IO_ADDR_W = nand_chip->IO_ADDR_R; 1787 nand_chip->IO_ADDR_W = nand_chip->IO_ADDR_R;
1788 nand_chip->cmd_ctrl = omap_hwcontrol; 1788 nand_chip->cmd_ctrl = omap_hwcontrol;
1789 1789
1790 info->ready_gpiod = devm_gpiod_get_optional(&pdev->dev, "rb",
1791 GPIOD_IN);
1792 if (IS_ERR(info->ready_gpiod)) {
1793 dev_err(dev, "failed to get ready gpio\n");
1794 return PTR_ERR(info->ready_gpiod);
1795 }
1796
1790 /* 1797 /*
1791 * If RDY/BSY line is connected to OMAP then use the omap ready 1798 * If RDY/BSY line is connected to OMAP then use the omap ready
1792 * function and the generic nand_wait function which reads the status 1799 * function and the generic nand_wait function which reads the status
@@ -1794,7 +1801,7 @@ static int omap_nand_probe(struct platform_device *pdev)
1794 * chip delay which is slightly more than tR (AC Timing) of the NAND 1801 * chip delay which is slightly more than tR (AC Timing) of the NAND
1795 * device and read status register until you get a failure or success 1802 * device and read status register until you get a failure or success
1796 */ 1803 */
1797 if (info->dev_ready) { 1804 if (info->ready_gpiod) {
1798 nand_chip->dev_ready = omap_dev_ready; 1805 nand_chip->dev_ready = omap_dev_ready;
1799 nand_chip->chip_delay = 0; 1806 nand_chip->chip_delay = 0;
1800 } else { 1807 } else {
diff --git a/include/linux/platform_data/mtd-nand-omap2.h b/include/linux/platform_data/mtd-nand-omap2.h
index 7f6de5377f80..17d57a18bac5 100644
--- a/include/linux/platform_data/mtd-nand-omap2.h
+++ b/include/linux/platform_data/mtd-nand-omap2.h
@@ -71,7 +71,6 @@ struct omap_nand_platform_data {
71 int cs; 71 int cs;
72 struct mtd_partition *parts; 72 struct mtd_partition *parts;
73 int nr_parts; 73 int nr_parts;
74 bool dev_ready;
75 bool flash_bbt; 74 bool flash_bbt;
76 enum nand_io xfer_type; 75 enum nand_io xfer_type;
77 int devsize; 76 int devsize;
@@ -82,5 +81,6 @@ struct omap_nand_platform_data {
82 /* deprecated */ 81 /* deprecated */
83 struct gpmc_nand_regs reg; 82 struct gpmc_nand_regs reg;
84 struct device_node *of_node; 83 struct device_node *of_node;
84 bool dev_ready;
85}; 85};
86#endif 86#endif