On Thu, 22 Feb 2018 14:33:35 +0100
Miquel Raynal <miquel.ray...@bootlin.com> wrote:

> The pattern of polling on a status register until a bit is set or a
> timeout occurs is repeated multiple times in the driver. Mutualize the
> code by introducing the nand_wait_int() helper that does wait for the
> bit to flip or returns an error in case of timeout.
> 
> Signed-off-by: Miquel Raynal <miquel.ray...@bootlin.com>
> ---
>  drivers/mtd/nand/sunxi_nand_spl.c | 33 ++++++++++++++-------------------
>  1 file changed, 14 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/mtd/nand/sunxi_nand_spl.c 
> b/drivers/mtd/nand/sunxi_nand_spl.c
> index 608cc997ca..afb5fef0a6 100644
> --- a/drivers/mtd/nand/sunxi_nand_spl.c
> +++ b/drivers/mtd/nand/sunxi_nand_spl.c
> @@ -155,6 +155,17 @@ static inline int check_value_negated(int offset, int 
> unexpected_bits,
>       return check_value_inner(offset, unexpected_bits, timeout_us, 1);
>  }
>  
> +static int nand_wait_int(void)
> +{
> +     if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
> +                      DEFAULT_TIMEOUT_US)) {
> +             printf("nand: timeout waiting for interruption\n");
> +             return -ETIMEDOUT;
> +     }
> +
> +     return 0;
> +}
> +
>  void nand_init(void)
>  {
>       uint32_t val;
> @@ -176,12 +187,7 @@ void nand_init(void)
>       writel(NFC_SEND_CMD1 | NFC_WAIT_FLAG | NAND_CMD_RESET,
>              SUNXI_NFC_BASE + NFC_CMD);
>  
> -     if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
> -                      DEFAULT_TIMEOUT_US)) {
> -             printf("Error timeout waiting for nand reset\n");
> -             return;
> -     }
> -     writel(NFC_ST_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_ST);
> +     nand_wait_int();
>  }
>  
>  static void nand_apply_config(const struct nfc_config *conf)
> @@ -211,13 +217,7 @@ static int nand_load_page(const struct nfc_config *conf, 
> u32 offs)
>              ((conf->addr_cycles - 1) << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR,
>              SUNXI_NFC_BASE + NFC_CMD);
>  
> -     if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
> -                      DEFAULT_TIMEOUT_US)) {
> -             printf("Error while initializing dma interrupt\n");
> -             return -EIO;
> -     }
> -
> -     return 0;
> +     return nand_wait_int();
>  }
>  
>  static int nand_reset_column(void)
> @@ -231,13 +231,8 @@ static int nand_reset_column(void)
>              (1 << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR | NFC_CMD_RNDOUT,
>              SUNXI_NFC_BASE + NFC_CMD);
>  
> -     if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
> -                      DEFAULT_TIMEOUT_US)) {
> -             printf("Error while initializing dma interrupt\n");
> -             return -1;
> -     }
> +     return nand_wait_int();
>  

You can drop this empty line.

> -     return 0;
>  }
>  
>  static int nand_read_page(const struct nfc_config *conf, u32 offs,



-- 
Boris Brezillon, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to