Message ID | 20230211152909.1436133-2-linus.walleij@linaro.org |
---|---|
State | New |
Headers | show |
Series | Backport BRCMNAND changes from Linux | expand |
Hi On Sat, Feb 11, 2023 at 4:29 PM Linus Walleij <linus.walleij@linaro.org> wrote: > > From: Kamal Dasu <kdasu.kdev@gmail.com> > > Refactored NAND ECC and CMD address configuration code to use helper > functions. > > Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> > [Ported to U-Boot from the Linux kernel] > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > 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) > + & 0xffff) << 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) > + & 0xffff) << 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) & 0xffff)); > + (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) & 0xffff)); > - (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) & 0xffff)); > - (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 mtd_info *mtd, struct nand_chip *chip, > host->hwcfg.sector_size_1k); > > if (ret != -EBADMSG) { > - *err_addr = brcmnand_read_reg(ctrl, > - BRCMNAND_UNCORR_ADDR) | > - ((u64)(brcmnand_read_reg(ctrl, > - BRCMNAND_UNCORR_EXT_ADDR) > - & 0xffff) << 32); > + *err_addr = brcmnand_get_uncorrecc_addr(ctrl); > + > if (*err_addr) > ret = -EBADMSG; > } > > if (!ret) { > - *err_addr = brcmnand_read_reg(ctrl, > - BRCMNAND_CORR_ADDR) | > - ((u64)(brcmnand_read_reg(ctrl, > - BRCMNAND_CORR_EXT_ADDR) > - & 0xffff) << 32); > + *err_addr = brcmnand_get_correcc_addr(ctrl); > + > if (*err_addr) > ret = -EUCLEAN; > } > @@ -1721,7 +1751,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, > dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf); > > try_dmaread: > - brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0); > + brcmnand_clear_ecc_addr(ctrl); > > #ifndef __UBOOT__ > if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { > @@ -1875,15 +1905,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, > } > #endif /* __UBOOT__ */ > > - brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, > - (host->cs << 16) | ((addr >> 32) & 0xffff)); > - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); > - > for (i = 0; i < trans; i++, addr += FC_BYTES) { > /* full address MUST be set before populating FC */ > - 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); > > if (buf) { > brcmnand_soc_data_bus_prepare(ctrl->soc, false); > -- > 2.39.1 Reviewed-by: Michael Trimarchi <michael@amarulasolutions.com> >
On 02/11/2023 07:29 AM, Linus Walleij wrote: > From: Kamal Dasu <kdasu.kdev@gmail.com> > > Refactored NAND ECC and CMD address configuration code to use helper > functions. > > Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> > [Ported to U-Boot from the Linux kernel] > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > 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) > + & 0xffff) << 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) > + & 0xffff) << 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) & 0xffff)); > + (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) & 0xffff)); > - (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) & 0xffff)); > - (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 mtd_info *mtd, struct nand_chip *chip, > host->hwcfg.sector_size_1k); > > if (ret != -EBADMSG) { > - *err_addr = brcmnand_read_reg(ctrl, > - BRCMNAND_UNCORR_ADDR) | > - ((u64)(brcmnand_read_reg(ctrl, > - BRCMNAND_UNCORR_EXT_ADDR) > - & 0xffff) << 32); > + *err_addr = brcmnand_get_uncorrecc_addr(ctrl); > + > if (*err_addr) > ret = -EBADMSG; > } > > if (!ret) { > - *err_addr = brcmnand_read_reg(ctrl, > - BRCMNAND_CORR_ADDR) | > - ((u64)(brcmnand_read_reg(ctrl, > - BRCMNAND_CORR_EXT_ADDR) > - & 0xffff) << 32); > + *err_addr = brcmnand_get_correcc_addr(ctrl); > + > if (*err_addr) > ret = -EUCLEAN; > } > @@ -1721,7 +1751,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, > dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf); > > try_dmaread: > - brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0); > + brcmnand_clear_ecc_addr(ctrl); > > #ifndef __UBOOT__ > if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { > @@ -1875,15 +1905,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, > } > #endif /* __UBOOT__ */ > > - brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, > - (host->cs << 16) | ((addr >> 32) & 0xffff)); > - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); > - > for (i = 0; i < trans; i++, addr += FC_BYTES) { > /* full address MUST be set before populating FC */ > - 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); > > if (buf) { > brcmnand_soc_data_bus_prepare(ctrl->soc, false); > Acked-by: William Zhang <william.zhang@broadcom.com>
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) + & 0xffff) << 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) + & 0xffff) << 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) & 0xffff)); + (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) & 0xffff)); - (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) & 0xffff)); - (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 mtd_info *mtd, struct nand_chip *chip, host->hwcfg.sector_size_1k); if (ret != -EBADMSG) { - *err_addr = brcmnand_read_reg(ctrl, - BRCMNAND_UNCORR_ADDR) | - ((u64)(brcmnand_read_reg(ctrl, - BRCMNAND_UNCORR_EXT_ADDR) - & 0xffff) << 32); + *err_addr = brcmnand_get_uncorrecc_addr(ctrl); + if (*err_addr) ret = -EBADMSG; } if (!ret) { - *err_addr = brcmnand_read_reg(ctrl, - BRCMNAND_CORR_ADDR) | - ((u64)(brcmnand_read_reg(ctrl, - BRCMNAND_CORR_EXT_ADDR) - & 0xffff) << 32); + *err_addr = brcmnand_get_correcc_addr(ctrl); + if (*err_addr) ret = -EUCLEAN; } @@ -1721,7 +1751,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf); try_dmaread: - brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0); + brcmnand_clear_ecc_addr(ctrl); #ifndef __UBOOT__ if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { @@ -1875,15 +1905,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, } #endif /* __UBOOT__ */ - brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, - (host->cs << 16) | ((addr >> 32) & 0xffff)); - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); - for (i = 0; i < trans; i++, addr += FC_BYTES) { /* full address MUST be set before populating FC */ - 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); if (buf) { brcmnand_soc_data_bus_prepare(ctrl->soc, false);