mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH V3 0/8] mtd framework rework
@ 2011-12-19 14:04 Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 1/8] drivers/mtd: move nand.c into core.c Robert Jarzmik
                   ` (8 more replies)
  0 siblings, 9 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

This patchset aims at reworking the mtd support :
 - add a mtd core
 - concentrate MTD core functions (MTD_WRITE)
 - split mtd core character device (/dev/mtd<N>) from other
   character devices (/dev/mtdoob<N>).
 - add a data+oob character device (/dev/mtdraw<N>)

Since V1, Sascha comments should have been taken into
account, and the patchset was rebased against next tree
(commit "mtd nand: fix oob compile time option").

As there were some quirks on the rebase, I'd like a
quick validation from you, Sascha, if everything still works
as it's supposed to, especially the *_READ_OOB thingy.

Robert Jarzmik (8):
  drivers/mtd: move nand.c into core.c
  drivers/mtd: cosmetic changes
  drivers/mtd: transfer NAND notions to MTD core
  drivers/mtd: recover NAND default device name "nand"
  drivers/mtd: fix core multiple MTD registrations
  drivers/mtd: add mtd core hooks
  drivers/mtd: split mtd mtdoob devices
  drivers/mtd: add the mtdraw device (data+oob)

 drivers/mtd/Kconfig                    |   17 ++
 drivers/mtd/Makefile                   |    7 +-
 drivers/mtd/core.c                     |  241 +++++++++++++++++++++++++
 drivers/mtd/mtd.h                      |   42 +++++
 drivers/mtd/mtdoob.c                   |  100 +++++++++++
 drivers/mtd/mtdraw.c                   |  303 ++++++++++++++++++++++++++++++++
 drivers/mtd/nand/Kconfig               |   11 --
 drivers/mtd/nand/Makefile              |    4 +-
 drivers/mtd/nand/atmel_nand.c          |    2 +-
 drivers/mtd/nand/diskonchip.c          |    2 +-
 drivers/mtd/nand/nand-bb.c             |    6 +-
 drivers/mtd/nand/nand.c                |  290 ------------------------------
 drivers/mtd/nand/nand_base.c           |   14 +-
 drivers/mtd/nand/nand_bbt.c            |    2 +-
 drivers/mtd/nand/nand_hwecc.c          |    4 +-
 drivers/mtd/nand/nand_hwecc_syndrome.c |    6 +-
 drivers/mtd/nand/nand_imx.c            |    2 +-
 drivers/mtd/nand/nand_omap_gpmc.c      |    2 +-
 drivers/mtd/nand/nand_s3c2410.c        |    2 +-
 drivers/mtd/nand/nand_swecc.c          |    4 +-
 drivers/mtd/nand/nomadik_nand.c        |    2 +-
 include/linux/mtd/mtd.h                |    3 +-
 22 files changed, 735 insertions(+), 331 deletions(-)
 create mode 100644 drivers/mtd/core.c
 create mode 100644 drivers/mtd/mtd.h
 create mode 100644 drivers/mtd/mtdoob.c
 create mode 100644 drivers/mtd/mtdraw.c
 delete mode 100644 drivers/mtd/nand/nand.c

-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 1/8] drivers/mtd: move nand.c into core.c
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 2/8] drivers/mtd: cosmetic changes Robert Jarzmik
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

Move nand core into the global MTD core.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/mtd/Makefile      |    1 +
 drivers/mtd/core.c        |  290 +++++++++++++++++++++++++++++++++++++++++++++
 drivers/mtd/nand/Makefile |    2 +-
 drivers/mtd/nand/nand.c   |  290 ---------------------------------------------
 4 files changed, 292 insertions(+), 291 deletions(-)
 create mode 100644 drivers/mtd/core.c
 delete mode 100644 drivers/mtd/nand/nand.c

diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index 85bed11..80fe386 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -1,3 +1,4 @@
 obj-$(CONFIG_NAND)	+= nand/
 obj-$(CONFIG_UBI)	+= ubi/
 obj-$(CONFIG_PARTITION_NEED_MTD)	+= partition.o
+obj-$(CONFIG_MTD)	+= core.o
diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
new file mode 100644
index 0000000..130e2af
--- /dev/null
+++ b/drivers/mtd/core.c
@@ -0,0 +1,290 @@
+/*
+ * (C) Copyright 2005
+ * 2N Telekomunikace, a.s. <www.2n.cz>
+ * Ladislav Michl <michl@2n.cz>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/mtd.h>
+#include <init.h>
+#include <xfuncs.h>
+#include <driver.h>
+#include <malloc.h>
+#include <ioctl.h>
+#include <nand.h>
+#include <errno.h>
+
+static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count, ulong offset, ulong flags)
+{
+	struct mtd_info *info = cdev->priv;
+	size_t retlen;
+	int ret;
+
+	debug("nand_read: 0x%08lx 0x%08x\n", offset, count);
+
+	ret = info->read(info, offset, count, &retlen, buf);
+
+	if(ret) {
+		printf("err %d\n", ret);
+		return ret;
+	}
+	return retlen;
+}
+
+#define NOTALIGNED(x) (x & (info->writesize - 1)) != 0
+
+#ifdef CONFIG_NAND_WRITE
+static int all_ff(const void *buf, int len)
+{
+	int i;
+	const uint8_t *p = buf;
+
+	for (i = 0; i < len; i++)
+		if (p[i] != 0xFF)
+			return 0;
+	return 1;
+}
+
+static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count, ulong offset, ulong flags)
+{
+	struct mtd_info *info = cdev->priv;
+	size_t retlen, now;
+	int ret = 0;
+	void *wrbuf = NULL;
+	size_t count = _count;
+
+	if (NOTALIGNED(offset)) {
+		printf("offset 0x%0lx not page aligned\n", offset);
+		return -EINVAL;
+	}
+
+	debug("write: 0x%08lx 0x%08x\n", offset, count);
+
+	while (count) {
+		now = count > info->writesize ? info->writesize : count;
+
+		if (NOTALIGNED(now)) {
+			debug("not aligned: %d %ld\n", info->writesize, (offset % info->writesize));
+			wrbuf = xmalloc(info->writesize);
+			memset(wrbuf, 0xff, info->writesize);
+			memcpy(wrbuf + (offset % info->writesize), buf, now);
+			if (!all_ff(wrbuf, info->writesize))
+				ret = info->write(info, offset & ~(info->writesize - 1),
+						info->writesize, &retlen, wrbuf);
+			free(wrbuf);
+		} else {
+			if (!all_ff(buf, info->writesize))
+				ret = info->write(info, offset, now, &retlen, buf);
+			debug("offset: 0x%08lx now: 0x%08x retlen: 0x%08x\n", offset, now, retlen);
+		}
+		if (ret)
+			goto out;
+
+		offset += now;
+		count -= now;
+		buf += now;
+	}
+
+out:
+	return ret ? ret : _count;
+}
+#endif
+
+static int nand_ioctl(struct cdev *cdev, int request, void *buf)
+{
+	struct mtd_info *info = cdev->priv;
+	struct mtd_info_user *user = buf;
+
+	switch (request) {
+	case MEMGETBADBLOCK:
+		debug("MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
+		return info->block_isbad(info, (off_t)buf);
+#ifdef CONFIG_NAND_WRITE
+	case MEMSETBADBLOCK:
+		debug("MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
+		return info->block_markbad(info, (off_t)buf);
+#endif
+	case MEMGETINFO:
+		user->type	= info->type;
+		user->flags	= info->flags;
+		user->size	= info->size;
+		user->erasesize	= info->erasesize;
+		user->oobsize	= info->oobsize;
+		user->mtd	= info;
+		/* The below fields are obsolete */
+		user->ecctype	= -1;
+		user->eccsize	= 0;
+		return 0;
+	}
+
+	return 0;
+}
+
+#ifdef CONFIG_NAND_WRITE
+static ssize_t nand_erase(struct cdev *cdev, size_t count, unsigned long offset)
+{
+	struct mtd_info *info = cdev->priv;
+	struct erase_info erase;
+	int ret;
+
+	memset(&erase, 0, sizeof(erase));
+	erase.mtd = info;
+	erase.addr = offset;
+	erase.len = info->erasesize;
+
+	while (count > 0) {
+		debug("erase %d %d\n", erase.addr, erase.len);
+
+		ret = info->block_isbad(info, erase.addr);
+		if (ret > 0) {
+			printf("Skipping bad block at 0x%08x\n", erase.addr);
+		} else {
+			ret = info->erase(info, &erase);
+			if (ret)
+				return ret;
+		}
+
+		erase.addr += info->erasesize;
+		count -= count > info->erasesize ? info->erasesize : count;
+	}
+
+	return 0;
+}
+#endif
+
+#if 0
+static char* mtd_get_size(struct device_d *, struct param_d *param)
+{
+	static char 
+}
+#endif
+
+static struct file_operations nand_ops = {
+	.read   = nand_read,
+#ifdef CONFIG_NAND_WRITE
+	.write  = nand_write,
+	.erase  = nand_erase,
+#endif
+	.ioctl  = nand_ioctl,
+	.lseek  = dev_lseek_default,
+};
+
+#ifdef CONFIG_NAND_OOB_DEVICE
+static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
+{
+	struct mtd_info *info = cdev->priv;
+	struct nand_chip *chip = info->priv;
+	struct mtd_oob_ops ops;
+	int ret;
+
+	if (count < info->oobsize)
+		return -EINVAL;
+
+	ops.mode = MTD_OOB_RAW;
+	ops.ooboffs = 0;
+	ops.ooblen = info->oobsize;
+	ops.oobbuf = buf;
+	ops.datbuf = NULL;
+	ops.len = info->oobsize;
+
+	offset /= info->oobsize;
+	ret = info->read_oob(info, offset << chip->page_shift, &ops);
+	if (ret)
+		return ret;
+
+	return info->oobsize;
+}
+
+static struct file_operations nand_ops_oob = {
+	.read   = nand_read_oob,
+	.ioctl  = nand_ioctl,
+	.lseek  = dev_lseek_default,
+};
+
+static int nand_init_oob_cdev(struct mtd_info *mtd)
+{
+	struct nand_chip *chip = mtd->priv;
+
+	mtd->cdev_oob.ops = &nand_ops_oob;
+	mtd->cdev_oob.size = (mtd->size >> chip->page_shift) * mtd->oobsize;
+	mtd->cdev_oob.name = asprintf("nand_oob%d", mtd->class_dev.id);
+	mtd->cdev_oob.priv = mtd;
+	mtd->cdev_oob.dev = &mtd->class_dev;
+	devfs_create(&mtd->cdev_oob);
+
+	return 0;
+}
+
+static void nand_exit_oob_cdev(struct mtd_info *mtd)
+{
+	free(mtd->cdev_oob.name);
+}
+#else
+
+static int nand_init_oob_cdev(struct mtd_info *mtd)
+{
+	return 0;
+}
+
+static void nand_exit_oob_cdev(struct mtd_info *mtd)
+{
+	return;
+}
+#endif
+
+int add_mtd_device(struct mtd_info *mtd)
+{
+	char str[16];
+
+	strcpy(mtd->class_dev.name, "nand");
+	register_device(&mtd->class_dev);
+
+	mtd->cdev.ops = &nand_ops;
+	mtd->cdev.size = mtd->size;
+	mtd->cdev.name = asprintf("nand%d", mtd->class_dev.id);
+	mtd->cdev.priv = mtd;
+	mtd->cdev.dev = &mtd->class_dev;
+	mtd->cdev.mtd = mtd;
+
+	sprintf(str, "%u", mtd->size);
+	dev_add_param_fixed(&mtd->class_dev, "size", str);
+	sprintf(str, "%u", mtd->erasesize);
+	dev_add_param_fixed(&mtd->class_dev, "erasesize", str);
+	sprintf(str, "%u", mtd->writesize);
+	dev_add_param_fixed(&mtd->class_dev, "writesize", str);
+	sprintf(str, "%u", mtd->oobsize);
+	dev_add_param_fixed(&mtd->class_dev, "oobsize", str);
+
+	devfs_create(&mtd->cdev);
+
+	nand_init_oob_cdev(mtd);
+
+	return 0;
+}
+
+int del_mtd_device (struct mtd_info *mtd)
+{
+	unregister_device(&mtd->class_dev);
+	nand_exit_oob_cdev(mtd);
+	free(mtd->param_size.value);
+	free(mtd->cdev.name);
+	return 0;
+}
+
diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
index 149cbbf..26b65a7 100644
--- a/drivers/mtd/nand/Makefile
+++ b/drivers/mtd/nand/Makefile
@@ -1,6 +1,6 @@
 
 # Generic NAND options
-obj-$(CONFIG_NAND)			+= nand.o nand_ecc.o
+obj-$(CONFIG_NAND)			+= nand_ecc.o
 obj-$(CONFIG_NAND_WRITE)		+= nand_write.o
 obj-$(CONFIG_NAND_ECC_SOFT)		+= nand_ecc.o nand_swecc.o
 obj-$(CONFIG_NAND_ECC_HW)		+= nand_hwecc.o
diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c
deleted file mode 100644
index 130e2af..0000000
--- a/drivers/mtd/nand/nand.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * (C) Copyright 2005
- * 2N Telekomunikace, a.s. <www.2n.cz>
- * Ladislav Michl <michl@2n.cz>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-#include <common.h>
-#include <linux/mtd/nand.h>
-#include <linux/mtd/mtd.h>
-#include <init.h>
-#include <xfuncs.h>
-#include <driver.h>
-#include <malloc.h>
-#include <ioctl.h>
-#include <nand.h>
-#include <errno.h>
-
-static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count, ulong offset, ulong flags)
-{
-	struct mtd_info *info = cdev->priv;
-	size_t retlen;
-	int ret;
-
-	debug("nand_read: 0x%08lx 0x%08x\n", offset, count);
-
-	ret = info->read(info, offset, count, &retlen, buf);
-
-	if(ret) {
-		printf("err %d\n", ret);
-		return ret;
-	}
-	return retlen;
-}
-
-#define NOTALIGNED(x) (x & (info->writesize - 1)) != 0
-
-#ifdef CONFIG_NAND_WRITE
-static int all_ff(const void *buf, int len)
-{
-	int i;
-	const uint8_t *p = buf;
-
-	for (i = 0; i < len; i++)
-		if (p[i] != 0xFF)
-			return 0;
-	return 1;
-}
-
-static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count, ulong offset, ulong flags)
-{
-	struct mtd_info *info = cdev->priv;
-	size_t retlen, now;
-	int ret = 0;
-	void *wrbuf = NULL;
-	size_t count = _count;
-
-	if (NOTALIGNED(offset)) {
-		printf("offset 0x%0lx not page aligned\n", offset);
-		return -EINVAL;
-	}
-
-	debug("write: 0x%08lx 0x%08x\n", offset, count);
-
-	while (count) {
-		now = count > info->writesize ? info->writesize : count;
-
-		if (NOTALIGNED(now)) {
-			debug("not aligned: %d %ld\n", info->writesize, (offset % info->writesize));
-			wrbuf = xmalloc(info->writesize);
-			memset(wrbuf, 0xff, info->writesize);
-			memcpy(wrbuf + (offset % info->writesize), buf, now);
-			if (!all_ff(wrbuf, info->writesize))
-				ret = info->write(info, offset & ~(info->writesize - 1),
-						info->writesize, &retlen, wrbuf);
-			free(wrbuf);
-		} else {
-			if (!all_ff(buf, info->writesize))
-				ret = info->write(info, offset, now, &retlen, buf);
-			debug("offset: 0x%08lx now: 0x%08x retlen: 0x%08x\n", offset, now, retlen);
-		}
-		if (ret)
-			goto out;
-
-		offset += now;
-		count -= now;
-		buf += now;
-	}
-
-out:
-	return ret ? ret : _count;
-}
-#endif
-
-static int nand_ioctl(struct cdev *cdev, int request, void *buf)
-{
-	struct mtd_info *info = cdev->priv;
-	struct mtd_info_user *user = buf;
-
-	switch (request) {
-	case MEMGETBADBLOCK:
-		debug("MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
-		return info->block_isbad(info, (off_t)buf);
-#ifdef CONFIG_NAND_WRITE
-	case MEMSETBADBLOCK:
-		debug("MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
-		return info->block_markbad(info, (off_t)buf);
-#endif
-	case MEMGETINFO:
-		user->type	= info->type;
-		user->flags	= info->flags;
-		user->size	= info->size;
-		user->erasesize	= info->erasesize;
-		user->oobsize	= info->oobsize;
-		user->mtd	= info;
-		/* The below fields are obsolete */
-		user->ecctype	= -1;
-		user->eccsize	= 0;
-		return 0;
-	}
-
-	return 0;
-}
-
-#ifdef CONFIG_NAND_WRITE
-static ssize_t nand_erase(struct cdev *cdev, size_t count, unsigned long offset)
-{
-	struct mtd_info *info = cdev->priv;
-	struct erase_info erase;
-	int ret;
-
-	memset(&erase, 0, sizeof(erase));
-	erase.mtd = info;
-	erase.addr = offset;
-	erase.len = info->erasesize;
-
-	while (count > 0) {
-		debug("erase %d %d\n", erase.addr, erase.len);
-
-		ret = info->block_isbad(info, erase.addr);
-		if (ret > 0) {
-			printf("Skipping bad block at 0x%08x\n", erase.addr);
-		} else {
-			ret = info->erase(info, &erase);
-			if (ret)
-				return ret;
-		}
-
-		erase.addr += info->erasesize;
-		count -= count > info->erasesize ? info->erasesize : count;
-	}
-
-	return 0;
-}
-#endif
-
-#if 0
-static char* mtd_get_size(struct device_d *, struct param_d *param)
-{
-	static char 
-}
-#endif
-
-static struct file_operations nand_ops = {
-	.read   = nand_read,
-#ifdef CONFIG_NAND_WRITE
-	.write  = nand_write,
-	.erase  = nand_erase,
-#endif
-	.ioctl  = nand_ioctl,
-	.lseek  = dev_lseek_default,
-};
-
-#ifdef CONFIG_NAND_OOB_DEVICE
-static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
-{
-	struct mtd_info *info = cdev->priv;
-	struct nand_chip *chip = info->priv;
-	struct mtd_oob_ops ops;
-	int ret;
-
-	if (count < info->oobsize)
-		return -EINVAL;
-
-	ops.mode = MTD_OOB_RAW;
-	ops.ooboffs = 0;
-	ops.ooblen = info->oobsize;
-	ops.oobbuf = buf;
-	ops.datbuf = NULL;
-	ops.len = info->oobsize;
-
-	offset /= info->oobsize;
-	ret = info->read_oob(info, offset << chip->page_shift, &ops);
-	if (ret)
-		return ret;
-
-	return info->oobsize;
-}
-
-static struct file_operations nand_ops_oob = {
-	.read   = nand_read_oob,
-	.ioctl  = nand_ioctl,
-	.lseek  = dev_lseek_default,
-};
-
-static int nand_init_oob_cdev(struct mtd_info *mtd)
-{
-	struct nand_chip *chip = mtd->priv;
-
-	mtd->cdev_oob.ops = &nand_ops_oob;
-	mtd->cdev_oob.size = (mtd->size >> chip->page_shift) * mtd->oobsize;
-	mtd->cdev_oob.name = asprintf("nand_oob%d", mtd->class_dev.id);
-	mtd->cdev_oob.priv = mtd;
-	mtd->cdev_oob.dev = &mtd->class_dev;
-	devfs_create(&mtd->cdev_oob);
-
-	return 0;
-}
-
-static void nand_exit_oob_cdev(struct mtd_info *mtd)
-{
-	free(mtd->cdev_oob.name);
-}
-#else
-
-static int nand_init_oob_cdev(struct mtd_info *mtd)
-{
-	return 0;
-}
-
-static void nand_exit_oob_cdev(struct mtd_info *mtd)
-{
-	return;
-}
-#endif
-
-int add_mtd_device(struct mtd_info *mtd)
-{
-	char str[16];
-
-	strcpy(mtd->class_dev.name, "nand");
-	register_device(&mtd->class_dev);
-
-	mtd->cdev.ops = &nand_ops;
-	mtd->cdev.size = mtd->size;
-	mtd->cdev.name = asprintf("nand%d", mtd->class_dev.id);
-	mtd->cdev.priv = mtd;
-	mtd->cdev.dev = &mtd->class_dev;
-	mtd->cdev.mtd = mtd;
-
-	sprintf(str, "%u", mtd->size);
-	dev_add_param_fixed(&mtd->class_dev, "size", str);
-	sprintf(str, "%u", mtd->erasesize);
-	dev_add_param_fixed(&mtd->class_dev, "erasesize", str);
-	sprintf(str, "%u", mtd->writesize);
-	dev_add_param_fixed(&mtd->class_dev, "writesize", str);
-	sprintf(str, "%u", mtd->oobsize);
-	dev_add_param_fixed(&mtd->class_dev, "oobsize", str);
-
-	devfs_create(&mtd->cdev);
-
-	nand_init_oob_cdev(mtd);
-
-	return 0;
-}
-
-int del_mtd_device (struct mtd_info *mtd)
-{
-	unregister_device(&mtd->class_dev);
-	nand_exit_oob_cdev(mtd);
-	free(mtd->param_size.value);
-	free(mtd->cdev.name);
-	return 0;
-}
-
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 2/8] drivers/mtd: cosmetic changes
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 1/8] drivers/mtd: move nand.c into core.c Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-21 11:00   ` Sascha Hauer
  2011-12-19 14:04 ` [PATCH V3 3/8] drivers/mtd: transfer NAND notions to MTD core Robert Jarzmik
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

Fix whitespace, replace all debug() by dev_dbg(), and fix
line length to 80 characters.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/mtd/core.c |   49 +++++++++++++++++++++++--------------------------
 1 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index 130e2af..1627359 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -14,11 +14,6 @@
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
  */
 #include <common.h>
 #include <linux/mtd/nand.h>
@@ -31,7 +26,8 @@
 #include <nand.h>
 #include <errno.h>
 
-static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count, ulong offset, ulong flags)
+static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count,
+			  ulong offset, ulong flags)
 {
 	struct mtd_info *info = cdev->priv;
 	size_t retlen;
@@ -49,6 +45,7 @@ static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count, ulong offs
 }
 
 #define NOTALIGNED(x) (x & (info->writesize - 1)) != 0
+#define MTDPGALG(x) ((x) & (info->writesize - 1))
 
 #ifdef CONFIG_NAND_WRITE
 static int all_ff(const void *buf, int len)
@@ -62,7 +59,8 @@ static int all_ff(const void *buf, int len)
 	return 1;
 }
 
-static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count, ulong offset, ulong flags)
+static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count,
+			  ulong offset, ulong flags)
 {
 	struct mtd_info *info = cdev->priv;
 	size_t retlen, now;
@@ -75,24 +73,29 @@ static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count, ulo
 		return -EINVAL;
 	}
 
-	debug("write: 0x%08lx 0x%08x\n", offset, count);
-
+	dev_dbg(cdev->dev, "write: 0x%08lx 0x%08x\n", offset, count);
 	while (count) {
 		now = count > info->writesize ? info->writesize : count;
 
 		if (NOTALIGNED(now)) {
-			debug("not aligned: %d %ld\n", info->writesize, (offset % info->writesize));
+			dev_dbg(cdev->dev, "not aligned: %d %ld\n",
+				info->writesize,
+				(offset % info->writesize));
 			wrbuf = xmalloc(info->writesize);
 			memset(wrbuf, 0xff, info->writesize);
 			memcpy(wrbuf + (offset % info->writesize), buf, now);
 			if (!all_ff(wrbuf, info->writesize))
-				ret = info->write(info, offset & ~(info->writesize - 1),
-						info->writesize, &retlen, wrbuf);
+				ret = info->write(info, MTDPGALG(offset),
+						  info->writesize, &retlen,
+						  wrbuf);
 			free(wrbuf);
 		} else {
 			if (!all_ff(buf, info->writesize))
-				ret = info->write(info, offset, now, &retlen, buf);
-			debug("offset: 0x%08lx now: 0x%08x retlen: 0x%08x\n", offset, now, retlen);
+				ret = info->write(info, offset, now, &retlen,
+						  buf);
+			dev_dbg(cdev->dev,
+				"offset: 0x%08lx now: 0x%08x retlen: 0x%08x\n",
+				offset, now, retlen);
 		}
 		if (ret)
 			goto out;
@@ -114,11 +117,11 @@ static int nand_ioctl(struct cdev *cdev, int request, void *buf)
 
 	switch (request) {
 	case MEMGETBADBLOCK:
-		debug("MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
+		dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
 		return info->block_isbad(info, (off_t)buf);
 #ifdef CONFIG_NAND_WRITE
 	case MEMSETBADBLOCK:
-		debug("MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
+		dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
 		return info->block_markbad(info, (off_t)buf);
 #endif
 	case MEMGETINFO:
@@ -150,7 +153,7 @@ static ssize_t nand_erase(struct cdev *cdev, size_t count, unsigned long offset)
 	erase.len = info->erasesize;
 
 	while (count > 0) {
-		debug("erase %d %d\n", erase.addr, erase.len);
+		dev_dbg(cdev->dev, "erase %d %d\n", erase.addr, erase.len);
 
 		ret = info->block_isbad(info, erase.addr);
 		if (ret > 0) {
@@ -169,13 +172,6 @@ static ssize_t nand_erase(struct cdev *cdev, size_t count, unsigned long offset)
 }
 #endif
 
-#if 0
-static char* mtd_get_size(struct device_d *, struct param_d *param)
-{
-	static char 
-}
-#endif
-
 static struct file_operations nand_ops = {
 	.read   = nand_read,
 #ifdef CONFIG_NAND_WRITE
@@ -186,8 +182,9 @@ static struct file_operations nand_ops = {
 	.lseek  = dev_lseek_default,
 };
 
-#ifdef CONFIG_NAND_OOB_DEVICE
-static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
+#ifdef CONFIG_NAND_READ_DEVICE
+static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count,
+			     ulong offset, ulong flags)
 {
 	struct mtd_info *info = cdev->priv;
 	struct nand_chip *chip = info->priv;
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 3/8] drivers/mtd: transfer NAND notions to MTD core
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 1/8] drivers/mtd: move nand.c into core.c Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 2/8] drivers/mtd: cosmetic changes Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-21 11:25   ` Sascha Hauer
  2011-12-19 14:04 ` [PATCH V3 4/8] drivers/mtd: recover NAND default device name "nand" Robert Jarzmik
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

Change NAND_WRITE into MTD_WRITE.
Change "page_shift" references in the core, which are purely
NAND, into mtd->writesize which is MTD generic.
Rename all "info" (struct mtd_info) into "mtd".

Beware, bisection is broken here as driver name changes from
/dev/nand<N> into /dev/mtd<N>.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/mtd/Kconfig                    |   10 ++
 drivers/mtd/core.c                     |  149 ++++++++++++++++----------------
 drivers/mtd/nand/Kconfig               |    5 -
 drivers/mtd/nand/Makefile              |    2 +-
 drivers/mtd/nand/nand-bb.c             |    6 +-
 drivers/mtd/nand/nand_base.c           |   14 ++--
 drivers/mtd/nand/nand_bbt.c            |    2 +-
 drivers/mtd/nand/nand_hwecc.c          |    4 +-
 drivers/mtd/nand/nand_hwecc_syndrome.c |    6 +-
 drivers/mtd/nand/nand_swecc.c          |    4 +-
 10 files changed, 104 insertions(+), 98 deletions(-)

diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index 562f0cd..81282ab 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -3,6 +3,16 @@ menuconfig MTD
 
 if MTD
 
+config MTD_WRITE
+	bool
+	default y
+	prompt "Support writing to MTD devices"
+
+config MTD_READ_OOB
+	bool
+	default y
+	prompt "Create a device for reading the OOB data"
+
 source "drivers/mtd/nand/Kconfig"
 source "drivers/mtd/ubi/Kconfig"
 
diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index 1627359..8ed0438 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -26,16 +26,16 @@
 #include <nand.h>
 #include <errno.h>
 
-static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count,
+static 	ssize_t mtd_read(struct cdev *cdev, void* buf, size_t count,
 			  ulong offset, ulong flags)
 {
-	struct mtd_info *info = cdev->priv;
+	struct mtd_info *mtd = cdev->priv;
 	size_t retlen;
 	int ret;
 
-	debug("nand_read: 0x%08lx 0x%08x\n", offset, count);
+	debug("mtd_read: 0x%08lx 0x%08x\n", offset, count);
 
-	ret = info->read(info, offset, count, &retlen, buf);
+	ret = mtd->read(mtd, offset, count, &retlen, buf);
 
 	if(ret) {
 		printf("err %d\n", ret);
@@ -44,10 +44,10 @@ static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count,
 	return retlen;
 }
 
-#define NOTALIGNED(x) (x & (info->writesize - 1)) != 0
-#define MTDPGALG(x) ((x) & (info->writesize - 1))
+#define NOTALIGNED(x) (x & (mtd->writesize - 1)) != 0
+#define MTDPGALG(x) ((x) & (mtd->writesize - 1))
 
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 static int all_ff(const void *buf, int len)
 {
 	int i;
@@ -59,10 +59,10 @@ static int all_ff(const void *buf, int len)
 	return 1;
 }
 
-static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count,
+static ssize_t mtd_write(struct cdev* cdev, const void *buf, size_t _count,
 			  ulong offset, ulong flags)
 {
-	struct mtd_info *info = cdev->priv;
+	struct mtd_info *mtd = cdev->priv;
 	size_t retlen, now;
 	int ret = 0;
 	void *wrbuf = NULL;
@@ -75,23 +75,23 @@ static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count,
 
 	dev_dbg(cdev->dev, "write: 0x%08lx 0x%08x\n", offset, count);
 	while (count) {
-		now = count > info->writesize ? info->writesize : count;
+		now = count > mtd->writesize ? mtd->writesize : count;
 
 		if (NOTALIGNED(now)) {
 			dev_dbg(cdev->dev, "not aligned: %d %ld\n",
-				info->writesize,
-				(offset % info->writesize));
-			wrbuf = xmalloc(info->writesize);
-			memset(wrbuf, 0xff, info->writesize);
-			memcpy(wrbuf + (offset % info->writesize), buf, now);
-			if (!all_ff(wrbuf, info->writesize))
-				ret = info->write(info, MTDPGALG(offset),
-						  info->writesize, &retlen,
+				mtd->writesize,
+				(offset % mtd->writesize));
+			wrbuf = xmalloc(mtd->writesize);
+			memset(wrbuf, 0xff, mtd->writesize);
+			memcpy(wrbuf + (offset % mtd->writesize), buf, now);
+			if (!all_ff(wrbuf, mtd->writesize))
+				ret = mtd->write(mtd, MTDPGALG(offset),
+						  mtd->writesize, &retlen,
 						  wrbuf);
 			free(wrbuf);
 		} else {
-			if (!all_ff(buf, info->writesize))
-				ret = info->write(info, offset, now, &retlen,
+			if (!all_ff(buf, mtd->writesize))
+				ret = mtd->write(mtd, offset, now, &retlen,
 						  buf);
 			dev_dbg(cdev->dev,
 				"offset: 0x%08lx now: 0x%08x retlen: 0x%08x\n",
@@ -110,27 +110,27 @@ out:
 }
 #endif
 
-static int nand_ioctl(struct cdev *cdev, int request, void *buf)
+static int mtd_ioctl(struct cdev *cdev, int request, void *buf)
 {
-	struct mtd_info *info = cdev->priv;
+	struct mtd_info *mtd = cdev->priv;
 	struct mtd_info_user *user = buf;
 
 	switch (request) {
 	case MEMGETBADBLOCK:
 		dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
-		return info->block_isbad(info, (off_t)buf);
-#ifdef CONFIG_NAND_WRITE
+		return mtd->block_isbad(mtd, (off_t)buf);
+#ifdef CONFIG_MTD_WRITE
 	case MEMSETBADBLOCK:
 		dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
-		return info->block_markbad(info, (off_t)buf);
+		return mtd->block_markbad(mtd, (off_t)buf);
 #endif
 	case MEMGETINFO:
-		user->type	= info->type;
-		user->flags	= info->flags;
-		user->size	= info->size;
-		user->erasesize	= info->erasesize;
-		user->oobsize	= info->oobsize;
-		user->mtd	= info;
+		user->type	= mtd->type;
+		user->flags	= mtd->flags;
+		user->size	= mtd->size;
+		user->erasesize	= mtd->erasesize;
+		user->oobsize	= mtd->oobsize;
+		user->mtd	= mtd;
 		/* The below fields are obsolete */
 		user->ecctype	= -1;
 		user->eccsize	= 0;
@@ -140,88 +140,89 @@ static int nand_ioctl(struct cdev *cdev, int request, void *buf)
 	return 0;
 }
 
-#ifdef CONFIG_NAND_WRITE
-static ssize_t nand_erase(struct cdev *cdev, size_t count, unsigned long offset)
+#ifdef CONFIG_MTD_WRITE
+static ssize_t mtd_erase(struct cdev *cdev, size_t count, unsigned long offset)
 {
-	struct mtd_info *info = cdev->priv;
+	struct mtd_info *mtd = cdev->priv;
 	struct erase_info erase;
 	int ret;
 
 	memset(&erase, 0, sizeof(erase));
-	erase.mtd = info;
+	erase.mtd = mtd;
 	erase.addr = offset;
-	erase.len = info->erasesize;
+	erase.len = mtd->erasesize;
 
 	while (count > 0) {
 		dev_dbg(cdev->dev, "erase %d %d\n", erase.addr, erase.len);
 
-		ret = info->block_isbad(info, erase.addr);
+		ret = mtd->block_isbad(mtd, erase.addr);
 		if (ret > 0) {
 			printf("Skipping bad block at 0x%08x\n", erase.addr);
 		} else {
-			ret = info->erase(info, &erase);
+			ret = mtd->erase(mtd, &erase);
 			if (ret)
 				return ret;
 		}
 
-		erase.addr += info->erasesize;
-		count -= count > info->erasesize ? info->erasesize : count;
+		erase.addr += mtd->erasesize;
+		count -= count > mtd->erasesize ? mtd->erasesize : count;
 	}
 
 	return 0;
 }
 #endif
 
-static struct file_operations nand_ops = {
-	.read   = nand_read,
-#ifdef CONFIG_NAND_WRITE
-	.write  = nand_write,
-	.erase  = nand_erase,
+static struct file_operations mtd_ops = {
+	.read   = mtd_read,
+#ifdef CONFIG_MTD_WRITE
+	.write  = mtd_write,
+	.erase  = mtd_erase,
 #endif
-	.ioctl  = nand_ioctl,
+	.ioctl  = mtd_ioctl,
 	.lseek  = dev_lseek_default,
 };
 
 #ifdef CONFIG_NAND_READ_DEVICE
-static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count,
-			     ulong offset, ulong flags)
+static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count,
+			    ulong offset, ulong flags)
 {
-	struct mtd_info *info = cdev->priv;
-	struct nand_chip *chip = info->priv;
+	struct mtd_info *mtd = cdev->priv;
 	struct mtd_oob_ops ops;
 	int ret;
 
-	if (count < info->oobsize)
+	if (count < mtd->oobsize)
 		return -EINVAL;
 
 	ops.mode = MTD_OOB_RAW;
 	ops.ooboffs = 0;
-	ops.ooblen = info->oobsize;
+	ops.ooblen = mtd->oobsize;
 	ops.oobbuf = buf;
 	ops.datbuf = NULL;
-	ops.len = info->oobsize;
-
-	offset /= info->oobsize;
-	ret = info->read_oob(info, offset << chip->page_shift, &ops);
+	ops.len = mtd->oobsize;
+
+	offset /= mtd->oobsize;
+	/*
+	 * This seems suspicious, shouldn't it be :
+	 *   offset / mtd->oobsize * mtd->writesize
+	 */
+	ret = mtd->read_oob(mtd, offset * mtd->writesize, &ops);
 	if (ret)
 		return ret;
 
-	return info->oobsize;
+	return mtd->oobsize;
 }
 
-static struct file_operations nand_ops_oob = {
-	.read   = nand_read_oob,
-	.ioctl  = nand_ioctl,
+static struct file_operations mtd_ops_oob = {
+	.read   = mtd_read_oob,
+	.ioctl  = mtd_ioctl,
 	.lseek  = dev_lseek_default,
 };
 
-static int nand_init_oob_cdev(struct mtd_info *mtd)
+static int mtd_init_oob_cdev(struct mtd_info *mtd)
 {
-	struct nand_chip *chip = mtd->priv;
-
-	mtd->cdev_oob.ops = &nand_ops_oob;
-	mtd->cdev_oob.size = (mtd->size >> chip->page_shift) * mtd->oobsize;
-	mtd->cdev_oob.name = asprintf("nand_oob%d", mtd->class_dev.id);
+	mtd->cdev_oob.ops = &mtd_ops_oob;
+	mtd->cdev_oob.size = (mtd->size / mtd->writesize) * mtd->oobsize;
+	mtd->cdev_oob.name = asprintf("mtd_oob%d", mtd->class_dev.id);
 	mtd->cdev_oob.priv = mtd;
 	mtd->cdev_oob.dev = &mtd->class_dev;
 	devfs_create(&mtd->cdev_oob);
@@ -229,18 +230,18 @@ static int nand_init_oob_cdev(struct mtd_info *mtd)
 	return 0;
 }
 
-static void nand_exit_oob_cdev(struct mtd_info *mtd)
+static void mtd_exit_oob_cdev(struct mtd_info *mtd)
 {
 	free(mtd->cdev_oob.name);
 }
 #else
 
-static int nand_init_oob_cdev(struct mtd_info *mtd)
+static int mtd_init_oob_cdev(struct mtd_info *mtd)
 {
 	return 0;
 }
 
-static void nand_exit_oob_cdev(struct mtd_info *mtd)
+static void mtd_exit_oob_cdev(struct mtd_info *mtd)
 {
 	return;
 }
@@ -250,12 +251,12 @@ int add_mtd_device(struct mtd_info *mtd)
 {
 	char str[16];
 
-	strcpy(mtd->class_dev.name, "nand");
+	strcpy(mtd->class_dev.name, "mtd");
 	register_device(&mtd->class_dev);
 
-	mtd->cdev.ops = &nand_ops;
+	mtd->cdev.ops = &mtd_ops;
 	mtd->cdev.size = mtd->size;
-	mtd->cdev.name = asprintf("nand%d", mtd->class_dev.id);
+	mtd->cdev.name = asprintf("mtd%d", mtd->class_dev.id);
 	mtd->cdev.priv = mtd;
 	mtd->cdev.dev = &mtd->class_dev;
 	mtd->cdev.mtd = mtd;
@@ -271,7 +272,7 @@ int add_mtd_device(struct mtd_info *mtd)
 
 	devfs_create(&mtd->cdev);
 
-	nand_init_oob_cdev(mtd);
+	mtd_init_oob_cdev(mtd);
 
 	return 0;
 }
@@ -279,7 +280,7 @@ int add_mtd_device(struct mtd_info *mtd)
 int del_mtd_device (struct mtd_info *mtd)
 {
 	unregister_device(&mtd->class_dev);
-	nand_exit_oob_cdev(mtd);
+	mtd_exit_oob_cdev(mtd);
 	free(mtd->param_size.value);
 	free(mtd->cdev.name);
 	return 0;
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index 1cc29a8..b6e38ff 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -8,11 +8,6 @@ menuconfig NAND
 
 if NAND
 
-config NAND_WRITE
-	bool
-	default y
-	prompt "Support writing to Nand"
-
 config NAND_ECC_SOFT
 	bool
 	default y
diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
index 26b65a7..00b7b27 100644
--- a/drivers/mtd/nand/Makefile
+++ b/drivers/mtd/nand/Makefile
@@ -1,7 +1,7 @@
 
 # Generic NAND options
 obj-$(CONFIG_NAND)			+= nand_ecc.o
-obj-$(CONFIG_NAND_WRITE)		+= nand_write.o
+obj-$(CONFIG_MTD_WRITE)			+= nand_write.o
 obj-$(CONFIG_NAND_ECC_SOFT)		+= nand_ecc.o nand_swecc.o
 obj-$(CONFIG_NAND_ECC_HW)		+= nand_hwecc.o
 obj-$(CONFIG_NAND_ECC_HW_SYNDROME)	+= nand_hwecc_syndrome.o
diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c
index 73ccab3..bd30438 100644
--- a/drivers/mtd/nand/nand-bb.c
+++ b/drivers/mtd/nand/nand-bb.c
@@ -90,7 +90,7 @@ static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count,
 /* Must be a multiple of the largest NAND page size */
 #define BB_WRITEBUF_SIZE	4096
 
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 static int nand_bb_write_buf(struct nand_bb *bb, size_t count)
 {
 	int ret, now;
@@ -185,7 +185,7 @@ static int nand_bb_close(struct cdev *cdev)
 {
 	struct nand_bb *bb = cdev->priv;
 
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	if (bb->needs_write)
 		nand_bb_write_buf(bb, bb->offset % BB_WRITEBUF_SIZE);
 #endif
@@ -250,7 +250,7 @@ static struct file_operations nand_bb_ops = {
 	.close  = nand_bb_close,
 	.read  	= nand_bb_read,
 	.lseek	= nand_bb_lseek,
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	.write 	= nand_bb_write,
 	.erase	= nand_bb_erase,
 #endif
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index ec0f4a3..c4eca0d 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -1006,7 +1006,7 @@ static void nand_set_defaults(struct nand_chip *chip, int busw)
 		chip->read_word = nand_read_word;
 	if (!chip->block_bad)
 		chip->block_bad = nand_block_bad;
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	if (!chip->block_markbad)
 		chip->block_markbad = nand_default_block_markbad;
 	if (!chip->write_buf)
@@ -1168,7 +1168,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
 	if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize)
 		chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;
 
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	/* Check for AND chips with 4 page planes */
 	if (chip->options & NAND_4PAGE_ARRAY)
 		chip->erase_cmd = multi_erase_cmd;
@@ -1297,7 +1297,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 		}
 	}
 
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	if (!chip->write_page)
 		chip->write_page = nand_write_page;
 #endif
@@ -1308,7 +1308,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 	 */
 	if (!chip->ecc.read_page_raw)
 		chip->ecc.read_page_raw = nand_read_page_raw;
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	if (!chip->ecc.write_page_raw)
 		chip->ecc.write_page_raw = nand_write_page_raw;
 #endif
@@ -1335,7 +1335,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 		printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. "
 		       "This is not recommended !!\n");
 		chip->ecc.read_page = nand_read_page_raw;
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 		chip->ecc.write_page = nand_write_page_raw;
 		chip->ecc.write_oob = nand_write_oob_std;
 #endif
@@ -1401,7 +1401,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 	/* Fill in remaining MTD driver data */
 	mtd->type = MTD_NANDFLASH;
 	mtd->flags = MTD_CAP_NANDFLASH;
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	mtd->erase = nand_erase;
 	mtd->write = nand_write;
 	mtd->write_oob = nand_write_oob;
@@ -1413,7 +1413,7 @@ int nand_scan_tail(struct mtd_info *mtd)
 	mtd->lock = NULL;
 	mtd->unlock = NULL;
 	mtd->block_isbad = nand_block_isbad;
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	mtd->block_markbad = nand_block_markbad;
 #endif
 	/* propagate ecc.layout to mtd_info */
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index bf3a7db..c1696ee 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -557,7 +557,7 @@ static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt
  * (Re)write the bad block table
  *
 */
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
 		     struct nand_bbt_descr *td, struct nand_bbt_descr *md,
 		     int chipsel)
diff --git a/drivers/mtd/nand/nand_hwecc.c b/drivers/mtd/nand/nand_hwecc.c
index 5ead49c..a48efa1 100644
--- a/drivers/mtd/nand/nand_hwecc.c
+++ b/drivers/mtd/nand/nand_hwecc.c
@@ -61,7 +61,7 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
  * @chip:	nand chip info structure
  * @buf:	data buffer
  */
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
 				  const uint8_t *buf)
 {
@@ -94,7 +94,7 @@ void nand_init_ecc_hw(struct nand_chip *chip)
 	if (!chip->ecc.read_oob)
 		chip->ecc.read_oob = nand_read_oob_std;
 #endif
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	if (!chip->ecc.write_oob)
 		chip->ecc.write_oob = nand_write_oob_std;
 	if (!chip->ecc.write_page)
diff --git a/drivers/mtd/nand/nand_hwecc_syndrome.c b/drivers/mtd/nand/nand_hwecc_syndrome.c
index dd067c9..1493b88 100644
--- a/drivers/mtd/nand/nand_hwecc_syndrome.c
+++ b/drivers/mtd/nand/nand_hwecc_syndrome.c
@@ -72,7 +72,7 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
  * The hw generator calculates the error syndrome automatically. Therefor
  * we need a special oob layout and handling.
  */
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 static void nand_write_page_syndrome(struct mtd_info *mtd,
 				    struct nand_chip *chip, const uint8_t *buf)
 {
@@ -155,7 +155,7 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
  * @chip:	nand chip info structure
  * @page:	page number to write
  */
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 static int nand_write_oob_syndrome(struct mtd_info *mtd,
 				   struct nand_chip *chip, int page)
 {
@@ -216,7 +216,7 @@ void nand_init_ecc_hw_syndrome(struct nand_chip *chip)
 		chip->ecc.read_page = nand_read_page_syndrome;
 	if (!chip->ecc.read_oob)
 		chip->ecc.read_oob = nand_read_oob_syndrome;
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	if (!chip->ecc.write_page)
 		chip->ecc.write_page = nand_write_page_syndrome;
 	if (!chip->ecc.write_oob)
diff --git a/drivers/mtd/nand/nand_swecc.c b/drivers/mtd/nand/nand_swecc.c
index a5edffa..95dfbd8 100644
--- a/drivers/mtd/nand/nand_swecc.c
+++ b/drivers/mtd/nand/nand_swecc.c
@@ -57,7 +57,7 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
  * @chip:	nand chip info structure
  * @buf:	data buffer
  */
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
 				  const uint8_t *buf)
 {
@@ -85,7 +85,7 @@ void nand_init_ecc_soft(struct nand_chip *chip)
 	chip->ecc.correct = nand_correct_data;
 	chip->ecc.read_page = nand_read_page_swecc;
 	chip->ecc.read_oob = nand_read_oob_std;
-#ifdef CONFIG_NAND_WRITE
+#ifdef CONFIG_MTD_WRITE
 	chip->ecc.write_page = nand_write_page_swecc;
 	chip->ecc.write_oob = nand_write_oob_std;
 #endif
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 4/8] drivers/mtd: recover NAND default device name "nand"
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
                   ` (2 preceding siblings ...)
  2011-12-19 14:04 ` [PATCH V3 3/8] drivers/mtd: transfer NAND notions to MTD core Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 5/8] drivers/mtd: fix core multiple MTD registrations Robert Jarzmik
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

As the previous commit changed the generic MTD device name
created from nand<N> into mtd<N>, provide a parameter to
add_mtd_device() so that legacy nand devices still appear as
nand<N>, and repair existing environements.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/mtd/core.c                |   16 +++++++++-------
 drivers/mtd/nand/atmel_nand.c     |    2 +-
 drivers/mtd/nand/diskonchip.c     |    2 +-
 drivers/mtd/nand/nand_imx.c       |    2 +-
 drivers/mtd/nand/nand_omap_gpmc.c |    2 +-
 drivers/mtd/nand/nand_s3c2410.c   |    2 +-
 drivers/mtd/nand/nomadik_nand.c   |    2 +-
 include/linux/mtd/mtd.h           |    2 +-
 8 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index 8ed0438..f767e84 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -218,11 +218,11 @@ static struct file_operations mtd_ops_oob = {
 	.lseek  = dev_lseek_default,
 };
 
-static int mtd_init_oob_cdev(struct mtd_info *mtd)
+static int mtd_init_oob_cdev(struct mtd_info *mtd, char *devname)
 {
 	mtd->cdev_oob.ops = &mtd_ops_oob;
 	mtd->cdev_oob.size = (mtd->size / mtd->writesize) * mtd->oobsize;
-	mtd->cdev_oob.name = asprintf("mtd_oob%d", mtd->class_dev.id);
+	mtd->cdev_oob.name = asprintf("%s_oob%d", devname, mtd->class_dev.id);
 	mtd->cdev_oob.priv = mtd;
 	mtd->cdev_oob.dev = &mtd->class_dev;
 	devfs_create(&mtd->cdev_oob);
@@ -236,7 +236,7 @@ static void mtd_exit_oob_cdev(struct mtd_info *mtd)
 }
 #else
 
-static int mtd_init_oob_cdev(struct mtd_info *mtd)
+static int mtd_init_oob_cdev(struct mtd_info *mtd, char *devname)
 {
 	return 0;
 }
@@ -247,16 +247,18 @@ static void mtd_exit_oob_cdev(struct mtd_info *mtd)
 }
 #endif
 
-int add_mtd_device(struct mtd_info *mtd)
+int add_mtd_device(struct mtd_info *mtd, char *devname)
 {
 	char str[16];
 
-	strcpy(mtd->class_dev.name, "mtd");
+	if (!devname)
+		devname = "mtd";
+	strcpy(mtd->class_dev.name, devname);
 	register_device(&mtd->class_dev);
 
 	mtd->cdev.ops = &mtd_ops;
 	mtd->cdev.size = mtd->size;
-	mtd->cdev.name = asprintf("mtd%d", mtd->class_dev.id);
+	mtd->cdev.name = asprintf("%s%d", devname, mtd->class_dev.id);
 	mtd->cdev.priv = mtd;
 	mtd->cdev.dev = &mtd->class_dev;
 	mtd->cdev.mtd = mtd;
@@ -272,7 +274,7 @@ int add_mtd_device(struct mtd_info *mtd)
 
 	devfs_create(&mtd->cdev);
 
-	mtd_init_oob_cdev(mtd);
+	mtd_init_oob_cdev(mtd, devname);
 
 	return 0;
 }
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 8cc1b51..534a065 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -485,7 +485,7 @@ static int __init atmel_nand_probe(struct device_d *dev)
 		goto err_scan_tail;
 	}
 
-	add_mtd_device(mtd);
+	add_mtd_device(mtd, "nand");
 
 	if (!res)
 		return res;
diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
index 2433945..8323575 100644
--- a/drivers/mtd/nand/diskonchip.c
+++ b/drivers/mtd/nand/diskonchip.c
@@ -1358,7 +1358,7 @@ static int __init nftl_scan_bbt(struct mtd_info *mtd)
 	   At least as nand_bbt.c is currently written. */
 	if ((ret = nand_scan_bbt(mtd, NULL)))
 		return ret;
-	add_mtd_device(mtd);
+	add_mtd_device(mtd, "nand");
 #ifdef CONFIG_MTD_PARTITIONS
 	if (!no_autopart)
 		add_mtd_partitions(mtd, parts, numparts);
diff --git a/drivers/mtd/nand/nand_imx.c b/drivers/mtd/nand/nand_imx.c
index c8c69d6..85cfbed 100644
--- a/drivers/mtd/nand/nand_imx.c
+++ b/drivers/mtd/nand/nand_imx.c
@@ -1176,7 +1176,7 @@ static int __init imxnd_probe(struct device_d *dev)
 		goto escan;
 	}
 
-	add_mtd_device(mtd);
+	add_mtd_device(mtd, "nand");
 
 	dev->priv = host;
 
diff --git a/drivers/mtd/nand/nand_omap_gpmc.c b/drivers/mtd/nand/nand_omap_gpmc.c
index d5e642a..9fb1132 100644
--- a/drivers/mtd/nand/nand_omap_gpmc.c
+++ b/drivers/mtd/nand/nand_omap_gpmc.c
@@ -956,7 +956,7 @@ static int gpmc_nand_probe(struct device_d *pdev)
 	dev_set_param(pdev, "eccmode", ecc_mode_strings[pdata->ecc_mode]);
 
 	/* We are all set to register with the system now! */
-	err = add_mtd_device(minfo);
+	err = add_mtd_device(minfo, "nand");
 	if (err) {
 		dev_dbg(pdev, "device registration failed\n");
 		goto out_release_mem;
diff --git a/drivers/mtd/nand/nand_s3c2410.c b/drivers/mtd/nand/nand_s3c2410.c
index c5f5d97..ed45788 100644
--- a/drivers/mtd/nand/nand_s3c2410.c
+++ b/drivers/mtd/nand/nand_s3c2410.c
@@ -485,7 +485,7 @@ static int s3c24x0_nand_probe(struct device_d *dev)
 		goto on_error;
 	}
 
-	return add_mtd_device(mtd);
+	return add_mtd_device(mtd, "nand");
 	
 on_error:
 	free(host);
diff --git a/drivers/mtd/nand/nomadik_nand.c b/drivers/mtd/nand/nomadik_nand.c
index c1e93ad..05d61c2 100644
--- a/drivers/mtd/nand/nomadik_nand.c
+++ b/drivers/mtd/nand/nomadik_nand.c
@@ -220,7 +220,7 @@ static int nomadik_nand_probe(struct device_d *dev)
 	}
 
 	pr_info("Registering %s as whole device\n", mtd->name);
-	add_mtd_device(mtd);
+	add_mtd_device(mtd, "nand");
 
 	return 0;
 
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index 29591e2..a985c30 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -220,7 +220,7 @@ static inline uint32_t mtd_mod_by_eb(uint64_t sz, struct mtd_info *mtd)
 }
 	/* Kernel-side ioctl definitions */
 
-extern int add_mtd_device(struct mtd_info *mtd);
+extern int add_mtd_device(struct mtd_info *mtd, char *devname);
 extern int del_mtd_device (struct mtd_info *mtd);
 
 extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 5/8] drivers/mtd: fix core multiple MTD registrations
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
                   ` (3 preceding siblings ...)
  2011-12-19 14:04 ` [PATCH V3 4/8] drivers/mtd: recover NAND default device name "nand" Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 6/8] drivers/mtd: add mtd core hooks Robert Jarzmik
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

If multiple MTD devices were registered, an exception
occured, as they all wanted id 0. Let the driver code choose
the device number dynamically.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/mtd/core.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index f767e84..8611d02 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -254,6 +254,7 @@ int add_mtd_device(struct mtd_info *mtd, char *devname)
 	if (!devname)
 		devname = "mtd";
 	strcpy(mtd->class_dev.name, devname);
+	mtd->class_dev.id = -1;
 	register_device(&mtd->class_dev);
 
 	mtd->cdev.ops = &mtd_ops;
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 6/8] drivers/mtd: add mtd core hooks
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
                   ` (4 preceding siblings ...)
  2011-12-19 14:04 ` [PATCH V3 5/8] drivers/mtd: fix core multiple MTD registrations Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-19 14:04 ` [PATCH V3 7/8] drivers/mtd: split mtd mtdoob devices Robert Jarzmik
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

Add hooks for spinoff MTD drivers (mtdoob, mtdraw, ...).

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/mtd/core.c |   17 +++++++++++++++++
 drivers/mtd/mtd.h  |   39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 0 deletions(-)
 create mode 100644 drivers/mtd/mtd.h

diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index 8611d02..a3cea33 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -26,6 +26,10 @@
 #include <nand.h>
 #include <errno.h>
 
+#include "mtd.h"
+
+static LIST_HEAD(mtd_register_hooks);
+
 static 	ssize_t mtd_read(struct cdev *cdev, void* buf, size_t count,
 			  ulong offset, ulong flags)
 {
@@ -250,6 +254,7 @@ static void mtd_exit_oob_cdev(struct mtd_info *mtd)
 int add_mtd_device(struct mtd_info *mtd, char *devname)
 {
 	char str[16];
+	struct mtddev_hook *hook;
 
 	if (!devname)
 		devname = "mtd";
@@ -276,12 +281,20 @@ int add_mtd_device(struct mtd_info *mtd, char *devname)
 	devfs_create(&mtd->cdev);
 
 	mtd_init_oob_cdev(mtd, devname);
+	list_for_each_entry(hook, &mtd_register_hooks, hook)
+		if (hook->add_mtd_device)
+			hook->add_mtd_device(mtd, devname);
 
 	return 0;
 }
 
 int del_mtd_device (struct mtd_info *mtd)
 {
+	struct mtddev_hook *hook;
+
+	list_for_each_entry(hook, &mtd_register_hooks, hook)
+		if (hook->del_mtd_device)
+			hook->del_mtd_device(mtd);
 	unregister_device(&mtd->class_dev);
 	mtd_exit_oob_cdev(mtd);
 	free(mtd->param_size.value);
@@ -289,3 +302,7 @@ int del_mtd_device (struct mtd_info *mtd)
 	return 0;
 }
 
+void mtdcore_add_hook(struct mtddev_hook *hook)
+{
+	list_add(&hook->hook, &mtd_register_hooks);
+}
diff --git a/drivers/mtd/mtd.h b/drivers/mtd/mtd.h
new file mode 100644
index 0000000..261cd2b
--- /dev/null
+++ b/drivers/mtd/mtd.h
@@ -0,0 +1,39 @@
+/*
+ * MTD devices registration
+ *
+ * Copyright (C) 2011 Robert Jarzmik
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/**
+ * mtddev_hook - hook to register additional mtd devices
+ * @add_mtd_device: called when a MTD driver calls add_mtd_device()
+ * @del_mtd_device: called when a MTD driver calls del_mtd_device()
+ *
+ * Provide a hook to be called whenether a add_mtd_device() is called.
+ * Additionnal devices like mtdoob and mtdraw subscribe to the service.
+ */
+struct mtddev_hook {
+	struct list_head hook;
+	int (*add_mtd_device)(struct mtd_info *mtd, char *devname);
+	int (*del_mtd_device)(struct mtd_info *mtd);
+};
+
+/**
+ * mtdcore_add_hook - add a hook to MTD registration/unregistration
+ * @hook: the hook
+ *
+ * Normally called in a coredevice_initcall() to add another MTD layout (such as
+ * mtdraw, ...)
+ */
+void mtdcore_add_hook(struct mtddev_hook *hook);
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 7/8] drivers/mtd: split mtd mtdoob devices
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
                   ` (5 preceding siblings ...)
  2011-12-19 14:04 ` [PATCH V3 6/8] drivers/mtd: add mtd core hooks Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-21 11:32   ` Sascha Hauer
  2011-12-19 14:04 ` [PATCH V3 8/8] drivers/mtd: add the mtdraw device (data+oob) Robert Jarzmik
  2011-12-21 10:59 ` [PATCH V3 0/8] mtd framework rework Sascha Hauer
  8 siblings, 1 reply; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

Split /dev/mtd and /dev/mtdoob devices.
Remove from mtd structure the mtdoob character device.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>

---
Since V1:
 - fix Sascha name
 - rebase on the NAND_READ_OOB / NAND_DEVICE_OOB change
---
 drivers/mtd/Kconfig      |    3 +-
 drivers/mtd/Makefile     |    3 +-
 drivers/mtd/core.c       |   69 +-------------------------------
 drivers/mtd/mtd.h        |    3 +
 drivers/mtd/mtdoob.c     |  100 ++++++++++++++++++++++++++++++++++++++++++++++
 drivers/mtd/nand/Kconfig |    6 ---
 include/linux/mtd/mtd.h  |    1 -
 7 files changed, 108 insertions(+), 77 deletions(-)
 create mode 100644 drivers/mtd/mtdoob.c

diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index 81282ab..a130c74 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -8,8 +8,9 @@ config MTD_WRITE
 	default y
 	prompt "Support writing to MTD devices"
 
-config MTD_READ_OOB
+config MTD_OOB_DEVICE
 	bool
+	select NAND_READ_OOB
 	default y
 	prompt "Create a device for reading the OOB data"
 
diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index 80fe386..d41ffd4 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -1,4 +1,5 @@
 obj-$(CONFIG_NAND)	+= nand/
 obj-$(CONFIG_UBI)	+= ubi/
 obj-$(CONFIG_PARTITION_NEED_MTD)	+= partition.o
-obj-$(CONFIG_MTD)	+= core.o
+obj-$(CONFIG_MTD)			+= core.o
+obj-$(CONFIG_MTD_OOB_DEVICE)		+= mtdoob.o
diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
index a3cea33..55d845d 100644
--- a/drivers/mtd/core.c
+++ b/drivers/mtd/core.c
@@ -114,7 +114,7 @@ out:
 }
 #endif
 
-static int mtd_ioctl(struct cdev *cdev, int request, void *buf)
+int mtd_ioctl(struct cdev *cdev, int request, void *buf)
 {
 	struct mtd_info *mtd = cdev->priv;
 	struct mtd_info_user *user = buf;
@@ -186,71 +186,6 @@ static struct file_operations mtd_ops = {
 	.lseek  = dev_lseek_default,
 };
 
-#ifdef CONFIG_NAND_READ_DEVICE
-static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count,
-			    ulong offset, ulong flags)
-{
-	struct mtd_info *mtd = cdev->priv;
-	struct mtd_oob_ops ops;
-	int ret;
-
-	if (count < mtd->oobsize)
-		return -EINVAL;
-
-	ops.mode = MTD_OOB_RAW;
-	ops.ooboffs = 0;
-	ops.ooblen = mtd->oobsize;
-	ops.oobbuf = buf;
-	ops.datbuf = NULL;
-	ops.len = mtd->oobsize;
-
-	offset /= mtd->oobsize;
-	/*
-	 * This seems suspicious, shouldn't it be :
-	 *   offset / mtd->oobsize * mtd->writesize
-	 */
-	ret = mtd->read_oob(mtd, offset * mtd->writesize, &ops);
-	if (ret)
-		return ret;
-
-	return mtd->oobsize;
-}
-
-static struct file_operations mtd_ops_oob = {
-	.read   = mtd_read_oob,
-	.ioctl  = mtd_ioctl,
-	.lseek  = dev_lseek_default,
-};
-
-static int mtd_init_oob_cdev(struct mtd_info *mtd, char *devname)
-{
-	mtd->cdev_oob.ops = &mtd_ops_oob;
-	mtd->cdev_oob.size = (mtd->size / mtd->writesize) * mtd->oobsize;
-	mtd->cdev_oob.name = asprintf("%s_oob%d", devname, mtd->class_dev.id);
-	mtd->cdev_oob.priv = mtd;
-	mtd->cdev_oob.dev = &mtd->class_dev;
-	devfs_create(&mtd->cdev_oob);
-
-	return 0;
-}
-
-static void mtd_exit_oob_cdev(struct mtd_info *mtd)
-{
-	free(mtd->cdev_oob.name);
-}
-#else
-
-static int mtd_init_oob_cdev(struct mtd_info *mtd, char *devname)
-{
-	return 0;
-}
-
-static void mtd_exit_oob_cdev(struct mtd_info *mtd)
-{
-	return;
-}
-#endif
-
 int add_mtd_device(struct mtd_info *mtd, char *devname)
 {
 	char str[16];
@@ -280,7 +215,6 @@ int add_mtd_device(struct mtd_info *mtd, char *devname)
 
 	devfs_create(&mtd->cdev);
 
-	mtd_init_oob_cdev(mtd, devname);
 	list_for_each_entry(hook, &mtd_register_hooks, hook)
 		if (hook->add_mtd_device)
 			hook->add_mtd_device(mtd, devname);
@@ -296,7 +230,6 @@ int del_mtd_device (struct mtd_info *mtd)
 		if (hook->del_mtd_device)
 			hook->del_mtd_device(mtd);
 	unregister_device(&mtd->class_dev);
-	mtd_exit_oob_cdev(mtd);
 	free(mtd->param_size.value);
 	free(mtd->cdev.name);
 	return 0;
diff --git a/drivers/mtd/mtd.h b/drivers/mtd/mtd.h
index 261cd2b..c8af6e3 100644
--- a/drivers/mtd/mtd.h
+++ b/drivers/mtd/mtd.h
@@ -28,6 +28,7 @@ struct mtddev_hook {
 	int (*add_mtd_device)(struct mtd_info *mtd, char *devname);
 	int (*del_mtd_device)(struct mtd_info *mtd);
 };
+struct cdev;
 
 /**
  * mtdcore_add_hook - add a hook to MTD registration/unregistration
@@ -37,3 +38,5 @@ struct mtddev_hook {
  * mtdraw, ...)
  */
 void mtdcore_add_hook(struct mtddev_hook *hook);
+
+int mtd_ioctl(struct cdev *cdev, int request, void *buf);
diff --git a/drivers/mtd/mtdoob.c b/drivers/mtd/mtdoob.c
new file mode 100644
index 0000000..fdecee6
--- /dev/null
+++ b/drivers/mtd/mtdoob.c
@@ -0,0 +1,100 @@
+/*
+ * MTD oob device
+ *
+ * Copyright (C) 2011 Sascha Hauer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Adds a character devices :
+ *  - mtdoob<N>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <malloc.h>
+#include <ioctl.h>
+#include <errno.h>
+#include <linux/mtd/mtd.h>
+
+#include "mtd.h"
+
+struct mtdoob {
+	struct cdev cdev;
+	struct mtd_info *mtd;
+};
+
+static struct mtd_info *to_mtd(struct cdev *cdev)
+{
+	struct mtdoob *mtdoob = cdev->priv;
+	return mtdoob->mtd;
+}
+
+static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count,
+			     ulong offset, ulong flags)
+{
+	struct mtd_info *mtd = to_mtd(cdev);
+	struct mtd_oob_ops ops;
+	int ret;
+
+	if (count < mtd->oobsize)
+		return -EINVAL;
+
+	ops.mode = MTD_OOB_RAW;
+	ops.ooboffs = 0;
+	ops.ooblen = mtd->oobsize;
+	ops.oobbuf = buf;
+	ops.datbuf = NULL;
+	ops.len = mtd->oobsize;
+
+	offset /= mtd->oobsize;
+	/*
+	 * This seems suspicious, shouldn't it be :
+	 *   offset / mtd->oobsize * mtd->writesize
+	 */
+	ret = mtd->read_oob(mtd, offset * mtd->writesize, &ops);
+	if (ret)
+		return ret;
+
+	return mtd->oobsize;
+}
+
+static struct file_operations mtd_ops_oob = {
+	.read   = mtd_read_oob,
+	.ioctl  = mtd_ioctl,
+	.lseek  = dev_lseek_default,
+};
+
+static int add_mtdoob_device(struct mtd_info *mtd, char *devname)
+{
+	struct mtdoob *mtdoob;
+
+	mtdoob = xzalloc(sizeof(*mtdoob));
+	mtdoob->cdev.ops = &mtd_ops_oob;
+	mtdoob->cdev.size = (mtd->size / mtd->writesize) * mtd->oobsize;
+	mtdoob->cdev.name = asprintf("%s_oob%d", devname, mtd->class_dev.id);
+	mtdoob->cdev.priv = mtdoob;
+	mtdoob->cdev.dev = &mtd->class_dev;
+	devfs_create(&mtdoob->cdev);
+
+	return 0;
+}
+
+static struct mtddev_hook mtdoob_hook = {
+	.add_mtd_device = add_mtdoob_device,
+};
+
+static int __init register_mtdoob(void)
+{
+	mtdcore_add_hook(&mtdoob_hook);
+	return 0;
+}
+
+coredevice_initcall(register_mtdoob);
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index b6e38ff..bda0529 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -48,12 +48,6 @@ config NAND_BBT
 	  Say y here to include support for bad block tables. This speeds
 	  up the process of checking for bad blocks
 
-config NAND_OOB_DEVICE
-	bool
-	select NAND_READ_OOB
-	default y
-	prompt "create a device for reading the OOB data"
-
 config NAND_IMX
 	bool
 	prompt "i.MX NAND driver"
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index a985c30..71d3c6f 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -202,7 +202,6 @@ struct mtd_info {
 	struct device_d class_dev;
 	struct device_d *dev;
 	struct cdev cdev;
-	struct cdev cdev_oob;
 
 	struct param_d param_size;
 	char *size_str;
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH V3 8/8] drivers/mtd: add the mtdraw device (data+oob)
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
                   ` (6 preceding siblings ...)
  2011-12-19 14:04 ` [PATCH V3 7/8] drivers/mtd: split mtd mtdoob devices Robert Jarzmik
@ 2011-12-19 14:04 ` Robert Jarzmik
  2011-12-21 10:59 ` [PATCH V3 0/8] mtd framework rework Sascha Hauer
  8 siblings, 0 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-19 14:04 UTC (permalink / raw)
  To: barebox

Add a device to read and write to MTD data and oob
(/dev/mtdraw<N>).

The device is constrained in a separate source file, so that
further improvement of commands (such as nandwrite) could
make it useless, and easy to remove.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/mtd/Kconfig  |    6 +
 drivers/mtd/Makefile |    5 +-
 drivers/mtd/mtdraw.c |  303 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 312 insertions(+), 2 deletions(-)
 create mode 100644 drivers/mtd/mtdraw.c

diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index a130c74..9137cde 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -14,6 +14,12 @@ config MTD_OOB_DEVICE
 	default y
 	prompt "Create a device for reading the OOB data"
 
+config MTD_RAW_DEVICE
+	bool
+	select NAND_READ_OOB
+	default n
+	prompt "mtdraw device to read/write both data+oob"
+
 source "drivers/mtd/nand/Kconfig"
 source "drivers/mtd/ubi/Kconfig"
 
diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index d41ffd4..67741f4 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -1,5 +1,6 @@
-obj-$(CONFIG_NAND)	+= nand/
-obj-$(CONFIG_UBI)	+= ubi/
+obj-$(CONFIG_NAND)			+= nand/
+obj-$(CONFIG_UBI)			+= ubi/
 obj-$(CONFIG_PARTITION_NEED_MTD)	+= partition.o
 obj-$(CONFIG_MTD)			+= core.o
 obj-$(CONFIG_MTD_OOB_DEVICE)		+= mtdoob.o
+obj-$(CONFIG_MTD_RAW_DEVICE)		+= mtdraw.o
diff --git a/drivers/mtd/mtdraw.c b/drivers/mtd/mtdraw.c
new file mode 100644
index 0000000..b1cce3d
--- /dev/null
+++ b/drivers/mtd/mtdraw.c
@@ -0,0 +1,303 @@
+/*
+ * MTD raw device
+ *
+ * Copyright (C) 2011 Robert Jarzmik
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Adds a character devices :
+ *  - mtdraw<N>
+ *
+ * Device mtd_raw<N> provides acces to the MTD "pages+OOB". For example if a MTD
+ * has pages of 512 bytes and OOB of 16 bytes, mtd_oob<N> will be made of blocks
+ * of 528 bytes, with page data being followed by OOB.
+ * The layout will be: <page0> <oob0> <page1> <oob1> ... <pageN> <oobN>.
+ * This means that a read at offset 516 of 20 bytes will give the 12 last bytes
+ * of the OOB of page0, and the 8 first bytes of page1.
+ * Same thing applies for writes, which have to be page+oob aligned (ie. offset
+ * and size should be multiples of (mtd->writesize + mtd->oobsize)).
+ */
+
+#include <common.h>
+#include <init.h>
+#include <malloc.h>
+#include <ioctl.h>
+#include <errno.h>
+#include <linux/mtd/mtd.h>
+
+#include "mtd.h"
+
+/* Must be a multiple of the largest NAND page size */
+#define RAW_WRITEBUF_SIZE	4096
+
+/**
+ * mtdraw - mtdraw device private data
+ * @cdev: character device "mtdraw<N>"
+ * @mtd: MTD device to handle read/writes/erases
+ *
+ * @writebuf: buffer to handle unaligned writes (ie. writes of sizes which are
+ * not multiples of MTD (writesize+oobsize)
+ * @write_fill: number of bytes in writebuf
+ * @write_ofs: offset in character device (mtdraw) where last write(s) stored
+ * bytes because of unaligned writes (ie. remain of writesize+oobsize write)
+ *
+ * The mtdraw device must allow unaligned writes. This is enabled by a write buffer which gathers data to issue mtd->write_oob() with full page+oob data.
+ * Suppose writesize=512, oobsize=16.
+ * A first write of 512 bytes triggers:
+ *  - write_ofs = offset of write()
+ *  - write_fill = 512
+ *  - copy of the 512 provided bytes into writebuf
+ *  - no actual mtd->write if done
+ * A second write of 512 bytes triggers:
+ *  - copy of the 16 first bytes into writebuf
+ *  - a mtd->write_oob() from writebuf
+ *  - empty writebuf
+ *  - copy the remaining 496 bytes into writebuf
+ *    => write_fill = 496, write_ofs = offset + 528
+ * Etc ...
+ */
+struct mtdraw {
+	struct cdev cdev;
+	struct mtd_info *mtd;
+	void *writebuf;
+	int write_fill;
+	int write_ofs;
+};
+
+static struct mtdraw *to_mtdraw(struct cdev *cdev)
+{
+	return cdev->priv;
+}
+
+static struct mtd_info *to_mtd(struct cdev *cdev)
+{
+	struct mtdraw *mtdraw = to_mtdraw(cdev);
+	return mtdraw->mtd;
+}
+
+static ssize_t mtdraw_read_unaligned(struct mtd_info *mtd, void *dst,
+				     size_t count, int skip, ulong offset)
+{
+	struct mtd_oob_ops ops;
+	ssize_t ret;
+	int partial = 0;
+	void *tmp = dst;
+
+	if (skip || count < mtd->writesize + mtd->oobsize)
+		partial = 1;
+	if (partial)
+		tmp = malloc(mtd->writesize + mtd->oobsize);
+	if (!tmp)
+		return -ENOMEM;
+	ops.mode = MTD_OOB_RAW;
+	ops.datbuf = tmp;
+	ops.len = mtd->writesize;
+	ops.oobbuf = tmp + mtd->writesize;
+	ops.ooblen = mtd->oobsize;
+	ret = mtd->read_oob(mtd, offset, &ops);
+	if (ret)
+		goto err;
+	if (partial)
+		memcpy(dst, tmp + skip, count);
+	ret = count;
+err:
+	if (partial)
+		free(tmp);
+
+	return ret;
+}
+
+static ssize_t mtdraw_read(struct cdev *cdev, void *buf, size_t count,
+			    ulong offset, ulong flags)
+{
+	struct mtd_info *mtd = to_mtd(cdev);
+	ssize_t retlen = 0, ret = 1, toread;
+	ulong numpage;
+	int skip;
+
+	numpage = offset / (mtd->writesize + mtd->oobsize);
+	skip = offset % (mtd->writesize + mtd->oobsize);
+
+	while (ret > 0 && count > 0) {
+		toread = min_t(int, count, mtd->writesize + mtd->oobsize);
+		ret = mtdraw_read_unaligned(mtd, buf, toread,
+					    skip, numpage++ * mtd->writesize);
+		buf += ret;
+		skip = 0;
+		count -= ret;
+		retlen += ret;
+	}
+	if (ret < 0)
+		printf("err %d\n", ret);
+	else
+		ret = retlen;
+	return ret;
+}
+
+#ifdef CONFIG_MTD_WRITE
+static ssize_t mtdraw_blkwrite(struct mtd_info *mtd, const void *buf,
+			       ulong offset)
+{
+	struct mtd_oob_ops ops;
+	int ret;
+
+	ops.mode = MTD_OOB_RAW;
+	ops.datbuf = (void *)buf;
+	ops.len = mtd->writesize;
+	ops.oobbuf = (void *)buf + mtd->writesize;
+	ops.ooblen = mtd->oobsize;
+	ret = mtd->write_oob(mtd, offset, &ops);
+	if (!ret)
+		ret = ops.retlen + ops.oobretlen;
+	return ret;
+}
+
+static void mtdraw_fillbuf(struct mtdraw *mtdraw, const void *src, int nbbytes)
+{
+	memcpy(mtdraw->writebuf + mtdraw->write_fill, src, nbbytes);
+	mtdraw->write_fill += nbbytes;
+}
+
+static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
+			    ulong offset, ulong flags)
+{
+	struct mtdraw *mtdraw = to_mtdraw(cdev);
+	struct mtd_info *mtd = to_mtd(cdev);
+	int bsz = mtd->writesize + mtd->oobsize;
+	ulong numpage;
+	size_t retlen = 0, tofill;
+	int ret = 0;
+
+	if (mtdraw->write_fill &&
+	    mtdraw->write_ofs + mtdraw->write_fill != offset)
+		return -EINVAL;
+	if (mtdraw->write_fill == 0 && offset % bsz)
+		return -EINVAL;
+
+	if (mtdraw->write_fill) {
+		tofill = min_t(size_t, count, bsz - mtdraw->write_fill);
+		mtdraw_fillbuf(mtdraw, buf, tofill);
+		offset += tofill;
+		count -= tofill;
+		retlen += tofill;
+	}
+
+	if (mtdraw->write_fill == bsz) {
+		ret = mtdraw_blkwrite(mtd, mtdraw->writebuf, mtdraw->write_ofs);
+		retlen += ret;
+		mtdraw->write_fill = 0;
+	}
+
+	numpage = offset / (mtd->writesize + mtd->oobsize);
+	while (ret >= 0 && count >= bsz) {
+		ret = mtdraw_blkwrite(mtd, buf + retlen,
+				   mtd->writesize * numpage++);
+		count -= ret;
+		retlen += ret;
+		offset += ret;
+	}
+
+	if (ret >= 0 && count) {
+		mtdraw->write_ofs = offset - mtdraw->write_fill;
+		mtdraw_fillbuf(mtdraw, buf + retlen, count);
+	}
+
+	if (ret < 0) {
+		printf("err %d\n", ret);
+		return ret;
+	} else {
+		return retlen;
+	}
+}
+
+static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, ulong offset)
+{
+	struct mtd_info *mtd = to_mtd(cdev);
+	struct erase_info erase;
+	int ret;
+
+	offset = offset / (mtd->writesize + mtd->oobsize) * mtd->writesize;
+	count = count / (mtd->writesize + mtd->oobsize) * mtd->writesize;
+
+	memset(&erase, 0, sizeof(erase));
+	erase.mtd = mtd;
+	erase.addr = offset;
+	erase.len = mtd->erasesize;
+
+	while (count > 0) {
+		debug("erase %d %d\n", erase.addr, erase.len);
+
+		ret = mtd->block_isbad(mtd, erase.addr);
+		if (ret > 0) {
+			printf("Skipping bad block at 0x%08x\n", erase.addr);
+		} else {
+			ret = mtd->erase(mtd, &erase);
+			if (ret)
+				return ret;
+		}
+
+		erase.addr += mtd->erasesize;
+		count -= count > mtd->erasesize ? mtd->erasesize : count;
+	}
+
+	return 0;
+}
+#else
+static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
+			    ulong offset, ulong flags)
+{
+	return 0;
+}
+static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, ulong offset)
+{
+	return 0;
+}
+#endif
+
+static const struct file_operations mtd_raw_fops = {
+	.read		= mtdraw_read,
+	.write		= mtdraw_write,
+	.erase		= mtdraw_erase,
+	.ioctl		= mtd_ioctl,
+	.lseek		= dev_lseek_default,
+};
+
+static int add_mtdraw_device(struct mtd_info *mtd, char *devname)
+{
+	struct mtdraw *mtdraw;
+
+	mtdraw = xzalloc(sizeof(*mtdraw));
+	mtdraw->writebuf = xmalloc(RAW_WRITEBUF_SIZE);
+	mtdraw->mtd = mtd;
+
+	mtdraw->cdev.ops = (struct file_operations *)&mtd_raw_fops;
+	mtdraw->cdev.size = mtd->size / mtd->writesize *
+		(mtd->writesize + mtd->oobsize);
+	mtdraw->cdev.name = asprintf("%sraw%d", devname, mtd->class_dev.id);
+	mtdraw->cdev.priv = mtdraw;
+	mtdraw->cdev.dev = &mtd->class_dev;
+	mtdraw->cdev.mtd = mtd;
+	devfs_create(&mtdraw->cdev);
+
+	return 0;
+}
+
+static struct mtddev_hook mtdraw_hook = {
+	.add_mtd_device = add_mtdraw_device,
+};
+
+static int __init register_mtdraw(void)
+{
+	mtdcore_add_hook(&mtdraw_hook);
+	return 0;
+}
+
+coredevice_initcall(register_mtdraw);
-- 
1.7.5.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH V3 0/8] mtd framework rework
  2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
                   ` (7 preceding siblings ...)
  2011-12-19 14:04 ` [PATCH V3 8/8] drivers/mtd: add the mtdraw device (data+oob) Robert Jarzmik
@ 2011-12-21 10:59 ` Sascha Hauer
  8 siblings, 0 replies; 15+ messages in thread
From: Sascha Hauer @ 2011-12-21 10:59 UTC (permalink / raw)
  To: Robert Jarzmik; +Cc: barebox

On Mon, Dec 19, 2011 at 03:04:01PM +0100, Robert Jarzmik wrote:
> This patchset aims at reworking the mtd support :
>  - add a mtd core
>  - concentrate MTD core functions (MTD_WRITE)
>  - split mtd core character device (/dev/mtd<N>) from other
>    character devices (/dev/mtdoob<N>).
>  - add a data+oob character device (/dev/mtdraw<N>)
> 
> Since V1, Sascha comments should have been taken into
> account, and the patchset was rebased against next tree
> (commit "mtd nand: fix oob compile time option").
> 
> As there were some quirks on the rebase, I'd like a
> quick validation from you, Sascha, if everything still works
> as it's supposed to, especially the *_READ_OOB thingy.

Almost there, the oob thing doesn't work yet. Some comments inline.

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH V3 2/8] drivers/mtd: cosmetic changes
  2011-12-19 14:04 ` [PATCH V3 2/8] drivers/mtd: cosmetic changes Robert Jarzmik
@ 2011-12-21 11:00   ` Sascha Hauer
  2011-12-21 21:27     ` Robert Jarzmik
  0 siblings, 1 reply; 15+ messages in thread
From: Sascha Hauer @ 2011-12-21 11:00 UTC (permalink / raw)
  To: Robert Jarzmik; +Cc: barebox

On Mon, Dec 19, 2011 at 03:04:03PM +0100, Robert Jarzmik wrote:
> Fix whitespace, replace all debug() by dev_dbg(), and fix
> line length to 80 characters.
> 
> Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
> ---
>  drivers/mtd/core.c |   49 +++++++++++++++++++++++--------------------------
>  1 files changed, 23 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
> index 130e2af..1627359 100644
> --- a/drivers/mtd/core.c
> +++ b/drivers/mtd/core.c
> @@ -14,11 +14,6 @@
>   * but WITHOUT ANY WARRANTY; without even the implied warranty of
>   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>   * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> - * MA 02111-1307 USA
>   */
>  #include <common.h>
>  #include <linux/mtd/nand.h>
> @@ -31,7 +26,8 @@
>  #include <nand.h>
>  #include <errno.h>
>  
> -static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count, ulong offset, ulong flags)
> +static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count,
> +			  ulong offset, ulong flags)
>  {
>  	struct mtd_info *info = cdev->priv;
>  	size_t retlen;
> @@ -49,6 +45,7 @@ static 	ssize_t nand_read(struct cdev *cdev, void* buf, size_t count, ulong offs
>  }
>  
>  #define NOTALIGNED(x) (x & (info->writesize - 1)) != 0
> +#define MTDPGALG(x) ((x) & (info->writesize - 1))
>  
>  #ifdef CONFIG_NAND_WRITE
>  static int all_ff(const void *buf, int len)
> @@ -62,7 +59,8 @@ static int all_ff(const void *buf, int len)
>  	return 1;
>  }
>  
> -static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count, ulong offset, ulong flags)
> +static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count,
> +			  ulong offset, ulong flags)
>  {
>  	struct mtd_info *info = cdev->priv;
>  	size_t retlen, now;
> @@ -75,24 +73,29 @@ static ssize_t nand_write(struct cdev* cdev, const void *buf, size_t _count, ulo
>  		return -EINVAL;
>  	}
>  
> -	debug("write: 0x%08lx 0x%08x\n", offset, count);
> -
> +	dev_dbg(cdev->dev, "write: 0x%08lx 0x%08x\n", offset, count);
>  	while (count) {
>  		now = count > info->writesize ? info->writesize : count;
>  
>  		if (NOTALIGNED(now)) {
> -			debug("not aligned: %d %ld\n", info->writesize, (offset % info->writesize));
> +			dev_dbg(cdev->dev, "not aligned: %d %ld\n",
> +				info->writesize,
> +				(offset % info->writesize));
>  			wrbuf = xmalloc(info->writesize);
>  			memset(wrbuf, 0xff, info->writesize);
>  			memcpy(wrbuf + (offset % info->writesize), buf, now);
>  			if (!all_ff(wrbuf, info->writesize))
> -				ret = info->write(info, offset & ~(info->writesize - 1),
> -						info->writesize, &retlen, wrbuf);
> +				ret = info->write(info, MTDPGALG(offset),
> +						  info->writesize, &retlen,
> +						  wrbuf);
>  			free(wrbuf);
>  		} else {
>  			if (!all_ff(buf, info->writesize))
> -				ret = info->write(info, offset, now, &retlen, buf);
> -			debug("offset: 0x%08lx now: 0x%08x retlen: 0x%08x\n", offset, now, retlen);
> +				ret = info->write(info, offset, now, &retlen,
> +						  buf);
> +			dev_dbg(cdev->dev,
> +				"offset: 0x%08lx now: 0x%08x retlen: 0x%08x\n",
> +				offset, now, retlen);
>  		}
>  		if (ret)
>  			goto out;
> @@ -114,11 +117,11 @@ static int nand_ioctl(struct cdev *cdev, int request, void *buf)
>  
>  	switch (request) {
>  	case MEMGETBADBLOCK:
> -		debug("MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
> +		dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
>  		return info->block_isbad(info, (off_t)buf);
>  #ifdef CONFIG_NAND_WRITE
>  	case MEMSETBADBLOCK:
> -		debug("MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
> +		dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
>  		return info->block_markbad(info, (off_t)buf);
>  #endif
>  	case MEMGETINFO:
> @@ -150,7 +153,7 @@ static ssize_t nand_erase(struct cdev *cdev, size_t count, unsigned long offset)
>  	erase.len = info->erasesize;
>  
>  	while (count > 0) {
> -		debug("erase %d %d\n", erase.addr, erase.len);
> +		dev_dbg(cdev->dev, "erase %d %d\n", erase.addr, erase.len);
>  
>  		ret = info->block_isbad(info, erase.addr);
>  		if (ret > 0) {
> @@ -169,13 +172,6 @@ static ssize_t nand_erase(struct cdev *cdev, size_t count, unsigned long offset)
>  }
>  #endif
>  
> -#if 0
> -static char* mtd_get_size(struct device_d *, struct param_d *param)
> -{
> -	static char 
> -}
> -#endif
> -
>  static struct file_operations nand_ops = {
>  	.read   = nand_read,
>  #ifdef CONFIG_NAND_WRITE
> @@ -186,8 +182,9 @@ static struct file_operations nand_ops = {
>  	.lseek  = dev_lseek_default,
>  };
>  
> -#ifdef CONFIG_NAND_OOB_DEVICE
> -static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
> +#ifdef CONFIG_NAND_READ_DEVICE
> +static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count,
> +			     ulong offset, ulong flags)

You change the name of the Kconfig variable here. This shouldn't be here
and breaks read_oob support.

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH V3 3/8] drivers/mtd: transfer NAND notions to MTD core
  2011-12-19 14:04 ` [PATCH V3 3/8] drivers/mtd: transfer NAND notions to MTD core Robert Jarzmik
@ 2011-12-21 11:25   ` Sascha Hauer
  0 siblings, 0 replies; 15+ messages in thread
From: Sascha Hauer @ 2011-12-21 11:25 UTC (permalink / raw)
  To: Robert Jarzmik; +Cc: barebox

On Mon, Dec 19, 2011 at 03:04:04PM +0100, Robert Jarzmik wrote:
> Change NAND_WRITE into MTD_WRITE.
> Change "page_shift" references in the core, which are purely
> NAND, into mtd->writesize which is MTD generic.
> Rename all "info" (struct mtd_info) into "mtd".
> 
> Beware, bisection is broken here as driver name changes from
> /dev/nand<N> into /dev/mtd<N>.

Indeed, this patch should be after the next one.

>  	ops.oobbuf = buf;
>  	ops.datbuf = NULL;
> -	ops.len = info->oobsize;
> -
> -	offset /= info->oobsize;
> -	ret = info->read_oob(info, offset << chip->page_shift, &ops);
> +	ops.len = mtd->oobsize;
> +
> +	offset /= mtd->oobsize;
> +	/*
> +	 * This seems suspicious, shouldn't it be :
> +	 *   offset / mtd->oobsize * mtd->writesize
> +	 */
> +	ret = mtd->read_oob(mtd, offset * mtd->writesize, &ops);

directly before this comment we have 'offset /= mtd->oobsize', so in fact
we really have 'offset / mtd->oobsize * mtd->writesize'.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH V3 7/8] drivers/mtd: split mtd mtdoob devices
  2011-12-19 14:04 ` [PATCH V3 7/8] drivers/mtd: split mtd mtdoob devices Robert Jarzmik
@ 2011-12-21 11:32   ` Sascha Hauer
  2011-12-21 21:28     ` Robert Jarzmik
  0 siblings, 1 reply; 15+ messages in thread
From: Sascha Hauer @ 2011-12-21 11:32 UTC (permalink / raw)
  To: Robert Jarzmik; +Cc: barebox

On Mon, Dec 19, 2011 at 03:04:08PM +0100, Robert Jarzmik wrote:
> Split /dev/mtd and /dev/mtdoob devices.
> Remove from mtd structure the mtdoob character device.
> 
> Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
> 
> ---
> Since V1:
>  - fix Sascha name
>  - rebase on the NAND_READ_OOB / NAND_DEVICE_OOB change
> ---
>  drivers/mtd/Kconfig      |    3 +-
>  drivers/mtd/Makefile     |    3 +-
>  drivers/mtd/core.c       |   69 +-------------------------------
>  drivers/mtd/mtd.h        |    3 +
>  drivers/mtd/mtdoob.c     |  100 ++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/mtd/nand/Kconfig |    6 ---
>  include/linux/mtd/mtd.h  |    1 -
>  7 files changed, 108 insertions(+), 77 deletions(-)
>  create mode 100644 drivers/mtd/mtdoob.c
> 
> diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
> index 81282ab..a130c74 100644
> --- a/drivers/mtd/Kconfig
> +++ b/drivers/mtd/Kconfig
> @@ -8,8 +8,9 @@ config MTD_WRITE
>  	default y
>  	prompt "Support writing to MTD devices"
>  
> -config MTD_READ_OOB
> +config MTD_OOB_DEVICE
>  	bool
> +	select NAND_READ_OOB
>  	default y
>  	prompt "Create a device for reading the OOB data"
>  
> diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
> index 80fe386..d41ffd4 100644
> --- a/drivers/mtd/Makefile
> +++ b/drivers/mtd/Makefile
> @@ -1,4 +1,5 @@
>  obj-$(CONFIG_NAND)	+= nand/
>  obj-$(CONFIG_UBI)	+= ubi/
>  obj-$(CONFIG_PARTITION_NEED_MTD)	+= partition.o
> -obj-$(CONFIG_MTD)	+= core.o
> +obj-$(CONFIG_MTD)			+= core.o
> +obj-$(CONFIG_MTD_OOB_DEVICE)		+= mtdoob.o
> diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
> index a3cea33..55d845d 100644
> --- a/drivers/mtd/core.c
> +++ b/drivers/mtd/core.c
> @@ -114,7 +114,7 @@ out:
>  }
>  #endif
>  
> -static int mtd_ioctl(struct cdev *cdev, int request, void *buf)
> +int mtd_ioctl(struct cdev *cdev, int request, void *buf)
>  {
>  	struct mtd_info *mtd = cdev->priv;
>  	struct mtd_info_user *user = buf;
> @@ -186,71 +186,6 @@ static struct file_operations mtd_ops = {
>  	.lseek  = dev_lseek_default,
>  };
>  
> -#ifdef CONFIG_NAND_READ_DEVICE
> -static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count,
> -			    ulong offset, ulong flags)
> -{
> -	struct mtd_info *mtd = cdev->priv;
> -	struct mtd_oob_ops ops;
> -	int ret;
> -
> -	if (count < mtd->oobsize)
> -		return -EINVAL;
> -
> -	ops.mode = MTD_OOB_RAW;
> -	ops.ooboffs = 0;
> -	ops.ooblen = mtd->oobsize;
> -	ops.oobbuf = buf;
> -	ops.datbuf = NULL;
> -	ops.len = mtd->oobsize;
> -
> -	offset /= mtd->oobsize;
> -	/*
> -	 * This seems suspicious, shouldn't it be :
> -	 *   offset / mtd->oobsize * mtd->writesize
> -	 */
> -	ret = mtd->read_oob(mtd, offset * mtd->writesize, &ops);
> -	if (ret)
> -		return ret;
> -
> -	return mtd->oobsize;
> -}
> -
> -static struct file_operations mtd_ops_oob = {
> -	.read   = mtd_read_oob,
> -	.ioctl  = mtd_ioctl,
> -	.lseek  = dev_lseek_default,
> -};
> -
> -static int mtd_init_oob_cdev(struct mtd_info *mtd, char *devname)
> -{
> -	mtd->cdev_oob.ops = &mtd_ops_oob;
> -	mtd->cdev_oob.size = (mtd->size / mtd->writesize) * mtd->oobsize;
> -	mtd->cdev_oob.name = asprintf("%s_oob%d", devname, mtd->class_dev.id);
> -	mtd->cdev_oob.priv = mtd;
> -	mtd->cdev_oob.dev = &mtd->class_dev;
> -	devfs_create(&mtd->cdev_oob);
> -
> -	return 0;
> -}
> -
> -static void mtd_exit_oob_cdev(struct mtd_info *mtd)
> -{
> -	free(mtd->cdev_oob.name);
> -}
> -#else
> -
> -static int mtd_init_oob_cdev(struct mtd_info *mtd, char *devname)
> -{
> -	return 0;
> -}
> -
> -static void mtd_exit_oob_cdev(struct mtd_info *mtd)
> -{
> -	return;
> -}
> -#endif
> -
>  int add_mtd_device(struct mtd_info *mtd, char *devname)
>  {
>  	char str[16];
> @@ -280,7 +215,6 @@ int add_mtd_device(struct mtd_info *mtd, char *devname)
>  
>  	devfs_create(&mtd->cdev);
>  
> -	mtd_init_oob_cdev(mtd, devname);
>  	list_for_each_entry(hook, &mtd_register_hooks, hook)
>  		if (hook->add_mtd_device)
>  			hook->add_mtd_device(mtd, devname);
> @@ -296,7 +230,6 @@ int del_mtd_device (struct mtd_info *mtd)
>  		if (hook->del_mtd_device)
>  			hook->del_mtd_device(mtd);
>  	unregister_device(&mtd->class_dev);
> -	mtd_exit_oob_cdev(mtd);
>  	free(mtd->param_size.value);
>  	free(mtd->cdev.name);
>  	return 0;
> diff --git a/drivers/mtd/mtd.h b/drivers/mtd/mtd.h
> index 261cd2b..c8af6e3 100644
> --- a/drivers/mtd/mtd.h
> +++ b/drivers/mtd/mtd.h
> @@ -28,6 +28,7 @@ struct mtddev_hook {
>  	int (*add_mtd_device)(struct mtd_info *mtd, char *devname);
>  	int (*del_mtd_device)(struct mtd_info *mtd);
>  };
> +struct cdev;
>  
>  /**
>   * mtdcore_add_hook - add a hook to MTD registration/unregistration
> @@ -37,3 +38,5 @@ struct mtddev_hook {
>   * mtdraw, ...)
>   */
>  void mtdcore_add_hook(struct mtddev_hook *hook);
> +
> +int mtd_ioctl(struct cdev *cdev, int request, void *buf);
> diff --git a/drivers/mtd/mtdoob.c b/drivers/mtd/mtdoob.c
> new file mode 100644
> index 0000000..fdecee6
> --- /dev/null
> +++ b/drivers/mtd/mtdoob.c
> @@ -0,0 +1,100 @@
> +/*
> + * MTD oob device
> + *
> + * Copyright (C) 2011 Sascha Hauer
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * Adds a character devices :
> + *  - mtdoob<N>
> + */
> +
> +#include <common.h>
> +#include <init.h>
> +#include <malloc.h>
> +#include <ioctl.h>
> +#include <errno.h>
> +#include <linux/mtd/mtd.h>
> +
> +#include "mtd.h"
> +
> +struct mtdoob {
> +	struct cdev cdev;
> +	struct mtd_info *mtd;
> +};
> +
> +static struct mtd_info *to_mtd(struct cdev *cdev)
> +{
> +	struct mtdoob *mtdoob = cdev->priv;
> +	return mtdoob->mtd;
> +}
> +
> +static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count,
> +			     ulong offset, ulong flags)
> +{
> +	struct mtd_info *mtd = to_mtd(cdev);
> +	struct mtd_oob_ops ops;
> +	int ret;
> +
> +	if (count < mtd->oobsize)
> +		return -EINVAL;
> +
> +	ops.mode = MTD_OOB_RAW;
> +	ops.ooboffs = 0;
> +	ops.ooblen = mtd->oobsize;
> +	ops.oobbuf = buf;
> +	ops.datbuf = NULL;
> +	ops.len = mtd->oobsize;
> +
> +	offset /= mtd->oobsize;
> +	/*
> +	 * This seems suspicious, shouldn't it be :
> +	 *   offset / mtd->oobsize * mtd->writesize
> +	 */
> +	ret = mtd->read_oob(mtd, offset * mtd->writesize, &ops);
> +	if (ret)
> +		return ret;
> +
> +	return mtd->oobsize;
> +}
> +
> +static struct file_operations mtd_ops_oob = {
> +	.read   = mtd_read_oob,
> +	.ioctl  = mtd_ioctl,
> +	.lseek  = dev_lseek_default,
> +};
> +
> +static int add_mtdoob_device(struct mtd_info *mtd, char *devname)
> +{
> +	struct mtdoob *mtdoob;
> +
> +	mtdoob = xzalloc(sizeof(*mtdoob));
> +	mtdoob->cdev.ops = &mtd_ops_oob;
> +	mtdoob->cdev.size = (mtd->size / mtd->writesize) * mtd->oobsize;
> +	mtdoob->cdev.name = asprintf("%s_oob%d", devname, mtd->class_dev.id);
> +	mtdoob->cdev.priv = mtdoob;
> +	mtdoob->cdev.dev = &mtd->class_dev;

mtdoob->mtd = mtd

is missing here.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH V3 2/8] drivers/mtd: cosmetic changes
  2011-12-21 11:00   ` Sascha Hauer
@ 2011-12-21 21:27     ` Robert Jarzmik
  0 siblings, 0 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-21 21:27 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox

Sascha Hauer <s.hauer@pengutronix.de> writes:

>> -#ifdef CONFIG_NAND_OOB_DEVICE
>> -static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
>> +#ifdef CONFIG_NAND_READ_DEVICE
>> +static ssize_t nand_read_oob(struct cdev *cdev, void *buf, size_t count,
>> +			     ulong offset, ulong flags)
>
> You change the name of the Kconfig variable here. This shouldn't be here
> and breaks read_oob support.
True, but that was eliminated by a further patch (split of main mtd device from
oob device). Still, I removed that hunk for V4.

Cheers.

-- 
Robert

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH V3 7/8] drivers/mtd: split mtd mtdoob devices
  2011-12-21 11:32   ` Sascha Hauer
@ 2011-12-21 21:28     ` Robert Jarzmik
  0 siblings, 0 replies; 15+ messages in thread
From: Robert Jarzmik @ 2011-12-21 21:28 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox

Sascha Hauer <s.hauer@pengutronix.de> writes:

> mtdoob->mtd = mtd
> is missing here.

As yes, that can't work without this line :) For V4.

-- 
Robert

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2011-12-21 21:28 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-19 14:04 [PATCH V3 0/8] mtd framework rework Robert Jarzmik
2011-12-19 14:04 ` [PATCH V3 1/8] drivers/mtd: move nand.c into core.c Robert Jarzmik
2011-12-19 14:04 ` [PATCH V3 2/8] drivers/mtd: cosmetic changes Robert Jarzmik
2011-12-21 11:00   ` Sascha Hauer
2011-12-21 21:27     ` Robert Jarzmik
2011-12-19 14:04 ` [PATCH V3 3/8] drivers/mtd: transfer NAND notions to MTD core Robert Jarzmik
2011-12-21 11:25   ` Sascha Hauer
2011-12-19 14:04 ` [PATCH V3 4/8] drivers/mtd: recover NAND default device name "nand" Robert Jarzmik
2011-12-19 14:04 ` [PATCH V3 5/8] drivers/mtd: fix core multiple MTD registrations Robert Jarzmik
2011-12-19 14:04 ` [PATCH V3 6/8] drivers/mtd: add mtd core hooks Robert Jarzmik
2011-12-19 14:04 ` [PATCH V3 7/8] drivers/mtd: split mtd mtdoob devices Robert Jarzmik
2011-12-21 11:32   ` Sascha Hauer
2011-12-21 21:28     ` Robert Jarzmik
2011-12-19 14:04 ` [PATCH V3 8/8] drivers/mtd: add the mtdraw device (data+oob) Robert Jarzmik
2011-12-21 10:59 ` [PATCH V3 0/8] mtd framework rework Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox