summaryrefslogtreecommitdiff
path: root/target/linux/etrax/patches-2.6.29
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/etrax/patches-2.6.29')
-rw-r--r--target/linux/etrax/patches-2.6.29/100-cris-makefiles.patch55
-rw-r--r--target/linux/etrax/patches-2.6.29/200-samsung_flash.patch13
-rw-r--r--target/linux/etrax/patches-2.6.29/201-flashsize.patch92
-rw-r--r--target/linux/etrax/patches-2.6.29/300-sysfs.patch43
-rw-r--r--target/linux/etrax/patches-2.6.29/400-Kconfig_source.patch17
-rw-r--r--target/linux/etrax/patches-2.6.29/500-i2c_gvc.patch45
-rw-r--r--target/linux/etrax/patches-2.6.29/600-fix_serial_cris.patch265
7 files changed, 530 insertions, 0 deletions
diff --git a/target/linux/etrax/patches-2.6.29/100-cris-makefiles.patch b/target/linux/etrax/patches-2.6.29/100-cris-makefiles.patch
new file mode 100644
index 0000000..6495c49
--- /dev/null
+++ b/target/linux/etrax/patches-2.6.29/100-cris-makefiles.patch
@@ -0,0 +1,55 @@
+diff -urN linux-2.6.28.clean/arch/cris/Makefile linux-2.6.28.mod/arch/cris/Makefile
+--- linux-2.6.28.clean/arch/cris/Makefile 2008-12-25 00:26:37.000000000 +0100
++++ linux-2.6.28.mod/arch/cris/Makefile 2009-04-07 11:52:30.000000000 +0200
+@@ -40,7 +40,7 @@
+
+ LD = $(CROSS_COMPILE)ld -mcrislinux
+
+-OBJCOPYFLAGS := -O binary -R .note -R .comment -S
++OBJCOPYFLAGS := -O binary -R .bss -R .note -R .note.gnu.build-id -R .comment -S
+
+ CPPFLAGS_vmlinux.lds = -DDRAM_VIRTUAL_BASE=0x$(CONFIG_ETRAX_DRAM_VIRTUAL_BASE)
+
+diff -urN linux-2.6.28.clean/arch/cris/arch-v10/boot/Makefile linux-2.6.28.mod/arch/cris/arch-v10/boot/Makefile
+--- linux-2.6.28.clean/arch/cris/arch-v10/boot/Makefile 2008-12-25 00:26:37.000000000 +0100
++++ linux-2.6.28.mod/arch/cris/arch-v10/boot/Makefile 2009-04-07 11:55:01.000000000 +0200
+@@ -2,8 +2,6 @@
+ # arch/cris/arch-v10/boot/Makefile
+ #
+
+-OBJCOPYFLAGS = -O binary --remove-section=.bss
+-
+ subdir- := compressed rescue
+ targets := Image
+
+@@ -13,7 +11,7 @@
+
+ $(obj)/compressed/vmlinux: $(obj)/Image FORCE
+ $(Q)$(MAKE) $(build)=$(obj)/compressed $@
+- $(Q)$(MAKE) $(build)=$(obj)/rescue $(obj)/rescue/rescue.bin
++# $(Q)$(MAKE) $(build)=$(obj)/rescue $(obj)/rescue/rescue.bin
+
+ $(obj)/zImage: $(obj)/compressed/vmlinux
+ @cp $< $@
+diff -urN linux-2.6.28.clean/arch/cris/arch-v10/boot/compressed/Makefile linux-2.6.28.mod/arch/cris/arch-v10/boot/compressed/Makefile
+--- linux-2.6.28.clean/arch/cris/arch-v10/boot/compressed/Makefile 2008-12-25 00:26:37.000000000 +0100
++++ linux-2.6.28.mod/arch/cris/arch-v10/boot/compressed/Makefile 2009-04-07 11:53:02.000000000 +0200
+@@ -6,7 +6,6 @@
+ ccflags-y += -O2 $(LINUXINCLUDE)
+ ldflags-y += -T $(srctree)/$(src)/decompress.lds
+ OBJECTS = $(obj)/head.o $(obj)/misc.o
+-OBJCOPYFLAGS = -O binary --remove-section=.bss
+
+ quiet_cmd_image = BUILD $@
+ cmd_image = cat $(obj)/decompress.bin $(obj)/piggy.gz > $@
+diff -urN linux-2.6.28.clean/arch/cris/arch-v10/boot/rescue/Makefile linux-2.6.28.mod/arch/cris/arch-v10/boot/rescue/Makefile
+--- linux-2.6.28.clean/arch/cris/arch-v10/boot/rescue/Makefile 2008-12-25 00:26:37.000000000 +0100
++++ linux-2.6.28.mod/arch/cris/arch-v10/boot/rescue/Makefile 2009-04-07 11:53:09.000000000 +0200
+@@ -5,7 +5,6 @@
+ ccflags-y += -O2 $(LINUXINCLUDE)
+ asflags-y += $(LINUXINCLUDE)
+ ldflags-y += -T $(srctree)/$(src)/rescue.lds
+-OBJCOPYFLAGS = -O binary --remove-section=.bss
+ obj-$(CONFIG_ETRAX_AXISFLASHMAP) = head.o
+ OBJECT := $(obj)/head.o
+
diff --git a/target/linux/etrax/patches-2.6.29/200-samsung_flash.patch b/target/linux/etrax/patches-2.6.29/200-samsung_flash.patch
new file mode 100644
index 0000000..5df6590
--- /dev/null
+++ b/target/linux/etrax/patches-2.6.29/200-samsung_flash.patch
@@ -0,0 +1,13 @@
+Index: linux-2.6.28.2/drivers/mtd/chips/cfi_cmdset_0002.c
+===================================================================
+--- linux-2.6.28.2.orig/drivers/mtd/chips/cfi_cmdset_0002.c 2009-02-04 13:42:19.000000000 +0100
++++ linux-2.6.28.2/drivers/mtd/chips/cfi_cmdset_0002.c 2009-02-04 13:44:11.000000000 +0100
+@@ -364,7 +364,7 @@
+ return NULL;
+ }
+
+- if (extp->MajorVersion != '1' ||
++ if (extp->MajorVersion < '1' || extp->MajorVersion > '3' ||
+ (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
+ if (cfi->mfr == MANUFACTURER_SAMSUNG &&
+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
diff --git a/target/linux/etrax/patches-2.6.29/201-flashsize.patch b/target/linux/etrax/patches-2.6.29/201-flashsize.patch
new file mode 100644
index 0000000..e825acf
--- /dev/null
+++ b/target/linux/etrax/patches-2.6.29/201-flashsize.patch
@@ -0,0 +1,92 @@
+Index: linux-2.6.28.2/arch/cris/arch-v10/drivers/axisflashmap.c
+===================================================================
+--- linux-2.6.28.2.orig/arch/cris/arch-v10/drivers/axisflashmap.c 2009-02-04 13:49:34.000000000 +0100
++++ linux-2.6.28.2/arch/cris/arch-v10/drivers/axisflashmap.c 2009-02-04 13:55:30.000000000 +0100
+@@ -113,7 +113,7 @@
+
+ /* If no partition-table was found, we use this default-set. */
+ #define MAX_PARTITIONS 7
+-#define NUM_DEFAULT_PARTITIONS 3
++#define NUM_DEFAULT_PARTITIONS 2
+
+ /*
+ * Default flash size is 2MB. CONFIG_ETRAX_PTABLE_SECTOR is most likely the
+@@ -122,19 +122,14 @@
+ */
+ static struct mtd_partition axis_default_partitions[NUM_DEFAULT_PARTITIONS] = {
+ {
+- .name = "boot firmware",
+- .size = CONFIG_ETRAX_PTABLE_SECTOR,
+- .offset = 0
+- },
+- {
+ .name = "kernel",
+- .size = 0x200000 - (6 * CONFIG_ETRAX_PTABLE_SECTOR),
+- .offset = CONFIG_ETRAX_PTABLE_SECTOR
++ .size = 0x00,
++ .offset = 0
+ },
+ {
+- .name = "filesystem",
+- .size = 5 * CONFIG_ETRAX_PTABLE_SECTOR,
+- .offset = 0x200000 - (5 * CONFIG_ETRAX_PTABLE_SECTOR)
++ .name = "rootfs",
++ .size = 0x200000,
++ .offset = 0x200000
+ }
+ };
+
+@@ -281,6 +276,11 @@
+ struct partitiontable_entry *ptable;
+ int use_default_ptable = 1; /* Until proven otherwise. */
+ const char pmsg[] = " /dev/flash%d at 0x%08x, size 0x%08x\n";
++ unsigned int kernel_part_size = 0;
++ unsigned char *flash_mem = (unsigned char*)(FLASH_CACHED_ADDR);
++ unsigned int flash_scan_count = 0;
++ const char *part_magic = "ACME_PART_MAGIC";
++ unsigned int magic_len = strlen(part_magic);
+
+ if (!(mymtd = flash_probe())) {
+ /* There's no reason to use this module if no flash chip can
+@@ -293,6 +293,31 @@
+ axisflash_mtd = mymtd;
+ }
+
++ /* scan flash to findout where out partition starts */
++
++ printk(KERN_INFO "Scanning flash for end of kernel magic\n");
++ for(flash_scan_count = 0; flash_scan_count < 100000; flash_scan_count++) {
++ if(strncmp(&flash_mem[flash_scan_count], part_magic, magic_len - 1) == 0) {
++ kernel_part_size = flash_mem[flash_scan_count + magic_len ];
++ kernel_part_size <<= 8;
++ kernel_part_size += flash_mem[flash_scan_count + magic_len + 2];
++ kernel_part_size <<= 8;
++ kernel_part_size += flash_mem[flash_scan_count + magic_len + 1];
++ kernel_part_size <<= 8;
++ kernel_part_size += flash_mem[flash_scan_count + magic_len + 3];
++ printk(KERN_INFO "Kernel ends at 0x%.08X\n", kernel_part_size);
++ flash_scan_count = 1100000;
++ }
++ }
++
++
++ if(kernel_part_size){
++ kernel_part_size = (kernel_part_size & 0xffff0000);
++ axis_default_partitions[0].size = kernel_part_size;
++ axis_default_partitions[1].size = mymtd->size - axis_default_partitions[0].size;
++ axis_default_partitions[1].offset = axis_default_partitions[0].size;
++ }
++
+ if (mymtd) {
+ mymtd->owner = THIS_MODULE;
+ ptable_head = (struct partitiontable_head *)(FLASH_CACHED_ADDR +
+Index: linux-2.6.28.2/arch/cris/arch-v10/lib/hw_settings.S
+===================================================================
+--- linux-2.6.28.2.orig/arch/cris/arch-v10/lib/hw_settings.S 2009-02-04 13:48:25.000000000 +0100
++++ linux-2.6.28.2/arch/cris/arch-v10/lib/hw_settings.S 2009-02-04 13:49:04.000000000 +0100
+@@ -60,3 +60,5 @@
+ .dword R_PORT_PB_SET
+ .dword PB_SET_VALUE
+ .dword 0 ; No more register values
++ .ascii "ACME_PART_MAGIC"
++ .dword 0xdeadc0de
diff --git a/target/linux/etrax/patches-2.6.29/300-sysfs.patch b/target/linux/etrax/patches-2.6.29/300-sysfs.patch
new file mode 100644
index 0000000..9f415b4
--- /dev/null
+++ b/target/linux/etrax/patches-2.6.29/300-sysfs.patch
@@ -0,0 +1,43 @@
+--- a/drivers/serial/crisv10.c
++++ b/drivers/serial/crisv10.c
+@@ -27,6 +27,7 @@ static char *serial_version = "$Revision
+ #include <linux/kernel.h>
+ #include <linux/mutex.h>
+ #include <linux/bitops.h>
++#include <linux/device.h>
+
+ #include <asm/io.h>
+ #include <asm/irq.h>
+@@ -4384,6 +4385,7 @@ static const struct tty_operations rs_op
+ .tiocmset = rs_tiocmset
+ };
+
++static struct class *rs_class;
+ static int __init
+ rs_init(void)
+ {
+@@ -4518,6 +4520,24 @@ rs_init(void)
+ #endif
+ #endif /* CONFIG_SVINTO_SIM */
+
++ rs_class = class_create(THIS_MODULE, "rs_tty");
++#ifdef CONFIG_ETRAX_SERIAL_PORT0
++ device_create(rs_class, NULL,
++ MKDEV(TTY_MAJOR, 64), NULL, "ttyS0");
++#endif
++#ifdef CONFIG_ETRAX_SERIAL_PORT1
++ device_create(rs_class, NULL,
++ MKDEV(TTY_MAJOR, 65), NULL, "ttyS1");
++#endif
++#ifdef CONFIG_ETRAX_SERIAL_PORT2
++ device_create(rs_class, NULL,
++ MKDEV(TTY_MAJOR, 66), NULL, "ttyS2");
++#endif
++#ifdef CONFIG_ETRAX_SERIAL_PORT3
++ device_create(rs_class, NULL,
++ MKDEV(TTY_MAJOR, 67), NULL, "ttyS3");
++#endif
++
+ return 0;
+ }
+
diff --git a/target/linux/etrax/patches-2.6.29/400-Kconfig_source.patch b/target/linux/etrax/patches-2.6.29/400-Kconfig_source.patch
new file mode 100644
index 0000000..d0fdbf5
--- /dev/null
+++ b/target/linux/etrax/patches-2.6.29/400-Kconfig_source.patch
@@ -0,0 +1,17 @@
+Index: linux-2.6.28.9/arch/cris/Kconfig
+===================================================================
+--- linux-2.6.28.9.orig/arch/cris/Kconfig 2009-03-23 22:55:52.000000000 +0100
++++ linux-2.6.28.9/arch/cris/Kconfig 2009-04-08 16:53:30.000000000 +0200
+@@ -662,6 +662,12 @@
+
+ source "drivers/ide/Kconfig"
+
++source "drivers/scsi/Kconfig"
++
++source "drivers/media/Kconfig"
++
++source "sound/Kconfig"
++
+ source "drivers/net/Kconfig"
+
+ source "drivers/i2c/Kconfig"
diff --git a/target/linux/etrax/patches-2.6.29/500-i2c_gvc.patch b/target/linux/etrax/patches-2.6.29/500-i2c_gvc.patch
new file mode 100644
index 0000000..7eed8b2
--- /dev/null
+++ b/target/linux/etrax/patches-2.6.29/500-i2c_gvc.patch
@@ -0,0 +1,45 @@
+Index: linux-2.6.25.20/arch/cris/arch-v10/drivers/Kconfig
+===================================================================
+--- linux-2.6.25.20.orig/arch/cris/arch-v10/drivers/Kconfig 2009-02-09 09:30:40.000000000 +0100
++++ linux-2.6.25.20/arch/cris/arch-v10/drivers/Kconfig 2009-02-09 21:23:12.000000000 +0100
+@@ -450,11 +450,18 @@
+ i2c_arg = I2C_READARG(STA013_READ_ADDR, reg);
+ val = ioctl(fd, _IO(ETRAXI2C_IOCTYPE, I2C_READREG), i2c_arg);
+
++config ETRAX_I2C_GVC
++ bool "I2C GVC support"
++ depends on ETRAX_ARCH_V10 && !ETRAX_I2C
++ select ETRAX_I2C_USES_PB_NOT_PB_I2C
++ help
++ Enables an I2C driver with Geert Vancompernolle improvement.
++
+ # this is true for most products since PB-I2C seems to be somewhat
+ # flawed..
+ config ETRAX_I2C_USES_PB_NOT_PB_I2C
+ bool "I2C uses PB not PB-I2C"
+- depends on ETRAX_I2C
++ depends on ETRAX_I2C || ETRAX_I2C_GVC
+ help
+ Select whether to use the special I2C mode in the PB I/O register or
+ not. This option needs to be selected in order to use some drivers
+@@ -478,7 +485,7 @@
+
+ config ETRAX_I2C_EEPROM
+ bool "I2C EEPROM (non-volatile RAM) support"
+- depends on ETRAX_I2C
++ depends on ETRAX_I2C || ETRAX_I2C_GVC
+ help
+ Enables I2C EEPROM (non-volatile RAM) on PB0 and PB1 using the I2C
+ driver. Select size option: Probed, 2k, 8k, 16k.
+Index: linux-2.6.25.20/arch/cris/arch-v10/drivers/Makefile
+===================================================================
+--- linux-2.6.25.20.orig/arch/cris/arch-v10/drivers/Makefile 2009-02-09 09:30:41.000000000 +0100
++++ linux-2.6.25.20/arch/cris/arch-v10/drivers/Makefile 2009-02-09 09:35:39.000000000 +0100
+@@ -4,6 +4,7 @@
+
+ obj-$(CONFIG_ETRAX_AXISFLASHMAP) += axisflashmap.o
+ obj-$(CONFIG_ETRAX_I2C) += i2c.o
++obj-$(CONFIG_ETRAX_I2C_GVC) += i2c_gvc.o
+ obj-$(CONFIG_ETRAX_I2C_EEPROM) += eeprom.o
+ obj-$(CONFIG_ETRAX_GPIO) += gpio.o
+ obj-$(CONFIG_ETRAX_DS1302) += ds1302.o
diff --git a/target/linux/etrax/patches-2.6.29/600-fix_serial_cris.patch b/target/linux/etrax/patches-2.6.29/600-fix_serial_cris.patch
new file mode 100644
index 0000000..7ac24a4
--- /dev/null
+++ b/target/linux/etrax/patches-2.6.29/600-fix_serial_cris.patch
@@ -0,0 +1,265 @@
+Index: linux-2.6.28.9/drivers/serial/crisv10.c
+===================================================================
+--- linux-2.6.28.9.orig/drivers/serial/crisv10.c 2009-04-10 12:58:18.000000000 +0200
++++ linux-2.6.28.9/drivers/serial/crisv10.c 2009-04-10 12:58:22.000000000 +0200
+@@ -28,12 +28,15 @@
+ #include <linux/mutex.h>
+ #include <linux/bitops.h>
+ #include <linux/device.h>
++#include <linux/seq_file.h>
++#include <linux/delay.h>
++#include <linux/module.h>
++#include <linux/uaccess.h>
++#include <linux/io.h>
+
+-#include <asm/io.h>
+ #include <asm/irq.h>
+ #include <asm/dma.h>
+ #include <asm/system.h>
+-#include <linux/delay.h>
+
+ #include <arch/svinto.h>
+
+@@ -457,7 +460,6 @@
+
+ #define NR_PORTS (sizeof(rs_table)/sizeof(struct e100_serial))
+
+-static struct ktermios *serial_termios[NR_PORTS];
+ #ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
+ static struct fast_timer fast_timers[NR_PORTS];
+ #endif
+@@ -4221,151 +4223,132 @@
+ return 0;
+ }
+
++#ifdef CONFIG_PROC_FS
+ /*
+ * /proc fs routines....
+ */
+
+-static int line_info(char *buf, struct e100_serial *info)
++static void seq_line_info(struct seq_file *m, struct e100_serial *info)
+ {
+- char stat_buf[30];
+- int ret;
+ unsigned long tmp;
+
+- ret = sprintf(buf, "%d: uart:E100 port:%lX irq:%d",
+- info->line, (unsigned long)info->ioport, info->irq);
++ seq_printf(m, "%d: uart:E100 port:%lX irq:%d",
++ info->line, (unsigned long)info->ioport, info->irq);
+
+ if (!info->ioport || (info->type == PORT_UNKNOWN)) {
+- ret += sprintf(buf+ret, "\n");
+- return ret;
++ seq_printf(m, "\n");
++ return;
+ }
+
+- stat_buf[0] = 0;
+- stat_buf[1] = 0;
+- if (!E100_RTS_GET(info))
+- strcat(stat_buf, "|RTS");
+- if (!E100_CTS_GET(info))
+- strcat(stat_buf, "|CTS");
+- if (!E100_DTR_GET(info))
+- strcat(stat_buf, "|DTR");
+- if (!E100_DSR_GET(info))
+- strcat(stat_buf, "|DSR");
+- if (!E100_CD_GET(info))
+- strcat(stat_buf, "|CD");
+- if (!E100_RI_GET(info))
+- strcat(stat_buf, "|RI");
+-
+- ret += sprintf(buf+ret, " baud:%d", info->baud);
+-
+- ret += sprintf(buf+ret, " tx:%lu rx:%lu",
++ seq_printf(m, " baud:%d", info->baud);
++ seq_printf(m, " tx:%lu rx:%lu",
+ (unsigned long)info->icount.tx,
+ (unsigned long)info->icount.rx);
+ tmp = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
+- if (tmp) {
+- ret += sprintf(buf+ret, " tx_pend:%lu/%lu",
+- (unsigned long)tmp,
+- (unsigned long)SERIAL_XMIT_SIZE);
+- }
+-
+- ret += sprintf(buf+ret, " rx_pend:%lu/%lu",
+- (unsigned long)info->recv_cnt,
+- (unsigned long)info->max_recv_cnt);
++ if (tmp)
++ seq_printf(m, " tx_pend:%lu/%lu",
++ (unsigned long)tmp,
++ (unsigned long)SERIAL_XMIT_SIZE);
++
++ seq_printf(m, " rx_pend:%lu/%lu",
++ (unsigned long)info->recv_cnt,
++ (unsigned long)info->max_recv_cnt);
+
+ #if 1
+ if (info->port.tty) {
+-
+ if (info->port.tty->stopped)
+- ret += sprintf(buf+ret, " stopped:%i",
+- (int)info->port.tty->stopped);
++ seq_printf(m, " stopped:%i",
++ (int)info->port.tty->stopped);
+ if (info->port.tty->hw_stopped)
+- ret += sprintf(buf+ret, " hw_stopped:%i",
+- (int)info->port.tty->hw_stopped);
++ seq_printf(m, " hw_stopped:%i",
++ (int)info->port.tty->hw_stopped);
+ }
+
+ {
+ unsigned char rstat = info->ioport[REG_STATUS];
+- if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) )
+- ret += sprintf(buf+ret, " xoff_detect:1");
++ if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect))
++ seq_printf(m, " xoff_detect:1");
+ }
+
+ #endif
+
+-
+-
+-
+ if (info->icount.frame)
+- ret += sprintf(buf+ret, " fe:%lu",
+- (unsigned long)info->icount.frame);
++ seq_printf(m, " fe:%lu", (unsigned long)info->icount.frame);
+
+ if (info->icount.parity)
+- ret += sprintf(buf+ret, " pe:%lu",
+- (unsigned long)info->icount.parity);
++ seq_printf(m, " pe:%lu", (unsigned long)info->icount.parity);
+
+ if (info->icount.brk)
+- ret += sprintf(buf+ret, " brk:%lu",
+- (unsigned long)info->icount.brk);
++ seq_printf(m, " brk:%lu", (unsigned long)info->icount.brk);
+
+ if (info->icount.overrun)
+- ret += sprintf(buf+ret, " oe:%lu",
+- (unsigned long)info->icount.overrun);
++ seq_printf(m, " oe:%lu", (unsigned long)info->icount.overrun);
+
+ /*
+ * Last thing is the RS-232 status lines
+ */
+- ret += sprintf(buf+ret, " %s\n", stat_buf+1);
+- return ret;
++ if (!E100_RTS_GET(info))
++ seq_puts(m, "|RTS");
++ if (!E100_CTS_GET(info))
++ seq_puts(m, "|CTS");
++ if (!E100_DTR_GET(info))
++ seq_puts(m, "|DTR");
++ if (!E100_DSR_GET(info))
++ seq_puts(m, "|DSR");
++ if (!E100_CD_GET(info))
++ seq_puts(m, "|CD");
++ if (!E100_RI_GET(info))
++ seq_puts(m, "|RI");
++ seq_puts(m, "\n");
+ }
+
+-int rs_read_proc(char *page, char **start, off_t off, int count,
+- int *eof, void *data)
++
++static int crisv10_proc_show(struct seq_file *m, void *v)
+ {
+- int i, len = 0, l;
+- off_t begin = 0;
++ int i;
++
++ seq_printf(m, "serinfo:1.0 driver:%s\n", serial_version);
+
+- len += sprintf(page, "serinfo:1.0 driver:%s\n",
+- serial_version);
+- for (i = 0; i < NR_PORTS && len < 4000; i++) {
++ for (i = 0; i < NR_PORTS; i++) {
+ if (!rs_table[i].enabled)
+ continue;
+- l = line_info(page + len, &rs_table[i]);
+- len += l;
+- if (len+begin > off+count)
+- goto done;
+- if (len+begin < off) {
+- begin += len;
+- len = 0;
+- }
++ seq_line_info(m, &rs_table[i]);
+ }
+ #ifdef DEBUG_LOG_INCLUDED
+ for (i = 0; i < debug_log_pos; i++) {
+- len += sprintf(page + len, "%-4i %lu.%lu ", i, debug_log[i].time, timer_data_to_ns(debug_log[i].timer_data));
+- len += sprintf(page + len, debug_log[i].string, debug_log[i].value);
+- if (len+begin > off+count)
+- goto done;
+- if (len+begin < off) {
+- begin += len;
+- len = 0;
+- }
++ seq_printf(m, "%-4i %lu.%lu ",
++ i, debug_log[i].time,
++ timer_data_to_ns(debug_log[i].timer_data));
++ seq_printf(m, debug_log[i].string, debug_log[i].value);
+ }
+- len += sprintf(page + len, "debug_log %i/%i %li bytes\n",
+- i, DEBUG_LOG_SIZE, begin+len);
++ seq_printf(m, "debug_log %i/%i\n", i, DEBUG_LOG_SIZE);
+ debug_log_pos = 0;
+ #endif
++ return 0;
++}
+
+- *eof = 1;
+-done:
+- if (off >= len+begin)
+- return 0;
+- *start = page + (off-begin);
+- return ((count < begin+len-off) ? count : begin+len-off);
++static int crisv10_proc_open(struct inode *inode, struct file *file)
++{
++ return single_open(file, crisv10_proc_show, NULL);
+ }
+
++static const struct file_operations crisv10_proc_fops = {
++ .owner = THIS_MODULE,
++ .open = crisv10_proc_open,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .release = single_release,
++};
++#endif
++
++
+ /* Finally, routines used to initialize the serial driver. */
+
+-static void
+-show_serial_version(void)
++static void show_serial_version(void)
+ {
+ printk(KERN_INFO
+- "ETRAX 100LX serial-driver %s, (c) 2000-2004 Axis Communications AB\r\n",
++ "ETRAX 100LX serial-driver %s, "
++ "(c) 2000-2004 Axis Communications AB\r\n",
+ &serial_version[11]); /* "$Revision: x.yy" */
+ }
+
+@@ -4389,9 +4372,11 @@
+ .break_ctl = rs_break,
+ .send_xchar = rs_send_xchar,
+ .wait_until_sent = rs_wait_until_sent,
+- .read_proc = rs_read_proc,
+ .tiocmget = rs_tiocmget,
+- .tiocmset = rs_tiocmset
++ .tiocmset = rs_tiocmset,
++#ifdef CONFIG_PROC_FS
++ .proc_fops = &crisv10_proc_fops,
++#endif
+ };
+
+ static struct class *rs_class;