Re: [PATCH v2 01/10] mtd: rawnand: brcmnand: Refactored code to introduce helper functions

2023-02-21 Thread William Zhang



On 02/11/2023 07:29 AM, Linus Walleij wrote:

From: Kamal Dasu 

Refactored NAND ECC and CMD address configuration code to use helper
functions.

Signed-off-by: Kamal Dasu 
Signed-off-by: Miquel Raynal 
[Ported to U-Boot from the Linux kernel]
Signed-off-by: Linus Walleij 
---
  drivers/mtd/nand/raw/brcmnand/brcmnand.c | 100 ++-
  1 file changed, 62 insertions(+), 38 deletions(-)

diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index 74c9348f7fc4..571f1c795da0 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -595,6 +595,54 @@ static inline void brcmnand_write_fc(struct 
brcmnand_controller *ctrl,
__raw_writel(val, ctrl->nand_fc + word * 4);
  }
  
+static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl)

+{
+
+   /* Clear error addresses */
+   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
+   brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
+   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
+   brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
+}
+
+static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl)
+{
+   u64 err_addr;
+
+   err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR);
+   err_addr |= ((u64)(brcmnand_read_reg(ctrl,
+BRCMNAND_UNCORR_EXT_ADDR)
+& 0x) << 32);
+
+   return err_addr;
+}
+
+static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl)
+{
+   u64 err_addr;
+
+   err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR);
+   err_addr |= ((u64)(brcmnand_read_reg(ctrl,
+BRCMNAND_CORR_EXT_ADDR)
+& 0x) << 32);
+
+   return err_addr;
+}
+
+static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr)
+{
+   struct nand_chip *chip =  mtd_to_nand(mtd);
+   struct brcmnand_host *host = nand_get_controller_data(chip);
+   struct brcmnand_controller *ctrl = host->ctrl;
+
+   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
+  (host->cs << 16) | ((addr >> 32) & 0x));
+   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
+   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
+  lower_32_bits(addr));
+   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+}
+
  static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs,
 enum brcmnand_cs_reg reg)
  {
@@ -1190,9 +1238,12 @@ static void brcmnand_send_cmd(struct brcmnand_host 
*host, int cmd)
  {
struct brcmnand_controller *ctrl = host->ctrl;
int ret;
+   u64 cmd_addr;
+
+   cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+
+   dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr);
  
-	dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd,

-   brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS));
BUG_ON(ctrl->cmd_pending != 0);
ctrl->cmd_pending = cmd;
  
@@ -1365,12 +1416,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,

if (!native_cmd)
return;
  
-	brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,

-   (host->cs << 16) | ((addr >> 32) & 0x));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
-   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
-
+   brcmnand_set_cmd_addr(mtd, addr);
brcmnand_send_cmd(host, native_cmd);
brcmnand_waitfunc(mtd, chip);
  
@@ -1600,20 +1646,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,

struct brcmnand_controller *ctrl = host->ctrl;
int i, j, ret = 0;
  
-	/* Clear error addresses */

-   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
-   brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
-   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
-   brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
-
-   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
-   (host->cs << 16) | ((addr >> 32) & 0x));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
+   brcmnand_clear_ecc_addr(ctrl);
  
  	for (i = 0; i < trans; i++, addr += FC_BYTES) {

-   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
-  lower_32_bits(addr));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+   brcmnand_set_cmd_addr(mtd, addr);
/* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */
brcmnand_send_cmd(host, CMD_PAGE_READ);
brcmnand_waitfunc(mtd, chip);
@@ -1633,21 

Re: [PATCH v2 01/10] mtd: rawnand: brcmnand: Refactored code to introduce helper functions

2023-02-12 Thread Michael Nazzareno Trimarchi
Hi

On Sat, Feb 11, 2023 at 4:29 PM Linus Walleij  wrote:
>
> From: Kamal Dasu 
>
> Refactored NAND ECC and CMD address configuration code to use helper
> functions.
>
> Signed-off-by: Kamal Dasu 
> Signed-off-by: Miquel Raynal 
> [Ported to U-Boot from the Linux kernel]
> Signed-off-by: Linus Walleij 
> ---
>  drivers/mtd/nand/raw/brcmnand/brcmnand.c | 100 ++-
>  1 file changed, 62 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
> b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
> index 74c9348f7fc4..571f1c795da0 100644
> --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
> +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
> @@ -595,6 +595,54 @@ static inline void brcmnand_write_fc(struct 
> brcmnand_controller *ctrl,
> __raw_writel(val, ctrl->nand_fc + word * 4);
>  }
>
> +static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl)
> +{
> +
> +   /* Clear error addresses */
> +   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
> +   brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
> +   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
> +   brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
> +}
> +
> +static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl)
> +{
> +   u64 err_addr;
> +
> +   err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR);
> +   err_addr |= ((u64)(brcmnand_read_reg(ctrl,
> +BRCMNAND_UNCORR_EXT_ADDR)
> +& 0x) << 32);
> +
> +   return err_addr;
> +}
> +
> +static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl)
> +{
> +   u64 err_addr;
> +
> +   err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR);
> +   err_addr |= ((u64)(brcmnand_read_reg(ctrl,
> +BRCMNAND_CORR_EXT_ADDR)
> +& 0x) << 32);
> +
> +   return err_addr;
> +}
> +
> +static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr)
> +{
> +   struct nand_chip *chip =  mtd_to_nand(mtd);
> +   struct brcmnand_host *host = nand_get_controller_data(chip);
> +   struct brcmnand_controller *ctrl = host->ctrl;
> +
> +   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
> +  (host->cs << 16) | ((addr >> 32) & 0x));
> +   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
> +   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
> +  lower_32_bits(addr));
> +   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
> +}
> +
>  static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int 
> cs,
>  enum brcmnand_cs_reg reg)
>  {
> @@ -1190,9 +1238,12 @@ static void brcmnand_send_cmd(struct brcmnand_host 
> *host, int cmd)
>  {
> struct brcmnand_controller *ctrl = host->ctrl;
> int ret;
> +   u64 cmd_addr;
> +
> +   cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
> +
> +   dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr);
>
> -   dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd,
> -   brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS));
> BUG_ON(ctrl->cmd_pending != 0);
> ctrl->cmd_pending = cmd;
>
> @@ -1365,12 +1416,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, 
> unsigned command,
> if (!native_cmd)
> return;
>
> -   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
> -   (host->cs << 16) | ((addr >> 32) & 0x));
> -   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
> -   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr));
> -   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
> -
> +   brcmnand_set_cmd_addr(mtd, addr);
> brcmnand_send_cmd(host, native_cmd);
> brcmnand_waitfunc(mtd, chip);
>
> @@ -1600,20 +1646,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, 
> struct nand_chip *chip,
> struct brcmnand_controller *ctrl = host->ctrl;
> int i, j, ret = 0;
>
> -   /* Clear error addresses */
> -   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
> -   brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
> -   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
> -   brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
> -
> -   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
> -   (host->cs << 16) | ((addr >> 32) & 0x));
> -   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
> +   brcmnand_clear_ecc_addr(ctrl);
>
> for (i = 0; i < trans; i++, addr += FC_BYTES) {
> -   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
> -  lower_32_bits(addr));
> -   (void)brcmnand_read_reg(ctrl, 

[PATCH v2 01/10] mtd: rawnand: brcmnand: Refactored code to introduce helper functions

2023-02-11 Thread Linus Walleij
From: Kamal Dasu 

Refactored NAND ECC and CMD address configuration code to use helper
functions.

Signed-off-by: Kamal Dasu 
Signed-off-by: Miquel Raynal 
[Ported to U-Boot from the Linux kernel]
Signed-off-by: Linus Walleij 
---
 drivers/mtd/nand/raw/brcmnand/brcmnand.c | 100 ++-
 1 file changed, 62 insertions(+), 38 deletions(-)

diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index 74c9348f7fc4..571f1c795da0 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -595,6 +595,54 @@ static inline void brcmnand_write_fc(struct 
brcmnand_controller *ctrl,
__raw_writel(val, ctrl->nand_fc + word * 4);
 }
 
+static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl)
+{
+
+   /* Clear error addresses */
+   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
+   brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
+   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
+   brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
+}
+
+static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl)
+{
+   u64 err_addr;
+
+   err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR);
+   err_addr |= ((u64)(brcmnand_read_reg(ctrl,
+BRCMNAND_UNCORR_EXT_ADDR)
+& 0x) << 32);
+
+   return err_addr;
+}
+
+static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl)
+{
+   u64 err_addr;
+
+   err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR);
+   err_addr |= ((u64)(brcmnand_read_reg(ctrl,
+BRCMNAND_CORR_EXT_ADDR)
+& 0x) << 32);
+
+   return err_addr;
+}
+
+static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr)
+{
+   struct nand_chip *chip =  mtd_to_nand(mtd);
+   struct brcmnand_host *host = nand_get_controller_data(chip);
+   struct brcmnand_controller *ctrl = host->ctrl;
+
+   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
+  (host->cs << 16) | ((addr >> 32) & 0x));
+   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
+   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
+  lower_32_bits(addr));
+   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+}
+
 static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs,
 enum brcmnand_cs_reg reg)
 {
@@ -1190,9 +1238,12 @@ static void brcmnand_send_cmd(struct brcmnand_host 
*host, int cmd)
 {
struct brcmnand_controller *ctrl = host->ctrl;
int ret;
+   u64 cmd_addr;
+
+   cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+
+   dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr);
 
-   dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd,
-   brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS));
BUG_ON(ctrl->cmd_pending != 0);
ctrl->cmd_pending = cmd;
 
@@ -1365,12 +1416,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, 
unsigned command,
if (!native_cmd)
return;
 
-   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
-   (host->cs << 16) | ((addr >> 32) & 0x));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
-   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
-
+   brcmnand_set_cmd_addr(mtd, addr);
brcmnand_send_cmd(host, native_cmd);
brcmnand_waitfunc(mtd, chip);
 
@@ -1600,20 +1646,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, 
struct nand_chip *chip,
struct brcmnand_controller *ctrl = host->ctrl;
int i, j, ret = 0;
 
-   /* Clear error addresses */
-   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0);
-   brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0);
-   brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0);
-   brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0);
-
-   brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS,
-   (host->cs << 16) | ((addr >> 32) & 0x));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS);
+   brcmnand_clear_ecc_addr(ctrl);
 
for (i = 0; i < trans; i++, addr += FC_BYTES) {
-   brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS,
-  lower_32_bits(addr));
-   (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
+   brcmnand_set_cmd_addr(mtd, addr);
/* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */
brcmnand_send_cmd(host, CMD_PAGE_READ);
brcmnand_waitfunc(mtd, chip);
@@ -1633,21 +1669,15 @@ static int brcmnand_read_by_pio(struct