Patchwork [5/6] OneNand driver for Nomadik 8815 SoC (on NHK8815 board)

login
register
mail settings
Submitter Alessandro Rubini
Date April 22, 2009, 7:41 a.m.
Message ID <e06507b00cbf2bcb35e80dec547f8ef91c67158b.1240384958.git.rubini@gnudd.com>
Download mbox | patch
Permalink /patch/26300/
State New
Headers show

Comments

Alessandro Rubini - April 22, 2009, 7:41 a.m.
From: Alessandro Rubini <rubini@unipv.it>

Add the platform_device and the configuration used to activate
the OneNand device found on the NHK8815 evaluation kit.

Signed-off-by: Alessandro Rubini <rubini@unipv.it>
Acked-by: Andrea Gallo <andrea.gallo@stericsson.com>
---

This and one-nand are Cc: to the mtd list, the other patches
have been sent only to linux-arm-kernel.

 arch/arm/configs/nhk15_defconfig      |    9 +++-
 arch/arm/mach-nomadik/board-8815nhk.c |   67 +++++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+), 2 deletions(-)
Jean-Christophe PLAGNIOL-VILLARD - April 24, 2009, 8:27 p.m.
On 09:41 Wed 22 Apr     , Alessandro Rubini wrote:
> From: Alessandro Rubini <rubini@unipv.it>
> 
> Add the platform_device and the configuration used to activate
> the OneNand device found on the NHK8815 evaluation kit.
it will be nice to known on which one you boot at runtime
> 
> Signed-off-by: Alessandro Rubini <rubini@unipv.it>
> Acked-by: Andrea Gallo <andrea.gallo@stericsson.com>
> ---
> 
> This and one-nand are Cc: to the mtd list, the other patches
> have been sent only to linux-arm-kernel.
> 
> +	},
> +};
> +
> +static struct platform_device nhk8815_onenand_device = {
> +	.name		= "onenand",
> +	.id		= -1,
> +	.dev		= {
> +		.platform_data	= &nhk8815_onenand_data,
> +	},
> +	.resource	= nhk8815_onenand_resource,
> +	.num_resources	= ARRAY_SIZE(nhk8815_onenand_resource),
> +};
> +
> +static void __init nhk8815_onenand_init(void)
> +{
> +#ifdef CONFIG_ONENAND
> +       /* Set up SMCS0 for OneNand */
> +       writel(0x000030db, FSMC_BCR0);
> +       writel(0x02100551, FSMC_BTR0);
same as nand it will be better, more readable and easier to maintain to use macro
to generate these SMCSx config instead hard code value

otherwise looks fine

Best Regards,
J.

Patch

diff --git a/arch/arm/configs/nhk15_defconfig b/arch/arm/configs/nhk15_defconfig
index 1697efe..ea99b34 100644
--- a/arch/arm/configs/nhk15_defconfig
+++ b/arch/arm/configs/nhk15_defconfig
@@ -1,7 +1,7 @@ 
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.29-rc7
-# Thu Mar 12 00:30:32 2009
+# Fri Mar 13 00:06:15 2009
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -477,7 +477,12 @@  CONFIG_MTD_NAND_IDS=y
 # CONFIG_MTD_NAND_NANDSIM is not set
 # CONFIG_MTD_NAND_PLATFORM is not set
 CONFIG_MTD_NAND_NOMADIK=y
-# CONFIG_MTD_ONENAND is not set
+CONFIG_MTD_ONENAND=y
+CONFIG_MTD_ONENAND_VERIFY_WRITE=y
+CONFIG_MTD_ONENAND_GENERIC=y
+# CONFIG_MTD_ONENAND_OTP is not set
+# CONFIG_MTD_ONENAND_2X_PROGRAM is not set
+# CONFIG_MTD_ONENAND_SIM is not set
 
 #
 # LPDDR flash memory drivers
diff --git a/arch/arm/mach-nomadik/board-8815nhk.c b/arch/arm/mach-nomadik/board-8815nhk.c
index b7be6c2..0cd2dcb 100644
--- a/arch/arm/mach-nomadik/board-8815nhk.c
+++ b/arch/arm/mach-nomadik/board-8815nhk.c
@@ -27,6 +27,7 @@ 
 #include <asm/mach/arch.h>
 #include <asm/mach/irq.h>
 
+#include <asm/mach/flash.h>
 #include <mach/hardware.h>
 #include <mach/setup.h>
 #include <mach/nand.h>
@@ -120,6 +121,70 @@  static struct platform_device nhk8815_nand_device = {
 	.num_resources	= ARRAY_SIZE(nhk8815_nand_resources),
 };
 
+/* These are the partitions for the OneNand device, different from above */
+static struct mtd_partition nhk8815_onenand_partitions[] = {
+	{
+		.name	= "X-Loader(OneNAND)",
+		.offset = 0,
+		.size	= SZ_256K,
+	}, {
+		.name	= "MemInit(OneNAND)",
+		.offset	= MTDPART_OFS_APPEND,
+		.size	= SZ_256K,
+	}, {
+		.name	= "BootLoader(OneNAND)",
+		.offset	= MTDPART_OFS_APPEND,
+		.size	= SZ_2M-SZ_256K,
+	}, {
+		.name	= "U-Boot Environment(OneNAND)",
+		.offset	= MTDPART_OFS_APPEND,
+		.size	= SZ_256K,
+	}, {
+		.name	= "SysImage(OneNAND)",
+		.offset	= MTDPART_OFS_APPEND,
+		.size	= 4 * SZ_1M,
+	}, {
+		.name	= "Root Filesystem(OneNAND)",
+		.offset	= MTDPART_OFS_APPEND,
+		.size	= 22 * SZ_1M,
+	}, {
+		.name	= "User Filesystem(OneNAND)",
+		.offset	= MTDPART_OFS_APPEND,
+		.size	= MTDPART_SIZ_FULL,
+	}
+};
+
+static struct flash_platform_data nhk8815_onenand_data = {
+	.parts		= nhk8815_onenand_partitions,
+	.nr_parts	= ARRAY_SIZE(nhk8815_onenand_partitions),
+};
+
+static struct resource nhk8815_onenand_resource[] = {
+	{
+		.start		= 0x30000000,
+		.end		= 0x30000000 + SZ_128K - 1,
+		.flags		= IORESOURCE_MEM,
+	},
+};
+
+static struct platform_device nhk8815_onenand_device = {
+	.name		= "onenand",
+	.id		= -1,
+	.dev		= {
+		.platform_data	= &nhk8815_onenand_data,
+	},
+	.resource	= nhk8815_onenand_resource,
+	.num_resources	= ARRAY_SIZE(nhk8815_onenand_resource),
+};
+
+static void __init nhk8815_onenand_init(void)
+{
+#ifdef CONFIG_ONENAND
+       /* Set up SMCS0 for OneNand */
+       writel(0x000030db, FSMC_BCR0);
+       writel(0x02100551, FSMC_BTR0);
+#endif
+}
 
 #define __MEM_4K_RESOURCE(x) \
 	.res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
@@ -159,6 +224,7 @@  arch_initcall(nhk8815_init);
 
 static struct platform_device *nhk8815_platform_devices[] __initdata = {
 	&nhk8815_nand_device,
+	&nhk8815_onenand_device,
 	/* will add keypad, touchscreen etc */
 };
 
@@ -170,6 +236,7 @@  static void __init nhk8815_map_io(void)
 static void __init nhk8815_platform_init(void)
 {
 	cpu8815_platform_init();
+	nhk8815_onenand_init();
 	platform_add_devices(nhk8815_platform_devices,
 			     ARRAY_SIZE(nhk8815_platform_devices));
 }