To simplify porting kernel NAND drivers a tiny bit, provide the Linux nand_gpio_waitrdy. This is readily implementable with barebox' own gpio_poll_timeout_us. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/mtd/nand/nand_base.c | 22 ++++++++++++++++++++++ include/linux/mtd/rawnand.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 4c90ad975771..c3cd22935bb2 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -36,6 +36,7 @@ #include <asm/byteorder.h> #include <io.h> #include <malloc.h> +#include <gpio.h> #include <module.h> #include <of_mtd.h> @@ -785,6 +786,27 @@ int nand_soft_waitrdy(struct nand_chip *chip, unsigned long timeout_ms) }; EXPORT_SYMBOL_GPL(nand_soft_waitrdy); +/** + * nand_gpio_waitrdy - Poll R/B GPIO pin until ready + * @chip: NAND chip structure + * @gpiod: GPIO descriptor of R/B pin + * @timeout_ms: Timeout in ms + * + * Poll the R/B GPIO pin until it becomes ready. If that does not happen + * whitin the specified timeout, -ETIMEDOUT is returned. + * + * This helper is intended to be used when the controller has access to the + * NAND R/B pin over GPIO. + * + * Return 0 if the R/B pin indicates chip is ready, a negative error otherwise. + */ +int nand_gpio_waitrdy(struct nand_chip *chip, int gpio, + unsigned long timeout_ms) +{ + return gpio_poll_timeout_us(gpio, true, timeout_ms * USEC_PER_MSEC); +}; +EXPORT_SYMBOL_GPL(nand_gpio_waitrdy); + static bool nand_supports_get_features(struct nand_chip *chip, int addr) { return (chip->parameters.supports_set_get_features && diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h index 1147f235a680..a05c67e1404b 100644 --- a/include/linux/mtd/rawnand.h +++ b/include/linux/mtd/rawnand.h @@ -1414,6 +1414,8 @@ void nand_cleanup(struct nand_chip *chip); * instruction and have no physical pin to check it. */ int nand_soft_waitrdy(struct nand_chip *chip, unsigned long timeout_ms); +int nand_gpio_waitrdy(struct nand_chip *chip, int gpio, + unsigned long timeout_ms); /* Select/deselect a NAND target. */ void nand_select_target(struct nand_chip *chip, unsigned int cs); -- 2.30.2