From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: linux-mtd@lists.infradead.org,
David Woodhouse <dwmw2@infradead.org>,
Marek Vasut <marek.vasut@gmail.com>,
Brian Norris <computersforpeace@gmail.com>,
thorsten.christiansson@idquantique.com,
laurent.monat@idquantique.com, Dinh Nguyen <dinguyen@kernel.org>,
Artem Bityutskiy <artem.bityutskiy@linux.intel.com>,
Graham Moore <grmoore@opensource.altera.com>,
Enrico Jorns <ejo@pengutronix.de>,
Chuanxiao Dong <chuanxiao.dong@intel.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
Jassi Brar <jaswinder.singh@linaro.org>,
Rob Herring <robh@kernel.org>
Subject: Re: [RESEND PATCH v2 42/53] mtd: nand: denali: switch over to cmd_ctrl instead of cmdfunc
Date: Thu, 23 Mar 2017 09:52:00 +0100 [thread overview]
Message-ID: <20170323095200.282c50e5@bbrezillon> (raw)
In-Reply-To: <1490228282-10805-16-git-send-email-yamada.masahiro@socionext.com>
On Thu, 23 Mar 2017 09:17:51 +0900
Masahiro Yamada <yamada.masahiro@socionext.com> wrote:
> The NAND_CMD_SET_FEATURES support is missing from denali_cmdfunc().
> This is needed for nand_onfi_set_features(). It would be possible
> to add it in the current implementation, but having ->cmd_ctrl()
> seems a better approach from the discussion with Boris [1].
>
> Rely on the default implementation for ->cmdfunc() and implement
> the driver's own ->cmd_ctrl().
>
> Also add ->write_byte(), which is needed to write parameters for
> NAND_CMD_SET_FEATURES.
I'll review more carefully, but it goes in the right direction.
Thanks a lot for doing that!
>
> [1] https://lkml.org/lkml/2017/3/15/97
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
> ---
>
> Changes in v2:
> - Newly added
>
> drivers/mtd/nand/denali.c | 104 +++++++++++++++++++++++-----------------------
> 1 file changed, 52 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c
> index c0b8179..2d25b2f 100644
> --- a/drivers/mtd/nand/denali.c
> +++ b/drivers/mtd/nand/denali.c
> @@ -230,20 +230,16 @@ static uint32_t denali_wait_for_irq(struct denali_nand_info *denali,
> return denali->irq_status;
> }
>
> -/* resets a specific device connected to the core */
> -static void reset_bank(struct denali_nand_info *denali)
> +static uint32_t denali_check_irq(struct denali_nand_info *denali)
> {
> + unsigned long flags;
> uint32_t irq_status;
>
> - denali_reset_irq(denali);
> -
> - iowrite32(1 << denali->flash_bank, denali->flash_reg + DEVICE_RESET);
> -
> - irq_status = denali_wait_for_irq(denali,
> - INTR__RST_COMP | INTR__TIME_OUT);
> + spin_lock_irqsave(&denali->irq_lock, flags);
> + irq_status = denali->irq_status;
> + spin_unlock_irqrestore(&denali->irq_lock, flags);
>
> - if (!(irq_status & INTR__RST_COMP))
> - dev_err(denali->dev, "reset bank failed.\n");
> + return irq_status;
> }
>
> /*
> @@ -273,6 +269,42 @@ static uint8_t denali_read_byte(struct mtd_info *mtd)
> return ioread32(denali->flash_mem + 0x10);
> }
>
> +static void denali_write_byte(struct mtd_info *mtd, uint8_t byte)
> +{
> + struct denali_nand_info *denali = mtd_to_denali(mtd);
> +
> + index_addr(denali, MODE_11 | BANK(denali->flash_bank) | 2, byte);
> +}
> +
> +static void denali_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl)
> +{
> + struct denali_nand_info *denali = mtd_to_denali(mtd);
> + uint32_t type;
> +
> + if (ctrl & NAND_CLE)
> + type = 0;
> + else if (ctrl & NAND_ALE)
> + type = 1;
> + else
> + return;
> +
> + /*
> + * Some commands are followed by chip->dev_ready or chip->waitfunc.
> + * irq_status must be cleared here to catch the R/B# interrupt later.
> + */
> + if (ctrl & NAND_CTRL_CHANGE)
> + denali_reset_irq(denali);
> +
> + index_addr(denali, MODE_11 | BANK(denali->flash_bank) | type, dat);
> +}
> +
> +static int denali_dev_ready(struct mtd_info *mtd)
> +{
> + struct denali_nand_info *denali = mtd_to_denali(mtd);
> +
> + return !!(denali_check_irq(denali) & INTR__INT_ACT);
> +}
> +
> /*
> * sends a pipeline command operation to the controller. See the Denali NAND
> * controller's user guide for more information (section 4.2.3.6).
> @@ -788,7 +820,13 @@ static void denali_select_chip(struct mtd_info *mtd, int chip)
>
> static int denali_waitfunc(struct mtd_info *mtd, struct nand_chip *chip)
> {
> - return 0;
> + struct denali_nand_info *denali = mtd_to_denali(mtd);
> + uint32_t irq_status;
> +
> + /* R/B# pin transitioned from low to high? */
> + irq_status = denali_wait_for_irq(denali, INTR__INT_ACT);
> +
> + return irq_status & INTR__INT_ACT ? 0 : NAND_STATUS_FAIL;
> }
>
> static int denali_erase(struct mtd_info *mtd, int page)
> @@ -809,46 +847,6 @@ static int denali_erase(struct mtd_info *mtd, int page)
> return irq_status & INTR__ERASE_COMP ? 0 : NAND_STATUS_FAIL;
> }
>
> -static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
> - int page)
> -{
> - struct denali_nand_info *denali = mtd_to_denali(mtd);
> - uint32_t addr, irq_status;
> - int wait_ready = 0;
> -
> - switch (cmd) {
> - case NAND_CMD_PARAM:
> - wait_ready = 1;
> - break;
> - case NAND_CMD_STATUS:
> - case NAND_CMD_READID:
> - break;
> - case NAND_CMD_RESET:
> - reset_bank(denali);
> - break;
> - case NAND_CMD_READOOB:
> - /* TODO: Read OOB data */
> - return;
> - default:
> - pr_err(": unsupported command received 0x%x\n", cmd);
> - return;
> - }
> -
> - denali_reset_irq(denali);
> -
> - addr = MODE_11 | BANK(denali->flash_bank);
> - index_addr(denali, addr | 0, cmd);
> - if (col != -1)
> - index_addr(denali, addr | 1, col);
> -
> - if (!wait_ready)
> - return;
> -
> - irq_status = denali_wait_for_irq(denali, INTR__INT_ACT);
> - if (!(irq_status & INTR__INT_ACT))
> - dev_err(denali->dev, "failed to issue command 0x%x\n", cmd);
> -}
> -
> #define DIV_ROUND_DOWN_ULL(ll, d) \
> ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; })
>
> @@ -1187,8 +1185,10 @@ int denali_init(struct denali_nand_info *denali)
>
> /* register the driver with the NAND core subsystem */
> chip->select_chip = denali_select_chip;
> - chip->cmdfunc = denali_cmdfunc;
> chip->read_byte = denali_read_byte;
> + chip->write_byte = denali_write_byte;
> + chip->cmd_ctrl = denali_cmd_ctrl;
> + chip->dev_ready = denali_dev_ready;
> chip->waitfunc = denali_waitfunc;
> /* clk rate info is needed for setup_data_interface */
> if (denali->clk_x_rate)
next prev parent reply other threads:[~2017-03-23 8:52 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-23 0:17 [RESEND PATCH v2 27/53] mtd: nand: denali: avoid hard-coding ecc.strength and ecc.bytes Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 28/53] mtd: nand: denali: support "nand-ecc-strength" DT property Masahiro Yamada
2017-03-23 8:43 ` Boris Brezillon
2017-03-23 0:17 ` [RESEND PATCH v2 29/53] mtd: nand: denali: remove Toshiba and Hynix specific fixup code Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 30/53] mtd: nand: denali_dt: add compatible strings for UniPhier SoC variants Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 31/53] mtd: nand: denali: set NAND_ECC_CUSTOM_PAGE_ACCESS Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 32/53] mtd: nand: denali: do not propagate NAND_STATUS_FAIL to waitfunc() Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 33/53] mtd: nand: denali: use BIT() and GENMASK() for register macros Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 34/53] mtd: nand: denali: remove unneeded find_valid_banks() Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 35/53] mtd: nand: denali: handle timing parameters by setup_data_interface() Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 36/53] mtd: nand: denali: remove meaningless pipeline read-ahead operation Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 37/53] mtd: nand: denali: rework interrupt handling Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 38/53] mtd: nand: denali: fix NAND_CMD_STATUS handling Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 39/53] mtd: nand: denali: fix NAND_CMD_PARAM handling Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 40/53] mtd: nand: do not check R/B# for CMD_READID in nand_command(_lp) Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 41/53] mtd: nand: do not check R/B# for CMD_SET_FEATURES " Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 42/53] mtd: nand: denali: switch over to cmd_ctrl instead of cmdfunc Masahiro Yamada
2017-03-23 8:52 ` Boris Brezillon [this message]
2017-03-23 0:17 ` [RESEND PATCH v2 43/53] mtd: nand: denali: fix bank reset function Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 44/53] mtd: nand: denali: use interrupt instead of polling for bank reset Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 45/53] mtd: nand: denali: propagate page to helpers via function argument Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 46/53] mtd: nand: denali: merge struct nand_buf into struct denali_nand_info Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 47/53] mtd: nand: denali: use flag instead of register macro for direction Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 48/53] mtd: nand: denali: fix raw and oob accessors for syndrome page layout Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 49/53] mtd: nand: denali: support hardware-assisted erased page detection Masahiro Yamada
2017-03-23 0:17 ` [RESEND PATCH v2 50/53] mtd: nand: allocate aligned buffers if NAND_OWN_BUFFERS is unset Masahiro Yamada
2017-03-27 8:00 ` Boris Brezillon
2017-03-28 1:13 ` yamada.masahiro
2017-03-28 7:59 ` Boris Brezillon
2017-03-28 8:07 ` Boris Brezillon
2017-03-28 10:22 ` Russell King - ARM Linux
2017-03-28 10:17 ` Russell King - ARM Linux
2017-03-28 12:13 ` Boris Brezillon
2017-03-29 3:22 ` yamada.masahiro
2017-03-29 7:03 ` Boris Brezillon
2017-03-23 0:18 ` [RESEND PATCH v2 51/53] mtd: nand: denali: skip driver internal bounce buffer when possible Masahiro Yamada
2017-03-23 0:18 ` [RESEND PATCH v2 52/53] mtd: nand: denali: use non-managed kmalloc() for DMA buffer Masahiro Yamada
2017-03-23 11:33 ` Robin Murphy
2017-03-24 1:41 ` yamada.masahiro
2017-03-24 17:09 ` Robin Murphy
2017-03-23 0:18 ` [RESEND PATCH v2 53/53] mtd: nand: denali: enable bad block table scan 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=20170323095200.282c50e5@bbrezillon \
--to=boris.brezillon@free-electrons.com \
--cc=artem.bityutskiy@linux.intel.com \
--cc=chuanxiao.dong@intel.com \
--cc=computersforpeace@gmail.com \
--cc=dinguyen@kernel.org \
--cc=dwmw2@infradead.org \
--cc=ejo@pengutronix.de \
--cc=grmoore@opensource.altera.com \
--cc=jaswinder.singh@linaro.org \
--cc=laurent.monat@idquantique.com \
--cc=linux-mtd@lists.infradead.org \
--cc=marek.vasut@gmail.com \
--cc=mhiramat@kernel.org \
--cc=robh@kernel.org \
--cc=thorsten.christiansson@idquantique.com \
--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.