aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorRoger Quadros <rogerq@ti.com>2015-08-06 10:39:35 -0400
committerRoger Quadros <rogerq@ti.com>2016-04-15 04:55:37 -0400
commit10f22ee367c4aff7841da6a83c10445d7d6328d9 (patch)
tree31223517cf21ef6b15b86a65804bbc8b4e2ddcae /drivers/mtd
parent9e6946215dbd9803e8b511928c9f61f3a49e2c58 (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.c29
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
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 {