public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH] MTD: Add support for the CPCI405 board
@ 2006-06-14 14:06 Matthias Fuchs
  2006-06-14 20:12 ` David Woodhouse
  0 siblings, 1 reply; 3+ messages in thread
From: Matthias Fuchs @ 2006-06-14 14:06 UTC (permalink / raw)
  To: linux-mtd

[-- Attachment #1: Type: text/plain, Size: 461 bytes --]

This patch adds MTD support for the NOR flash on CPCI405 boards.

These boards may have different flash chips installed. Some of them
are detected by the cfi probing. Others need the jedec_probe support.
The patch also adds support for SST39VF3201 chips in jedec_probe.c

The patch is tested with all available flash combinations against
the recent mtd-2.6.git repository.

Regards
Matthias

Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>



[-- Attachment #2: cpci405_mtd_2006_06_14.patch --]
[-- Type: text/plain, Size: 6247 bytes --]

diff --git a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c
index 517ea33..f99f73e 100644
--- a/drivers/mtd/chips/jedec_probe.c
+++ b/drivers/mtd/chips/jedec_probe.c
@@ -147,6 +147,7 @@ #define SST29LE512	0x003d
 #define SST39LF800	0x2781
 #define SST39LF160	0x2782
 #define SST39VF1601	0x234b
+#define SST39VF3201	0x235b
 #define SST39LF512	0x00D4
 #define SST39LF010	0x00D5
 #define SST39LF020	0x00D6
@@ -1483,6 +1484,22 @@ static const struct amd_flash_info jedec
                }
 
        }, {
+               .mfr_id         = MANUFACTURER_SST,     /* should be CFI */
+               .dev_id         = SST39VF3201,
+               .name           = "SST 39VF3201",
+               .uaddr          = {
+                       [0] = MTD_UADDR_0x5555_0x2AAA,  /* x8 */
+                       [1] = MTD_UADDR_0x5555_0x2AAA   /* x16 */
+               },
+               .DevSize        = SIZE_4MiB,
+               .CmdSet         = P_ID_AMD_STD,
+               .NumEraseRegions= 2,
+               .regions        = {
+                       ERASEINFO(0x1000,512),
+                       ERASEINFO(0x1000,512)
+               }
+
+       }, {
 		.mfr_id		= MANUFACTURER_ST,	/* FIXME - CFI device? */
 		.dev_id		= M29W800DT,
 		.name		= "ST M29W800DT",
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index 6bdaacc..9fd9c25 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -323,6 +323,14 @@ config MTD_WALNUT
 	  Walnut board. If you have one of these boards and would like to
 	  use the flash chips on it, say 'Y'.
 
+config MTD_CPCI405
+	tristate "Flash devices mapped on esd CPCI405"
+	depends on MTD_JEDECPROBE && CPCI405
+	help
+	  This enables access routines for the flash chips on the esd
+	  CPCI405 board.  If you have this board and would like to use the
+	  flash chips on it, say 'Y'.
+
 config MTD_EBONY
 	tristate "Flash devices mapped on IBM 440GP Ebony"
 	depends on MTD_JEDECPROBE && EBONY
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index ab71f17..c298dc3 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -58,6 +58,7 @@ obj-$(CONFIG_MTD_OCOTEA)	+= ocotea.o
 obj-$(CONFIG_MTD_BEECH)		+= beech-mtd.o
 obj-$(CONFIG_MTD_ARCTIC)	+= arctic-mtd.o
 obj-$(CONFIG_MTD_WALNUT)        += walnut.o
+obj-$(CONFIG_MTD_CPCI405)	+= cpci405-mtd.o
 obj-$(CONFIG_MTD_H720X)		+= h720x-flash.o
 obj-$(CONFIG_MTD_SBC8240)	+= sbc8240.o
 obj-$(CONFIG_MTD_NOR_TOTO)	+= omap-toto-flash.o
diff --git a/drivers/mtd/maps/cpci405-mtd.c b/drivers/mtd/maps/cpci405-mtd.c
new file mode 100644
index 0000000..ff2ae75
--- /dev/null
+++ b/drivers/mtd/maps/cpci405-mtd.c
@@ -0,0 +1,142 @@
+/*
+ *  drivers/mtd/maps/cpci405-mtd.c
+ *
+ *  Mapping for esd CPCI405 onboard flash
+ *
+ *  Copyright (c) 2006 electronic system design gmbh
+ *
+ *  Author:
+ *  Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+ *
+ *  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.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/io.h>
+#include <asm/ibm4xx.h>
+#include <asm/ppcboot.h>
+
+extern bd_t __res;
+
+#define P0_KERNEL_SIZE_MIN 0x100000
+#define P0_KERNEL_SIZE_MAX 0x140000
+#define P1_INITRD_SIZE	   0x180000
+#define P3_UBOOT_SIZE	   0x040000
+
+static struct mtd_partition cpci405_flash_partitions[] = {
+	{
+		.name = "kernel",
+		.offset = 0,
+		.size = P0_KERNEL_SIZE_MIN
+	},
+	{
+		.name = "initrd",
+		.offset = MTDPART_OFS_APPEND,
+		.size = P1_INITRD_SIZE
+	},
+	{
+		.name = "data",
+		.offset = MTDPART_OFS_APPEND,
+                /* size of partition 2 will be calculated at
+		   runtime dependent on the total flash size
+		*/
+	},
+	{
+		.name = "u-boot",
+		.offset = MTDPART_OFS_APPEND,
+		.size = P3_UBOOT_SIZE
+	}
+};
+
+static struct map_info cpci405_flash_map = {
+	.name = "CPCI405 Flash",
+	.bankwidth = 2,
+};
+
+static struct mtd_info *cpci405_mtd;
+
+static int __init init_cpci405_flash(void)
+{
+	unsigned long long flash_base;
+	unsigned long flash_size;
+
+	flash_base = __res.bi_flashstart;
+	flash_size = __res.bi_flashsize;
+
+	cpci405_flash_map.size = flash_size;
+	cpci405_flash_map.phys = flash_base;
+	cpci405_flash_map.virt = ioremap(flash_base, cpci405_flash_map.size);
+
+	if (!cpci405_flash_map.virt) {
+		printk(KERN_NOTICE "init_cpci405_flash: failed to ioremap\n");
+		return -EIO;
+	}
+
+	/*
+	 * Adjust kernel partition when we have a huge flash
+	 */
+	if (cpci405_flash_map.size > 0x400000) {
+		cpci405_flash_partitions[0].size = P0_KERNEL_SIZE_MAX;
+	}
+
+	/*
+	 * Adjust data partition to use the remaining flash
+	 */
+	cpci405_flash_partitions[2].size = cpci405_flash_map.size -
+		cpci405_flash_partitions[0].size - 
+		P1_INITRD_SIZE - P3_UBOOT_SIZE;
+
+	simple_map_init(&cpci405_flash_map);
+
+	/* 
+	 * On some boards there are CFI compatable flashes installed ...
+	 */
+	cpci405_mtd = do_map_probe("cfi_probe", &cpci405_flash_map);
+	if (!cpci405_mtd) {
+		/*
+		 * ... some others use SST flashes that are currently not 
+		 * detected by the cfi code, but jedec_probe works for these.
+		 */
+		cpci405_mtd = do_map_probe("jedec_probe", &cpci405_flash_map);
+	}
+
+	if (cpci405_mtd) {
+		cpci405_mtd->owner = THIS_MODULE;
+		return add_mtd_partitions(cpci405_mtd,
+					  cpci405_flash_partitions,
+					  ARRAY_SIZE(cpci405_flash_partitions));
+	} else {
+		printk(KERN_NOTICE \
+		       "init_cpci405_flash: failed to probe flash\n");
+	}
+
+	return -ENXIO;
+}
+
+static void __exit cleanup_cpci405_flash(void)
+{
+	if (cpci405_mtd) {
+		del_mtd_partitions(cpci405_mtd);
+		map_destroy(cpci405_mtd);
+		iounmap(cpci405_flash_map.virt);
+	}
+}
+
+module_init(init_cpci405_flash);
+module_exit(cleanup_cpci405_flash);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Matthias Fuchs <matthias.fuchs@esd-electronics.com>");
+MODULE_DESCRIPTION("MTD map for esd CPCI405 onboard flash");

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

end of thread, other threads:[~2006-06-15  8:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-14 14:06 [PATCH] MTD: Add support for the CPCI405 board Matthias Fuchs
2006-06-14 20:12 ` David Woodhouse
2006-06-15  8:16   ` Matthias Fuchs

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