From: Boris Brezillon <boris.brezillon@collabora.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Boris Brezillon <bbrezillon@kernel.org>,
Richard Weinberger <richard@nod.at>,
linux-kernel@vger.kernel.org, Marek Vasut <marek.vasut@gmail.com>,
linux-mtd@lists.infradead.org,
Miquel Raynal <miquel.raynal@bootlin.com>,
Brian Norris <computersforpeace@gmail.com>,
David Woodhouse <dwmw2@infradead.org>
Subject: Re: [PATCH v4 1/9] mtd: rawnand: denali: use nand_chip pointer more for internal functions
Date: Sat, 30 Mar 2019 15:23:23 +0100 [thread overview]
Message-ID: <20190330152323.71734cb8@collabora.com> (raw)
In-Reply-To: <1553844501-7119-2-git-send-email-yamada.masahiro@socionext.com>
On Fri, 29 Mar 2019 16:28:13 +0900
Masahiro Yamada <yamada.masahiro@socionext.com> wrote:
> With the recent refactoring, the NAND driver hooks now take a pointer
> to nand_chip. Add to_denali() in order to convert (struct nand_chip *)
> to (struct denali_nand_info *) directly. It is more useful than the
> current mtd_to_denali().
>
> I changed some helper functions to take (struct nand_chip *). This will
> avoid pointer conversion back and forth, and ease further development.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
> ---
>
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
> drivers/mtd/nand/raw/denali.c | 57 ++++++++++++++++++++++++-------------------
> 1 file changed, 32 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c
> index 24aeafc..4ac1314 100644
> --- a/drivers/mtd/nand/raw/denali.c
> +++ b/drivers/mtd/nand/raw/denali.c
> @@ -47,6 +47,11 @@ static inline struct denali_nand_info *mtd_to_denali(struct mtd_info *mtd)
> return container_of(mtd_to_nand(mtd), struct denali_nand_info, nand);
> }
>
> +static struct denali_nand_info *to_denali(struct nand_chip *chip)
> +{
> + return container_of(chip, struct denali_nand_info, nand);
> +}
> +
> /*
> * Direct Addressing - the slave address forms the control information (command
> * type, bank, block, and page address). The slave data is the actual data to
> @@ -282,12 +287,12 @@ static void denali_cmd_ctrl(struct nand_chip *chip, int dat, unsigned int ctrl)
> denali->host_write(denali, DENALI_BANK(denali) | type, dat);
> }
>
> -static int denali_check_erased_page(struct mtd_info *mtd,
> - struct nand_chip *chip, uint8_t *buf,
> +static int denali_check_erased_page(struct nand_chip *chip,
> + struct denali_nand_info *denali, u8 *buf,
You don't need to pass both chip and denali, as one can be extracted
from the other.
> unsigned long uncor_ecc_flags,
> unsigned int max_bitflips)
> {
> - struct denali_nand_info *denali = mtd_to_denali(mtd);
> + struct mtd_ecc_stats *ecc_stats = &nand_to_mtd(chip)->ecc_stats;
> uint8_t *ecc_code = chip->oob_poi + denali->oob_skip_bytes;
> int ecc_steps = chip->ecc.steps;
> int ecc_size = chip->ecc.size;
> @@ -303,9 +308,9 @@ static int denali_check_erased_page(struct mtd_info *mtd,
> NULL, 0,
> chip->ecc.strength);
> if (stat < 0) {
> - mtd->ecc_stats.failed++;
> + ecc_stats->failed++;
> } else {
> - mtd->ecc_stats.corrected += stat;
> + ecc_stats->corrected += stat;
> max_bitflips = max_t(unsigned int, max_bitflips, stat);
> }
>
> @@ -316,11 +321,11 @@ static int denali_check_erased_page(struct mtd_info *mtd,
> return max_bitflips;
> }
>
> -static int denali_hw_ecc_fixup(struct mtd_info *mtd,
> +static int denali_hw_ecc_fixup(struct nand_chip *chip,
> struct denali_nand_info *denali,
Ditto.
> unsigned long *uncor_ecc_flags)
> {
> - struct nand_chip *chip = mtd_to_nand(mtd);
> + struct mtd_ecc_stats *ecc_stats = &nand_to_mtd(chip)->ecc_stats;
> int bank = denali->active_bank;
> uint32_t ecc_cor;
> unsigned int max_bitflips;
> @@ -346,16 +351,17 @@ static int denali_hw_ecc_fixup(struct mtd_info *mtd,
> * Unfortunately, we can not know the total number of corrected bits in
> * the page. Increase the stats by max_bitflips. (compromised solution)
> */
> - mtd->ecc_stats.corrected += max_bitflips;
> + ecc_stats->corrected += max_bitflips;
>
> return max_bitflips;
> }
>
> -static int denali_sw_ecc_fixup(struct mtd_info *mtd,
> +static int denali_sw_ecc_fixup(struct nand_chip *chip,
> struct denali_nand_info *denali,
> unsigned long *uncor_ecc_flags, uint8_t *buf)
> {
> - unsigned int ecc_size = denali->nand.ecc.size;
> + struct mtd_ecc_stats *ecc_stats = &nand_to_mtd(chip)->ecc_stats;
> + unsigned int ecc_size = chip->ecc.size;
> unsigned int bitflips = 0;
> unsigned int max_bitflips = 0;
> uint32_t err_addr, err_cor_info;
> @@ -404,7 +410,7 @@ static int denali_sw_ecc_fixup(struct mtd_info *mtd,
> /* correct the ECC error */
> flips_in_byte = hweight8(buf[offset] ^ err_cor_value);
> buf[offset] ^= err_cor_value;
> - mtd->ecc_stats.corrected += flips_in_byte;
> + ecc_stats->corrected += flips_in_byte;
> bitflips += flips_in_byte;
>
> max_bitflips = max(max_bitflips, bitflips);
> @@ -587,9 +593,11 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf,
> return ret;
> }
>
> -static int denali_data_xfer(struct denali_nand_info *denali, void *buf,
> - size_t size, int page, int raw, int write)
> +static int denali_data_xfer(struct nand_chip *chip, void *buf, size_t size,
> + int page, int raw, int write)
> {
> + struct denali_nand_info *denali = to_denali(chip);
> +
> iowrite32(raw ? 0 : ECC_ENABLE__FLAG, denali->reg + ECC_ENABLE);
> iowrite32(raw ? TRANSFER_SPARE_REG__FLAG : 0,
> denali->reg + TRANSFER_SPARE_REG);
> @@ -678,7 +686,7 @@ static int denali_read_page_raw(struct nand_chip *chip, uint8_t *buf,
> size_t size = writesize + oobsize;
> int ret, i, pos, len;
>
> - ret = denali_data_xfer(denali, tmp_buf, size, page, 1, 0);
> + ret = denali_data_xfer(chip, tmp_buf, size, page, 1, 0);
> if (ret)
> return ret;
>
> @@ -766,14 +774,14 @@ static int denali_read_page(struct nand_chip *chip, uint8_t *buf,
> int stat = 0;
> int ret;
>
> - ret = denali_data_xfer(denali, buf, mtd->writesize, page, 0, 0);
> + ret = denali_data_xfer(chip, buf, mtd->writesize, page, 0, 0);
> if (ret && ret != -EBADMSG)
> return ret;
>
> if (denali->caps & DENALI_CAP_HW_ECC_FIXUP)
> - stat = denali_hw_ecc_fixup(mtd, denali, &uncor_ecc_flags);
> + stat = denali_hw_ecc_fixup(chip, denali, &uncor_ecc_flags);
> else if (ret == -EBADMSG)
> - stat = denali_sw_ecc_fixup(mtd, denali, &uncor_ecc_flags, buf);
> + stat = denali_sw_ecc_fixup(chip, denali, &uncor_ecc_flags, buf);
>
> if (stat < 0)
> return stat;
> @@ -783,7 +791,7 @@ static int denali_read_page(struct nand_chip *chip, uint8_t *buf,
> if (ret)
> return ret;
>
> - stat = denali_check_erased_page(mtd, chip, buf,
> + stat = denali_check_erased_page(chip, denali, buf,
> uncor_ecc_flags, stat);
> }
>
> @@ -866,17 +874,16 @@ static int denali_write_page_raw(struct nand_chip *chip, const uint8_t *buf,
> memcpy(tmp_buf + size - len, oob, len);
> }
>
> - return denali_data_xfer(denali, tmp_buf, size, page, 1, 1);
> + return denali_data_xfer(chip, tmp_buf, size, page, 1, 1);
> }
>
> static int denali_write_page(struct nand_chip *chip, const uint8_t *buf,
> int oob_required, int page)
> {
> struct mtd_info *mtd = nand_to_mtd(chip);
> - struct denali_nand_info *denali = mtd_to_denali(mtd);
>
> - return denali_data_xfer(denali, (void *)buf, mtd->writesize,
> - page, 0, 1);
> + return denali_data_xfer(chip, (void *)buf, mtd->writesize, page,
> + 0, 1);
> }
>
> static void denali_select_chip(struct nand_chip *chip, int cs)
> @@ -1092,9 +1099,9 @@ static const struct mtd_ooblayout_ops denali_ooblayout_ops = {
> .free = denali_ooblayout_free,
> };
>
> -static int denali_multidev_fixup(struct denali_nand_info *denali)
> +static int denali_multidev_fixup(struct nand_chip *chip)
> {
> - struct nand_chip *chip = &denali->nand;
> + struct denali_nand_info *denali = to_denali(chip);
> struct mtd_info *mtd = nand_to_mtd(chip);
>
> /*
> @@ -1222,7 +1229,7 @@ static int denali_attach_chip(struct nand_chip *chip)
> chip->ecc.read_oob = denali_read_oob;
> chip->ecc.write_oob = denali_write_oob;
>
> - ret = denali_multidev_fixup(denali);
> + ret = denali_multidev_fixup(chip);
> if (ret)
> return ret;
>
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: linux-mtd@lists.infradead.org,
Miquel Raynal <miquel.raynal@bootlin.com>,
Brian Norris <computersforpeace@gmail.com>,
linux-kernel@vger.kernel.org, Marek Vasut <marek.vasut@gmail.com>,
Richard Weinberger <richard@nod.at>,
David Woodhouse <dwmw2@infradead.org>,
Boris Brezillon <bbrezillon@kernel.org>
Subject: Re: [PATCH v4 1/9] mtd: rawnand: denali: use nand_chip pointer more for internal functions
Date: Sat, 30 Mar 2019 15:23:23 +0100 [thread overview]
Message-ID: <20190330152323.71734cb8@collabora.com> (raw)
In-Reply-To: <1553844501-7119-2-git-send-email-yamada.masahiro@socionext.com>
On Fri, 29 Mar 2019 16:28:13 +0900
Masahiro Yamada <yamada.masahiro@socionext.com> wrote:
> With the recent refactoring, the NAND driver hooks now take a pointer
> to nand_chip. Add to_denali() in order to convert (struct nand_chip *)
> to (struct denali_nand_info *) directly. It is more useful than the
> current mtd_to_denali().
>
> I changed some helper functions to take (struct nand_chip *). This will
> avoid pointer conversion back and forth, and ease further development.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
> ---
>
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
> drivers/mtd/nand/raw/denali.c | 57 ++++++++++++++++++++++++-------------------
> 1 file changed, 32 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c
> index 24aeafc..4ac1314 100644
> --- a/drivers/mtd/nand/raw/denali.c
> +++ b/drivers/mtd/nand/raw/denali.c
> @@ -47,6 +47,11 @@ static inline struct denali_nand_info *mtd_to_denali(struct mtd_info *mtd)
> return container_of(mtd_to_nand(mtd), struct denali_nand_info, nand);
> }
>
> +static struct denali_nand_info *to_denali(struct nand_chip *chip)
> +{
> + return container_of(chip, struct denali_nand_info, nand);
> +}
> +
> /*
> * Direct Addressing - the slave address forms the control information (command
> * type, bank, block, and page address). The slave data is the actual data to
> @@ -282,12 +287,12 @@ static void denali_cmd_ctrl(struct nand_chip *chip, int dat, unsigned int ctrl)
> denali->host_write(denali, DENALI_BANK(denali) | type, dat);
> }
>
> -static int denali_check_erased_page(struct mtd_info *mtd,
> - struct nand_chip *chip, uint8_t *buf,
> +static int denali_check_erased_page(struct nand_chip *chip,
> + struct denali_nand_info *denali, u8 *buf,
You don't need to pass both chip and denali, as one can be extracted
from the other.
> unsigned long uncor_ecc_flags,
> unsigned int max_bitflips)
> {
> - struct denali_nand_info *denali = mtd_to_denali(mtd);
> + struct mtd_ecc_stats *ecc_stats = &nand_to_mtd(chip)->ecc_stats;
> uint8_t *ecc_code = chip->oob_poi + denali->oob_skip_bytes;
> int ecc_steps = chip->ecc.steps;
> int ecc_size = chip->ecc.size;
> @@ -303,9 +308,9 @@ static int denali_check_erased_page(struct mtd_info *mtd,
> NULL, 0,
> chip->ecc.strength);
> if (stat < 0) {
> - mtd->ecc_stats.failed++;
> + ecc_stats->failed++;
> } else {
> - mtd->ecc_stats.corrected += stat;
> + ecc_stats->corrected += stat;
> max_bitflips = max_t(unsigned int, max_bitflips, stat);
> }
>
> @@ -316,11 +321,11 @@ static int denali_check_erased_page(struct mtd_info *mtd,
> return max_bitflips;
> }
>
> -static int denali_hw_ecc_fixup(struct mtd_info *mtd,
> +static int denali_hw_ecc_fixup(struct nand_chip *chip,
> struct denali_nand_info *denali,
Ditto.
> unsigned long *uncor_ecc_flags)
> {
> - struct nand_chip *chip = mtd_to_nand(mtd);
> + struct mtd_ecc_stats *ecc_stats = &nand_to_mtd(chip)->ecc_stats;
> int bank = denali->active_bank;
> uint32_t ecc_cor;
> unsigned int max_bitflips;
> @@ -346,16 +351,17 @@ static int denali_hw_ecc_fixup(struct mtd_info *mtd,
> * Unfortunately, we can not know the total number of corrected bits in
> * the page. Increase the stats by max_bitflips. (compromised solution)
> */
> - mtd->ecc_stats.corrected += max_bitflips;
> + ecc_stats->corrected += max_bitflips;
>
> return max_bitflips;
> }
>
> -static int denali_sw_ecc_fixup(struct mtd_info *mtd,
> +static int denali_sw_ecc_fixup(struct nand_chip *chip,
> struct denali_nand_info *denali,
> unsigned long *uncor_ecc_flags, uint8_t *buf)
> {
> - unsigned int ecc_size = denali->nand.ecc.size;
> + struct mtd_ecc_stats *ecc_stats = &nand_to_mtd(chip)->ecc_stats;
> + unsigned int ecc_size = chip->ecc.size;
> unsigned int bitflips = 0;
> unsigned int max_bitflips = 0;
> uint32_t err_addr, err_cor_info;
> @@ -404,7 +410,7 @@ static int denali_sw_ecc_fixup(struct mtd_info *mtd,
> /* correct the ECC error */
> flips_in_byte = hweight8(buf[offset] ^ err_cor_value);
> buf[offset] ^= err_cor_value;
> - mtd->ecc_stats.corrected += flips_in_byte;
> + ecc_stats->corrected += flips_in_byte;
> bitflips += flips_in_byte;
>
> max_bitflips = max(max_bitflips, bitflips);
> @@ -587,9 +593,11 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf,
> return ret;
> }
>
> -static int denali_data_xfer(struct denali_nand_info *denali, void *buf,
> - size_t size, int page, int raw, int write)
> +static int denali_data_xfer(struct nand_chip *chip, void *buf, size_t size,
> + int page, int raw, int write)
> {
> + struct denali_nand_info *denali = to_denali(chip);
> +
> iowrite32(raw ? 0 : ECC_ENABLE__FLAG, denali->reg + ECC_ENABLE);
> iowrite32(raw ? TRANSFER_SPARE_REG__FLAG : 0,
> denali->reg + TRANSFER_SPARE_REG);
> @@ -678,7 +686,7 @@ static int denali_read_page_raw(struct nand_chip *chip, uint8_t *buf,
> size_t size = writesize + oobsize;
> int ret, i, pos, len;
>
> - ret = denali_data_xfer(denali, tmp_buf, size, page, 1, 0);
> + ret = denali_data_xfer(chip, tmp_buf, size, page, 1, 0);
> if (ret)
> return ret;
>
> @@ -766,14 +774,14 @@ static int denali_read_page(struct nand_chip *chip, uint8_t *buf,
> int stat = 0;
> int ret;
>
> - ret = denali_data_xfer(denali, buf, mtd->writesize, page, 0, 0);
> + ret = denali_data_xfer(chip, buf, mtd->writesize, page, 0, 0);
> if (ret && ret != -EBADMSG)
> return ret;
>
> if (denali->caps & DENALI_CAP_HW_ECC_FIXUP)
> - stat = denali_hw_ecc_fixup(mtd, denali, &uncor_ecc_flags);
> + stat = denali_hw_ecc_fixup(chip, denali, &uncor_ecc_flags);
> else if (ret == -EBADMSG)
> - stat = denali_sw_ecc_fixup(mtd, denali, &uncor_ecc_flags, buf);
> + stat = denali_sw_ecc_fixup(chip, denali, &uncor_ecc_flags, buf);
>
> if (stat < 0)
> return stat;
> @@ -783,7 +791,7 @@ static int denali_read_page(struct nand_chip *chip, uint8_t *buf,
> if (ret)
> return ret;
>
> - stat = denali_check_erased_page(mtd, chip, buf,
> + stat = denali_check_erased_page(chip, denali, buf,
> uncor_ecc_flags, stat);
> }
>
> @@ -866,17 +874,16 @@ static int denali_write_page_raw(struct nand_chip *chip, const uint8_t *buf,
> memcpy(tmp_buf + size - len, oob, len);
> }
>
> - return denali_data_xfer(denali, tmp_buf, size, page, 1, 1);
> + return denali_data_xfer(chip, tmp_buf, size, page, 1, 1);
> }
>
> static int denali_write_page(struct nand_chip *chip, const uint8_t *buf,
> int oob_required, int page)
> {
> struct mtd_info *mtd = nand_to_mtd(chip);
> - struct denali_nand_info *denali = mtd_to_denali(mtd);
>
> - return denali_data_xfer(denali, (void *)buf, mtd->writesize,
> - page, 0, 1);
> + return denali_data_xfer(chip, (void *)buf, mtd->writesize, page,
> + 0, 1);
> }
>
> static void denali_select_chip(struct nand_chip *chip, int cs)
> @@ -1092,9 +1099,9 @@ static const struct mtd_ooblayout_ops denali_ooblayout_ops = {
> .free = denali_ooblayout_free,
> };
>
> -static int denali_multidev_fixup(struct denali_nand_info *denali)
> +static int denali_multidev_fixup(struct nand_chip *chip)
> {
> - struct nand_chip *chip = &denali->nand;
> + struct denali_nand_info *denali = to_denali(chip);
> struct mtd_info *mtd = nand_to_mtd(chip);
>
> /*
> @@ -1222,7 +1229,7 @@ static int denali_attach_chip(struct nand_chip *chip)
> chip->ecc.read_oob = denali_read_oob;
> chip->ecc.write_oob = denali_write_oob;
>
> - ret = denali_multidev_fixup(denali);
> + ret = denali_multidev_fixup(chip);
> if (ret)
> return ret;
>
next prev parent reply other threads:[~2019-03-30 14:23 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-29 7:28 [PATCH v4 0/9] mtd: rawnand: denali: exec_op(), controller/chip separation, and cleanups Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 1/9] mtd: rawnand: denali: use nand_chip pointer more for internal functions Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-30 14:23 ` Boris Brezillon [this message]
2019-03-30 14:23 ` Boris Brezillon
2019-04-01 17:14 ` Miquel Raynal
2019-04-01 17:14 ` Miquel Raynal
2019-04-02 3:48 ` Masahiro Yamada
2019-04-02 3:48 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 2/9] mtd: rawnand: denali: refactor raw page accessors Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 3/9] mtd: rawnand: denali: remove unneeded casts in denali_{read, write}_pio Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 3/9] mtd: rawnand: denali: remove unneeded casts in denali_{read,write}_pio Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 4/9] mtd: rawnand: denali: switch over to ->exec_op() from legacy hooks Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 5/9] mtd: rawnand: denali: use bool type instead of int where appropriate Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 6/9] mtd: rawnand: denali_pci: rename goto labels Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 7/9] mtd: rawnand: denali: decouple controller and NAND chips Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 8/9] mtd: rawnand: denali: remove DENALI_NR_BANKS macro Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
2019-03-29 7:28 ` [PATCH v4 9/9] mtd: rawnand: denali: clean up coding style Masahiro Yamada
2019-03-29 7:28 ` Masahiro Yamada
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190330152323.71734cb8@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=bbrezillon@kernel.org \
--cc=computersforpeace@gmail.com \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=marek.vasut@gmail.com \
--cc=miquel.raynal@bootlin.com \
--cc=richard@nod.at \
--cc=yamada.masahiro@socionext.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.