All of lore.kernel.org
 help / color / mirror / Atom feed
From: Miquel Raynal <miquel.raynal@bootlin.com>
To: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>,
	Vignesh Raghavendra <vigneshr@ti.com>,
	Tudor Ambarus <tudor.ambarus@microchip.com>,
	Richard Weinberger <richard@nod.at>,
	Boris Brezillon <bbrezillon@kernel.org>,
	Nicolas Ferre <nicolas.ferre@microchip.com>,
	Ludovic Desroches <ludovic.desroches@microchip.com>,
	linux-mtd@lists.infradead.org
Subject: Re: [PATCH 2/2] mtd: rawnand: atmel: Convert the driver to exec_op()
Date: Mon, 27 Apr 2020 17:17:19 +0200	[thread overview]
Message-ID: <20200427171719.395b84a7@xps13> (raw)
In-Reply-To: <20200418194959.1017197-2-boris.brezillon@collabora.com>

Hi Boris,

Thanks for the conversion!

Boris Brezillon <boris.brezillon@collabora.com> wrote on Sat, 18 Apr
2020 21:49:59 +0200:

[...]

>  
> -static void atmel_nand_cmd_ctrl(struct nand_chip *chip, int cmd,
> -				unsigned int ctrl)
> +static int atmel_hsmc_exec_rw(struct nand_chip *chip,
> +			      const struct nand_subop *subop)
>  {
> +	const struct nand_op_instr *instr = subop->instrs;
>  	struct atmel_nand *nand = to_atmel_nand(chip);
> -	struct atmel_nand_controller *nc;
>  
> -	nc = to_nand_controller(chip->controller);
> +	if (WARN_ON_ONCE(subop->ninstrs != 1 ||
> +			 (instr->type != NAND_OP_DATA_IN_INSTR &&
> +			  instr->type != NAND_OP_DATA_OUT_INSTR)))
> +		return -EINVAL;
>  
> -	if ((ctrl & NAND_CTRL_CHANGE) && nand->activecs->csgpio) {
> -		if (ctrl & NAND_NCE)
> -			gpiod_set_value(nand->activecs->csgpio, 0);
> -		else
> -			gpiod_set_value(nand->activecs->csgpio, 1);
> -	}
> +	if (instr->type == NAND_OP_DATA_IN_INSTR)
> +		atmel_nand_read_buf(nand, instr->ctx.data.buf.in,
> +				    instr->ctx.data.len,
> +				    instr->ctx.data.force_8bit);
> +	else
> +		atmel_nand_write_buf(nand, instr->ctx.data.buf.out,
> +				     instr->ctx.data.len,
> +				     instr->ctx.data.force_8bit);
>  
> -	if (ctrl & NAND_ALE)
> -		writeb(cmd, nand->activecs->io.virt + nc->caps->ale_offs);
> -	else if (ctrl & NAND_CLE)
> -		writeb(cmd, nand->activecs->io.virt + nc->caps->cle_offs);
> +	return 0;
> +}
> +
> +static int atmel_hsmc_exec_waitrdy(struct nand_chip *chip,
> +				   const struct nand_subop *subop)
> +{
> +	const struct nand_op_instr *instr = subop->instrs;
> +	struct atmel_nand *nand = to_atmel_nand(chip);
> +
> +	if (WARN_ON_ONCE(subop->ninstrs != 1 ||
> +			 instr->type != NAND_OP_WAITRDY_INSTR))
> +		return -EINVAL;

How could this happen? I would drop this extra check which IMHO is not
useful (same for all the occurrences of similar conditions).

> +
> +	return atmel_hsmc_nand_waitrdy(nand, instr->ctx.waitrdy.timeout_ms);
> +}
> +
> +static const struct nand_op_parser atmel_hsmc_op_parser = NAND_OP_PARSER(
> +	NAND_OP_PARSER_PATTERN(atmel_hsmc_exec_cmd_addr,
> +		NAND_OP_PARSER_PAT_CMD_ELEM(true),
> +		NAND_OP_PARSER_PAT_ADDR_ELEM(true, 5),
> +		NAND_OP_PARSER_PAT_CMD_ELEM(true)),
> +	NAND_OP_PARSER_PATTERN(atmel_hsmc_exec_rw,
> +		NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, UINT_MAX)),

I find more meaningful to use 0 than UINT_MAX as the core will ignore
any boundary in this case.

> +	NAND_OP_PARSER_PATTERN(atmel_hsmc_exec_rw,
> +		NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, UINT_MAX)),

You probably meant DATA_OUT here?

> +	NAND_OP_PARSER_PATTERN(atmel_hsmc_exec_waitrdy,
> +		NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)),
> +);
> +
> +static int atmel_hsmc_nand_exec_op(struct atmel_nand *nand,
> +				   const struct nand_operation *op,
> +				   bool check_only)
> +{
> +	int ret;
> +
> +	if (check_only)
> +		return nand_op_parser_exec_op(&nand->base,
> +					      &atmel_hsmc_op_parser, op, true);
> +
> +	atmel_hsmc_nand_select_die(nand, op->cs);
> +	ret = nand_op_parser_exec_op(&nand->base, &atmel_hsmc_op_parser, op,
> +				     false);
> +	atmel_hsmc_nand_unselect_die(nand);
> +
> +	return ret;
>  }
>  

With the above fixed, please add my

Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>


Thanks,
Miquèl

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

  reply	other threads:[~2020-04-27 15:17 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-18 19:49 [PATCH 1/2] mtd: rawnand: Propage CS selection to sub operations Boris Brezillon
2020-04-18 19:49 ` [PATCH 2/2] mtd: rawnand: atmel: Convert the driver to exec_op() Boris Brezillon
2020-04-27 15:17   ` Miquel Raynal [this message]
2020-04-27 18:25     ` Boris Brezillon
2020-04-27 18:27     ` Boris Brezillon
2020-04-27 18:36       ` Miquel Raynal
2020-04-27 15:00 ` [PATCH 1/2] mtd: rawnand: Propage CS selection to sub operations Miquel Raynal
2020-04-27 18:22   ` Boris Brezillon

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=20200427171719.395b84a7@xps13 \
    --to=miquel.raynal@bootlin.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=bbrezillon@kernel.org \
    --cc=boris.brezillon@collabora.com \
    --cc=linux-mtd@lists.infradead.org \
    --cc=ludovic.desroches@microchip.com \
    --cc=nicolas.ferre@microchip.com \
    --cc=richard@nod.at \
    --cc=tudor.ambarus@microchip.com \
    --cc=vigneshr@ti.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.