Hi Boris,

On Wed, 24 Jan 2018 09:06:38 +0100
Boris Brezillon <boris.brezil...@free-electrons.com> wrote:

> On Wed, 24 Jan 2018 01:44:50 +0100
> Miquel Raynal <miquel.ray...@free-electrons.com> 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>
> > ---
> >  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)  
> 
> This typo fix probably deserves a separate patch.

Indeed.

> 
> >  #define NFC_DATA_TRANS             (1 << 21)
> >  #define NFC_SEND_CMD1              (1 << 22)
> >  #define NFC_WAIT_FLAG              (1 << 23)
> > @@ -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);  
> 
> I'm pretty sure this udelay() is not required. Probably some leftover
> of your debug session ;-).

That is right -> removed.

> 
> > +
> > +   return 0;
> > +}
> > +
> >  void nand_init(void)
> >  {
> >     uint32_t val;
> > @@ -172,22 +196,21 @@ void nand_init(void)
> >     }
> >  
> >     /* reset NAND */
> > +   nand_wait_cmd_fifo_empty();
> > +
> >     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();  
> 
> I would go even further and create an helper that takes care of the
> 'wait_fifo_empty+clear_int+write_cmd+wait_int' sequence:
> 
> static int nand_exec_cmd(u32 cmd)
> {
>       int ret;
> 
>       ret = nand_wait_cmd_fifo_empty();
>       if (ret)
>               return ret;
> 
>       writel(NFC_ST_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_ST);
>       writel(cmd, SUNXI_NFC_BASE + NFC_CMD);
> 
>       return nand_wait_int();
> }

It makes sense, I added another patch to introduce this helper.

> 
> >  }
> >  
> >  static void nand_apply_config(const struct nfc_config *conf)
> >  {
> >     u32 val;
> >  
> > +   nand_wait_cmd_fifo_empty();
> > +
> >     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();
> > +
> >     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,
> >            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();
> > +
> >     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);
> >     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();  
> 
> Here, I think you should wait, just to make sure we don't read data
> before tCCS. udelay(1) should be enough.

Done and explained in another patch.

> 
> >  
> > -   return 0;
> >  }
> >  
> > +static const int ecc_bytes[] = {32, 46, 54, 60, 74, 88, 102, 110, 116};
> > +  
> 
> Putting ecc_bytes out of nand_max_ecc_strength() is not really related
> to this patch, and should probably go in patch 5.

Right, I will move this to the patch where it belongs.

> 
> >  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 
> > };
> >     int max_oobsize, max_ecc_bytes;
> >     int nsectors = conf->page_size / conf->ecc_size;
> >     int i;  
> 

Thanks,
Miquèl
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to