Hi,

On Wed, Jan 24, 2018 at 01:44:50AM +0100, Miquel Raynal wrote:
> Do some cleaning in sunxi NAND SPL driver like adding helpers and
> clearing flags at the right spot
> 
> Signed-off-by: Miquel Raynal <miquel.ray...@free-electrons.com>

I'm not really fond of these kind of wildcard patches, especially
since..

> ---
>  drivers/mtd/nand/sunxi_nand_spl.c | 64 
> +++++++++++++++++++++++++--------------
>  1 file changed, 41 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/mtd/nand/sunxi_nand_spl.c 
> b/drivers/mtd/nand/sunxi_nand_spl.c
> index 06695fc15f..2488d5cb51 100644
> --- a/drivers/mtd/nand/sunxi_nand_spl.c
> +++ b/drivers/mtd/nand/sunxi_nand_spl.c
> @@ -55,8 +55,8 @@
>  
>  
>  #define NFC_ADDR_NUM_OFFSET        16
> -#define NFC_SEND_ADR               (1 << 19)
>  #define NFC_ACCESS_DIR             (1 << 20)
> +#define NFC_SEND_ADDR              (1 << 19)
>  #define NFC_DATA_TRANS             (1 << 21)
>  #define NFC_SEND_CMD1              (1 << 22)
>  #define NFC_WAIT_FLAG              (1 << 23)

... here you reorder a single value, which means that the set of these
values is not sorted anymore ...

> @@ -155,6 +155,30 @@ 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_cmd_fifo_empty(void)
> +{
> +     if (!check_value_negated(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_FIFO_STAT,
> +                              DEFAULT_TIMEOUT_US)) {
> +             printf("nand: timeout waiting for empty cmd FIFO\n");
> +             return -ETIMEDOUT;
> +     }
> +
> +     return 0;
> +}
> +
> +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;
> +     }
> +
> +     udelay(1);
> +
> +     return 0;
> +}
> +

... here you add the helpers that you talked about in your commit log,
good. but ...

>  void nand_init(void)
>  {
>       uint32_t val;
> @@ -172,22 +196,21 @@ void nand_init(void)
>       }
>  
>       /* reset NAND */
> +     nand_wait_cmd_fifo_empty();
> +

... here you call one of these helpers where you didn't have that code
before, and that's not mentionned or explained in your commit log.

>       writel(NFC_ST_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_ST);
>       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)
>  {
>       u32 val;
>  
> +     nand_wait_cmd_fifo_empty();
> +

Ditto.

>       val = readl(SUNXI_NFC_BASE + NFC_CTL);
>       val &= ~NFC_CTL_PAGE_SIZE_MASK;
>       writel(val | NFC_CTL_RAM_METHOD | NFC_CTL_PAGE_SIZE(conf->page_size),
> @@ -200,6 +223,8 @@ static int nand_load_page(const struct nfc_config *conf, 
> u32 offs)
>  {
>       int page = offs / conf->page_size;
>  
> +     nand_wait_cmd_fifo_empty();
> +

Ditto.

>       writel((NFC_CMD_RNDOUTSTART << NFC_RANDOM_READ_CMD1_OFFSET) |
>              (NFC_CMD_RNDOUT << NFC_RANDOM_READ_CMD0_OFFSET) |
>              (NFC_CMD_READSTART << NFC_READ_CMD_OFFSET),
> @@ -208,38 +233,32 @@ static int nand_load_page(const struct nfc_config 
> *conf, u32 offs)
>       writel((page >> 16) & 0xFF, SUNXI_NFC_BASE + NFC_ADDR_HIGH);
>       writel(NFC_ST_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_ST);
>       writel(NFC_SEND_CMD1 | NFC_SEND_CMD2 | NFC_RAW_CMD | NFC_WAIT_FLAG |
> -            ((conf->addr_cycles - 1) << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADR,
> +            ((conf->addr_cycles - 1) << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR,

I guess it was a typo fix then?

>              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)
>  {
> +     nand_wait_cmd_fifo_empty();
> +

Not mentionned or explained in your commit log.

>       writel((NFC_CMD_RNDOUTSTART << NFC_RANDOM_READ_CMD1_OFFSET) |
>              (NFC_CMD_RNDOUT << NFC_RANDOM_READ_CMD0_OFFSET) |
>              (NFC_CMD_RNDOUTSTART << NFC_READ_CMD_OFFSET),
>              SUNXI_NFC_BASE + NFC_RCMD_SET);
> +     writel(NFC_ST_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_ST);

Ditto

>       writel(0, SUNXI_NFC_BASE + NFC_ADDR_LOW);
>       writel(NFC_SEND_CMD1 | NFC_SEND_CMD2 | NFC_RAW_CMD |
> -            (1 << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADR | NFC_CMD_RNDOUT,
> +            (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();
>  
> -     return 0;
>  }
>  
> +static const int ecc_bytes[] = {32, 46, 54, 60, 74, 88, 102, 110, 116};
> +
>  static int nand_read_page(const struct nfc_config *conf, u32 offs,
>                         void *dest, int len)
>  {
> @@ -327,7 +346,6 @@ static int nand_read_page(const struct nfc_config *conf, 
> u32 offs,
>  
>  static int nand_max_ecc_strength(struct nfc_config *conf)
>  {
> -     static const int ecc_bytes[] = { 32, 46, 54, 60, 74, 88, 102, 110, 116 
> };


Ditto.

Overall, I think it would be great to split that patch into 4:
  - the first one to fix the ADR vs ADDR typo (without changing the order)
  - the second one to introduce the nand_wait_int helper
  - the third one to introduce the nand_wait_cmd_fifo_empty, with a
    proper commit log explaining why this needs to be done and which
    issues is it fixing
  - And maybe if justified moving the ecc_bytes array to global scope

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

Attachment: signature.asc
Description: PGP signature

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to