[REPOST] mtd: extend plat_nand for (read|write)_buf

Submitted by Alexander Clouter on May 11, 2009, 6:28 p.m.

Details

Message ID 20090511182801.GK32684@woodchuck
State Accepted
Commit d6fed9e9fc5eefae5be0ecf222bac7e7496e8e74
Headers show

Commit Message

Alexander Clouter May 11, 2009, 6:28 p.m.
This patch adds (write|read)_buf callbacks to plat_nand.

The NAND on the TS-7800 provisioned by the FPGA allows readw() and 
readl() to be used which gives a 2.5x speed up.  To be able to use this 
from the plat_nand driver a hook for read_buf (and also write_buf whilst 
we are in there) need to be made available.  This patch adds the hook.

This is a repost[1] of a feature asked for before[2], plus other helpful 
patches to plat_nand[3] would be welcomed if at all possible too.

[1] http://lists.infradead.org/pipermail/linux-mtd/2009-March/024747.html
[2] http://lists.infradead.org/pipermail/linux-mtd/2007-October/019659.html
[3] http://lists.infradead.org/pipermail/linux-mtd/2009-March/024780.html

Signed-off-by: Alexander Clouter <alex@digriz.org.uk>
---

Comments

Artem Bityutskiy May 15, 2009, 1:51 p.m.
On Mon, 2009-05-11 at 19:28 +0100, Alexander Clouter wrote:
> This patch adds (write|read)_buf callbacks to plat_nand.
> 
> The NAND on the TS-7800 provisioned by the FPGA allows readw() and 
> readl() to be used which gives a 2.5x speed up.  To be able to use this 
> from the plat_nand driver a hook for read_buf (and also write_buf whilst 
> we are in there) need to be made available.  This patch adds the hook.
> 
> This is a repost[1] of a feature asked for before[2], plus other helpful 
> patches to plat_nand[3] would be welcomed if at all possible too.
> 
> [1] http://lists.infradead.org/pipermail/linux-mtd/2009-March/024747.html
> [2] http://lists.infradead.org/pipermail/linux-mtd/2007-October/019659.html
> [3] http://lists.infradead.org/pipermail/linux-mtd/2009-March/024780.html
> 
> Signed-off-by: Alexander Clouter <alex@digriz.org.uk>

I think this should be submitted with the user at the same
time. Adding hooks without having a user is not very good.
E.g., you may find out later that this does not help, or
cancel your project, or end up with different call-backs,
etc.

You may keep this patch privately, work on your NAND driver,
and when you have it ready, you submit it with this at the
same time.
Alexander Clouter May 15, 2009, 3:05 p.m.
Hi,

* Artem Bityutskiy <dedekind@infradead.org> [2009-05-15 16:51:00+0300]:
> 
> On Mon, 2009-05-11 at 19:28 +0100, Alexander Clouter wrote:
> > This patch adds (write|read)_buf callbacks to plat_nand.
> > 
> > The NAND on the TS-7800 provisioned by the FPGA allows readw() and 
> > readl() to be used which gives a 2.5x speed up.  To be able to use this 
> > from the plat_nand driver a hook for read_buf (and also write_buf whilst 
> > we are in there) need to be made available.  This patch adds the hook.
> > 
> > This is a repost[1] of a feature asked for before[2], plus other helpful 
> > patches to plat_nand[3] would be welcomed if at all possible too.
> > 
> > [1] http://lists.infradead.org/pipermail/linux-mtd/2009-March/024747.html
> > [2] http://lists.infradead.org/pipermail/linux-mtd/2007-October/019659.html
> > [3] http://lists.infradead.org/pipermail/linux-mtd/2009-March/024780.html
> > 
> > Signed-off-by: Alexander Clouter <alex@digriz.org.uk>
> 
> I think this should be submitted with the user at the same
> time. Adding hooks without having a user is not very good.
> E.g., you may find out later that this does not help, or
> cancel your project, or end up with different call-backs,
> etc.
> 
In the case of read/write_buf...there is no other way, I'm all ears if 
you know how I can do (read|write)(w|l) with plat_nand *now*?

I just pulled off this type of manoeuvre for a HW RNG driver:

http://lkml.indiana.edu/hypermail/linux/kernel/0902.2/02727.html
http://git.marvell.com/?p=orion.git;a=commit;h=8be7b57dea0467324ad4545334c5e35c18f0814b

I doubt the ARM people would be happy if I push ARM patches through the 
MTD sub-system :)

> You may keep this patch privately, work on your NAND driver,
> and when you have it ready, you submit it with this at the
> same time.
> 
Erm, it's been ready for a *long* time, about a year[1], and is being 
used.  Recently the bits of my plat_nand impementation[2] is on it's way 
to going mainline (Orion -> ARM -> Linus):

http://git.marvell.com/?p=orion.git;a=commit;h=75bb6b9aab3255f440ef4e72a31978d1681105d6

Cheers

[1] http://tech.groups.yahoo.com/group/ts-7000/message/11616
[2] http://lists.infradead.org/pipermail/linux-mtd/2009-February/024555.html
Artem Bityutskiy May 15, 2009, 3:31 p.m.
On Fri, 2009-05-15 at 16:05 +0100, Alexander Clouter wrote:
> > You may keep this patch privately, work on your NAND driver,
> > and when you have it ready, you submit it with this at the
> > same time.
> > 
> Erm, it's been ready for a *long* time, about a year[1], and is being 
> used.  Recently the bits of my plat_nand impementation[2] is on it's way 
> to going mainline (Orion -> ARM -> Linus):

Ok, I thought you do not use this so far.

I've pushed your patch to l2-mtd-2.6.git. This does not guarantee
anything, just means I'll ping David to look at it and send upstream.

Patch hide | download patch | download mbox

diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c
index 86e1d08..4cdec46 100644
--- a/drivers/mtd/nand/plat_nand.c
+++ b/drivers/mtd/nand/plat_nand.c
@@ -61,6 +61,8 @@  static int __devinit plat_nand_probe(struct platform_device *pdev)
 	data->chip.cmd_ctrl = pdata->ctrl.cmd_ctrl;
 	data->chip.dev_ready = pdata->ctrl.dev_ready;
 	data->chip.select_chip = pdata->ctrl.select_chip;
+	data->chip.write_buf = pdata->ctrl.write_buf;
+	data->chip.read_buf = pdata->ctrl.read_buf;
 	data->chip.chip_delay = pdata->chip.chip_delay;
 	data->chip.options |= pdata->chip.options;
 
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 7efb9be..0e35375 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -584,6 +584,8 @@  struct platform_nand_chip {
  * @select_chip:	platform specific chip select function
  * @cmd_ctrl:		platform specific function for controlling
  *			ALE/CLE/nCE. Also used to write command and address
+ * @write_buf:		platform specific function for write buffer
+ * @read_buf:		platform specific function for read buffer
  * @priv:		private data to transport driver specific settings
  *
  * All fields are optional and depend on the hardware driver requirements
@@ -594,6 +596,10 @@  struct platform_nand_ctrl {
 	void		(*select_chip)(struct mtd_info *mtd, int chip);
 	void		(*cmd_ctrl)(struct mtd_info *mtd, int dat,
 				    unsigned int ctrl);
+	void		(*write_buf)(struct mtd_info *mtd,
+				    const uint8_t *buf, int len);
+	void		(*read_buf)(struct mtd_info *mtd,
+				    uint8_t *buf, int len);
 	void		*priv;
 };