diff options
-rw-r--r-- | Documentation/devicetree/bindings/mtd/gpmc-nand.txt | 2 | ||||
-rw-r--r-- | drivers/mtd/nand/omap2.c | 29 | ||||
-rw-r--r-- | include/linux/platform_data/mtd-nand-omap2.h | 2 |
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 | ||
52 | For inline partition table parsing (optional): | 53 | For 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 | ||
187 | static inline struct omap_nand_info *mtd_to_omap(struct mtd_info *mtd) | 190 | static 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 | */ |
1029 | static int omap_dev_ready(struct mtd_info *mtd) | 1034 | static 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 |