#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h>
+#include "../yaffs_nandemul2k.h"
-#define T(f,x) printk x
#define ALLOCATE(x) kmalloc(x,GFP_KERNEL)
#define FREE(x) kfree(x)
-#define EM_SIZE_IN_MEG 4
-#define PAGE_DATA_SIZE (2048)
-#define PAGE_SPARE_SIZE (64)
-#define PAGES_PER_BLOCK (64)
#define NAND_SHIFT (11) // Shifter for 2k
+#define PAGE_DATA_SIZE (1 << NAND_SHIFT)
+#define PAGE_SPARE_SIZE (64)
+#define BLK_SHIFT 6
+#define PAGES_PER_BLOCK (1 << BLK_SHIFT) // = 64
+#define EM_SIZE_IN_MEG 4
#define EM_SIZE_IN_BYTES (EM_SIZE_IN_MEG * (1<<20))
#define PAGE_TOTAL_SIZE (PAGE_DATA_SIZE+PAGE_SPARE_SIZE)
-int nandemul2k_ReadId(__u8 *vendorId, __u8 *deviceId)
+static int nandemul2k_ReadId(__u8 *vendorId, __u8 *deviceId)
{
*vendorId = 'Y';
*deviceId = '2';
}
-int nandemul2k_ReadStatus(__u8 *status)
+static int nandemul2k_ReadStatus(__u8 *status)
{
*status = 0;
return 1;
size_t *retlen, const u_char *buf);
static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const u_char *buf,
- const u_char *oob_buf, struct nand_oobinfo *dummy);
+ u_char *oob_buf, struct nand_oobinfo *dummy);
static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const u_char *buf);
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,7))
+static int nand_writev (struct mtd_info *mtd, const struct kvec *vecs,
+ unsigned long count, loff_t to, size_t *retlen);
+#else
static int nand_writev (struct mtd_info *mtd, const struct iovec *vecs,
unsigned long count, loff_t to, size_t *retlen);
+#endif
static int nand_erase (struct mtd_info *mtd, struct erase_info *instr);
static void nand_sync (struct mtd_info *mtd);
*/
static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const u_char *buf,
- const u_char *oob_buf, struct nand_oobinfo *dummy)
+ u_char *oob_buf, struct nand_oobinfo *dummy)
{
int start, page;
/*
* NAND write with iovec
*/
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,7))
+static int nand_writev (struct mtd_info *mtd, const struct kvec *vecs,
+ unsigned long count, loff_t to, size_t *retlen)
+#else
static int nand_writev (struct mtd_info *mtd, const struct iovec *vecs,
unsigned long count, loff_t to, size_t *retlen)
+#endif
{
return -EINVAL;
}
return -EINVAL;
}
- nBlocks = instr->len >> (NAND_SHIFT + 5);
- block = instr->addr >> (NAND_SHIFT + 5);
+ nBlocks = instr->len >> (NAND_SHIFT + BLK_SHIFT);
+ block = instr->addr >> (NAND_SHIFT + BLK_SHIFT);
for(i = 0; i < nBlocks; i++)
{
}
-int nand_block_isbad(struct mtd_info *mtd,int blockNo)
+static int nand_block_isbad(struct mtd_info *mtd, loff_t ofs)
{
return 0;
}
-int nand_block_markbad(struct mtd_info *mtd, int blockNo)
+static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
{
return 0;
}
/*
* Scan for the NAND device
*/
-int nand_scan (struct mtd_info *mtd,int nchips)
+static int nandemul2k_scan (struct mtd_info *mtd,int nchips)
{
mtd->oobblock = PAGE_DATA_SIZE;
mtd->oobsize = PAGE_SPARE_SIZE;
mtd->suspend = NULL;
mtd->resume = NULL;
+ mtd->name = "NANDemul2k";
+
/* Return happy */
return 0;
}
static struct mtd_partition nandemul2k_partition[] =
{
- { name: "NANDemul partition 1",
- offset: 0,
- size: 0 },
+ { .name = "NANDemul partition 1",
+ .offset = 0,
+ .size = 0 },
};
static int nPartitions = sizeof(nandemul2k_partition)/sizeof(nandemul2k_partition[0]);
CheckInit();
- nand_scan(&nandemul2k_mtd,1);
+ nandemul2k_scan(&nandemul2k_mtd,1);
// Build the partition table