From ebd641a5ea79f88cae62e97e3dade8e646195a18 Mon Sep 17 00:00:00 2001 From: "sshahrom@micron.com" Date: Fri, 10 Aug 2007 03:22:31 -0700 Subject: [PATCH] OMAP: Adding Support for 2K nand page support for omap2430 Following patches would add support for 2k Page nand with Enabled HW ECC on omap2430 v4.0. It has been Tested with Micron Nand. The Patch is against 2.6.22 linux-omap.git tree. As Always all the comments are welcomed. Signed-off-by: Shahrom Sharif-Kashani Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/board-2430sdp-flash.c | 81 ++++++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-omap2/board-2430sdp-flash.c b/arch/arm/mach-omap2/board-2430sdp-flash.c index 1e8492a055a..aaf5970f9ca 100644 --- a/arch/arm/mach-omap2/board-2430sdp-flash.c +++ b/arch/arm/mach-omap2/board-2430sdp-flash.c @@ -20,10 +20,64 @@ #include #include #include +#include #define ONENAND_MAP 0x20000000 #define GPMC_OFF_CONFIG1_0 0x60 +enum fsType { + NAND = 0, + NOR, + ONENAND, + UNKNOWN=-1 +}; + +static enum fsType flashType = NAND; + +static struct mtd_partition nand_partitions[] = { + { + .name = "X-Loader", + .offset = 0, + .size = 4*(64*2048), /* 0-3 blks reserved. + Mandated by ROM code */ + .mask_flags = MTD_WRITEABLE /* force read-only */ + }, + { + .name = "U-Boot", + .offset = MTDPART_OFS_APPEND, + .size = 4*(64*2048), + .mask_flags = MTD_WRITEABLE /* force read-only */ + }, + { + .name = "U-Boot Environment", + .offset = MTDPART_OFS_APPEND, + .size = 2*(64*2048), + }, + { + .name = "Kernel", + .offset = MTDPART_OFS_APPEND, + .size = 32*(64*2048), /* 4*1M */ + }, + { + .name = "File System", + .offset = MTDPART_OFS_APPEND, + .size = MTDPART_SIZ_FULL, + }, +}; +static struct omap_nand_platform_data sdp_nand_data = { + .parts = nand_partitions, + .nr_parts = ARRAY_SIZE(nand_partitions), + .dma_channel = -1, /* disable DMA in OMAP OneNAND driver */ +}; + +static struct platform_device sdp_nand_device = { + .name = "omap2-nand", + .id = -1, + .dev = { + .platform_data = &sdp_nand_data, + }, +}; + static struct mtd_partition onenand_partitions[] = { { .name = "(OneNAND)X-Loader", @@ -82,29 +136,50 @@ void __init sdp2430_flash_init(void) gpmc_cs_base_add = (gpmc_base_add + GPMC_OFF_CONFIG1_0 + (cs*0x30)); - /* xloader/Uboot would have programmed the oneNAND + /* xloader/Uboot would have programmed the NAND/oneNAND * base address for us This is a ugly hack. The proper * way of doing this is to pass the setup of u-boot up * to kernel using kernel params - something on the - * lines of machineID. Check if oneNAND is + * lines of machineID. Check if Nand/oneNAND is * configured */ + ret = __raw_readl(gpmc_cs_base_add + GPMC_CS_CONFIG1); + if ((ret & 0xC00) == (0x800)) { + /* Found it!! */ + printk("NAND: Found NAND on CS %d \n",cs); + flashType = NAND; + break; + } ret = __raw_readl(gpmc_cs_base_add + GPMC_CS_CONFIG7); if ((ret & 0x3F) == (ONENAND_MAP >> 24)) { /* Found it!! */ + flashType = ONENAND; break; } cs++; } if (cs >= GPMC_CS_NUM) { - printk("OneNAND: Unable to find oneNAND configuration in GPMC " + printk("MTD: Unable to find MTD configuration in GPMC " " - not registering.\n"); return; } + if (flashType == NAND) { + sdp_nand_data.cs = cs; + sdp_nand_data.gpmcCsBaseAddr = gpmc_cs_base_add; + sdp_nand_data.gpmcBaseAddr = gpmc_base_add; + + if (platform_device_register(&sdp_nand_device) < 0) { + printk(KERN_ERR "Unable to register NAND device\n"); + return; + } + } + + if (flashType == ONENAND) { sdp_onenand_data.cs = cs; if (platform_device_register(&sdp_onenand_device) < 0) { printk(KERN_ERR "Unable to register OneNAND device\n"); return; } + } } -- 2.41.1