Patchwork [RFC,2/3,MTD] NAND: hooks for ts78xx.c to use ts7xxx.c NAND driver

login
register
mail settings
Submitter Alexander Clouter
Date Dec. 29, 2008, 9:52 p.m.
Message ID <20081229215207.GH3381@woodchuck>
Download mbox | patch
Permalink /patch/15992/
State RFC
Headers show

Comments

Alexander Clouter - Dec. 29, 2008, 9:52 p.m.
[PATCH RFC] [MTD] NAND: add hooks so TS78xx can use the NAND

Add the NAND hooks in the platform code for the ts78xx.c

Signed-off-by: Alexander Clouter <alex@digriz.org.uk>
---
 arch/arm/mach-orion5x/ts78xx-fpga.h  |    1 +
 arch/arm/mach-orion5x/ts78xx-setup.c |  115 ++++++++++++++++++++++++++++++++++
 2 files changed, 116 insertions(+), 0 deletions(-)

Patch

diff --git a/arch/arm/mach-orion5x/ts78xx-fpga.h b/arch/arm/mach-orion5x/ts78xx-fpga.h
index 247e7ea..44c2b3c 100644
--- a/arch/arm/mach-orion5x/ts78xx-fpga.h
+++ b/arch/arm/mach-orion5x/ts78xx-fpga.h
@@ -12,6 +12,7 @@  struct fpga_device {
 struct fpga_devices {
 	/* Technologic Systems */
 	struct fpga_device ts_rtc;
+	struct fpga_device ts_nand;
 };
 
 struct ts78xx_fpga_data {
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c
index 2d020ac..b0fb96d 100644
--- a/arch/arm/mach-orion5x/ts78xx-setup.c
+++ b/arch/arm/mach-orion5x/ts78xx-setup.c
@@ -15,6 +15,9 @@ 
 #include <linux/mv643xx_eth.h>
 #include <linux/ata_platform.h>
 #include <linux/m48t86.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/ts7xxx.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
@@ -159,11 +162,118 @@  static void ts78xx_ts_rtc_unload(void)
 #endif
 
 /*****************************************************************************
+ * NAND Flash
+ ****************************************************************************/
+#ifdef CONFIG_MTD_NAND_TS7XXX
+#define TS_NAND_IOBASE		TS78XX_FPGA_REGS_PHYS_BASE
+#define TS_NAND_SIZE		SZ_4K
+#define TS_NAND_CTRL_OFFSET	0x800
+#define TS_NAND_DATA_OFFSET	0x804
+
+static struct mtd_partition ts78xx_ts_nand_parts512[] = {
+	{
+		.name		= "mbr",
+		.offset		= 0,
+		.size		= SZ_128K,
+		.mask_flags	= MTD_WRITEABLE,
+	}, {
+		.name		= "kernel",
+		.offset		= MTDPART_OFS_APPEND,
+		.size		= SZ_4M,
+	}, {
+		.name		= "initrd",
+		.offset		= MTDPART_OFS_APPEND,
+		.size		= SZ_4M,
+	}, {
+		.name		= "rootfs",
+		.offset		= MTDPART_OFS_APPEND,
+		.size		= MTDPART_SIZ_FULL,
+	}
+};
+
+static struct ts7xxx_nand_data ts78xx_ts_nand_data = {
+	.partitions	= NULL,
+	.nr_partitions	= 0,
+
+	.ioports	= {
+		.ctrl	= {
+			.res	= 0,
+			.offset	= TS_NAND_CTRL_OFFSET,
+		},
+		.data	= {
+			.res	= 0,
+			.offset	= TS_NAND_DATA_OFFSET,
+		},
+
+		.busy	= {
+			.res	= 0,
+			.offset	= TS_NAND_CTRL_OFFSET,
+		},
+	},
+};
+
+static struct resource ts78xx_ts_nand_flash_resource[] = {
+	{
+		.flags		= IORESOURCE_MEM,
+		.start		= TS_NAND_IOBASE,
+		.end		= TS_NAND_IOBASE + TS_NAND_SIZE - 1,
+	},
+};
+
+static struct ts7xxx_nand_data *ts78xx_ts_nand(unsigned int size)
+{
+	/*
+	 * currently only the TS-7800 is out there with a 512MiB NAND
+	 */
+	if (size == 512 * SZ_1M) {
+		ts78xx_ts_nand_data.partitions = ts78xx_ts_nand_parts512;
+		ts78xx_ts_nand_data.nr_partitions
+					= ARRAY_SIZE(ts78xx_ts_nand_parts512);
+	}
+
+	return &ts78xx_ts_nand_data;
+};
+
+static struct platform_device ts78xx_ts_nand_device = {
+	.name		= "ts7xxx_nand",
+	.id		= -1,
+	.dev		= {
+		.platform_data	= &ts78xx_ts_nand,
+	},
+	.num_resources	= ARRAY_SIZE(ts78xx_ts_nand_flash_resource),
+	.resource	= ts78xx_ts_nand_flash_resource,
+};
+
+static void ts78xx_ts_nand_load(void)
+{
+	if (ts78xx_fpga.supports.ts_nand.init == 0) {
+		ts78xx_fpga.supports.ts_nand.init = 1;
+		platform_device_register(&ts78xx_ts_nand_device);
+	} else
+		platform_device_add(&ts78xx_ts_nand_device);
+};
+
+static void ts78xx_ts_nand_unload(void)
+{
+	platform_device_del(&ts78xx_ts_nand_device);
+}
+#else
+static void ts78xx_ts_nand_load(void)
+{
+}
+
+static void ts78xx_ts_nand_unload(void)
+{
+}
+#endif
+
+/*****************************************************************************
  * FPGA 'hotplug' support code
  ****************************************************************************/
 static void ts78xx_fpga_devices_zero_init(void)
 {
 	ts78xx_fpga.supports.ts_rtc.init = 0;
+	ts78xx_fpga.supports.ts_nand.init = 0;
 }
 
 static void ts78xx_fpga_supports(void)
@@ -172,6 +282,7 @@  static void ts78xx_fpga_supports(void)
 	switch (ts78xx_fpga.id) {
 	case TS7800_REV_B:
 		ts78xx_fpga.supports.ts_rtc.present = 1;
+		ts78xx_fpga.supports.ts_nand.present = 1;
 		break;
 	}
 }
@@ -186,6 +297,8 @@  static int ts78xx_fpga_load_devices(void)
 			printk(KERN_INFO "TS-78xx RTC not detected or enabled\n");
 		ret |= tmp;
 	}
+	if (ts78xx_fpga.supports.ts_nand.present == 1)
+		ts78xx_ts_nand_load();
 
 	return ret;
 }
@@ -196,6 +309,8 @@  static int ts78xx_fpga_unload_devices(void)
 
 	if (ts78xx_fpga.supports.ts_rtc.present == 1)
 		ts78xx_ts_rtc_unload();
+	if (ts78xx_fpga.supports.ts_nand.present == 1)
+		ts78xx_ts_nand_unload();
 
 	return ret;
 }