rk nand base compatible with RK29 and RK30.
authorzhaoyifeng <zyf@rock-chips.com>
Wed, 14 Mar 2012 09:06:47 +0000 (17:06 +0800)
committerzhaoyifeng <zyf@rock-chips.com>
Wed, 14 Mar 2012 09:06:47 +0000 (17:06 +0800)
drivers/mtd/rknand/Kconfig
drivers/mtd/rknand/Makefile
drivers/mtd/rknand/nand_config.h
drivers/mtd/rknand/rknand_base.h
drivers/mtd/rknand/rknand_base_ko.c

index 58e91664a6e6cd8c8dff3cf60bc731f6d0077932..318c80c36763efa9a1dcc1cd11406829884fdf25 100755 (executable)
@@ -10,32 +10,32 @@ config MTD_RKNAND
          RK NAND Device Support \r
 if MTD_RKNAND \r
  \r
-config MTD_NAND_RK29XX \r
-       tristate "RK29 on-chip NAND Flash Controller driver with FTL" \r
+config MTD_NAND_RK\r
+       tristate "RK on-chip NAND Flash Controller driver with FTL" \r
        depends on MTD_RKNAND \r
     default y \r
        help \r
          This enables the RK28xx on-chip NAND flash controller and NFTL driver. \r
  \r
-config MTD_RKNAND_BUFFER \r
-       tristate "RK29 Nand buffer write enables" \r
+config MTD_RKNAND_BUFFER\r
+       tristate "RK Nand buffer write enables" \r
        depends on MTD_RKNAND \r
     default y \r
        help \r
        \r
 config MTD_EMMC_CLK_POWER_SAVE \r
-       tristate "RK29 emmc clock power save" \r
+       tristate "RK emmc clock power save" \r
        depends on MTD_RKNAND \r
     default n\r
        help \r
  \r
-config MTD_NAND_RK29XX_DEBUG \r
-       tristate "RK29 Nand driver debug enables" \r
+config MTD_NAND_RK_DEBUG \r
+       tristate "RK Nand driver debug enables"\r
        depends on MTD_RKNAND \r
     default n \r
        help \r
         \r
-config MTD_NAND_RK29XX_DEBUG_VERBOSE \r
+config MTD_NAND_RK_DEBUG_VERBOSE \r
        int "Debugging verbosity (0 = quiet, 3 = noisy)" \r
        depends on MTD_NAND_RK29XX_DEBUG \r
        default "0" \r
index 32176787dfbc4c5371620616227e855d0f9f3ff1..96be1a502ec49f94c7878eaa01ac7f4c337029af 100755 (executable)
@@ -3,7 +3,7 @@
 #\r
 # $Id: Makefile,v 1.3 2011/01/21 10:12:56 Administrator Exp $\r
 #\r
-obj-$(CONFIG_MTD_NAND_RK29XX)          += rknand_base_ko.o \r
-obj-$(CONFIG_MTD_RKNAND_BUFFER)                += rk30xxnand_ko.o\r
+obj-$(CONFIG_MTD_NAND_RK)              += rknand_base_ko.o \r
+#obj-$(CONFIG_MTD_RKNAND_BUFFER)               += rk30xxnand_ko.o\r
 \r
 \r
index d9483401b553c682df11d45bec0a6cc6b080e5c4..1cb460eb686437a2417981db64965ac65ed5203d 100755 (executable)
@@ -25,10 +25,11 @@ Revision:   1.00
 #include    <asm/dma.h>\r
 #include    "typedef.h"\r
 \r
-#ifdef CONFIG_MACH_RK30_SDK\r
+#ifdef CONFIG_ARCH_RK30\r
 #include    <mach/io.h>\r
 #include    <mach/irqs.h>\r
-#else\r
+#endif\r
+#ifdef CONFIG_ARCH_RK29\r
 #include    <mach/rk29_iomap.h>\r
 #include    <mach/iomux.h>\r
 #endif\r
index 828ee768e2278a19019e01ca8568145ca2e03910..e74761a8a32326a7d642514db66e4683e53f258c 100755 (executable)
@@ -69,12 +69,12 @@ struct rknand_info {
     char (*GetChipSectorInfo)(char * pbuf);\r
     int emmc_clk_power_save_en;\r
     char *pdmaBuf;\r
+    void (*nand_timing_config)(unsigned long AHBnKHz);\r
     int reserved[20];\r
 };\r
 \r
 extern int rknand_queue_read(int Index, int nSec, void *buf);\r
 extern int rknand_queue_write(int Index, int nSec, void *buf,int mode);\r
-extern int rknand_panic_write(int Index, int nSec, void *buf);\r
 extern int rknand_buffer_init(char * pbuf,int size);\r
 extern void rknand_buffer_data_init(void);\r
 extern void rknand_buffer_shutdown(void);\r
index 79681db50944544f78f1020aa14780acc5b1500b..0c0f2c7a5a22ec04e67d1bf9f4a2af17dcd63eaa 100755 (executable)
 //#include "api_flash.h"\r
 #include "rknand_base.h"\r
 \r
-\r
+#ifdef CONFIG_ARCH_RK30\r
 #define DRIVER_NAME    "rk30xxnand"\r
+#endif\r
+\r
+#ifdef CONFIG_ARCH_RK29\r
+#define DRIVER_NAME    "rk29xxnand"\r
+#endif\r
+\r
 const char rknand_base_version[] = "rknand_base.c version: 4.32 20120103";\r
 #define NAND_DEBUG_LEVEL0 0\r
 #define NAND_DEBUG_LEVEL1 1\r
@@ -37,8 +43,8 @@ struct mtd_info               rknand_mtd;
 struct mtd_partition *rknand_parts;\r
 struct rknand_info * gpNandInfo;\r
 \r
-#ifdef CONFIG_MTD_NAND_RK29XX_DEBUG\r
-static int s_debug = CONFIG_MTD_NAND_RK29XX_DEBUG_VERBOSE;\r
+#ifdef CONFIG_MTD_NAND_RK_DEBUG\r
+static int s_debug = CONFIG_MTD_NAND_RK_DEBUG_VERBOSE;\r
 #undef NAND_DEBUG\r
 #define NAND_DEBUG(n, format, arg...) \\r
        if (n <= s_debug) {      \\r
@@ -129,10 +135,10 @@ static int rkNand_proc_read(char *page,
        return buf - page < count ? buf - page : count;\r
 }\r
 \r
-static void rk28nand_create_procfs(void)\r
+static void rknand_create_procfs(void)\r
 {\r
     /* Install the proc_fs entry */\r
-    my_proc_entry = create_proc_entry("rk29xxnand",\r
+    my_proc_entry = create_proc_entry("rknand",\r
                            S_IRUGO | S_IFREG,\r
                            NANDPROC_ROOT);\r
 \r
@@ -165,7 +171,7 @@ void printk_write_log(long lba,int len, const u_char *pbuf)
     }\r
 }\r
 \r
-static int rk28xxnand_read(struct mtd_info *mtd, loff_t from, size_t len,\r
+static int rknand_read(struct mtd_info *mtd, loff_t from, size_t len,\r
        size_t *retlen, u_char *buf)\r
 {\r
        int ret = 0;\r
@@ -185,7 +191,7 @@ static int rk28xxnand_read(struct mtd_info *mtd, loff_t from, size_t len,
        return 0;//ret;\r
 }\r
 \r
-static int rk28xxnand_write(struct mtd_info *mtd, loff_t from, size_t len,\r
+static int rknand_write(struct mtd_info *mtd, loff_t from, size_t len,\r
        size_t *retlen, const u_char *buf)\r
 {\r
        int ret = 0;\r
@@ -216,7 +222,7 @@ static int rk28xxnand_write(struct mtd_info *mtd, loff_t from, size_t len,
        return 0;\r
 }\r
 \r
-static int rk28xxnand_erase(struct mtd_info *mtd, struct erase_info *instr)\r
+static int rknand_erase(struct mtd_info *mtd, struct erase_info *instr)\r
 {\r
        int ret = 0;\r
     if (instr->callback)\r
@@ -224,15 +230,15 @@ static int rk28xxnand_erase(struct mtd_info *mtd, struct erase_info *instr)
        return ret;\r
 }\r
 \r
-static void rk28xxnand_sync(struct mtd_info *mtd)\r
+static void rknand_sync(struct mtd_info *mtd)\r
 {\r
-       NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk30xxnand_sync: \n");\r
+       NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk_nand_sync: \n");\r
     if(gpNandInfo->ftl_sync)\r
         gpNandInfo->ftl_sync();\r
 }\r
 \r
 extern void FtlWriteCacheEn(int);\r
-static int rk28xxnand_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)\r
+static int rknand_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)\r
 {\r
        int sector = len >> 9;\r
        int LBA = (int)(to >> 9);\r
@@ -295,17 +301,17 @@ int  GetflashDataByLba(int lba,char * pbuf , int len)
 }\r
 \r
 \r
-static int rk28xxnand_block_isbad(struct mtd_info *mtd, loff_t ofs)\r
+static int rknand_block_isbad(struct mtd_info *mtd, loff_t ofs)\r
 {\r
        return 0;\r
 }\r
 \r
-static int rk28xxnand_block_markbad(struct mtd_info *mtd, loff_t ofs)\r
+static int rknand_block_markbad(struct mtd_info *mtd, loff_t ofs)\r
 {\r
        return 0;\r
 }\r
 \r
-static int rk28xxnand_init(struct rknand_info *nand_info)\r
+static int rknand_info_init(struct rknand_info *nand_info)\r
 {\r
        struct mtd_info    *mtd = &rknand_mtd;\r
        struct rknand_chip *rknand = &nand_info->rknand;  \r
@@ -324,22 +330,22 @@ static int rk28xxnand_init(struct rknand_info *nand_info)
        // Fill in remaining MTD driver data \r
        mtd->type = MTD_NANDFLASH;\r
        mtd->flags = (MTD_WRITEABLE|MTD_NO_ERASE);//\r
-       mtd->erase = rk28xxnand_erase;\r
+       mtd->erase = rknand_erase;\r
        mtd->point = NULL;\r
        mtd->unpoint = NULL;\r
-       mtd->read = rk28xxnand_read;\r
-       mtd->write = rk28xxnand_write;\r
+       mtd->read = rknand_read;\r
+       mtd->write = rknand_write;\r
        mtd->read_oob = NULL;\r
        mtd->write_oob = NULL;\r
-       mtd->panic_write = rk28xxnand_panic_write;\r
+       mtd->panic_write = rknand_panic_write;\r
 \r
-       mtd->sync = rk28xxnand_sync;\r
+       mtd->sync = rknand_sync;\r
        mtd->lock = NULL;\r
        mtd->unlock = NULL;\r
        mtd->suspend = NULL;\r
        mtd->resume = NULL;\r
-       mtd->block_isbad = rk28xxnand_block_isbad;\r
-       mtd->block_markbad = rk28xxnand_block_markbad;\r
+       mtd->block_isbad = rknand_block_isbad;\r
+       mtd->block_markbad = rknand_block_markbad;\r
        mtd->owner = THIS_MODULE;\r
     return 0;\r
 }\r
@@ -354,70 +360,8 @@ static int rk28xxnand_init(struct rknand_info *nand_info)
 #ifdef CONFIG_MTD_CMDLINE_PARTS\r
 const char *part_probes[] = { "cmdlinepart", NULL }; \r
 #endif \r
-static struct mtd_partition rk30_partition_info[] = {\r
-       { \r
-         name: "misc",\r
-         offset:  0x2000*0x200,\r
-         size:    0x2000*0x200,//100MB\r
-       },\r
-\r
-       { \r
-         name: "kernel",\r
-         offset:  0x4000*0x200,\r
-         size:   0x4000*0x200,//200MB\r
-       },\r
 \r
-       { \r
-         name: "boot",\r
-         offset:  0x8000*0x200,\r
-         size:   0x8000*0x200,//200MB\r
-       },\r
-       \r
-       { \r
-         name: "recovery",\r
-         offset:  0x10000*0x200,\r
-         size:   0x8000*0x200,//200MB\r
-       },\r
-       \r
-       { \r
-         name: "backup",\r
-         offset:  0x00018000*0x200,\r
-         size:   0x000C0000*0x200,//200MB\r
-       },\r
-       \r
-       { \r
-         name: "cache",\r
-         offset:  0x000D8000*0x200,\r
-         size:   0x00040000*0x200,//200MB\r
-       },\r
-       \r
-       { \r
-         name: "userdata",\r
-         offset:  0x00118000*0x200,\r
-         size:   0x00100000*0x200,//200MB\r
-       },\r
-       \r
-       { \r
-         name: "kpanic",\r
-         offset:  0x00218000*0x200,\r
-         size:   0x00002000*0x200,//200MB\r
-       },\r
-       \r
-       { \r
-         name: "system",\r
-         offset:  0x0021A000*0x200,\r
-         size:   0x000A0000*0x200,//200MB\r
-       },\r
-       \r
-       { \r
-         name: "user",\r
-         offset:  0x002BA000*0x200,\r
-         size:   0x000A0000*0x200,//200MB\r
-       },\r
-};\r
-\r
-\r
-static int rk29xxnand_add_partitions(struct rknand_info *nand_info)\r
+static int rknand_add_partitions(struct rknand_info *nand_info)\r
 {\r
 #ifdef CONFIG_MTD_CMDLINE_PARTS\r
     int num_partitions = 0; \r
@@ -442,14 +386,7 @@ static int rk29xxnand_add_partitions(struct rknand_info *nand_info)
 #endif\r
     } \r
 #endif \r
-    g_num_partitions = 10;\r
-    rknand_parts = rk30_partition_info;\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\r
-               return mtd_device_register(&rknand_mtd, rknand_parts, g_num_partitions);\r
-#else\r
-               return add_mtd_partitions(&(rknand_mtd), rknand_parts, g_num_partitions);\r
-#endif\r
-\r
+    g_num_partitions = 0;\r
        return 0;\r
 }\r
 \r
@@ -461,9 +398,10 @@ int add_rknand_device(struct rknand_info * prknand_Info)
     \r
     rknand_mtd.size = (uint64_t)gpNandInfo->nandCapacity*0x200;\r
     \r
-    rk29xxnand_add_partitions(prknand_Info);\r
+    rknand_add_partitions(prknand_Info);\r
  \r
     parts = rknand_parts;\r
+       SysImageWriteEndAdd = 0;\r
     for(i=0;i<g_num_partitions;i++)\r
     {\r
         //printk(">>> part[%d]: name=%s offset=0x%012llx\n", i, parts[i].name, parts[i].offset);\r
@@ -474,8 +412,8 @@ int add_rknand_device(struct rknand_info * prknand_Info)
             break;\r
         }\r
     }\r
-\r
-    gpNandInfo->SysImageWriteEndAdd = SysImageWriteEndAdd;\r
+       if(SysImageWriteEndAdd)\r
+       gpNandInfo->SysImageWriteEndAdd = SysImageWriteEndAdd;\r
     \r
     //if(gpNandInfo->nand_timing_config)\r
     //    gpNandInfo->nand_timing_config(100*1000);\r
@@ -495,8 +433,7 @@ static int rknand_probe(struct platform_device *pdev)
 {\r
        struct rknand_info *nand_info;\r
        int err = 0;\r
-       printk("nand init...\n");\r
-       NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk30xxnand_probe: \n");\r
+       NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk_nand_probe: \n");\r
        gpNandInfo = kzalloc(sizeof(struct rknand_info), GFP_KERNEL);\r
        if (!gpNandInfo)\r
                return -ENOMEM;\r
@@ -517,7 +454,7 @@ static int rknand_probe(struct platform_device *pdev)
        rknand_mtd.priv = &nand_info->rknand;\r
        rknand_mtd.owner = THIS_MODULE;\r
     \r
-       if(rk28xxnand_init(nand_info))\r
+       if(rknand_info_init(nand_info))\r
        {\r
                err = -ENXIO;\r
                goto  exit_free;\r
@@ -526,7 +463,7 @@ static int rknand_probe(struct platform_device *pdev)
        nand_info->add_rknand_device = add_rknand_device;\r
        nand_info->get_rknand_device = get_rknand_device;\r
 \r
-       rk28nand_create_procfs();\r
+       rknand_create_procfs();\r
        return 0;\r
 \r
 exit_free:\r