All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sebastian Block <basti@linux-source.de>
To: barebox@lists.infradead.org
Subject: [PATCH v2] mtd: add mtdram device (which build mtd over ram area - useful for FRAM oder MRAM)
Date: Sat, 06 Sep 2014 13:21:03 +0200	[thread overview]
Message-ID: <540AEE1F.5030504@linux-source.de> (raw)
In-Reply-To: <20140901080611.GE5352@pengutronix.de>

Change since v1 (Sascha, thanks for review):
	* use xzalloc instead of kzalloc and control check
	* correct help and names
	* fix coding style issue
	* remove verbose and unneeded messages

This adds support for MTD in RAM devices (like FRAM or MRAM). 

Signed-off-by: Sebastian Block <basti@linux-source.de>
---
 drivers/mtd/devices/Kconfig  |   5 ++
 drivers/mtd/devices/Makefile |   1 +
 drivers/mtd/devices/mtdram.c | 124 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 130 insertions(+)
 create mode 100644 drivers/mtd/devices/mtdram.c

diff --git a/drivers/mtd/devices/Kconfig b/drivers/mtd/devices/Kconfig
index 61278a2..7f9c306 100644
--- a/drivers/mtd/devices/Kconfig
+++ b/drivers/mtd/devices/Kconfig
@@ -58,4 +58,9 @@ config MTD_DOCG3
 	  M-Systems and now Sandisk. The support is very experimental,
 	  and doesn't give access to any write operations.
 
+config MTD_MTDRAM
+	tristate "Support for NVRAM devices (FRAM, MRAM, ...)"
+	help
+	  This enables non volatile RAM to used as MTD devices.
+
 endmenu
diff --git a/drivers/mtd/devices/Makefile b/drivers/mtd/devices/Makefile
index bf1f8a9..bc1960e 100644
--- a/drivers/mtd/devices/Makefile
+++ b/drivers/mtd/devices/Makefile
@@ -5,3 +5,4 @@
 obj-$(CONFIG_MTD_DATAFLASH)	+= mtd_dataflash.o
 obj-$(CONFIG_MTD_DOCG3)		+= docg3.o
 obj-$(CONFIG_MTD_M25P80)	+= m25p80.o
+obj-$(CONFIG_MTD_MTDRAM)	+= mtdram.o
diff --git a/drivers/mtd/devices/mtdram.c b/drivers/mtd/devices/mtdram.c
new file mode 100644
index 0000000..47c5ad7
--- /dev/null
+++ b/drivers/mtd/devices/mtdram.c
+ *
+ * Author: Sebastian Block <basti@linux-source.de>
+ * Copyright (c) 2014
+ *
+ * Some parts are based on mtdram.c found in Linux kernel 
+ * by   Alexander Larsson <alex@cendio.se> 
+ * and  Joern Engel <joern@wh.fh-wedel.de>.
+ *
+ * This code 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.
+ *
+ */
+#include <common.h>
+#include <environment.h>
+#include <errno.h>
+#include <init.h>
+#include <io.h>
+#include <linux/mtd/mtd.h>
+#include <malloc.h>
+#include <of.h>
+
+struct mtdram_priv_data {
+	struct mtd_info mtd;
+	void *base;
+};
+
+static int ram_erase(struct mtd_info *mtd, struct erase_info *instr) 
+{
+	memset((char *)mtd->priv + instr->addr, 0xff, instr->len);
+	instr->state = MTD_ERASE_DONE;
+	mtd_erase_callback(instr);
+	return 0;
+}
+
+static int ram_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) 
+{
+	memcpy((char*)mtd->priv + to, buf, len);
+	*retlen = len;
+	return 0;
+}
+
+static int ram_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) 
+{
+	memcpy(buf, mtd->priv + from, len);
+	*retlen = len;
+	return 0;
+}
+
+static int mtdram_probe(struct device_d *dev) 
+{
+	void __iomem *base;
+	int device_id;
+	struct mtd_info *mtd;
+	struct resource *res;
+	loff_t size;
+	int ret = 0;
+	
+	mtd = xzalloc(sizeof(struct mtd_info), GFP_KERNEL);
+
+	device_id = DEVICE_ID_SINGLE;
+	if (dev->device_node) {
+		const char *alias = of_alias_get(dev->device_node);
+		if (alias)
+			mtd->name = xstrdup(alias);
+	}
+	
+	if (!mtd->name) {
+		device_id = DEVICE_ID_DYNAMIC;
+		mtd->name = "mtdram";
+	}
+
+	base = dev_request_mem_region(dev, 0);
+	if (!base) {
+		ret = -EBUSY;
+		goto nobase;
+	}
+
+	res = dev_get_resource(dev, IORESOURCE_MEM, 0);
+	size = (unsigned long) resource_size(res);
+	mtd->priv = base;
+
+	mtd->type = MTD_RAM;
+	mtd->writesize = 1;
+	mtd->writebufsize = 64;
+	mtd->flags = MTD_CAP_RAM;
+	mtd->size = size;
+
+	mtd->read = ram_read;
+	mtd->write = ram_write;
+	mtd->erase = ram_erase;
+	mtd->erasesize = 1;
+
+	mtd->parent = dev;
+
+	ret = add_mtd_device(mtd, mtd->name, device_id);
+	return ret;
+
+nobase:
+	kfree(mtd);
+nomem1:
+	return ret;
+}
+
+static __maybe_unused struct of_device_id mtdram_dt_ids[] = {
+	{
+		.compatible	= "mtd-ram",
+	}, {
+		/*  sentinel */
+	}
+};
+
+static struct driver_d mtdram_driver = {
+	.name	= "mtdram",
+	.probe	= mtdram_probe,
+	.of_compatible	= DRV_OF_COMPAT(mtdram_dt_ids),
+};
+device_platform_driver(mtdram_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Sebastian Block");
+MODULE_DESCRIPTION("MTD RAM driver for NVRAMs");
-- 
1.9.1



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

  reply	other threads:[~2014-09-06 11:21 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-28  8:59 [PATCH] mtd: add mtdram device (which build mtd over ram area - useful for FRAM oder MRAM) basti
2014-08-28 11:51 ` Alexander Aring
2014-08-28 11:58 ` Alexander Aring
2014-09-01  8:06 ` Sascha Hauer
2014-09-06 11:21   ` Sebastian Block [this message]
2014-09-08  6:23     ` [PATCH v2] " Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=540AEE1F.5030504@linux-source.de \
    --to=basti@linux-source.de \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.