From: Boris Brezillon <boris.brezillon@collabora.com>
To: Miquel Raynal <miquel.raynal@bootlin.com>
Cc: "Vignesh Raghavendra" <vigneshr@ti.com>,
"Tudor Ambarus" <tudor.ambarus@microchip.com>,
"Richard Weinberger" <richard@nod.at>,
"Boris Brezillon" <bbrezillon@kernel.org>,
linux-mtd@lists.infradead.org, "Rafał Miłecki" <rafal@milecki.pl>,
bcm-kernel-feedback-list@broadcom.com,
openwrt-devel@lists.openwrt.org
Subject: Re: [PATCH 5/9] mtd: rawnand: bcm47xx: Implement the exec_op() interface
Date: Mon, 27 Apr 2020 20:35:25 +0200 [thread overview]
Message-ID: <20200427203525.5fd1deca@collabora.com> (raw)
In-Reply-To: <20200427191811.3f32cebc@xps13>
On Mon, 27 Apr 2020 19:18:11 +0200
Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> Hi Boris,
>
> Boris Brezillon <boris.brezillon@collabora.com> wrote on Sun, 19 Apr
> 2020 14:51:36 +0200:
>
> > Implement the exec_op() interface so we can get rid of the convoluted
> > cmdfunc() implementation.
> >
> > Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> > ---
> > This is based on my understanding of how this controller works, and I
> > think it covers all the use cases covered by the custom cmdfunc()
> > implementation. I might be wrong of course, so it'd be great to have
> > someone test on real HW.
> > ---
> > .../nand/raw/bcm47xxnflash/bcm47xxnflash.h | 1 +
> > .../mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c | 150 ++++++++++++++++++
> > 2 files changed, 151 insertions(+)
> >
> > diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/bcm47xxnflash.h b/drivers/mtd/nand/raw/bcm47xxnflash/bcm47xxnflash.h
> > index 201b9baa52a0..00d0974b73cb 100644
> > --- a/drivers/mtd/nand/raw/bcm47xxnflash/bcm47xxnflash.h
> > +++ b/drivers/mtd/nand/raw/bcm47xxnflash/bcm47xxnflash.h
> > @@ -10,6 +10,7 @@
> > #include <linux/mtd/rawnand.h>
> >
> > struct bcm47xxnflash {
> > + struct nand_controller base;
> > struct bcma_drv_cc *cc;
> >
> > struct nand_chip nand_chip;
> > diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
> > index fbb7acebc8f7..184f78b3d45a 100644
> > --- a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
> > +++ b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
> > @@ -382,6 +382,153 @@ static void bcm47xxnflash_ops_bcm4706_write_buf(struct nand_chip *nand_chip,
> > pr_err("Invalid command for buf write: 0x%X\n", b47n->curr_command);
> > }
> >
> > +static int
> > +bcm47xxnflash_ops_bcm4706_exec_cmd_addr(struct nand_chip *chip,
> > + const struct nand_subop *subop)
> > +{
> > + struct bcm47xxnflash *b47n = nand_get_controller_data(chip);
> > + u32 nctl = 0, col = 0, row = 0, ncols = 0, nrows = 0;
> > + unsigned int i, j;
> > +
> > + for (i = 0; i < subop->ninstrs; i++) {
> > + const struct nand_op_instr *instr = &subop->instrs[i];
> > +
> > + switch (instr->type) {
> > + case NAND_OP_CMD_INSTR:
> > + if (WARN_ON_ONCE((nctl & NCTL_CMD0) &&
> > + (nctl & NCTL_CMD1W)))
> > + return -EINVAL;
> > + else if (nctl & NCTL_CMD0)
> > + nctl |= NCTL_CMD1W |
> > + ((u32)instr->ctx.cmd.opcode << 8);
> > + else
> > + nctl |= NCTL_CMD0 | instr->ctx.cmd.opcode;
> > + break;
> > + case NAND_OP_ADDR_INSTR:
> > + for (j = 0; j < instr->ctx.addr.naddrs; j++) {
> > + u32 addr = instr->ctx.addr.addrs[j];
> > +
> > + if (i < 2) {
>
> Don't you mean j here? ^
>
Nice catch! Indeed, it should be j.
> > + col |= addr << i * 8;
>
> I'm not sure this will work, addr is 32-bit and col as well, I bet you
> won't end up with what you expect.
Well, assuming I use j that's really what I want. addr is an u32 to
allow for a shift greater than 8, but the value has be extracted
from the instr->ctx.addr.addrs array which is an u8 array, thus
making addr <= 0xff.
>
> > + nctl |= NCTL_COL;
> > + ncols++;
> > + } else {
> > + row |= addr << (i - 2) * 8;
And it's j here as well.
> > + nctl |= NCTL_ROW;
> > + nrows++;
> > + }
> > + }
> > + break;
> > + default:
> > + WARN_ON_ONCE(1);
> > + return -EINVAL;
> > + }
> > + }
> > +
> > + /* Keep the CS line asserted if there's something else to execute. */
> > + if (!subop->is_last)
> > + nctl |= NCTL_CSA;
> > +
> > + bcma_cc_write32(b47n->cc, BCMA_CC_NFLASH_CONF,
> > + CONF_MAGIC_BIT |
> > + CONF_COL_BYTES(ncols) |
> > + CONF_ROW_BYTES(nrows));
> > + return bcm47xxnflash_ops_bcm4706_ctl_cmd(b47n->cc, nctl);
> > +}
> > +
> > +static int
> > +bcm47xxnflash_ops_bcm4706_exec_waitrdy(struct nand_chip *chip,
> > + const struct nand_subop *subop)
> > +{
> > + struct bcm47xxnflash *b47n = nand_get_controller_data(chip);
> > + const struct nand_op_instr *instr = &subop->instrs[0];
> > + unsigned long timeout_jiffies = jiffies;
> > +
> > + if (WARN_ON(subop->ninstrs != 1 ||
> > + instr->type != NAND_OP_DATA_IN_INSTR))
> > + return -EINVAL;
>
> Same remark as for the atmel migration, I doubt all these checks are
> useful as long as we use the "official" parser to call these helpers. I
> would rather prefer to drop them all.
Agreed.
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2020-04-27 18:36 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-19 12:51 [PATCH 0/9] mtd: rawnand: bcm47xx: Convert the driver exec_op() Boris Brezillon
2020-04-19 12:51 ` [PATCH 1/9] mtd: rawnand: Add an is_last flag to nand_subop Boris Brezillon
2020-04-27 17:02 ` Miquel Raynal
2020-04-27 17:03 ` Miquel Raynal
2020-04-27 17:03 ` Miquel Raynal
2020-04-19 12:51 ` [PATCH 2/9] mtd: rawnand: bcm47xx: Drop dependency on BCMA Boris Brezillon
2020-04-19 12:51 ` [PATCH 3/9] mtd: rawnand: bcm47xx: Allow compiling the driver when COMPILE_TEST=y Boris Brezillon
2020-04-19 12:51 ` [PATCH 4/9] mtd: rawnand: bcm47xx: Demistify a few more things Boris Brezillon
2020-04-27 17:07 ` Miquel Raynal
2020-04-27 18:31 ` Boris Brezillon
2020-04-19 12:51 ` [PATCH 5/9] mtd: rawnand: bcm47xx: Implement the exec_op() interface Boris Brezillon
2020-04-27 17:18 ` Miquel Raynal
2020-04-27 18:35 ` Boris Brezillon [this message]
2020-04-27 18:49 ` Miquel Raynal
2020-04-19 12:51 ` [PATCH 6/9] mtd: rawnand: bcm47xx: Get rid of the legacy implementation Boris Brezillon
2020-04-27 17:19 ` Miquel Raynal
2020-04-27 18:39 ` Boris Brezillon
2020-04-19 12:51 ` [PATCH 7/9] mtd: rawnand: bcm47xx: Simplify the init() function Boris Brezillon
2020-04-27 17:20 ` Miquel Raynal
2020-04-19 12:51 ` [PATCH 8/9] mtd: rawnand: bcm47xx: Merge all source files Boris Brezillon
2020-04-27 17:27 ` Miquel Raynal
2020-04-19 12:51 ` [PATCH 9/9] mtd: rawnand: bcm47xx: Move the driver to drivers/mtd/nand/raw/ Boris Brezillon
2020-04-20 11:32 ` Boris Brezillon
2020-04-27 17:24 ` Miquel Raynal
2020-04-27 18:40 ` 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=20200427203525.5fd1deca@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=bbrezillon@kernel.org \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=linux-mtd@lists.infradead.org \
--cc=miquel.raynal@bootlin.com \
--cc=openwrt-devel@lists.openwrt.org \
--cc=rafal@milecki.pl \
--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.