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