diff options
author | Roger Quadros <rogerq@ti.com> | 2015-08-06 10:39:35 -0400 |
---|---|---|
committer | Roger Quadros <rogerq@ti.com> | 2016-04-15 04:55:37 -0400 |
commit | 10f22ee367c4aff7841da6a83c10445d7d6328d9 (patch) | |
tree | 31223517cf21ef6b15b86a65804bbc8b4e2ddcae /drivers/mtd | |
parent | 9e6946215dbd9803e8b511928c9f61f3a49e2c58 (diff) |
mtd: nand: omap2: Implement NAND ready using gpiolib
The GPMC WAIT pin status are now available over gpiolib.
Update the omap_dev_ready() function to use gpio instead of
directly accessing GPMC register space.
Signed-off-by: Roger Quadros <rogerq@ti.com>
Acked-by: Brian Norris <computersforpeace@gmail.com>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/nand/omap2.c | 29 |
1 files changed, 18 insertions, 11 deletions
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 { |