aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c')
-rw-r--r--target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c b/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c
index ac9a2ac8ac..244fd27590 100644
--- a/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c
+++ b/target/linux/ath79/files/drivers/mtd/nand/raw/rb91x_nand.c
@@ -40,6 +40,7 @@ enum rb91x_nand_gpios {
RB91X_NAND_ALE, /* Address Latch Enable */
RB91X_NAND_NRW, /* Read/Write. Active low */
RB91X_NAND_NLE, /* Latch Enable. Active low */
+ RB91X_NAND_PDIS, /* Reset Key Poll Disable. Active high */
RB91X_NAND_GPIOS,
};
@@ -57,6 +58,12 @@ static inline void rb91x_nand_latch_lock(struct rb91x_nand_drvdata *drvdata,
gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_NLE], lock);
}
+static inline void rb91x_nand_rst_key_poll_disable(struct rb91x_nand_drvdata *drvdata,
+ int disable)
+{
+ gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_PDIS], disable);
+}
+
static int rb91x_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion)
{
@@ -115,6 +122,7 @@ static void rb91x_nand_write(struct rb91x_nand_drvdata *drvdata,
unsigned i;
rb91x_nand_latch_lock(drvdata, 1);
+ rb91x_nand_rst_key_poll_disable(drvdata, 1);
oe_reg = __raw_readl(base + AR71XX_GPIO_REG_OE);
out_reg = __raw_readl(base + AR71XX_GPIO_REG_OUT);
@@ -146,6 +154,7 @@ static void rb91x_nand_write(struct rb91x_nand_drvdata *drvdata,
/* Flush write */
__raw_readl(base + AR71XX_GPIO_REG_OUT);
+ rb91x_nand_rst_key_poll_disable(drvdata, 0);
rb91x_nand_latch_lock(drvdata, 0);
}
@@ -162,6 +171,7 @@ static void rb91x_nand_read(struct rb91x_nand_drvdata *drvdata,
gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_READ], 1);
rb91x_nand_latch_lock(drvdata, 1);
+ rb91x_nand_rst_key_poll_disable(drvdata, 1);
/* Save registers */
oe_reg = __raw_readl(base + AR71XX_GPIO_REG_OE);
@@ -199,6 +209,7 @@ static void rb91x_nand_read(struct rb91x_nand_drvdata *drvdata,
/* Flush write */
__raw_readl(base + AR71XX_GPIO_REG_OUT);
+ rb91x_nand_rst_key_poll_disable(drvdata, 0);
rb91x_nand_latch_lock(drvdata, 0);
/* Disable read mode */
@@ -274,8 +285,11 @@ static int rb91x_nand_probe(struct platform_device *pdev)
gpios = gpiod_get_array(dev, NULL, GPIOD_OUT_LOW);
if (IS_ERR(gpios)) {
- dev_err(dev, "failed to get gpios: %d\n", (int)gpios);
- return -EINVAL;
+ if (PTR_ERR(gpios) != -EPROBE_DEFER) {
+ dev_err(dev, "failed to get gpios: %d\n",
+ PTR_ERR(gpios));
+ }
+ return PTR_ERR(gpios);
}
if (gpios->ndescs != RB91X_NAND_GPIOS) {