summaryrefslogtreecommitdiff
path: root/packages/linux/linux-ezx/ezx_roflash.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/linux/linux-ezx/ezx_roflash.patch')
-rw-r--r--packages/linux/linux-ezx/ezx_roflash.patch895
1 files changed, 0 insertions, 895 deletions
diff --git a/packages/linux/linux-ezx/ezx_roflash.patch b/packages/linux/linux-ezx/ezx_roflash.patch
deleted file mode 100644
index 73c62b9cea..0000000000
--- a/packages/linux/linux-ezx/ezx_roflash.patch
+++ /dev/null
@@ -1,895 +0,0 @@
-Roflash driver (don't think it will be needed for 2.6.x)
-
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/block/Kconfig linux-2.6.16.5-exz/drivers/block/Kconfig
---- linux-2.6.16.5/drivers/block/Kconfig 2006-04-12 22:27:57.000000000 +0200
-+++ linux-2.6.16.5-exz/drivers/block/Kconfig 2006-04-16 18:49:29.000000000 +0200
-@@ -453,4 +453,6 @@
- This driver provides Support for ATA over Ethernet block
- devices like the Coraid EtherDrive (R) Storage Blade.
-
-+source "drivers/block/roflash/Kconfig"
-+
- endmenu
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/block/Makefile linux-2.6.16.5-exz/drivers/block/Makefile
---- linux-2.6.16.5/drivers/block/Makefile 2006-04-12 22:27:57.000000000 +0200
-+++ linux-2.6.16.5-exz/drivers/block/Makefile 2006-04-16 18:49:29.000000000 +0200
-@@ -31,3 +31,4 @@
- obj-$(CONFIG_BLK_DEV_SX8) += sx8.o
- obj-$(CONFIG_BLK_DEV_UB) += ub.o
-
-+obj-$(CONFIG_ARCH_EZX_ROFLASH) += roflash/
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/block/roflash/Kconfig linux-2.6.16.5-exz/drivers/block/roflash/Kconfig
---- linux-2.6.16.5/drivers/block/roflash/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/drivers/block/roflash/Kconfig 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,7 @@
-+#
-+# Emualting Flash Chip driver configuration
-+#
-+config ARCH_EZX_ROFLASH
-+ tristate 'ROFLASH Device'
-+
-+#tristate 'Debug for ROFLASH device?' ROFLASH_DEBUG_ERR
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/block/roflash/Makefile linux-2.6.16.5-exz/drivers/block/roflash/Makefile
---- linux-2.6.16.5/drivers/block/roflash/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/drivers/block/roflash/Makefile 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,15 @@
-+#
-+# Makefile for VFM
-+#
-+# Note! Dependencies are done automagically by 'make dep', which also
-+# removes any old dependencies. DON'T put your own dependencies here
-+# unless it's something special (ie not a .c file).
-+#
-+# Note 2! The CFLAGS definitions are now inherited from the
-+# parent makes..
-+
-+#
-+# Makefile for the kernel VSB driver.
-+#
-+
-+obj-$(CONFIG_ARCH_EZX_ROFLASH) += roflash.o ezx_parts.o
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/block/roflash/ezx_parts.c linux-2.6.16.5-exz/drivers/block/roflash/ezx_parts.c
---- linux-2.6.16.5/drivers/block/roflash/ezx_parts.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/drivers/block/roflash/ezx_parts.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,198 @@
-+/*
-+ * drivers/mtd/maps/ezx_parts.c
-+ *
-+ * Parse multiple flash partitions in Ezx project into mtd_table or into act_roflash_table
-+ *
-+ * Created by Susan Gu Oct, 22 2002
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <asm/io.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/ezx_roflash.h>
-+
-+extern int roflash_init(void);
-+
-+extern int cfi_intelext_read_roflash(void *priv_map, unsigned long from, size_t len, size_t *retlen, u_char *buf);
-+extern int cfi_intelext_read_roflash_c(void *priv_map, unsigned long from, size_t len, size_t *retlen, u_char *buf);
-+roflash_area **roflash_table_pptr = NULL;
-+
-+static DECLARE_MUTEX(roflash_table_mutex);
-+
-+/* I know what I am doing, so setup l_x_b flag */
-+#ifdef CONFIG_ARCH_EZX_A780
-+static roflash_area fix_roflash_table[]=
-+{
-+ {
-+ name: "rootfs",
-+ size: 0x018E0000, /* rootfs size is 24.875MB */
-+ offset: 0x00120000,
-+ roflash_read: NULL, /* force read-only in cacheable mapping*/
-+ l_x_b: ROFLASH_LINEAR,
-+ phys_addr: 0x00000000,
-+ },{
-+ name: "NO-USE", /* language package is moved to MDOC */
-+ size: 0x00000000,
-+ offset: 0x01A00000, //Susan -- correspond to the beginning of the second flash chip //
-+ roflash_read: cfi_intelext_read_roflash,
-+ l_x_b: ROFLASH_BLOCK,
-+ phys_addr: 0xffffffff, // not use for block cramfs mount
-+ },{
-+ name: "setup",
-+ size: 0x00020000,
-+ offset: 0x01FA0000,
-+ roflash_read: cfi_intelext_read_roflash,
-+ l_x_b: ROFLASH_BLOCK,
-+ phys_addr: 0xffffffff, // not use for block cramfs mount
-+ }
-+};
-+#if (0)
-+static roflash_area fix_roflash_table[]=
-+{
-+ {
-+ name: "rootfs",
-+ size: 0x00f00000, /* rootfs size is 15MB */
-+ offset: 0x00100000,
-+ roflash_read: NULL, /* force read-only in cacheable mapping*/
-+ l_x_b: ROFLASH_LINEAR_XIP,
-+ phys_addr: 0x00000000,
-+ },{
-+ name: "nxipapp", /* old language area is 0xAA0000 */
-+ size: 0x00AA0000,
-+ offset: 0x00500000,
-+ roflash_read: cfi_intelext_read_roflash,
-+ l_x_b: ROFLASH_BLOCK,
-+ phys_addr: 0xffffffff, // not use for block cramfs mount
-+ },{
-+ name: "setup", /* setup stuff is 1MB */
-+ size: 0x00020000,
-+ offset: 0x00FA0000,
-+ roflash_read: cfi_intelext_read_roflash,
-+ l_x_b: ROFLASH_BLOCK,
-+ phys_addr: 0xffffffff, //phys_addr is not useful for block cramfs mount
-+ }
-+};
-+#endif
-+
-+#endif
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+static roflash_area fix_roflash_table[]=
-+{
-+ {
-+ name: "rootfs",
-+ size: 0x018E0000, /* rootfs size is 15MB */
-+ offset: 0x00120000,
-+ roflash_read: NULL, /* force read-only in cacheable mapping*/
-+ l_x_b: ROFLASH_LINEAR,
-+ phys_addr: 0x00000000,
-+ },{
-+ name: "NO-USE", /* language package is 2MB */
-+ size: 0x00000000,
-+ offset: 0x01A00000, //Susan -- correspond to the beginning of the second flash chip //
-+ roflash_read: cfi_intelext_read_roflash,
-+ l_x_b: ROFLASH_BLOCK,
-+ phys_addr: 0xffffffff, // not use for block cramfs mount
-+ },{
-+ name: "setup", /* setup stuff is 1MB */
-+ size: 0x00020000,
-+ offset: 0x01FA0000, //Susan -- correspond to the beginning of the second flash chip //
-+ roflash_read: cfi_intelext_read_roflash,
-+ l_x_b: ROFLASH_BLOCK,
-+ phys_addr: 0xffffffff, // not use for block cramfs mount
-+ }
-+};
-+#endif
-+
-+roflash_area *act_roflash_table[MAX_ROFLASH] = {0};
-+unsigned short roflash_partitions = 0;
-+
-+/* If we decide to use flash partition parse table, this function will parse the fpt - flash partition table,
-+* the beginning address of fpt is defined in CONFIG_FPT_OFFSET. This function will parser out all roflash areas
-+* and animation area( or re-fresh code area).
-+* For roflash areas, registered them into act_roflash_table, for animation region, register it into mtd_table[6].
-+* Note
-+* 6 is fixed for animation region -- /dev/mtd6 c 90 12
-+* /dev/roflash b 62 0 -- root file system
-+* /dev/roflash1 b 62 1 -- language package
-+* /dev/roflash2 b 62 2 -- setup stuff
-+*/
-+int ezx_parse(struct map_info *chip_map)
-+{
-+ return 0; // depends on discussion about DC tool
-+}
-+
-+int ezx_parts_parser(void)
-+{
-+ int ret = 0;
-+ int nrparts = 0;
-+ int i = 0;
-+
-+//#ifdef CONFIG_EZX_PARSER_TABLE
-+// ret = ezx_parse(chip_map);
-+//#else
-+ down(&roflash_table_mutex);
-+
-+ nrparts = sizeof(fix_roflash_table) / sizeof(roflash_area);
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk("ezx_parts_parser: nrparts is %d\n", nrparts);
-+#endif
-+ for ( i = 0; i < nrparts; i ++ )
-+ {
-+ if (act_roflash_table[i])
-+ return -1;
-+ act_roflash_table[i] = (roflash_area *)(&(fix_roflash_table[i]));
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "ezx_parts_parser: act_roflash_table[%d] = %d\n",i,(unsigned long)(act_roflash_table[i]));
-+#endif
-+ }
-+ roflash_partitions = i;
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk("ezx_parts_parser: roflash_partitions is %d\n", roflash_partitions);
-+#endif
-+
-+ up(&roflash_table_mutex);
-+
-+ return ret;
-+}
-+
-+int ezx_partition_init(void)
-+{
-+ int ret = 0;
-+
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "ezx_partition_init: roflash_table_pptr = %d\n",(unsigned long)(act_roflash_table));
-+#endif
-+ roflash_table_pptr = (roflash_area **)(act_roflash_table);
-+
-+ if ( ret = ezx_parts_parser() )
-+ {
-+ printk(KERN_NOTICE "invoke ezx_parts_parser, return %d\n", ret);
-+ return -EIO;
-+ }
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk("ezx_partition_init: ret of ezx_parts_parser is %d\n", ret);
-+#endif
-+
-+ if ( ret = roflash_init() )
-+ {
-+ printk(KERN_NOTICE "invoke roflash_init, return %d\n", ret);
-+ return -EIO;
-+ }
-+ return 0 ;
-+}
-+
-+
-+
-+
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/drivers/block/roflash/roflash.c linux-2.6.16.5-exz/drivers/block/roflash/roflash.c
---- linux-2.6.16.5/drivers/block/roflash/roflash.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/drivers/block/roflash/roflash.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,593 @@
-+/*
-+ * Linux Flash read-only block device driver For Cramfs file system, support simultaneous linear + block device mounting. -- Susan Gu Mar, 15 2002
-+ * In order to resolve logo area in cachable flash mapping, add roflash_c_fops methods, that is stolen from mtdchar.c (dwmw2)
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/config.h>
-+#include <linux/kmod.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#include <linux/vmalloc.h>
-+
-+#include <asm/uaccess.h>
-+#include <linux/mtd/map.h>
-+#include <linux/ezx_roflash.h>
-+
-+#ifdef CONFIG_PROC_FS
-+#include <linux/proc_fs.h> /* For /proc/roflash_info */
-+#endif /* CONFIG_PROC_FS */
-+
-+#define MAJOR_NR ROFLASH_MAJOR
-+#define DEVICE_NAME "roflash"
-+#define DEVICE_REQUEST roflash_request
-+#define DEVICE_NR(device) (MINOR(device))
-+#define DEVICE_ON(device)
-+#define DEVICE_OFF(device)
-+#define DEVICE_NO_RANDOM
-+
-+#define MAJOR_NR_C 101
-+#define DEVICE_NAME_C "roflash_c"
-+#include <linux/blkdev.h>
-+
-+
-+/* K3 flash lowlevel */
-+#define FLASH_WORD_ALIGN_MASK 0xFFFFFFFE
-+#define WIDTH_ADJUST 0x0001L /* I.E. Converts 0x90 to 0x90 */
-+#define FlashCommandRead (unsigned short)(0xFF * WIDTH_ADJUST)
-+#define FlashCommandStatus (unsigned short)(0x70 * WIDTH_ADJUST)
-+#define FlashStatusReady (unsigned short)(0x80 * WIDTH_ADJUST)
-+
-+/* Variables used to track operational state of ROFLASH */
-+#define ROFLASH_STATUS_READY 0
-+#define ROFLASH_STATUS_NOT_READY -1
-+#define ROFLASH_BLOCK_SIZE (4096)
-+static unsigned long flash_blocksizes[MAX_ROFLASH];
-+static unsigned long flash_sizes[MAX_ROFLASH];
-+
-+#ifdef CONFIG_PROC_FS
-+static struct proc_dir_entry *roflash_proc_entry;
-+static int roflash_read_procmem(char *, char **, off_t, int, int *, void *);
-+#endif /* CONFIG_PROC_FS */
-+
-+
-+extern unsigned short roflash_partitions;
-+extern struct map_info bulverde_map;
-+extern unsigned long bulverde_map_cacheable;
-+
-+static DEFINE_SPINLOCK(roflash_lock);
-+static struct request_queue *xd_queue;
-+
-+#define __KERNEL_SYSCALLS__
-+#include <linux/unistd.h>
-+#include <asm/unaligned.h>
-+
-+
-+void fmemoryCopy (void * dest, void * src, unsigned long bytes)
-+{
-+ unsigned char *new_dest;
-+ unsigned char *new_src;
-+ new_dest = (unsigned char *)dest;
-+ new_src = (unsigned char *)src;
-+ /* while bytes to modify is not complete */
-+ while (bytes-- != 0)
-+ {
-+ /* update destination byte to equal src byte */
-+ *new_dest = *new_src;
-+ new_dest++;
-+ new_src++;
-+ }
-+}
-+void memorySet (void * buff, unsigned long bytes, unsigned char value)
-+{
-+ unsigned char * new_buff;
-+ new_buff = (unsigned char *)buff;
-+ /* while not at end of modification */
-+ while (bytes-- != 0)
-+ {
-+ /* set contents of buffer to value specified */
-+ *new_buff = value;
-+
-+ /* increment to next byte */
-+ new_buff++;
-+ }
-+}
-+
-+#if (0)
-+unsigned short IntelSCSRead(unsigned long CardAddress, unsigned long Length, unsigned char * Buffer)
-+{
-+ unsigned long volatile pointer;
-+ unsigned short * volatile pointer0ed;
-+
-+#ifdef VFM_DEBUG2
-+ if ( roflash_status == ROFLASH_STATUS_READY )
-+ {
-+ printk("IntelSCSRead: PositionPtr(pointer, CardAddress);\n");
-+ printk("IntelSCSRead: pointer=%d, CardAddress=%d\n", (DWORD)pointer, (DWORD)CardAddress);
-+ }
-+#endif
-+ pointer = (unsigned long)(DALHART_K3_BASE_ADDR + CardAddress);
-+
-+ pointer0ed = (unsigned short *)((unsigned long)pointer & FLASH_WORD_ALIGN_MASK);
-+#ifdef CONFIG_K3_DEBUG
-+ printk("IntelSCSRead(): Reading %d bytes at 0x%lx\n",Length, pointer);
-+#endif
-+
-+ *pointer0ed = FlashCommandRead; /* Ensure it is in read mode */
-+
-+ /* This is assumimg that farmemory copy performs at a byte at a time */
-+ fmemoryCopy(Buffer, pointer, Length);
-+
-+ return(0);
-+}
-+#endif
-+
-+void roflash_request(request_queue_t *q)
-+{
-+ unsigned short minor;
-+ unsigned long offset, len, retlen;
-+ unsigned short err = 0;
-+ unsigned char *tmpBufPtr;
-+ unsigned short nrSectors;
-+ struct request *req;
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "Roflash_request(): Entered\n");
-+#endif
-+
-+ while ((req = elv_next_request(q)) != NULL) {
-+ unsigned block = req->sector;
-+ unsigned count = req->nr_sectors;
-+ struct gendisk *disk = req->rq_disk;
-+ int rw = rq_data_dir(req);
-+
-+ if (!(req->flags & REQ_CMD)) {
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+ if (rw != READ) {
-+ printk(KERN_ERR "roflash_request(): WARNING! Unknown Request\n");
-+ end_request(req, 0);
-+ }
-+
-+ /* Verify minor number is in range */
-+ minor = MINOR(req->rq_dev);
-+ if (minor >= roflash_partitions)
-+ {
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_request(): ERROR! Out of partition range (minor = %d)\n", minor );
-+#endif
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+ /* Check if writting-request is demanded */
-+ if ( req->cmd == WRITE )
-+ {
-+ printk(KERN_ERR "roflash_request: write-accessing is not allowed!\n");
-+ end_request(req, 0);
-+ break;
-+ }
-+
-+ /* Verify sector is in range */
-+ offset = req->sector << 9; // 512 bytes per sector
-+ len = req->nr_sectors << 9; // 512 bytes per sector
-+ if ((offset + len) > (flash_sizes[minor] << BLOCK_SIZE_BITS))
-+ {
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_request(): ERROR! Access beyond end of partition\n" );
-+#endif
-+ end_request(req, 0);
-+ continue;
-+ }
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_request(): minor=%d, %d sectors at sector %ld\n", minor, req->nr_sectors, req->sector);
-+#endif
-+
-+ /* Prepare to move data to/from the Linux buffer */
-+ nrSectors = req->nr_sectors;
-+ tmpBufPtr = req->buffer;
-+// blockTempBufPtr = roflashTempBuffer; -- this may cause race-condition in multiple cramfs
-+
-+ roflash_area *this_area = NULL;
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_request: READ\n");
-+#endif
-+// memorySet(roflashTempBuffer, len, 0x00); -- don't use the internal buffer, may exist race-conditions.
-+
-+ this_area = (roflash_area *)(roflash_table_pptr[minor]);
-+ err = (*this_area->roflash_read)((void *)(this_area->priv_map),(offset + this_area->offset), len, &retlen, tmpBufPtr);
-+ if (err == 0) {
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR " < %x %x %x %x ...>\n",req->buffer[0],req->buffer[1],req->buffer[2],req->buffer[3]);
-+#endif
-+ end_request(req, 1);
-+ } else {
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_request(): ERROR READ %d sectors at sector %d\n", req->nr_sectors, req->sector);
-+#endif
-+ end_request(req, 0);
-+ }
-+ }
-+}
-+
-+static int roflash_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+{
-+// What is the requirements? -- todo list
-+ return 0;
-+}
-+
-+
-+static int roflash_open(struct inode * inode, struct file * filp)
-+{
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_open() called, minor = %d\n", DEVICE_NR(inode->i_rdev));
-+#endif
-+ if (DEVICE_NR(inode->i_rdev) >= roflash_partitions)
-+ {
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "vfm_open() Failed!\n");
-+#endif
-+ return -ENXIO;
-+ }
-+ return 0;
-+}
-+
-+static int roflash_release(struct inode * inode, struct file * filp)
-+{
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_release() called\n");
-+#endif
-+ return 0;
-+}
-+
-+
-+/*Susan 2.4.6 */
-+static struct block_device_operations roflash_fops = {
-+ open: roflash_open,
-+ release: roflash_release,
-+ ioctl: roflash_ioctl,
-+};
-+
-+static loff_t roflash_c_lseek (struct file *file, loff_t offset, int orig)
-+{
-+ roflash_area *dev_def = (roflash_area *)(file->private_data);
-+
-+ switch (orig) {
-+ case 0:
-+ /* SEEK_SET */
-+ file->f_pos = offset;
-+ break;
-+ case 1:
-+ /* SEEK_CUR */
-+ file->f_pos += offset;
-+ break;
-+ case 2:
-+ /* SEEK_END */
-+ file->f_pos = (unsigned long)(dev_def->size + offset);
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ if (file->f_pos < 0)
-+ file->f_pos = 0;
-+ else if (file->f_pos >= dev_def->size)
-+ file->f_pos = dev_def->size - 1;
-+
-+ return file->f_pos;
-+}
-+
-+static int roflash_c_open(struct inode *inode, struct file *file)
-+{
-+ int minor = MINOR(inode->i_rdev);
-+ roflash_area *dev_def;
-+
-+ if (minor >= MAX_ROFLASH)
-+ return -EACCES;
-+
-+ dev_def = (roflash_area *)(roflash_table_pptr[minor]);
-+
-+ /* Sanity check */
-+ if (dev_def->l_x_b != ROFLASH_CHAR)
-+ return -EACCES;
-+
-+ /* You can't open the RO devices RW */
-+ if (file->f_mode & 2)
-+ return -EACCES;
-+
-+ file->private_data = dev_def;
-+
-+ return 0;
-+} /* mtd_open */
-+
-+static int roflash_c_close(struct inode *inode, struct file *file)
-+{
-+ return 0;
-+} /* mtd_close */
-+
-+/* FIXME: This _really_ needs to die. In 2.5, we should lock the
-+ userspace buffer down and use it directly with readv/writev.
-+*/
-+#define MAX_KMALLOC_SIZE 0x20000
-+
-+static int roflash_c_read(struct file *file, char *buf, size_t count,loff_t *ppos)
-+{
-+ roflash_area *dev_def = (roflash_area *)file->private_data;
-+ size_t retlen=0;
-+ size_t total_retlen=0;
-+ int ret=0;
-+ int len;
-+ char *kbuf;
-+ unsigned long virt_dev_start = 0;
-+
-+ if (*ppos + count > dev_def->size)
-+ count = dev_def->size - *ppos;
-+
-+ if (!count)
-+ return 0;
-+
-+ /* FIXME: Use kiovec in 2.5 to lock down the user's buffers
-+ and pass them directly to the MTD functions */
-+ while (count)
-+ {
-+ if (count > MAX_KMALLOC_SIZE)
-+ len = MAX_KMALLOC_SIZE;
-+ else
-+ len = count;
-+
-+ kbuf=kmalloc(len,GFP_KERNEL);
-+ if (!kbuf)
-+ return -ENOMEM;
-+
-+ //ret = (dev_def->roflash_read)( (void *)(dev_def->priv_map),(*ppos + dev_def->offset), len, &retlen, kbuf);
-+ virt_dev_start = (unsigned long)(dev_def->priv_map) + dev_def->offset;
-+ memcpy(kbuf,virt_dev_start + *ppos,len);
-+
-+ *ppos += len;
-+ if (copy_to_user(buf, kbuf, len))
-+ {
-+ kfree(kbuf);
-+ return -EFAULT;
-+ }
-+ else
-+ total_retlen += len;
-+
-+ count -= len;
-+ buf += len;
-+
-+
-+ kfree(kbuf);
-+ }
-+
-+ return total_retlen;
-+} /* mtd_read */
-+
-+
-+static struct file_operations roflash_c_fops = {
-+ owner: THIS_MODULE,
-+ llseek: roflash_c_lseek, /* lseek */
-+ read: roflash_c_read, /* read */
-+ open: roflash_c_open, /* open */
-+ release: roflash_c_close, /* release */
-+};
-+
-+roflash_area *roflash_get_dev(unsigned char minor)
-+{
-+ roflash_area *ret = NULL;
-+
-+ if (minor < MAX_ROFLASH)
-+ ret = (roflash_area *)(roflash_table_pptr[minor]);
-+
-+ return ret;
-+}
-+
-+int __init roflash_init(void)
-+{
-+ int i, size = 0;
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): Enter into this API.\n");
-+#endif
-+
-+/* We should do initialization for flash chips, however, we don't need to do it
-+ * twice after __init_lubbock has initialized K3 flash device */
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init: Registering device major %d [%s]\n",ROFLASH_MAJOR,DEVICE_NAME);
-+#endif
-+
-+ if (register_blkdev(ROFLASH_MAJOR, DEVICE_NAME)) {
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): Could not get major %d", ROFLASH_MAJOR);
-+#endif
-+ return -EIO;
-+ }
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): register_blkdev success\n");
-+#endif
-+
-+ roflash_queue = blk_init_queue(&roflash_request, &roflash_lock);
-+ if (!roflash_queue)
-+ return -ENOMEM;
-+
-+ struct gendisk *disk = alloc_disk(64);
-+ if (!disk)
-+ return -ENOMEM;
-+
-+ disk->major = ROFLASH_MAJOR;
-+ disk->first_minor = 0;
-+ sprintf(disk->disk_name, "roflash0");
-+ sprintf(disk->devfs_name, "roflash/target0");
-+ disk->fops = &roflash_fops;
-+ disk->queue = roflash_queue;
-+ // set_capacity(disk, );
-+
-+ add_disk(disk);
-+
-+
-+ /* We know this is invoked only once during kernel booting up, so there
-+ * is not race-conditions */
-+ for (i = 0; i < roflash_partitions; i++) {
-+ unsigned short lxb_flag = ((roflash_area *)(roflash_table_pptr[i]))->l_x_b;
-+
-+ switch (lxb_flag) {
-+ case ROFLASH_LINEAR:
-+ case ROFLASH_LINEAR_XIP:
-+ flash_blocksizes[i] = ROFLASH_BLOCK_SIZE;
-+ size = ((roflash_area *)(roflash_table_pptr[i]))->size;
-+ flash_sizes[i] = size >> BLOCK_SIZE_BITS ;
-+ // The virtual address of the cacheable mapping //
-+ ((roflash_area *)(roflash_table_pptr[i]))->priv_map =
-+ (void *)(bulverde_map_cacheable);
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): not-char "
-+ "roflash_table_pptr[%d]->size = %d\n",i,size);
-+#endif
-+ break;
-+ case ROFLASH_BLOCK:
-+ if (bulverde_map.size == 0) {
-+ unregister_blkdev(ROFLASH_MAJOR, DEVICE_NAME);
-+ return -EACCES;
-+ }
-+
-+ flash_blocksizes[i] = ROFLASH_BLOCK_SIZE;
-+ size = ((roflash_area *)(roflash_table_pptr[i]))->size;
-+ flash_sizes[i] = size >> BLOCK_SIZE_BITS ;
-+ //The pointer to struct map_info of the noncacheable mapping //
-+ ((roflash_area *)(roflash_table_pptr[i]))->priv_map =
-+ (void *)(&bulverde_map);
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): not-char roflash_table_pptr[%d]->size = %d\n",i,size);
-+#endif
-+ break;
-+ case ROFLASH_CHAR:
-+ if (register_chrdev(MAJOR_NR_C, DEVICE_NAME_C, &roflash_c_fops)) {
-+ printk(KERN_NOTICE "Can't allocate major number %d for "
-+ "Memory Technology Devices.\n", MAJOR_NR_C);
-+
-+ unregister_blkdev(ROFLASH_MAJOR, DEVICE_NAME);
-+ return -EAGAIN;
-+ }
-+ //The virtual address of the cacheable mapping //
-+ ((roflash_area *)(roflash_table_pptr[i]))->priv_map =
-+ (void *)(bulverde_map_cacheable);
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): char roflash_table_pptr[%d]->size "
-+ "= %d\n",i,size);
-+#endif
-+ break;
-+ }
-+ }
-+
-+ blksize_size[ROFLASH_MAJOR] = flash_blocksizes;
-+ blk_size[ROFLASH_MAJOR] = flash_sizes;
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): fill in blksize_size[] and blk_size[] "
-+ "success\n");
-+#endif
-+ //blk_init_queue(BLK_DEFAULT_QUEUE(ROFLASH_MAJOR),&roflash_request);
-+ roflash_queue = blk_init_queue(&roflash_request, &roflash_lock);
-+ if (!roflash_queue)
-+ return -ENOMEM;
-+
-+#ifdef ROFLASH_DEBUG_ERR
-+ printk(KERN_ERR "roflash_init(): ROFLASH Block device: blksize_size = %d"
-+ ", blk_size = %d\n",flash_blocksizes[0],flash_sizes[0]);
-+#endif
-+
-+#ifdef CONFIG_PROC_FS
-+ /* register procfs device */
-+ if (roflash_proc_entry = create_proc_entry("roflash_info", 0, 0)) {
-+ roflash_proc_entry->read_proc = roflash_read_procmem;
-+ }
-+
-+#endif /* CONFIG_PROC_FS */
-+
-+ for ( i = 0; i < roflash_partitions; i ++ ) {
-+ printk(KERN_NOTICE "ROFLASH Driver initialized and ready for use."
-+ "Size: %d Offset: %d\n",
-+ ((roflash_area*)(roflash_table_pptr[i]))->size,
-+ ((roflash_area*)(roflash_table_pptr[i]))->offset);
-+ }
-+
-+ return (0);
-+}
-+
-+
-+#ifdef CONFIG_PROC_FS
-+static int roflash_read_procmem(char *buf, char **start, off_t offset, int len,
-+ int *eof, void *data)
-+{
-+ #define LIMIT (PAGE_SIZE-80) /* don't print anymore after this size */
-+
-+ int i;
-+
-+ len=0;
-+
-+#if (0)
-+ switch (roflash_status)
-+ {
-+ case ROFLASH_STATUS_NOT_READY:
-+ strcpy(roflash_status_str,"Not-ready");
-+ break;
-+ case ROFLASH_STATUS_READY:
-+ strcpy(roflash_status_str,"Ready");
-+ break;
-+ default:
-+ strcpy(roflash_status_str,"Unknown!");
-+ break;
-+ }
-+#endif
-+
-+ len += sprintf(buf+len, "ROFLASH Driver status: %s\n\n","Ready");
-+ for ( i = 0; i < roflash_partitions; i ++ )
-+ {
-+ len += sprintf(buf+len, "ROFLASH area name is %s\n",((roflash_area*)(roflash_table_pptr[i]))->name);
-+ len += sprintf(buf+len, "ROFLASH area size = %d bytes\n",((roflash_area*)(roflash_table_pptr[i]))->size);
-+ len += sprintf(buf+len, "ROFLASH area offset = %ld bytes\n",((roflash_area*)(roflash_table_pptr[i]))->offset);
-+ len += sprintf(buf+len, "ROFLASH area l_x_b(%x)\n",((roflash_area*)(roflash_table_pptr[i]))->l_x_b);
-+ }
-+ return len;
-+}
-+#endif /* CONFIG_PROC_FS */
-+
-+#ifdef MODULE
-+static void __exit roflash_cleanup(void) //Susan//
-+{
-+ int i;
-+ int err_info = 0;
-+
-+ /* For read-only flash device, we don't need to invoke fsync_dev */
-+
-+ unregister_blkdev(ROFLASH_MAJOR, DEVICE_NAME);
-+ blk_cleanup_queue(BLK_DEFAULT_QUEUE(ROFLASH_MAJOR));
-+ blk_size[ROFLASH_MAJOR] = NULL;
-+ blksize_size[ROFLASH_MAJOR] = NULL;
-+
-+ /* For roflash char device -- sometimes, we don't have char roflash devices */
-+ for (i = 0; i < roflash_partitions; i++)
-+ {
-+ unsigned short lxb_flag = ((roflash_area *)(roflash_table_pptr[i]))->l_x_b;
-+
-+ if (lxb_flag == ROFLASH_CHAR)
-+ {
-+ unregister_chrdev(MAJOR_NR_C, DEVICE_NAME_C);
-+ break;
-+ }
-+ }
-+
-+ remove_proc_entry("roflash_info",NULL);
-+
-+ printk(KERN_ERR "remove roflash_info\n");
-+
-+}
-+
-+module_init(roflash_init);
-+module_exit(roflash_cleanup);
-+
-+#endif
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/include/linux/ezx_roflash.h linux-2.6.16.5-exz/include/linux/ezx_roflash.h
---- linux-2.6.16.5/include/linux/ezx_roflash.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/include/linux/ezx_roflash.h 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,41 @@
-+/*
-+ * linux/include/linux/ezx_roflash.h
-+ *
-+ * Created by Susan Gu 0ct, 22 2002
-+ *
-+ * For multiple cramfs partitions in ezx project
-+ * At repsent, there are three cramfs partitions in ezx project, they are:
-+ * 1. root file system
-+ * 2. Language package
-+ * 3. setup package
-+*/
-+
-+#ifndef EZX_ROFLASH_FS_H
-+#define EZX_ROFLASH_FS_H
-+
-+#include <asm/ioctl.h>
-+
-+#define ROFLASH_MAJOR 62
-+
-+#define ROFLASH_LINEAR 0x0010
-+#define ROFLASH_LINEAR_XIP 0x0011
-+#define ROFLASH_BLOCK 0x1000
-+#define ROFLASH_CHAR 0x1100
-+#define MAX_ROFLASH 4
-+
-+typedef struct
-+{
-+ char name[16]; /* This length should be enough for DC stuff */
-+ unsigned long offset;
-+ unsigned long size;
-+ int (*roflash_read)(void *, unsigned long, size_t, size_t *, u_char *);
-+ /* Added by Susan for multiple Linear or block cramfs */
-+ void *priv_map;
-+ unsigned long phys_addr;
-+ unsigned short l_x_b;
-+}roflash_area;
-+
-+extern roflash_area *roflash_get_dev(unsigned char minor);
-+extern roflash_area **roflash_table_pptr;
-+
-+#endif
-