[kernel] r10087 - in dists/trunk/linux-2.6/debian: . patches/bugfix/m68k patches/bugfix/m68k/2.6.24 patches/series
Christian T. Steigies
cts at alioth.debian.org
Tue Jan 8 22:54:41 UTC 2008
Author: cts
Date: Tue Jan 8 22:54:40 2008
New Revision: 10087
Log:
Update patches from linux-m68k CVS
Added:
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/130-adbraw.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/133-arch.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/134-atari-fat.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/141-ide.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/633-atari_scc.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/atari-hades-pci-balance-iomap-and-iounmap.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/dio-ARRAY_SIZE-cleanup.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-ARRAY_SIZE-cleanup.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-cc-cross-prefix.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-initrd-fix.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-amiga-amiga_ksyms-c.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-atari-atari_ksyms-c.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-hp300-ksyms-c.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mac-mac_ksyms-c.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mvme16x-mvme16x_ksyms-c.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-add-nubus-card-definitions-and-a-typo-fix.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-macii-adb-comment-correction.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-remove-dead-MAC_ADBKEYCODES.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-remove-dead-code.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/nubus-kill-drivers-nubus-nubus_syms-c.diff
Removed:
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/130-adbraw.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/133-arch.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/134-atari-fat.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/141-ide.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/143-ioext.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/149-mc68681.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/152-pci.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/357-mac89x0.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/448-ide.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/478-serial.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/577-module-arch.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/600-task_thread_info.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/611-module_fixup.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/618-discontig.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/630-extern-cleanup.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/630-extern-cleanup.diff.1
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/631-thread_stack.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/633-atari_scc.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/634-atari_scsi.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/635-atari_input.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/636-atafb.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/add-termios2.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/amiga-a2065-ariadne-stats.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/ask-m68k-io.h-missing.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/atari-aranym.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/atari-ethernec.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/atari-rom-isa.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/atari-scsi-compile-fixes.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/atari-scsi-reformat.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/atari_NCR5380-work.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-atari-scsi.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/debian-2.6.21-2-rom-isa.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/disable-mac-broken-config-options.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/dmasound_paula.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/early-param.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/ethernec-kill-ETHERNEC_USE_POLL.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/ethernec-work.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/falconide_intr_lock-ratelimit.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/falconide_intr_lock-reentrant.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/hilkbd-warning.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/irq_lockdep.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/kmap_atomic-inline.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-53c700-cleanups.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-53c700-scsi.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-amiga-z2ram-kill-TRUE-FALSE.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-arbitary-speed-tty-support.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-as.patch
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-do-not-include-RODATA-in-text-segment.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-generic-io.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-linux-gnu-crosscompile.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-mvme-scsi-rename.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-page.h-needs-compiler.h.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-reformat.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-scsi-Kconfig-hickups.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-undefined-module_fixup.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/m68k-use-_AC.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-cuda-adb-fixes.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-finish_irq_cleanup.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-irq-plan-e.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-irq-prep.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-macii-adb-fixes.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-macmace-fixes.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-macsonic-via-alt-mapping.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-patch_A-mac68k_cvs_nubus_defines.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-patch_B-mac68k_cvs_DP8390_update.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-patch_d-via-alt-mapping.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-remove-unused-adb-header.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-revert-remaining-irq-damage.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/mac68k-sonic-fixes.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/nfeth-virt_to_phys.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/pmu_queue_request-conflict.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/split-amiga7xx.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/sun3-3x-cg3-bw2.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/sun3-3x-serial.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/sun3-numints.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/unnecessary-m68k_memoffset.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/via-pmu68k-dead-code.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/zorro-module-device-table.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/zorro-resource_size_t-warnings.diff
dists/trunk/linux-2.6/debian/patches/bugfix/m68k/zorro_config_attr-read-only.diff
Modified:
dists/trunk/linux-2.6/debian/changelog
dists/trunk/linux-2.6/debian/patches/series/1~experimental.1-extra
Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog (original)
+++ dists/trunk/linux-2.6/debian/changelog Tue Jan 8 22:54:40 2008
@@ -59,7 +59,10 @@
* [mips/mipsel] Remove QEMU flavour, as the Malta platform is now correctly
emulated in QEMU.
- -- maximilian attems <maks at debian.org> Mon, 07 Jan 2008 17:28:08 +0100
+ [ Christian T. Steigies ]
+ * [m68k]: Update patches from linux-m68k CVS
+
+ -- Christian T. Steigies <cts at debian.org> Tue, 8 Jan 2008 22:16:26 +0100
linux-2.6 (2.6.23-1~experimental.1) UNRELEASED; urgency=low
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/130-adbraw.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/130-adbraw.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,42 @@
+To: linus, alan
+Cc: lkml
+Subject: [PATCH] ADB raw packets
+
+From: Linux/m68k legacy
+
+ADB: add support for raw packets
+---
+ drivers/macintosh/adb.c | 7 ++++---
+ include/linux/adb.h | 1 +
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+--- a/drivers/macintosh/adb.c
++++ b/drivers/macintosh/adb.c
+@@ -448,13 +448,14 @@ adb_request(struct adb_request *req, voi
+ use_sreq = 1;
+ } else
+ use_sreq = 0;
+- req->nbytes = nbytes+1;
++ i = (flags & ADBREQ_RAW) ? 0 : 1;
++ req->nbytes = nbytes+i;
+ req->done = done;
+ req->reply_expected = flags & ADBREQ_REPLY;
+ req->data[0] = ADB_PACKET;
+ va_start(list, nbytes);
+- for (i = 0; i < nbytes; ++i)
+- req->data[i+1] = va_arg(list, int);
++ while (i < req->nbytes)
++ req->data[i++] = va_arg(list, int);
+ va_end(list);
+
+ if (flags & ADBREQ_NOSEND)
+--- a/include/linux/adb.h
++++ b/include/linux/adb.h
+@@ -76,6 +76,7 @@ struct adb_driver {
+ #define ADBREQ_REPLY 1 /* expect reply */
+ #define ADBREQ_SYNC 2 /* poll until done */
+ #define ADBREQ_NOSEND 4 /* build the request, but don't send it */
++#define ADBREQ_RAW 8 /* send raw packet (don't prepend ADB_PACKET) */
+
+ /* Messages sent thru the client_list notifier. You should NOT stop
+ the operation, at least not with this version */
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/133-arch.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/133-arch.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,23 @@
+Subject: [PATCH] Local m68k changes
+
+Local m68k changes, _NEVER_ to be submitted upstream:
+ - Force ARCH to be m68k
+ - Append `-m68k' to EXTRAVERSION
+
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org> for m68k CVS only
+---
+ Makefile | 2 +-
+ localversion.m68k | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+--- a/Makefile
++++ b/Makefile
+@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i
+ # Default value for CROSS_COMPILE is not to prefix executables
+ # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
+
+-ARCH ?= $(SUBARCH)
++ARCH ?= m68k
+ CROSS_COMPILE ?=
+
+ # Architecture as present in compile.h
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/134-atari-fat.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/134-atari-fat.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,101 @@
+To: linus, alan
+Cc: lkml
+Subject: [PATCH] Atari FAT updates
+
+From: Linux/m68k legacy
+
+Add support for the Atari-variant of the FAT filesystem
+---
+ fs/fat/inode.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 43 insertions(+), 3 deletions(-)
+
+--- a/fs/fat/inode.c
++++ b/fs/fat/inode.c
+@@ -17,6 +17,7 @@
+ #include <linux/smp_lock.h>
+ #include <linux/seq_file.h>
+ #include <linux/msdos_fs.h>
++#include <linux/major.h>
+ #include <linux/pagemap.h>
+ #include <linux/mpage.h>
+ #include <linux/buffer_head.h>
+@@ -847,7 +848,7 @@ enum {
+ Opt_check_n, Opt_check_r, Opt_check_s, Opt_uid, Opt_gid,
+ Opt_umask, Opt_dmask, Opt_fmask, Opt_codepage, Opt_usefree, Opt_nocase,
+ Opt_quiet, Opt_showexec, Opt_debug, Opt_immutable,
+- Opt_dots, Opt_nodots,
++ Opt_dots, Opt_nodots, Opt_atari_no, Opt_atari_yes,
+ Opt_charset, Opt_shortname_lower, Opt_shortname_win95,
+ Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes,
+ Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes,
+@@ -873,6 +874,9 @@ static match_table_t fat_tokens = {
+ {Opt_showexec, "showexec"},
+ {Opt_debug, "debug"},
+ {Opt_immutable, "sys_immutable"},
++ {Opt_atari_yes, "atari=yes"},
++ {Opt_atari_yes, "atari"},
++ {Opt_atari_no, "atari=no"},
+ {Opt_obsolate, "conv=binary"},
+ {Opt_obsolate, "conv=text"},
+ {Opt_obsolate, "conv=auto"},
+@@ -948,6 +952,13 @@ static int parse_options(char *options,
+ opts->utf8 = opts->unicode_xlate = 0;
+ opts->numtail = 1;
+ opts->usefree = opts->nocase = 0;
++ opts->atari = 0;
++
++#ifdef CONFIG_ATARI
++ if (MACH_IS_ATARI)
++ /* make Atari GEMDOS format the default if machine is an Atari */
++ opts->atari = 1;
++#endif
+ *debug = 0;
+
+ if (!options)
+@@ -999,6 +1010,12 @@ static int parse_options(char *options,
+ case Opt_immutable:
+ opts->sys_immutable = 1;
+ break;
++ case Opt_atari_yes:
++ opts->atari = 1;
++ break;
++ case Opt_atari_no:
++ opts->atari = 0;
++ break;
+ case Opt_uid:
+ if (match_int(&args[0], &option))
+ return 0;
+@@ -1335,8 +1352,31 @@ int fat_fill_super(struct super_block *s
+
+ total_clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
+
+- if (sbi->fat_bits != 32)
+- sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
++ if (!sbi->options.atari) {
++ if (sbi->fat_bits != 32)
++ sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
++ } else {
++ int sectors;
++ /* Atari GEMDOS partitions always have 16-bit fat */
++ if (sbi->fat_bits != 32)
++ sbi->fat_bits = 16;
++ /* If more clusters than fat entries in 16-bit fat, we assume
++ * it's a real MSDOS partition with 12-bit fat.
++ */
++ if (sbi->fat_bits != 32 && total_clusters+2 > sbi->
++ fat_length*SECTOR_SIZE*8/sbi->fat_bits)
++ sbi->fat_bits = 12;
++ /* if it's a floppy disk --> 12bit fat */
++ if (sbi->fat_bits != 32 && MAJOR(sb->s_dev) == FLOPPY_MAJOR)
++ sbi->fat_bits = 12;
++ /* if it's a ramdisk or loopback device and has one of the usual
++ * floppy sizes -> 12bit FAT */
++ sectors = total_sectors + sbi->data_start;
++ if (sbi->fat_bits != 32 && (MAJOR(sb->s_dev) == RAMDISK_MAJOR ||
++ MAJOR(sb->s_dev) == LOOP_MAJOR) &&
++ (sectors == 720 || sectors == 1440 || sectors == 2880))
++ sbi->fat_bits = 12;
++ }
+
+ /* check that FAT table does not overflow */
+ fat_clusters = sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/141-ide.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/141-ide.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,37 @@
+To: linus, alan
+Cc: lkml
+Subject: [PATCH] M68k IDE updates
+
+From: Linux/m68k legacy
+
+M68k IDE updates: Add m68k-isms to the generic ide_fix_driveid()
+---
+ drivers/ide/ide-iops.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+--- a/drivers/ide/ide-iops.c
++++ b/drivers/ide/ide-iops.c
+@@ -313,6 +313,23 @@ void ide_fix_driveid (struct hd_driveid
+ int i;
+ u16 *stringcast;
+
++#ifdef __mc68000__
++ if (!MACH_IS_AMIGA && !MACH_IS_MAC && !MACH_IS_Q40 && !MACH_IS_ATARI)
++ return;
++
++#ifdef M68K_IDE_SWAPW
++ if (M68K_IDE_SWAPW) { /* fix bus byteorder first */
++ u_char *p = (u_char *)id;
++ u_char t;
++ for (i = 0; i < 512; i += 2) {
++ t = p[i];
++ p[i] = p[i+1];
++ p[i+1] = t;
++ }
++ }
++#endif
++#endif /* __mc68000__ */
++
+ id->config = __le16_to_cpu(id->config);
+ id->cyls = __le16_to_cpu(id->cyls);
+ id->reserved2 = __le16_to_cpu(id->reserved2);
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/633-atari_scc.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/633-atari_scc.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,1739 @@
+To: linus, akpm
+Cc: lkml
+Subject: [PATCH] m68k: Atari SCC serial driver
+
+From: Michael Schmitz <schmitz at opal.biophys.uni-duesseldorf.de>
+
+Atari SCC serial driver - this one works less well in 2.6 than it did in 2.4,
+most likely due to the way flip buffer push is handled now - i.e. no
+immediate push of received characters to the line disc. if the handler
+runs in interrupt context, and the bottom half for pushing is run as
+delayed task. 9 out of 10 ping packets end up in the bit bucket this way.
+I haven't figured out how to prevent overruns yet, and getting this right
+will require a bit more testing.
+
+Anyway, the basics are working, and maybe someone can figure out a better
+way to push characters up to the ldisc.
+
+Signed-off-by: Michael Schmitz <schmitz at debian.org>
+Signed-off-by: Roman Zippel <zippel at linux-m68k.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ drivers/char/Makefile | 1
+ drivers/char/atari_scc.c | 1701 +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 1702 insertions(+)
+
+--- a/drivers/char/Makefile
++++ b/drivers/char/Makefile
+@@ -30,6 +30,7 @@ obj-$(CONFIG_DIGIEPCA) += epca.o
+ obj-$(CONFIG_SPECIALIX) += specialix.o
+ obj-$(CONFIG_MOXA_INTELLIO) += moxa.o
+ obj-$(CONFIG_A2232) += ser_a2232.o generic_serial.o
++obj-$(CONFIG_ATARI_SCC) += atari_scc.o generic_serial.o
+ obj-$(CONFIG_ATARI_DSP56K) += dsp56k.o
+ obj-$(CONFIG_MOXA_SMARTIO) += mxser.o
+ obj-$(CONFIG_MOXA_SMARTIO_NEW) += mxser_new.o
+--- /dev/null
++++ b/drivers/char/atari_scc.c
+@@ -0,0 +1,1701 @@
++/*
++ * Atari TT/Falcon Am8530 SCC serial ports implementation.
++ *
++ * Copyright 2005 Michael Schmitz
++ *
++ * Based on:
++ * drivers/char/vme_scc.c: MVME147, MVME162, BVME6000 SCC serial ports
++ * implementation.
++ * Copyright 1999 Richard Hirst <richard at sleepie.demon.co.uk>
++ *
++ * which, in turn, was
++ *
++ * Based on atari_SCC.c which was
++ * Copyright 1994-95 Roman Hodek <Roman.Hodek at informatik.uni-erlangen.de>
++ * Partially based on PC-Linux serial.c by Linus Torvalds and Theodore Ts'o
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive
++ * for more details.
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/kdev_t.h>
++#include <asm/io.h>
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <linux/ioport.h>
++#include <linux/interrupt.h>
++#include <linux/errno.h>
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/mm.h>
++#include <linux/serial.h>
++#include <linux/fcntl.h>
++#include <linux/major.h>
++#include <linux/delay.h>
++#include <linux/slab.h>
++#include <linux/miscdevice.h>
++#include <linux/console.h>
++#include <linux/init.h>
++#include <asm/setup.h>
++#include <asm/uaccess.h>
++#include <asm/bootinfo.h>
++
++#include <asm/atarihw.h>
++#include <asm/atariints.h>
++
++#include <linux/generic_serial.h>
++#include "scc.h"
++
++#define CONFIG_TT_SCC 1
++#define CONFIG_FALCON_SCC 1
++
++#define CHANNEL_A 0
++#define CHANNEL_B 1
++
++#define SCC_MINOR_BASE 64
++
++/* Shadows for all SCC write registers */
++static unsigned char scc_shadow[2][16];
++
++/* Location to access for SCC register access delay */
++static volatile unsigned char *scc_del = NULL;
++
++/* To keep track of STATUS_REG state for detection of Ext/Status int source */
++static unsigned char scc_last_status_reg[2];
++
++/***************************** Prototypes *****************************/
++
++/* Function prototypes */
++static void scc_disable_tx_interrupts(void *ptr);
++static void scc_enable_tx_interrupts(void *ptr);
++static void scc_disable_rx_interrupts(void *ptr);
++static void scc_enable_rx_interrupts(void *ptr);
++static int scc_get_CD(void *ptr);
++static void scc_shutdown_port(void *ptr);
++static int scc_set_real_termios(void *ptr);
++static void scc_hungup(void *ptr);
++static void scc_close(void *ptr);
++static int scc_chars_in_buffer(void *ptr);
++static int scc_open(struct tty_struct *tty, struct file *filp);
++static int scc_ioctl(struct tty_struct *tty, struct file *filp,
++ unsigned int cmd, unsigned long arg);
++static void scc_throttle(struct tty_struct *tty);
++static void scc_unthrottle(struct tty_struct *tty);
++static irqreturn_t scc_tx_int(int irq, void *data);
++static irqreturn_t scc_rx_int(int irq, void *data);
++static irqreturn_t scc_stat_int(int irq, void *data);
++static irqreturn_t scc_spcond_int(int irq, void *data);
++static void scc_setsignals(struct scc_port *port, int dtr, int rts);
++static void scc_break_ctl(struct tty_struct *tty, int break_state);
++
++static struct tty_driver *scc_driver;
++
++struct scc_port scc_ports[2];
++
++int scc_initialized = 0;
++
++/*
++ * Flags to indicate one of the serial ports has already been initialized by the
++ * serial debug driver. We may want to hold off reinitializing ...
++ */
++
++/* Flag that Modem1 port is already initialized and used */
++extern int atari_SCC_init_done;
++/* Can be set somewhere, if a SCC master reset has already be done and should
++ * not be repeated; used by kgdb */
++extern int atari_SCC_reset_done;
++
++/*---------------------------------------------------------------------------
++ * Interface from generic_serial.c back here
++ *--------------------------------------------------------------------------*/
++
++static struct real_driver scc_real_driver = {
++ .disable_tx_interrupts = scc_disable_tx_interrupts,
++ .enable_tx_interrupts = scc_enable_tx_interrupts,
++ .disable_rx_interrupts = scc_disable_rx_interrupts,
++ .enable_rx_interrupts = scc_enable_rx_interrupts,
++ .get_CD = scc_get_CD,
++ .shutdown_port = scc_shutdown_port,
++ .set_real_termios = scc_set_real_termios,
++ .chars_in_buffer = scc_chars_in_buffer,
++ .close = scc_close,
++ .hungup = scc_hungup,
++};
++
++static struct tty_operations scc_ops = {
++ .open = scc_open,
++ .close = gs_close,
++ .write = gs_write,
++ .put_char = gs_put_char,
++ .flush_chars = gs_flush_chars,
++ .write_room = gs_write_room,
++ .chars_in_buffer = gs_chars_in_buffer,
++ .flush_buffer = gs_flush_buffer,
++ .ioctl = scc_ioctl,
++ .throttle = scc_throttle,
++ .unthrottle = scc_unthrottle,
++ .set_termios = gs_set_termios,
++ .stop = gs_stop,
++ .start = gs_start,
++ .hangup = gs_hangup,
++ .break_ctl = scc_break_ctl,
++};
++
++/* BRG values for the standard speeds and the various clock sources */
++
++typedef struct {
++ unsigned clksrc; /* clock source to use or -1 for not possible */
++ unsigned div; /* divisor: 1, 2 and 4 correspond to
++ * direct 1:16, 1:32 and 1:64 modes,
++ * divisors >= 4 yield a BRG value of
++ * div/2-2 (in 1:16 mode)
++ */
++} BAUD_ENTRY;
++
++/* A pointer for each channel to the current baud table */
++static BAUD_ENTRY *scc_baud_table[2];
++
++/* Baud table format:
++ *
++ * Each entry consists of the clock source (CLK_RTxC, CLK_TRxC or
++ * CLK_PCLK) and a divisor. The following rules apply to the divisor:
++ *
++ * - CLK_RTxC: 1 or even (1, 2 and 4 are the direct modes, > 4 use
++ * the BRG)
++ *
++ * - CLK_TRxC: 1, 2 or 4 (no BRG, only direct modes possible)
++ *
++ * - CLK_PCLK: >= 4 and even (no direct modes, only BRG)
++ *
++ */
++
++/* This table is used if RTxC = 3.672 MHz. This is the case for TT's
++ * channel A and for both channels on the Mega STE/Falcon. (TRxC is unused)
++ */
++
++static BAUD_ENTRY bdtab_norm[20] = {
++ /* B0 */ { 0, 0 },
++ /* B50 */ { CLK_RTxC, 4590 },
++ /* B75 */ { CLK_RTxC, 3060 },
++ /* B110 */ { CLK_PCLK, 4576 },
++ /* B134 */ { CLK_PCLK, 3756 },
++ /* B150 */ { CLK_RTxC, 1530 },
++ /* B200 */ { CLK_PCLK, 2516 },
++ /* B300 */ { CLK_PCLK, 1678 },
++ /* B600 */ { CLK_PCLK, 838 },
++ /* B1200 */ { CLK_PCLK, 420 },
++ /* B1800 */ { CLK_PCLK, 280 },
++ /* B2400 */ { CLK_PCLK, 210 },
++ /* B4800 */ { CLK_RTxC, 48 },
++ /* B9600 */ { CLK_RTxC, 24 },
++ /* B19200 */ { CLK_RTxC, 12 },
++ /* B38400 */ { CLK_RTxC, 6 }, /* #15 spd_extra */
++ /* B57600 */ { CLK_RTxC, 4 }, /* #16 spd_hi */
++ /* B115200 */ { CLK_RTxC, 2 }, /* #17 spd_vhi */
++ /* B230400 */ { CLK_RTxC, 1 }, /* #18 spd_shi */
++ /* B460800 */ { 0, 0 } /* #19 spd_warp: Impossible */
++};
++
++/* This is a special table for the TT channel B with 307.2 kHz at RTxC
++ * and 2.4576 MHz at TRxC
++ */
++static BAUD_ENTRY bdtab_TTChB[20] = {
++ /* B0 */ { 0, 0 },
++ /* B50 */ { CLK_RTxC, 384 },
++ /* B75 */ { CLK_RTxC, 256 },
++ /* B110 */ { CLK_PCLK, 4576 },
++ /* B134 */ { CLK_PCLK, 3756 },
++ /* B150 */ { CLK_RTxC, 128 },
++ /* B200 */ { CLK_RTxC, 96 },
++ /* B300 */ { CLK_RTxC, 64 },
++ /* B600 */ { CLK_RTxC, 32 },
++ /* B1200 */ { CLK_RTxC, 16 },
++ /* B1800 */ { CLK_PCLK, 280 },
++ /* B2400 */ { CLK_RTxC, 8 },
++ /* B4800 */ { CLK_RTxC, 4 },
++ /* B9600 */ { CLK_RTxC, 2 },
++ /* B19200 */ { CLK_RTxC, 1 },
++ /* B38400 */ { CLK_TRxC, 4 },
++ /* B57600 */ { CLK_TRxC, 2 }, /* 57600 is not possible, use 76800 instead */
++ /* B115200 */ { CLK_TRxC, 1 }, /* 115200 is not possible, use 153600 instead */
++ /* B230400 */ { 0, 0 }, /* #18 spd_shi: Impossible */
++ /* B460800 */ { 0, 0 } /* #19 spd_warp: Impossible */
++};
++
++
++/*----------------------------------------------------------------------------
++ * atari_scc_init() and support functions
++ *---------------------------------------------------------------------------*/
++
++static int scc_init_drivers(void)
++{
++ int error;
++
++ scc_driver = alloc_tty_driver(2);
++ if (!scc_driver)
++ return -ENOMEM;
++ scc_driver->owner = THIS_MODULE;
++ scc_driver->driver_name = "scc";
++ scc_driver->name = "ttyS";
++ scc_driver->major = TTY_MAJOR;
++ scc_driver->minor_start = SCC_MINOR_BASE;
++ scc_driver->type = TTY_DRIVER_TYPE_SERIAL;
++ scc_driver->subtype = SERIAL_TYPE_NORMAL;
++ scc_driver->init_termios = tty_std_termios;
++ scc_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
++ scc_driver->flags = TTY_DRIVER_REAL_RAW;
++
++ tty_set_operations(scc_driver, &scc_ops);
++
++ if ((error = tty_register_driver(scc_driver))) {
++ printk(KERN_ERR "scc: Couldn't register scc driver, error = %d\n",
++ error);
++ put_tty_driver(scc_driver);
++ return 1;
++ }
++
++ return 0;
++}
++
++
++/* ports[] array is indexed by line no (i.e. [0] for ttyS0, [1] for ttyS1).
++ */
++
++static void scc_init_portstructs(void)
++{
++ struct scc_port *port;
++ int i;
++
++ for (i = 0; i < 2; i++) {
++ port = scc_ports + i;
++ port->gs.magic = SCC_MAGIC;
++ port->gs.close_delay = HZ/2;
++ port->gs.closing_wait = 30 * HZ;
++ port->gs.rd = &scc_real_driver;
++#ifdef NEW_WRITE_LOCKING
++ port->gs.port_write_sem = MUTEX;
++#endif
++ init_waitqueue_head(&port->gs.open_wait);
++ init_waitqueue_head(&port->gs.close_wait);
++ }
++}
++
++
++#ifdef CONFIG_TT_SCC
++static int atari_tt_scc_init(void)
++{
++ struct scc_port *port;
++
++ printk(KERN_INFO "SCC: Atari TT Serial Driver\n");
++ /* FIXME channel A may be switchable between modem and LAN port */
++ /* Init channel A */
++ if (atari_SCC_init_done)
++ printk(KERN_INFO "SCC: already initialized, expect trouble!\n");
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: init channel A\n");
++#endif
++ port = &scc_ports[0];
++ port->channel = CHANNEL_A;
++ port->ctrlp = (volatile unsigned char *)&scc.cha_a_ctrl;
++ port->datap = port->ctrlp + 1;
++ port->port_a = &scc_ports[0];
++ port->port_b = &scc_ports[1];
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: request channel A irqs, port = %p\n", port);
++#endif
++ request_irq(IRQ_SCCA_TX, scc_tx_int, IRQ_TYPE_PRIO, "SCC-A TX", port);
++ request_irq(IRQ_SCCA_STAT, scc_stat_int, IRQ_TYPE_PRIO,
++ "SCC-A status", port);
++ request_irq(IRQ_SCCA_RX, scc_rx_int, IRQ_TYPE_PRIO, "SCC-A RX", port);
++ request_irq(IRQ_SCCA_SPCOND, scc_spcond_int, IRQ_TYPE_PRIO,
++ "SCC-A special cond", port);
++ {
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: read SCC status\n");
++#endif
++ /* on the first access, read status register to reset internal pointers */
++ SCCread(STATUS_REG);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: reset SCC\n");
++#endif
++ /* FIXME: master reset, once only */
++ SCCwrite(MASTER_INT_CTRL, MIC_HARD_RESET);
++ udelay(40);
++
++ /* disable interrupts for this channel */
++ SCCwrite(INT_AND_DMA_REG, 0);
++ /* Set the interrupt vector ; 0x60 for all Atari models */
++ SCCwrite(INT_VECTOR_REG, 0x60);
++ /* Interrupt parameters: vector includes status, status low */
++ SCCwrite(MASTER_INT_CTRL, MIC_VEC_INCL_STAT);
++ SCCmod(MASTER_INT_CTRL, 0xff, MIC_MASTER_INT_ENAB);
++
++ /* disable interrupts for this channel */
++ SCCwrite(INT_AND_DMA_REG, 0);
++ }
++
++ if (!atari_SCC_init_done) {
++ /* Init channel B */
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: init channel B\n");
++#endif
++ port = &scc_ports[1];
++ port->channel = CHANNEL_B;
++ port->ctrlp = (volatile unsigned char *)&scc.cha_b_ctrl;
++ port->datap = port->ctrlp + 1;
++ port->port_a = &scc_ports[0];
++ port->port_b = &scc_ports[1];
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: request channel B irqs, port = %p\n", port);
++#endif
++ request_irq(IRQ_SCCB_TX, scc_tx_int, IRQ_TYPE_PRIO,
++ "SCC-B TX", port);
++ request_irq(IRQ_SCCB_STAT, scc_stat_int, IRQ_TYPE_PRIO,
++ "SCC-B status", port);
++ request_irq(IRQ_SCCB_RX, scc_rx_int, IRQ_TYPE_PRIO,
++ "SCC-B RX", port);
++ request_irq(IRQ_SCCB_SPCOND, scc_spcond_int, IRQ_TYPE_PRIO,
++ "SCC-B special cond", port);
++ {
++ SCC_ACCESS_INIT(port);
++
++ /* disable interrupts for this channel */
++ SCCwrite(INT_AND_DMA_REG, 0);
++ }
++/* not implemented yet */
++#if 0
++ request_irq(IRQ_TT_MFP_RI, scc_ri_int, IRQ_TYPE_SLOW,
++ "TT-MFP ring indicator (modem 2)", port);
++#endif
++
++ }
++
++ /* once only: initalize MFP timer C for RTxC */
++ tt_mfp.tim_ct_cd = (tt_mfp.tim_ct_cd & ~0x70) | 0x10;
++ tt_mfp.tim_dt_c = 1;
++ atari_turnoff_irq(IRQ_TT_MFP_TIMC);
++
++ /* set baud tables */
++ scc_baud_table[CHANNEL_A] = bdtab_norm;
++ scc_baud_table[CHANNEL_B] = bdtab_TTChB;
++
++ /* Initialise the tty driver structures and register */
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: scc_init_portstructs()\n");
++#endif
++ scc_init_portstructs();
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: scc_init_drivers()\n");
++#endif
++ scc_init_drivers();
++
++ return 0;
++}
++#endif
++
++
++#ifdef CONFIG_FALCON_SCC
++static int atari_falcon_scc_init(void)
++{
++ struct scc_port *port;
++
++ printk(KERN_INFO "SCC: Atari Falcon Serial Driver\n");
++ if (atari_SCC_init_done)
++ printk(KERN_INFO "SCC: already initialized, expect trouble!\n");
++
++ /* Init channel A */
++ port = &scc_ports[0];
++ port->channel = CHANNEL_A;
++ port->ctrlp = (volatile unsigned char *)&scc.cha_a_ctrl;
++ port->datap = port->ctrlp + 2;
++ port->port_a = &scc_ports[0];
++ port->port_b = &scc_ports[1];
++ request_irq(IRQ_SCCA_TX, scc_tx_int, IRQ_TYPE_PRIO, "SCC-A TX", port);
++ request_irq(IRQ_SCCA_STAT, scc_stat_int, IRQ_TYPE_PRIO,
++ "SCC-A status", port);
++ request_irq(IRQ_SCCA_RX, scc_rx_int, IRQ_TYPE_PRIO, "SCC-A RX", port);
++ request_irq(IRQ_SCCA_SPCOND, scc_spcond_int, IRQ_TYPE_PRIO,
++ "SCC-A special cond", port);
++ {
++ SCC_ACCESS_INIT(port);
++
++ /* on the first access, read status register to reset internal pointers */
++ SCCread(STATUS_REG);
++
++ /* FIXME: master reset, once only */
++ SCCwrite(MASTER_INT_CTRL, MIC_HARD_RESET);
++ udelay(40);
++
++ /* disable interrupts for this channel */
++ SCCwrite(INT_AND_DMA_REG, 0);
++ /* Set the interrupt vector */
++ SCCwrite(INT_VECTOR_REG, 0x60);
++ /* Interrupt parameters: vector includes status, status low */
++ SCCwrite(MASTER_INT_CTRL, MIC_VEC_INCL_STAT);
++ SCCmod(MASTER_INT_CTRL, 0xff, MIC_MASTER_INT_ENAB);
++ }
++
++ /* conditionalize if port in use by console ?? */
++ /* Init channel B */
++ port = &scc_ports[1];
++ port->channel = CHANNEL_B;
++ port->ctrlp = (volatile unsigned char *)&scc.cha_b_ctrl;
++ port->datap = port->ctrlp + 2;
++ port->port_a = &scc_ports[0];
++ port->port_b = &scc_ports[1];
++ request_irq(IRQ_SCCB_TX, scc_tx_int, IRQ_TYPE_PRIO, "SCC-B TX", port);
++ request_irq(IRQ_SCCB_STAT, scc_stat_int, IRQ_TYPE_PRIO,
++ "SCC-B status", port);
++ request_irq(IRQ_SCCB_RX, scc_rx_int, IRQ_TYPE_PRIO, "SCC-B RX", port);
++ request_irq(IRQ_SCCB_SPCOND, scc_spcond_int, IRQ_TYPE_PRIO,
++ "SCC-B special cond", port);
++
++ {
++ SCC_ACCESS_INIT(port); /* Either channel will do */
++
++ /* disable interrupts for this channel */
++ SCCwrite(INT_AND_DMA_REG, 0);
++ }
++
++ /* set baud tables */
++ scc_baud_table[CHANNEL_A] = bdtab_norm;
++ scc_baud_table[CHANNEL_B] = bdtab_norm;
++
++ /* Initialise the tty driver structures and register */
++ scc_init_portstructs();
++ scc_init_drivers();
++
++ return 0;
++}
++#endif
++
++
++#ifdef CONFIG_ST_SCC
++static int atari_st_scc_init(void)
++{
++ struct scc_port *port;
++
++ int escc = ATARIHW_PRESENT(ST_ESCC);
++
++ printk(KERN_INFO "SCC: Atari MegaST/E Serial Driver\n");
++ /* FIXME: ports reversed logic */
++ /* Init channel A */
++ port = &scc_ports[1];
++ port->channel = CHANNEL_A;
++ port->ctrlp = (volatile unsigned char *)(escc ? &st_escc.cha_a_ctrl : &scc.cha_a_ctrl);
++ port->datap = port->ctrlp + 4;
++ port->port_a = &scc_ports[1];
++ port->port_b = &scc_ports[0];
++ request_irq(IRQ_SCCA_TX, scc_tx_int, IRQ_TYPE_PRIO, "SCC-A TX", port);
++ request_irq(IRQ_SCCA_STAT, scc_stat_int, IRQ_TYPE_PRIO,
++ "SCC-A status", port);
++ request_irq(IRQ_SCCA_RX, scc_rx_int, IRQ_TYPE_PRIO, "SCC-A RX", port);
++ request_irq(SCCA_SPCOND, scc_spcond_int, IRQ_TYPE_PRIO,
++ "SCC-A special cond", port);
++ {
++ SCC_ACCESS_INIT(port);
++
++ /* on the first access, read status register to reset internal pointers */
++ SCCread(STATUS_REG);
++
++ /* FIXME: master reset, once only */
++ SCCwrite(MASTER_INT_CTRL, MIC_HARD_RESET);
++ udelay(40);
++
++ /* disable interrupts for this channel */
++ SCCwrite(INT_AND_DMA_REG, 0);
++ /* Set the interrupt vector */
++ SCCwrite(INT_VECTOR_REG, BVME_IRQ_SCC_BASE);
++ /* Interrupt parameters: vector includes status, status low */
++ SCCwrite(MASTER_INT_CTRL, MIC_VEC_INCL_STAT);
++ SCCmod(MASTER_INT_CTRL, 0xff, MIC_MASTER_INT_ENAB);
++ }
++
++ /* Init channel B */
++ port = &scc_ports[0];
++ port->channel = CHANNEL_B;
++ port->ctrlp = (volatile unsigned char *)(escc ? &st_escc.cha_b_ctrl : &scc.cha_b_ctrl);
++ port->datap = port->ctrlp + 4;
++ port->port_a = &scc_ports[0];
++ port->port_b = &scc_ports[1];
++ request_irq(IRQ_SCCB_TX, scc_tx_int, IRQ_TYPE_PRIO, "SCC-B TX", port);
++ request_irq(IRQ_SCCB_STAT, scc_stat_int, IRQ_TYPE_PRIO,
++ "SCC-B status", port);
++ request_irq(IRQ_SCCB_RX, scc_rx_int, IRQ_TYPE_PRIO, "SCC-B RX", port);
++ request_irq(IRQ_SCCB_SPCOND, scc_spcond_int, IRQ_TYPE_PRIO,
++ "SCC-B special cond", port);
++
++ {
++ SCC_ACCESS_INIT(port); /* Either channel will do */
++
++ /* disable interrupts for this channel */
++ SCCwrite(INT_AND_DMA_REG, 0);
++ }
++
++ /* set baud tables */
++ scc_baud_table[CHANNEL_A] = bdtab_norm;
++ scc_baud_table[CHANNEL_B] = bdtab_norm;
++
++ /* Initialise the tty driver structures and register */
++ scc_init_portstructs();
++ scc_init_drivers();
++
++ return 0;
++}
++#endif
++
++
++int atari_scc_init(void)
++{
++ int res = -ENODEV;
++ static int called = 0;
++
++ if (called)
++ return res;
++ called = 1;
++
++ if (!(ATARIHW_PRESENT(SCC) || ATARIHW_PRESENT(ST_ESCC)))
++ return -ENODEV;
++
++ scc_del = &mfp.par_dt_reg;
++
++#ifdef CONFIG_TT_SCC
++ if (MACH_IS_TT)
++ res = atari_tt_scc_init();
++#endif
++#ifdef CONFIG_FALCON_SCC
++ if (MACH_IS_FALCON)
++ res = atari_falcon_scc_init();
++#endif
++#ifdef CONFIG_ST_SCC
++ if (MACH_IS_ST)
++ res = atari_st_scc_init();
++#endif
++ return res;
++}
++
++void atari_scc_cleanup(void)
++{
++ struct scc_port *port;
++
++ tty_unregister_driver(scc_driver);
++ port = &scc_ports[0];
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: free channel A irqs, port = %p\n", port);
++#endif
++ free_irq(IRQ_SCCA_TX, port);
++ free_irq(IRQ_SCCA_STAT, port);
++ free_irq(IRQ_SCCA_RX, port);
++ free_irq(IRQ_SCCA_SPCOND, port);
++
++ port = &scc_ports[1];
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: free channel A irqs, port = %p\n", port);
++#endif
++ free_irq(IRQ_SCCB_TX, port);
++ free_irq(IRQ_SCCB_STAT, port);
++ free_irq(IRQ_SCCB_RX, port);
++ free_irq(IRQ_SCCB_SPCOND, port);
++
++}
++
++module_init(atari_scc_init);
++module_exit(atari_scc_cleanup);
++
++/*---------------------------------------------------------------------------
++ * Interrupt handlers
++ *--------------------------------------------------------------------------*/
++
++static irqreturn_t scc_rx_int(int irq, void *data)
++{
++ unsigned char ch;
++ struct scc_port *port = data;
++ struct tty_struct *tty = port->gs.tty;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: rx_int ...\n");
++#endif
++ ch = SCCread_NB(RX_DATA_REG);
++ if (!tty) {
++ printk(KERN_WARNING "scc_rx_int with NULL tty!\n");
++ SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET);
++ return IRQ_HANDLED;
++ }
++ tty_insert_flip_char(tty, ch, 0);
++#if 0
++ if (tty->flip.count < TTY_FLIPBUF_SIZE) {
++ *tty->flip.char_buf_ptr = ch;
++ *tty->flip.flag_buf_ptr = 0;
++ tty->flip.flag_buf_ptr++;
++ tty->flip.char_buf_ptr++;
++ tty->flip.count++;
++ }
++#endif
++ /* Check if another character is already ready; in that case, the
++ * spcond_int() function must be used, because this character may have an
++ * error condition that isn't signalled by the interrupt vector used!
++ */
++ if (SCCread(INT_PENDING_REG) &
++ (port->channel == CHANNEL_A ? IPR_A_RX : IPR_B_RX)) {
++ scc_spcond_int(irq, data);
++ return IRQ_HANDLED;
++ }
++
++ SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET);
++
++ tty_flip_buffer_push(tty);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: rx_int done\n");
++#endif
++ return IRQ_HANDLED;
++}
++
++
++static irqreturn_t scc_spcond_int(int irq, void *data)
++{
++ struct scc_port *port = data;
++ struct tty_struct *tty = port->gs.tty;
++ unsigned char stat, ch, err;
++ int int_pending_mask = port->channel == CHANNEL_A ? IPR_A_RX : IPR_B_RX;
++
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: spcond_int ...\n");
++#endif
++ if (!tty) {
++ printk(KERN_WARNING "scc_spcond_int with NULL tty!\n");
++ SCCwrite(COMMAND_REG, CR_ERROR_RESET);
++ SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET);
++ return IRQ_HANDLED;
++ }
++ do {
++ stat = SCCread(SPCOND_STATUS_REG);
++ ch = SCCread_NB(RX_DATA_REG);
++
++ if (stat & SCSR_RX_OVERRUN)
++ err = TTY_OVERRUN;
++ else if (stat & SCSR_PARITY_ERR)
++ err = TTY_PARITY;
++ else if (stat & SCSR_CRC_FRAME_ERR)
++ err = TTY_FRAME;
++ else
++ err = 0;
++
++ tty_insert_flip_char(tty, ch, err);
++#if 0
++ if (tty->flip.count < TTY_FLIPBUF_SIZE) {
++ *tty->flip.char_buf_ptr = ch;
++ *tty->flip.flag_buf_ptr = err;
++ tty->flip.flag_buf_ptr++;
++ tty->flip.char_buf_ptr++;
++ tty->flip.count++;
++ }
++#endif
++ /* ++TeSche: *All* errors have to be cleared manually,
++ * else the condition persists for the next chars
++ */
++ if (err)
++ SCCwrite(COMMAND_REG, CR_ERROR_RESET);
++
++ } while (SCCread(INT_PENDING_REG) & int_pending_mask);
++
++ SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET);
++
++ tty_flip_buffer_push(tty);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: spcond_int done\n");
++#endif
++ return IRQ_HANDLED;
++}
++
++/* not implemented yet */
++#if 0
++static void scc_ri_int(int irq, void *data)
++{
++ struct scc_port *port = data;
++ /* update input line counter */
++ port->icount.rng++;
++ wake_up_interruptible(&port->delta_msr_wait);
++}
++#endif
++
++static irqreturn_t scc_tx_int(int irq, void *data)
++{
++ struct scc_port *port = data;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: tx_int irq %d port %p ...\n", irq, data);
++#endif
++ if (!port->gs.tty) {
++ printk(KERN_WARNING "scc_tx_int with NULL tty!\n");
++ SCCmod(INT_AND_DMA_REG, ~IDR_TX_INT_ENAB, 0);
++ SCCwrite(COMMAND_REG, CR_TX_PENDING_RESET);
++ SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET);
++ return IRQ_HANDLED;
++ }
++ while ((SCCread_NB(STATUS_REG) & SR_TX_BUF_EMPTY)) {
++ if (port->x_char) {
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: tx_int writing char %c\n",
++ port->x_char);
++#endif
++ SCCwrite(TX_DATA_REG, port->x_char);
++ port->x_char = 0;
++ } else if ((port->gs.xmit_cnt <= 0) || port->gs.tty->stopped ||
++ port->gs.tty->hw_stopped) {
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: nothing to do!\n");
++#endif
++ break;
++ } else {
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: tx_int writing buf %c\n",
++ port->gs.xmit_buf[port->gs.xmit_tail]);
++#endif
++ SCCwrite(TX_DATA_REG, port->gs.xmit_buf[port->gs.xmit_tail++]);
++ port->gs.xmit_tail = port->gs.xmit_tail & (SERIAL_XMIT_SIZE-1);
++ if (--port->gs.xmit_cnt <= 0)
++ break;
++ }
++ }
++ if ((port->gs.xmit_cnt <= 0) || port->gs.tty->stopped ||
++ port->gs.tty->hw_stopped) {
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: nothing to do, disabling int\n");
++#endif
++ /* disable tx interrupts */
++ SCCmod(INT_AND_DMA_REG, ~IDR_TX_INT_ENAB, 0);
++ SCCwrite(COMMAND_REG, CR_TX_PENDING_RESET); /* disable tx_int on next tx underrun? */
++ port->gs.flags &= ~GS_TX_INTEN;
++ }
++ if (port->gs.tty && port->gs.xmit_cnt <= port->gs.wakeup_chars) {
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: waking up tty!\n");
++#endif
++ tty_wakeup(port->gs.tty);
++ }
++
++ SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: tx_int done\n");
++#endif
++ return IRQ_HANDLED;
++}
++
++
++static irqreturn_t scc_stat_int(int irq, void *data)
++{
++ struct scc_port *port = data;
++ unsigned channel = port->channel;
++ unsigned char last_sr, sr, changed;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: stat_int ...\n");
++#endif
++ last_sr = scc_last_status_reg[channel];
++ sr = scc_last_status_reg[channel] = SCCread_NB(STATUS_REG);
++ changed = last_sr ^ sr;
++
++ if (changed & SR_DCD) {
++ port->c_dcd = !!(sr & SR_DCD);
++ if (!(port->gs.flags & ASYNC_CHECK_CD))
++ ; /* Don't report DCD changes */
++ else if (port->c_dcd) {
++ /* Are we blocking in open? */
++ wake_up_interruptible(&port->gs.open_wait);
++ } else {
++ if (port->gs.tty)
++ tty_hangup(port->gs.tty);
++ }
++ }
++
++ // FIXME: CTS and DSR status changes?
++
++ SCCwrite(COMMAND_REG, CR_EXTSTAT_RESET);
++ SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: stat_int done\n");
++#endif
++ return IRQ_HANDLED;
++}
++
++
++/*---------------------------------------------------------------------------
++ * generic_serial.c callback funtions
++ *--------------------------------------------------------------------------*/
++
++static void scc_disable_tx_interrupts(void *ptr)
++{
++ struct scc_port *port = ptr;
++ unsigned long flags;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: disable_tx_int ...\n");
++#endif
++ local_irq_save(flags);
++ SCCmod(INT_AND_DMA_REG, ~IDR_TX_INT_ENAB, 0);
++ port->gs.flags &= ~GS_TX_INTEN;
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: disable_tx_int done!\n");
++#endif
++}
++
++
++static void scc_enable_tx_interrupts(void *ptr)
++{
++ struct scc_port *port = ptr;
++ unsigned long flags;
++
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: enable_tx_int ...\n");
++#endif
++ local_irq_save(flags);
++ SCCmod(INT_AND_DMA_REG, 0xff, IDR_TX_INT_ENAB);
++ /* restart the transmitter */
++ scc_tx_int(0, port);
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: enable_tx_int done!\n");
++#endif
++}
++
++
++static void scc_disable_rx_interrupts(void *ptr)
++{
++ struct scc_port *port = ptr;
++ unsigned long flags;
++
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: disable_rx_int ...\n");
++#endif
++ local_irq_save(flags);
++ SCCmod(INT_AND_DMA_REG,
++ ~(IDR_RX_INT_MASK|IDR_PARERR_AS_SPCOND|IDR_EXTSTAT_INT_ENAB), 0);
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: disable_rx_int done!\n");
++#endif
++}
++
++
++static void scc_enable_rx_interrupts(void *ptr)
++{
++ struct scc_port *port = ptr;
++ unsigned long flags;
++
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: enable_rx_int ...\n");
++#endif
++ local_irq_save(flags);
++ SCCmod(INT_AND_DMA_REG, 0xff,
++ IDR_EXTSTAT_INT_ENAB|IDR_PARERR_AS_SPCOND|IDR_RX_INT_ALL);
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: enable_rx_int done!\n");
++#endif
++}
++
++
++static int scc_get_CD(void *ptr)
++{
++ struct scc_port *port = ptr;
++ unsigned channel = port->channel;
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: get_CD!\n");
++#endif
++ return !!(scc_last_status_reg[channel] & SR_DCD);
++}
++
++
++static void scc_shutdown_port(void *ptr)
++{
++ struct scc_port *port = ptr;
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: shutdown_port ...\n");
++#endif
++ port->gs.flags &= ~GS_ACTIVE;
++ if (port->gs.tty && port->gs.tty->termios->c_cflag & HUPCL)
++ scc_setsignals(port, 0, 0);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: shutdown_port done!\n");
++#endif
++}
++
++
++static int scc_set_real_termios(void *ptr)
++{
++ /* the SCC has char sizes 5,7,6,8 in that order! */
++ static int chsize_map[4] = { 0, 2, 1, 3 };
++ unsigned int cflag, baud, baudbits, baudidx, brgmode;
++ unsigned int clkmode, clksrc, div, chsize, channel, brgval = 0;
++ unsigned long flags;
++ struct scc_port *port = ptr;
++ SCC_ACCESS_INIT(port);
++
++ if (!port->gs.tty || !port->gs.tty->termios)
++ return 0;
++
++ channel = port->channel;
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: termios for channel %p\n", channel);
++#endif
++ cflag = port->gs.tty->termios->c_cflag;
++ baud = port->gs.baud;
++ baudbits = cflag & CBAUD;
++ chsize = (cflag & CSIZE) >> 4;
++
++ if (baud == 0) {
++ /* speed == 0 -> drop DTR */
++ local_irq_save(flags);
++ SCCmod(TX_CTRL_REG, ~TCR_DTR, 0);
++ local_irq_restore(flags);
++ return 0;
++ } else if ((MACH_IS_TT && (baud < 50 || baud > 115200)) ||
++ (MACH_IS_FALCON && (baud < 50 || baud > 230400))) {
++ printk(KERN_NOTICE "SCC: Bad speed requested, %d\n", baud);
++ return 0;
++ }
++
++ if (cflag & CLOCAL)
++ port->gs.flags &= ~ASYNC_CHECK_CD;
++ else
++ port->gs.flags |= ASYNC_CHECK_CD;
++
++ // calculate brgval for Atari; enable direct modes!
++
++ /* convert baud rate from gs.baud to table index, set custom divisor eventually */
++
++ div = 0;
++ clksrc = 0;
++ baudidx = 0;
++
++ switch (baud) {
++ case 50:
++ baudidx = 1;
++ break;
++ case 75:
++ baudidx = 2;
++ break;
++ case 110:
++ baudidx = 3;
++ break;
++ case 134:
++ baudidx = 4;
++ break;
++ case 150:
++ baudidx = 5;
++ break;
++ case 200:
++ baudidx = 6;
++ break;
++ case 300:
++ baudidx = 7;
++ break;
++ case 600:
++ baudidx = 8;
++ break;
++ case 1200:
++ baudidx = 9;
++ break;
++ case 1800:
++ baudidx = 10;
++ break;
++ case 2400:
++ baudidx = 11;
++ break;
++ case 4800:
++ baudidx = 12;
++ break;
++ case 9600:
++ baudidx = 13;
++ break;
++ case 19200:
++ baudidx = 14;
++ break;
++ case 38400:
++ baudidx = 15;
++ break;
++ case 57600:
++ baudidx = 16;
++ break;
++ case 115200:
++ baudidx = 17;
++ break;
++ case 230400:
++ baudidx = 18;
++ break;
++ default:
++ baudidx = 15;
++ break;
++ }
++
++ /* do we have a custom divisor ?? */
++ if (!div) {
++ if (baudidx > 19)
++ baudidx = 19;
++ clksrc = scc_baud_table[channel][baudidx].clksrc;
++ div = scc_baud_table[channel][baudidx].div;
++ if (!div) {
++ printk(" SCC_change_speed: divisor = 0 !!!");
++ return 0;
++ }
++ }
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: termios baud %d baudbits %d baudidx %d \n clksrc %d div %d\n",
++ baud, baudbits, baudidx, clksrc, div);
++#endif
++ /* compute the SCC's clock source, clock mode, BRG mode and BRG
++ * value from clksrc and div
++ */
++ if (div <= 4) {
++ clkmode = (div == 1 ? A1CR_CLKMODE_x16 :
++ div == 2 ? A1CR_CLKMODE_x32 :
++ A1CR_CLKMODE_x64);
++ clksrc = (clksrc == CLK_RTxC
++ ? CCR_TXCLK_RTxC | CCR_RXCLK_RTxC
++ : CCR_TXCLK_TRxC | CCR_RXCLK_TRxC);
++ brgmode = 0; /* off */
++ brgval = 0;
++ } else {
++ brgval = div/2 - 2;
++ brgmode = (DCR_BRG_ENAB |
++ (clksrc == CLK_PCLK ? DCR_BRG_USE_PCLK : 0));
++ clkmode = A1CR_CLKMODE_x16;
++ clksrc = CCR_TXCLK_BRG | CCR_RXCLK_BRG;
++ }
++
++ //printk(KERN_INFO "SCC: termios baud %d baudbits %d baudidx %d \n clksrc %d clkmode %d div %d brgval %d brgmode %d\n",
++ // baud, baudbits, baudidx, clksrc, clkmode, div, brgval, brgmode);
++
++ /* Now we have all parameters and can go to set them: */
++ local_irq_save(flags);
++
++#ifdef DEBUG
++ printk(" brgval=%d brgmode=%02x clkmode=%02x clksrc=%02x\n",
++ brgval, brgmode, clkmode, clksrc);
++#endif
++ /* receiver's character size and auto-enables */
++#if 0 // auto-enable considered harmful ...
++ SCCmod(RX_CTRL_REG, ~(RCR_CHSIZE_MASK|RCR_AUTO_ENAB_MODE),
++ (chsize_map[chsize] << 6) |
++ ((cflag & CRTSCTS) ? RCR_AUTO_ENAB_MODE : 0));
++#else
++ /* receiver's character size */
++ SCCmod(RX_CTRL_REG, ~RCR_CHSIZE_MASK, chsize_map[chsize] << 6);
++#endif
++#ifdef DEBUG
++ printk(" RX_CTRL_REG <- %02x\n", SCCread( RX_CTRL_REG ));
++#endif
++
++ // clock mode changes depending on baud rate
++ /* parity and stop bits (both, Tx and Rx) and clock mode */
++ SCCmod(AUX1_CTRL_REG,
++ ~(A1CR_PARITY_MASK | A1CR_MODE_MASK | A1CR_CLKMODE_MASK),
++ ((cflag & PARENB
++ ? (cflag & PARODD ? A1CR_PARITY_ODD : A1CR_PARITY_EVEN)
++ : A1CR_PARITY_NONE)
++ | (cflag & CSTOPB ? A1CR_MODE_ASYNC_2 : A1CR_MODE_ASYNC_1)
++ | clkmode));
++
++#ifdef DEBUG
++ printk(" AUX1_CTRL_REG <- %02x\n", SCCread(AUX1_CTRL_REG));
++#endif
++ /* sender's character size, set DTR for valid baud rate */
++ SCCmod(TX_CTRL_REG, ~TCR_CHSIZE_MASK, chsize_map[chsize] << 5 | TCR_DTR);
++#ifdef DEBUG
++ printk(" TX_CTRL_REG <- %02x\n", SCCread(TX_CTRL_REG));
++#endif
++
++ // clock sources change for TT !!
++ /* clock sources never change */
++ /* clock sources */
++ SCCmod(CLK_CTRL_REG, ~(CCR_TXCLK_MASK | CCR_RXCLK_MASK), clksrc);
++#ifdef DEBUG
++ printk(" CLK_CTRL_REG <- %02x\n", SCCread(CLK_CTRL_REG));
++#endif
++
++ /* disable BRG before changing the value */
++ SCCmod(DPLL_CTRL_REG, ~DCR_BRG_ENAB, 0);
++ /* BRG value */
++ SCCwrite(TIMER_LOW_REG, brgval & 0xff);
++ SCCwrite(TIMER_HIGH_REG, (brgval >> 8) & 0xff);
++ /* BRG enable, and clock source never changes */
++ //SCCmod(DPLL_CTRL_REG, 0xff, DCR_BRG_ENAB);
++ SCCmod(DPLL_CTRL_REG, ~(DCR_BRG_ENAB | DCR_BRG_USE_PCLK), brgmode);
++#ifdef DEBUG
++ printk(" TIMER_LOW_REG <- %02x\n", SCCread(TIMER_LOW_REG));
++ printk(" TIMER_HIGH_REG <- %02x\n", SCCread(TIMER_HIGH_REG));
++#endif
++#ifdef DEBUG
++ printk(" DPLL_CTRL_REG <- %02x\n", SCCread(DPLL_CTRL_REG));
++#endif
++
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: done termios for channel %d\n", channel);
++#endif
++ return 0;
++}
++
++
++static int scc_chars_in_buffer(void *ptr)
++{
++ struct scc_port *port = ptr;
++#ifdef DEBUG
++ int rv;
++#endif
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ rv = (SCCread(SPCOND_STATUS_REG) & SCSR_ALL_SENT) ? 0 : 1;
++ printk(KERN_INFO "SCC: chars_in_buffer: %d\n", rv);
++ return rv;
++#else
++ return (SCCread(SPCOND_STATUS_REG) & SCSR_ALL_SENT) ? 0 : 1;
++#endif
++}
++
++
++/* Comment taken from sx.c (2.4.0):
++ I haven't the foggiest why the decrement use count has to happen
++ here. The whole linux serial drivers stuff needs to be redesigned.
++ My guess is that this is a hack to minimize the impact of a bug
++ elsewhere. Thinking about it some more. (try it sometime) Try
++ running minicom on a serial port that is driven by a modularized
++ driver. Have the modem hangup. Then remove the driver module. Then
++ exit minicom. I expect an "oops". -- REW */
++
++static void scc_hungup(void *ptr)
++{
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: hungup ...\n");
++#endif
++ scc_disable_tx_interrupts(ptr);
++ scc_disable_rx_interrupts(ptr);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: hungup done\n");
++#endif
++}
++
++
++static void scc_close(void *ptr)
++{
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: close ...\n");
++#endif
++ scc_disable_tx_interrupts(ptr);
++ scc_disable_rx_interrupts(ptr);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: close done\n");
++#endif
++}
++
++
++/*---------------------------------------------------------------------------
++ * Internal support functions
++ *--------------------------------------------------------------------------*/
++
++static void scc_setsignals(struct scc_port *port, int dtr, int rts)
++{
++ unsigned long flags;
++ unsigned char t;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: setsignals dtr %d rts %d...\n", dtr, rts);
++#endif
++ local_irq_save(flags);
++ t = SCCread(TX_CTRL_REG);
++ if (dtr >= 0)
++ t = dtr? (t | TCR_DTR): (t & ~TCR_DTR);
++ if (rts >= 0)
++ t = rts? (t | TCR_RTS): (t & ~TCR_RTS);
++ SCCwrite(TX_CTRL_REG, t);
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: setsignals done\n");
++#endif
++}
++
++
++static void scc_send_xchar(struct tty_struct *tty, char ch)
++{
++ struct scc_port *port = (struct scc_port *)tty->driver_data;
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: send_xchar ...\n");
++#endif
++ port->x_char = ch;
++ if (ch)
++ scc_enable_tx_interrupts(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: send_xchar done\n");
++#endif
++}
++
++
++/*---------------------------------------------------------------------------
++ * Driver entrypoints referenced from above
++ *--------------------------------------------------------------------------*/
++
++static int scc_open(struct tty_struct *tty, struct file *filp)
++{
++ int line = tty->index;
++ int retval;
++ struct scc_port *port = &scc_ports[line];
++ int i, channel = port->channel;
++ unsigned long flags;
++ SCC_ACCESS_INIT(port);
++
++ static const struct {
++ unsigned reg, val;
++ } scc_init_tab[] = {
++ /* no parity, 1 stop bit, async, 1:16 */
++ { AUX1_CTRL_REG, A1CR_PARITY_NONE|A1CR_MODE_ASYNC_1|A1CR_CLKMODE_x64 },
++ /* parity error is special cond, ints disabled, no DMA */
++ { INT_AND_DMA_REG, IDR_PARERR_AS_SPCOND | IDR_RX_INT_DISAB },
++ /* Rx 8 bits/char, no auto enable, Rx off */
++ { RX_CTRL_REG, RCR_CHSIZE_8 },
++ /* DTR off, Tx 8 bits/char, RTS off, Tx off */
++ { TX_CTRL_REG, TCR_CHSIZE_8 },
++ /* special features off */
++ { AUX2_CTRL_REG, 0 },
++ /* RTxC is XTAL, TRxC is input, both clocks = RTxC */
++ { CLK_CTRL_REG, CCR_TRxCOUT_XTAL | CCR_TXCLK_RTxC | CCR_RXCLK_RTxC },
++ { DPLL_CTRL_REG, 0 },
++ /* Start Rx */
++ { RX_CTRL_REG, RCR_RX_ENAB | RCR_CHSIZE_8 },
++ /* Start Tx */
++ { TX_CTRL_REG, TCR_TX_ENAB | TCR_RTS | TCR_DTR | TCR_CHSIZE_8 },
++ /* Ext/Stat ints: CTS, DCD, SYNC (DSR) */
++ { INT_CTRL_REG, ICR_ENAB_DCD_INT | ICR_ENAB_CTS_INT | ICR_ENAB_SYNC_INT },
++ /* Reset Ext/Stat ints */
++ { COMMAND_REG, CR_EXTSTAT_RESET },
++ /* ...again */
++ { COMMAND_REG, CR_EXTSTAT_RESET },
++ /* Rx int always, TX int off, Ext/Stat int on */
++ { INT_AND_DMA_REG, IDR_EXTSTAT_INT_ENAB |
++ IDR_PARERR_AS_SPCOND | IDR_RX_INT_ALL }
++ };
++
++ if (atari_SCC_init_done && line == 1)
++ return -ENODEV;
++
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: open port ...\n");
++#endif
++ if (!(port->gs.flags & ASYNC_INITIALIZED)) {
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: init port ...\n");
++#endif
++ local_irq_save(flags);
++
++ SCCmod(MASTER_INT_CTRL, 0x3f,
++ channel == 0 ? MIC_CH_A_RESET : MIC_CH_B_RESET);
++ udelay(40); /* extra delay after a reset */
++
++ for (i = 0; i < sizeof(scc_init_tab)/sizeof(*scc_init_tab); ++i)
++ SCCwrite(scc_init_tab[i].reg, scc_init_tab[i].val);
++
++
++ /* remember status register for detection of DCD and CTS changes */
++ scc_last_status_reg[channel] = SCCread(STATUS_REG);
++
++ port->c_dcd = 0; /* Prevent initial 1->0 interrupt */
++ scc_setsignals(port, 1, 1);
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: init port done!\n");
++#endif
++ }
++
++ tty->driver_data = port;
++ port->gs.tty = tty;
++ port->gs.count++;
++#ifdef DEBUG
++ printk(KERN_WARNING "SCC: gs init port ...\n");
++#endif
++ retval = gs_init_port(&port->gs);
++ if (retval) {
++ port->gs.count--;
++ return retval;
++ }
++#ifdef DEBUG
++ printk(KERN_WARNING "SCC: gs init port done!\n");
++#endif
++ port->gs.flags |= GS_ACTIVE;
++
++#ifdef DEBUG
++ printk(KERN_WARNING "SCC: gs wait ready ...\n");
++#endif
++ retval = gs_block_til_ready(port, filp);
++#ifdef DEBUG
++ printk(KERN_WARNING "SCC: gs wait ready done!\n");
++#endif
++ if (retval) {
++ port->gs.count--;
++ return retval;
++ }
++
++ port->c_dcd = scc_get_CD(port);
++
++#ifdef DEBUG
++ printk(KERN_WARNING "SCC: enable rx ints ...\n");
++#endif
++ scc_enable_rx_interrupts(port);
++#ifdef DEBUG
++ printk(KERN_WARNING "SCC: enable rx ints done!\n");
++
++ printk(KERN_INFO "SCC: open port done!\n");
++#endif
++ return 0;
++}
++
++
++static void scc_throttle(struct tty_struct *tty)
++{
++ struct scc_port *port = (struct scc_port *)tty->driver_data;
++ unsigned long flags;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: throttle ...\n");
++#endif
++ if (tty->termios->c_cflag & CRTSCTS) {
++ local_irq_save(flags);
++ SCCmod(TX_CTRL_REG, ~TCR_RTS, 0);
++ local_irq_restore(flags);
++ }
++ if (I_IXOFF(tty))
++ scc_send_xchar(tty, STOP_CHAR(tty));
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: throttle done!\n");
++#endif
++}
++
++
++static void scc_unthrottle(struct tty_struct *tty)
++{
++ struct scc_port *port = (struct scc_port *)tty->driver_data;
++ unsigned long flags;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: unthrottle ...\n");
++#endif
++ if (tty->termios->c_cflag & CRTSCTS) {
++ local_irq_save(flags);
++ SCCmod(TX_CTRL_REG, 0xff, TCR_RTS);
++ local_irq_restore(flags);
++ }
++ if (I_IXOFF(tty))
++ scc_send_xchar(tty, START_CHAR(tty));
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: unthrottle done!\n");
++#endif
++}
++
++
++static int scc_ioctl(struct tty_struct *tty, struct file *file,
++ unsigned int cmd, unsigned long arg)
++{
++ struct scc_port *port = (struct scc_port *)tty->driver_data;
++ int retval;
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl! cmd %d, arg %p \n", cmd, arg);
++#endif
++ //if (serial_paranoia_check(info, tty->device, "zs_ioctl"))
++ // return -ENODEV;
++
++ if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
++ (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGWILD) &&
++ (cmd != TIOCSERSWILD) && (cmd != TIOCSERGSTRUCT)) {
++ if (tty->flags & (1 << TTY_IO_ERROR))
++ return -EIO;
++ }
++
++ switch (cmd) {
++ case TCSBRK: /* SVID version: non-zero arg --> no break */
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TCSBRK\n");
++#endif
++ retval = tty_check_change(tty);
++ if (retval)
++ return retval;
++ tty_wait_until_sent(tty, 0);
++ //if (!arg)
++ // send_break(info, HZ/4); /* 1/4 second */
++ return 0;
++ case TCSBRKP: /* support for POSIX tcsendbreak() */
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TCSBRKP\n");
++#endif
++ retval = tty_check_change(tty);
++ if (retval)
++ return retval;
++ tty_wait_until_sent(tty, 0);
++ //send_break(info, arg ? arg*(HZ/10) : HZ/4);
++ return 0;
++ case TIOCGSOFTCAR:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCGSOFTCAR\n");
++#endif
++ if (put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg))
++ return -EFAULT;
++ return 0;
++ case TIOCSSOFTCAR:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCSSOFTCAR\n");
++#endif
++ if (get_user(arg, (unsigned long *)arg))
++ return -EFAULT;
++ tty->termios->c_cflag =
++ ((tty->termios->c_cflag & ~CLOCAL) |
++ (arg ? CLOCAL : 0));
++ return 0;
++ case TIOCMGET:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCMGET\n");
++#endif
++ //return get_modem_info(info, (unsigned int *)arg);
++ return 0;
++ case TIOCMBIS:
++ case TIOCMBIC:
++ case TIOCMSET:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCMSET\n");
++#endif
++ //return set_modem_info(info, cmd, (unsigned int *)arg);
++ return 0;
++ case TIOCGSERIAL:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCGSERIAL\n");
++#endif
++ return 0;
++ //return get_serial_info(info,
++ // (struct serial_struct *)arg);
++ case TIOCSSERIAL:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCSSERIAL\n");
++#endif
++ return 0;
++ //return set_serial_info(info,
++ // (struct serial_struct *)arg);
++ case TIOCSERGETLSR: /* Get line status register */
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCSERGETLSR\n");
++#endif
++ return 0;
++ //return get_lsr_info(info, (unsigned int *)arg);
++
++ case TIOCSERGSTRUCT:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl TIOCSERGSTRUCT\n");
++#endif
++ return 0;
++ if (copy_to_user((struct scc_port *)arg,
++ port, sizeof(struct scc_port)))
++ return -EFAULT;
++ return 0;
++
++ default:
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: ioctl default\n");
++#endif
++ return -ENOIOCTLCMD;
++ }
++ return 0;
++}
++
++
++static void scc_break_ctl(struct tty_struct *tty, int break_state)
++{
++ struct scc_port *port = (struct scc_port *)tty->driver_data;
++ unsigned long flags;
++ SCC_ACCESS_INIT(port);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: break ctl ...\n");
++#endif
++ local_irq_save(flags);
++ SCCmod(TX_CTRL_REG, ~TCR_SEND_BREAK, break_state ? TCR_SEND_BREAK : 0);
++ local_irq_restore(flags);
++#ifdef DEBUG
++ printk(KERN_INFO "SCC: break ctl done!\n");
++#endif
++}
++
++
++/*---------------------------------------------------------------------------
++ * Serial console stuff...
++ *--------------------------------------------------------------------------*/
++#if 1
++#define scc_delay() \
++ asm volatile ("tstb %0" : : "m" (*scc_del) : "cc")
++
++#define SCC_WRITE(reg,val) \
++ do { \
++ scc.cha_b_ctrl = (reg); \
++ scc_delay(); \
++ scc.cha_b_ctrl = (val); \
++ scc_delay(); \
++ } while (0)
++
++/* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a
++ * delay of ~ 60us. */
++#define LONG_DELAY() \
++ do { \
++ int i; \
++ for (i = 100; i > 0; --i) \
++ scc_delay(); \
++ } while (0)
++
++static void atari_init_scc_port(int cflag)
++{
++ extern int atari_SCC_reset_done;
++ static int clksrc_table[9] =
++ /* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */
++ { 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };
++ static int brgsrc_table[9] =
++ /* reg 14: 0 = RTxC, 2 = PCLK */
++ { 2, 2, 2, 2, 2, 2, 0, 2, 2 };
++ static int clkmode_table[9] =
++ /* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */
++ { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 };
++ static int div_table[9] =
++ /* reg12 (BRG low) */
++ { 208, 138, 103, 50, 24, 11, 1, 0, 0 };
++
++ int baud = cflag & CBAUD;
++ int clksrc, clkmode, div, reg3, reg5;
++
++ scc_del = &mfp.par_dt_reg;
++
++ if (cflag & CBAUDEX)
++ baud += B38400;
++ if (baud < B1200 || baud > B38400+2)
++ baud = B9600; /* use default 9600bps for non-implemented rates */
++ baud -= B1200; /* tables starts at 1200bps */
++
++ clksrc = clksrc_table[baud];
++ clkmode = clkmode_table[baud];
++ div = div_table[baud];
++ if (ATARIHW_PRESENT(TT_MFP) && baud >= 6) {
++ /* special treatment for TT, where rates >= 38400 are done via TRxC */
++ clksrc = 0x28; /* TRxC */
++ clkmode = baud == 6 ? 0xc0 :
++ baud == 7 ? 0x80 : /* really 76800bps */
++ 0x40; /* really 153600bps */
++ div = 0;
++ }
++
++ reg3 = (cflag & CSIZE) == CS8 ? 0xc0 : 0x40;
++ reg5 = (cflag & CSIZE) == CS8 ? 0x60 : 0x20 | 0x82 /* assert DTR/RTS */;
++
++ (void)scc.cha_b_ctrl; /* reset reg pointer */
++ SCC_WRITE(9, 0xc0); /* reset */
++ LONG_DELAY(); /* extra delay after WR9 access */
++ SCC_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |
++ 0x04 /* 1 stopbit */ |
++ clkmode);
++ SCC_WRITE(3, reg3);
++ SCC_WRITE(5, reg5);
++ SCC_WRITE(9, 0); /* no interrupts */
++ LONG_DELAY(); /* extra delay after WR9 access */
++ SCC_WRITE(10, 0); /* NRZ mode */
++ SCC_WRITE(11, clksrc); /* main clock source */
++ SCC_WRITE(12, div); /* BRG value */
++ SCC_WRITE(13, 0); /* BRG high byte */
++ SCC_WRITE(14, brgsrc_table[baud]);
++ SCC_WRITE(14, brgsrc_table[baud] | (div ? 1 : 0));
++ SCC_WRITE(3, reg3 | 1);
++ SCC_WRITE(5, reg5 | 8);
++
++ atari_SCC_reset_done = 1;
++ atari_SCC_init_done = 1;
++}
++
++static void scc_ch_write(char ch)
++{
++ volatile char *p = NULL;
++
++ if (MACH_IS_TT || MACH_IS_FALCON)
++ p = (volatile char *)&scc.cha_b_ctrl;
++
++ if (MACH_IS_ST)
++ p = (volatile char *)&scc.cha_b_ctrl;
++
++ if (MACH_IS_STE)
++ p = (volatile char *)&st_escc.cha_b_ctrl;
++
++ do {
++ scc_delay();
++ }
++ while (!(*p & 4));
++ // scc_delay();
++ // *p = 8;
++ scc_delay();
++ *(p+1) = ch;
++}
++
++/* The console must be locked when we get here. */
++
++static void scc_console_write(struct console *co, const char *str, unsigned count)
++{
++ unsigned long flags;
++
++ //printk("scc_console_write: %s\n", str);
++ local_irq_save(flags);
++
++ while (count--) {
++ if (*str == '\n')
++ scc_ch_write('\r');
++ scc_ch_write(*str++);
++ }
++ local_irq_restore(flags);
++ //printk("scc_console_write done!\n");
++}
++
++static struct tty_driver *scc_console_device(struct console *c, int *index)
++{
++ *index = c->index;
++ return scc_driver;
++}
++
++
++static int __init scc_console_setup(struct console *co, char *options)
++{
++ printk("scc_console_setup: initializing SCC port B\n");
++ atari_init_scc_port(B9600|CS8);
++ printk("scc_console_setup: done!\n");
++ return 0;
++}
++
++
++static struct console sercons = {
++ .name = "ttyS",
++ .write = scc_console_write,
++ .device = scc_console_device,
++ .setup = scc_console_setup,
++ .flags = CON_PRINTBUFFER,
++ .index = -1,
++};
++
++
++static int __init vme_scc_console_init(void)
++{
++ if (MACH_IS_TT || MACH_IS_ST || MACH_IS_FALCON)
++ register_console(&sercons);
++ return 0;
++}
++
++console_initcall(vme_scc_console_init);
++#endif
++
++/***************************** End of Functions *********************/
++
++MODULE_AUTHOR("Michael Schmitz");
++MODULE_DESCRIPTION("Atari Amd8350 SCC serial driver");
++MODULE_LICENSE("GPL");
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/atari-hades-pci-balance-iomap-and-iounmap.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/atari-hades-pci-balance-iomap-and-iounmap.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,100 @@
+Subject: m68k: Balance ioremap and iounmap in m68k/atari/hades-pci.c
+
+From: Roel Kluin <12o3l at tiscali.nl>
+
+m68k: Balance ioremap and iounmap in m68k/atari/hades-pci.c
+
+Signed-off-by: Roel Kluin <12o3l at tiscali.nl>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/atari/hades-pci.c | 56 +++++++++++++++++++++-----------------------
+ 1 file changed, 27 insertions(+), 29 deletions(-)
+
+--- a/arch/m68k/atari/hades-pci.c
++++ b/arch/m68k/atari/hades-pci.c
+@@ -376,8 +376,8 @@ struct pci_bus_info * __init init_hades_
+ */
+
+ bus = kzalloc(sizeof(struct pci_bus_info), GFP_KERNEL);
+- if (!bus)
+- return NULL;
++ if (unlikely(!bus))
++ goto iounmap_base_virt;
+
+ /*
+ * Claim resources. The m68k has no separate I/O space, both
+@@ -385,43 +385,25 @@ struct pci_bus_info * __init init_hades_
+ * the I/O resources are requested in memory space as well.
+ */
+
+- if (request_resource(&iomem_resource, &config_space) != 0)
+- {
+- kfree(bus);
+- return NULL;
+- }
+-
+- if (request_resource(&iomem_resource, &io_space) != 0)
+- {
+- release_resource(&config_space);
+- kfree(bus);
+- return NULL;
+- }
++ if (unlikely(request_resource(&iomem_resource, &config_space) != 0))
++ goto free_bus;
++
++ if (unlikely(request_resource(&iomem_resource, &io_space) != 0))
++ goto release_config_space;
+
+ bus->mem_space.start = HADES_MEM_BASE;
+ bus->mem_space.end = HADES_MEM_BASE + HADES_MEM_SIZE - 1;
+ bus->mem_space.name = pci_mem_name;
+ #if 1
+- if (request_resource(&iomem_resource, &bus->mem_space) != 0)
+- {
+- release_resource(&io_space);
+- release_resource(&config_space);
+- kfree(bus);
+- return NULL;
+- }
++ if (unlikely(request_resource(&iomem_resource, &bus->mem_space) != 0))
++ goto release_io_space;
+ #endif
+ bus->io_space.start = pci_io_base_virt;
+ bus->io_space.end = pci_io_base_virt + HADES_VIRT_IO_SIZE - 1;
+ bus->io_space.name = pci_io_name;
+ #if 1
+- if (request_resource(&ioport_resource, &bus->io_space) != 0)
+- {
+- release_resource(&bus->mem_space);
+- release_resource(&io_space);
+- release_resource(&config_space);
+- kfree(bus);
+- return NULL;
+- }
++ if (unlikely(request_resource(&ioport_resource, &bus->io_space) != 0))
++ goto release_bus_mem_space;
+ #endif
+ /*
+ * Set hardware dependent functions.
+@@ -438,5 +420,21 @@ struct pci_bus_info * __init init_hades_
+ tt_mfp.active_edge &= ~0x27;
+
+ return bus;
++
++release_bus_mem_space:
++ release_resource(&bus->mem_space);
++release_io_space:
++ release_resource(&io_space);
++release_config_space:
++ release_resource(&config_space);
++free_bus:
++ kfree(bus);
++iounmap_base_virt:
++ iounmap((void *)pci_io_base_virt);
++
++ for (i = 0; i < N_SLOTS; i++)
++ iounmap((void *)pci_conf_base_virt[i]);
++
++ return NULL;
+ }
+ #endif
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/dio-ARRAY_SIZE-cleanup.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/dio-ARRAY_SIZE-cleanup.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,34 @@
+Subject: dio: ARRAY_SIZE() cleanup
+
+From: Alejandro Martinez Ruiz <alex at flawedcode.org>
+
+dio: ARRAY_SIZE() cleanup
+
+[Geert: eliminate NUMNAMES, as suggested by Richard Knutsson ]
+
+Signed-off-by: Alejandro Martinez Ruiz <alex at flawedcode.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ drivers/dio/dio.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+--- a/drivers/dio/dio.c
++++ b/drivers/dio/dio.c
+@@ -88,8 +88,6 @@ static struct dioname names[] =
+ #undef DIONAME
+ #undef DIOFBNAME
+
+-#define NUMNAMES (sizeof(names) / sizeof(struct dioname))
+-
+ static const char *unknowndioname
+ = "unknown DIO board -- please email <linux-m68k at lists.linux-m68k.org>!";
+
+@@ -97,7 +95,7 @@ static const char *dio_getname(int id)
+ {
+ /* return pointer to a constant string describing the board with given ID */
+ unsigned int i;
+- for (i = 0; i < NUMNAMES; i++)
++ for (i = 0; i < ARRAY_SIZE(names); i++)
+ if (names[i].id == id)
+ return names[i].name;
+
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-ARRAY_SIZE-cleanup.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-ARRAY_SIZE-cleanup.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,23 @@
+Subject: m68k: ARRAY_SIZE() cleanup
+
+From: Alejandro Martinez Ruiz <alex at flawedcode.org>
+
+m68k: ARRAY_SIZE() cleanup
+
+Signed-off-by: Alejandro Martinez Ruiz <alex at flawedcode.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/amiga/amisound.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/m68k/amiga/amisound.c
++++ b/arch/m68k/amiga/amisound.c
+@@ -21,7 +21,7 @@ static const signed char sine_data[] = {
+ 0, 39, 75, 103, 121, 127, 121, 103, 75, 39,
+ 0, -39, -75, -103, -121, -127, -121, -103, -75, -39
+ };
+-#define DATA_SIZE (sizeof(sine_data)/sizeof(sine_data[0]))
++#define DATA_SIZE ARRAY_SIZE(sine_data)
+
+ #define custom amiga_custom
+
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-cc-cross-prefix.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-cc-cross-prefix.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,35 @@
+Subject: m68k: Use cc-cross-prefix
+
+From: Geert Uytterhoeven <geert at linux-m68k.org>
+
+m68k: Use cc-cross-prefix
+
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/Makefile | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -13,16 +13,15 @@
+ # Copyright (C) 1994 by Hamish Macdonald
+ #
+
+-# test for cross compiling
+-COMPILE_ARCH = $(shell uname -m)
+-
+ # override top level makefile
+ AS += -m68020
+ LDFLAGS := -m m68kelf
+ LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
+-ifneq ($(COMPILE_ARCH),$(ARCH))
+- # prefix for cross-compiling binaries
+- CROSS_COMPILE = m68k-linux-gnu-
++ifneq ($(SUBARCH),$(ARCH))
++ ifeq ($(CROSS_COMPILE),)
++ CROSS_COMPILE := $(call cc-cross-prefix, \
++ m68k-linux-gnu- m68k-linux- m68k-unknown-linux-gnu-)
++ endif
+ endif
+
+ ifdef CONFIG_SUN3
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-initrd-fix.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-initrd-fix.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,52 @@
+Subject: initrd: Fix virtual/physical mix-up in overwrite test
+
+From: Geert Uytterhoeven <geert at linux-m68k.org>
+
+On recent kernels, I get the following error when using an initrd:
+
+| initrd overwritten (0x00b78000 < 0x07668000) - disabling it.
+
+My Amiga 4000 has 12 MiB of RAM at physical address 0x07400000 (virtual
+0x00000000).
+The initrd is located at the end of RAM: 0x00b78000 - 0x00c00000 (virtual).
+The overwrite test compares the (virtual) initrd location to the (physical)
+first available memory location, which fails.
+
+This patch converts initrd_start to a page frame number, so it can be safely
+compared with min_low_pfn.
+
+Before the introduction of discontiguous memory support on m68k
+(12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
+untouched by the m68k-specific code (zero, I guess), and everything worked
+fine.
+
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+On several platforms, initrd_below_start_ok is set to 1:
+
+| arch/mips/kernel/setup.c: initrd_below_start_ok = 1;
+| arch/parisc/mm/init.c: initrd_below_start_ok = 1;
+| arch/powerpc/kernel/prom.c: initrd_below_start_ok = 1;
+| arch/ppc/platforms/hdpu.c: initrd_below_start_ok = 1;
+| arch/xtensa/kernel/setup.c: initrd_below_start_ok = 1;
+
+Some of these may be workarounds for this bug. Please check.
+
+ init/main.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/init/main.c
++++ b/init/main.c
+@@ -598,9 +598,10 @@ asmlinkage void __init start_kernel(void
+
+ #ifdef CONFIG_BLK_DEV_INITRD
+ if (initrd_start && !initrd_below_start_ok &&
+- initrd_start < min_low_pfn << PAGE_SHIFT) {
++ page_to_pfn(virt_to_page(initrd_start)) < min_low_pfn) {
+ printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
+- "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT);
++ "disabling it.\n",
++ page_to_pfn(virt_to_page(initrd_start)), min_low_pfn);
+ initrd_start = 0;
+ }
+ #endif
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-amiga-amiga_ksyms-c.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-amiga-amiga_ksyms-c.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,217 @@
+Subject: m68k: kill arch/m68k/amiga/amiga_ksyms.c
+
+From: Adrian Bunk <bunk at kernel.org>
+
+m68k: kill arch/m68k/amiga/amiga_ksyms.c
+
+EXPORT_SYMBOL's belong to the actual code.
+
+Signed-off-by: Adrian Bunk <bunk at kernel.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/amiga/Makefile | 2 +-
+ arch/m68k/amiga/amiga_ksyms.c | 33 ---------------------------------
+ arch/m68k/amiga/amisound.c | 3 +++
+ arch/m68k/amiga/chipram.c | 7 +++++++
+ arch/m68k/amiga/config.c | 12 ++++++++++++
+ arch/m68k/amiga/pcmcia.c | 9 +++++++++
+ 6 files changed, 32 insertions(+), 34 deletions(-)
+
+--- a/arch/m68k/amiga/Makefile
++++ b/arch/m68k/amiga/Makefile
+@@ -2,6 +2,6 @@
+ # Makefile for Linux arch/m68k/amiga source directory
+ #
+
+-obj-y := config.o amiints.o cia.o chipram.o amisound.o amiga_ksyms.o
++obj-y := config.o amiints.o cia.o chipram.o amisound.o
+
+ obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o
+--- a/arch/m68k/amiga/amiga_ksyms.c
++++ /dev/null
+@@ -1,33 +0,0 @@
+-#include <linux/module.h>
+-#include <linux/types.h>
+-#include <asm/ptrace.h>
+-#include <asm/amigahw.h>
+-#include <asm/amigaints.h>
+-#include <asm/amipcmcia.h>
+-
+-extern volatile u_short amiga_audio_min_period;
+-extern u_short amiga_audio_period;
+-
+-/*
+- * Add things here when you find the need for it.
+- */
+-EXPORT_SYMBOL(amiga_model);
+-EXPORT_SYMBOL(amiga_chipset);
+-EXPORT_SYMBOL(amiga_hw_present);
+-EXPORT_SYMBOL(amiga_eclock);
+-EXPORT_SYMBOL(amiga_colorclock);
+-EXPORT_SYMBOL(amiga_chip_alloc);
+-EXPORT_SYMBOL(amiga_chip_free);
+-EXPORT_SYMBOL(amiga_chip_avail);
+-EXPORT_SYMBOL(amiga_chip_size);
+-EXPORT_SYMBOL(amiga_audio_period);
+-EXPORT_SYMBOL(amiga_audio_min_period);
+-
+-#ifdef CONFIG_AMIGA_PCMCIA
+- EXPORT_SYMBOL(pcmcia_reset);
+- EXPORT_SYMBOL(pcmcia_copy_tuple);
+- EXPORT_SYMBOL(pcmcia_program_voltage);
+- EXPORT_SYMBOL(pcmcia_access_speed);
+- EXPORT_SYMBOL(pcmcia_write_enable);
+- EXPORT_SYMBOL(pcmcia_write_disable);
+-#endif
+--- a/arch/m68k/amiga/amisound.c
++++ b/arch/m68k/amiga/amisound.c
+@@ -12,6 +12,7 @@
+ #include <linux/timer.h>
+ #include <linux/init.h>
+ #include <linux/string.h>
++#include <linux/module.h>
+
+ #include <asm/system.h>
+ #include <asm/amigahw.h>
+@@ -31,6 +32,7 @@ static const signed char sine_data[] = {
+ */
+
+ volatile unsigned short amiga_audio_min_period = 124; /* Default for pre-OCS */
++EXPORT_SYMBOL(amiga_audio_min_period);
+
+ #define MAX_PERIOD (65535)
+
+@@ -40,6 +42,7 @@ volatile unsigned short amiga_audio_min_
+ */
+
+ unsigned short amiga_audio_period = MAX_PERIOD;
++EXPORT_SYMBOL(amiga_audio_period);
+
+ static unsigned long clock_constant;
+
+--- a/arch/m68k/amiga/chipram.c
++++ b/arch/m68k/amiga/chipram.c
+@@ -13,10 +13,13 @@
+ #include <linux/ioport.h>
+ #include <linux/slab.h>
+ #include <linux/string.h>
++#include <linux/module.h>
++
+ #include <asm/page.h>
+ #include <asm/amigahw.h>
+
+ unsigned long amiga_chip_size;
++EXPORT_SYMBOL(amiga_chip_size);
+
+ static struct resource chipram_res = {
+ .name = "Chip RAM", .start = CHIP_PHYSADDR
+@@ -67,6 +70,7 @@ void *amiga_chip_alloc(unsigned long siz
+ #endif
+ return (void *)ZTWO_VADDR(res->start);
+ }
++EXPORT_SYMBOL(amiga_chip_alloc);
+
+
+ /*
+@@ -120,6 +124,7 @@ void amiga_chip_free(void *ptr)
+ }
+ printk("amiga_chip_free: trying to free nonexistent region at %p\n", ptr);
+ }
++EXPORT_SYMBOL(amiga_chip_free);
+
+
+ unsigned long amiga_chip_avail(void)
+@@ -129,3 +134,5 @@ unsigned long amiga_chip_avail(void)
+ #endif
+ return chipavail;
+ }
++EXPORT_SYMBOL(amiga_chip_avail);
++
+--- a/arch/m68k/amiga/config.c
++++ b/arch/m68k/amiga/config.c
+@@ -23,6 +23,7 @@
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/zorro.h>
++#include <linux/module.h>
+
+ #include <asm/bootinfo.h>
+ #include <asm/setup.h>
+@@ -36,13 +37,24 @@
+ #include <asm/io.h>
+
+ unsigned long amiga_model;
++EXPORT_SYMBOL(amiga_model);
++
+ unsigned long amiga_eclock;
++EXPORT_SYMBOL(amiga_eclock);
++
+ unsigned long amiga_masterclock;
++
+ unsigned long amiga_colorclock;
++EXPORT_SYMBOL(amiga_colorclock);
++
+ unsigned long amiga_chipset;
++EXPORT_SYMBOL(amiga_chipset);
++
+ unsigned char amiga_vblank;
+ unsigned char amiga_psfreq;
++
+ struct amiga_hw_present amiga_hw_present;
++EXPORT_SYMBOL(amiga_hw_present);
+
+ static char s_a500[] __initdata = "A500";
+ static char s_a500p[] __initdata = "A500+";
+--- a/arch/m68k/amiga/pcmcia.c
++++ b/arch/m68k/amiga/pcmcia.c
+@@ -15,6 +15,8 @@
+ #include <linux/types.h>
+ #include <linux/jiffies.h>
+ #include <linux/timer.h>
++#include <linux/module.h>
++
+ #include <asm/amigayle.h>
+ #include <asm/amipcmcia.h>
+
+@@ -30,6 +32,7 @@ void pcmcia_reset(void)
+ while (time_before(jiffies, reset_start_time + 1*HZ/100));
+ b = gayle_reset;
+ }
++EXPORT_SYMBOL(pcmcia_reset);
+
+
+ /* copy a tuple, including tuple header. return nb bytes copied */
+@@ -61,6 +64,7 @@ int pcmcia_copy_tuple(unsigned char tupl
+
+ return 0;
+ }
++EXPORT_SYMBOL(pcmcia_copy_tuple);
+
+ void pcmcia_program_voltage(int voltage)
+ {
+@@ -84,6 +88,7 @@ void pcmcia_program_voltage(int voltage)
+ gayle.config = cfg_byte;
+
+ }
++EXPORT_SYMBOL(pcmcia_program_voltage);
+
+ void pcmcia_access_speed(int speed)
+ {
+@@ -101,13 +106,17 @@ void pcmcia_access_speed(int speed)
+ cfg_byte = (cfg_byte & 0xf3) | s;
+ gayle.config = cfg_byte;
+ }
++EXPORT_SYMBOL(pcmcia_access_speed);
+
+ void pcmcia_write_enable(void)
+ {
+ gayle.cardstatus = GAYLE_CS_WR|GAYLE_CS_DA;
+ }
++EXPORT_SYMBOL(pcmcia_write_enable);
+
+ void pcmcia_write_disable(void)
+ {
+ gayle.cardstatus = 0;
+ }
++EXPORT_SYMBOL(pcmcia_write_disable);
++
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-atari-atari_ksyms-c.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-atari-atari_ksyms-c.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,238 @@
+Subject: m68k: kill arch/m68k/atari/atari_ksyms.c
+
+From: Adrian Bunk <bunk at kernel.org>
+
+m68k: kill arch/m68k/atari/atari_ksyms.c
+
+EXPORT_SYMBOL's belong to the actual code.
+
+Signed-off-by: Adrian Bunk <bunk at kernel.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/atari/Makefile | 2 +-
+ arch/m68k/atari/ataints.c | 3 +++
+ arch/m68k/atari/atari_ksyms.c | 35 -----------------------------------
+ arch/m68k/atari/atasound.c | 2 ++
+ arch/m68k/atari/config.c | 11 +++++++++++
+ arch/m68k/atari/debug.c | 6 ++++++
+ arch/m68k/atari/stdma.c | 5 +++++
+ arch/m68k/atari/stram.c | 3 +++
+ 8 files changed, 31 insertions(+), 36 deletions(-)
+
+--- a/arch/m68k/atari/Makefile
++++ b/arch/m68k/atari/Makefile
+@@ -3,7 +3,7 @@
+ #
+
+ obj-y := config.o time.o debug.o ataints.o stdma.o \
+- atasound.o stram.o atari_ksyms.o
++ atasound.o stram.o
+
+ ifeq ($(CONFIG_PCI),y)
+ obj-$(CONFIG_HADES) += hades-pci.o
+--- a/arch/m68k/atari/ataints.c
++++ b/arch/m68k/atari/ataints.c
+@@ -40,6 +40,7 @@
+ #include <linux/kernel_stat.h>
+ #include <linux/init.h>
+ #include <linux/seq_file.h>
++#include <linux/module.h>
+
+ #include <asm/system.h>
+ #include <asm/traps.h>
+@@ -446,6 +447,7 @@ unsigned long atari_register_vme_int(voi
+ free_vme_vec_bitmap |= 1 << i;
+ return VME_SOURCE_BASE + i;
+ }
++EXPORT_SYMBOL(atari_register_vme_int);
+
+
+ void atari_unregister_vme_int(unsigned long irq)
+@@ -455,5 +457,6 @@ void atari_unregister_vme_int(unsigned l
+ free_vme_vec_bitmap &= ~(1 << irq);
+ }
+ }
++EXPORT_SYMBOL(atari_unregister_vme_int);
+
+
+--- a/arch/m68k/atari/atari_ksyms.c
++++ /dev/null
+@@ -1,35 +0,0 @@
+-#include <linux/module.h>
+-
+-#include <asm/ptrace.h>
+-#include <asm/traps.h>
+-#include <asm/atarihw.h>
+-#include <asm/atariints.h>
+-#include <asm/atarikb.h>
+-#include <asm/atari_joystick.h>
+-#include <asm/atari_stdma.h>
+-#include <asm/atari_stram.h>
+-
+-extern void atari_microwire_cmd( int cmd );
+-extern int atari_MFP_init_done;
+-extern int atari_SCC_init_done;
+-extern int atari_SCC_reset_done;
+-
+-EXPORT_SYMBOL(atari_mch_cookie);
+-EXPORT_SYMBOL(atari_mch_type);
+-EXPORT_SYMBOL(atari_hw_present);
+-EXPORT_SYMBOL(atari_switches);
+-EXPORT_SYMBOL(atari_dont_touch_floppy_select);
+-EXPORT_SYMBOL(atari_register_vme_int);
+-EXPORT_SYMBOL(atari_unregister_vme_int);
+-EXPORT_SYMBOL(stdma_lock);
+-EXPORT_SYMBOL(stdma_release);
+-EXPORT_SYMBOL(stdma_others_waiting);
+-EXPORT_SYMBOL(stdma_islocked);
+-EXPORT_SYMBOL(atari_stram_alloc);
+-EXPORT_SYMBOL(atari_stram_free);
+-
+-EXPORT_SYMBOL(atari_MFP_init_done);
+-EXPORT_SYMBOL(atari_SCC_init_done);
+-EXPORT_SYMBOL(atari_SCC_reset_done);
+-
+-EXPORT_SYMBOL(atari_microwire_cmd);
+--- a/arch/m68k/atari/atasound.c
++++ b/arch/m68k/atari/atasound.c
+@@ -22,6 +22,7 @@
+ #include <linux/fcntl.h>
+ #include <linux/errno.h>
+ #include <linux/mm.h>
++#include <linux/module.h>
+
+ #include <asm/atarihw.h>
+ #include <asm/system.h>
+@@ -43,6 +44,7 @@ void atari_microwire_cmd (int cmd)
+ while( tt_microwire.mask != 0x7ff)
+ ;
+ }
++EXPORT_SYMBOL(atari_microwire_cmd);
+
+
+ /* PSG base frequency */
+--- a/arch/m68k/atari/config.c
++++ b/arch/m68k/atari/config.c
+@@ -31,6 +31,7 @@
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
+ #include <linux/vt_kern.h>
++#include <linux/module.h>
+
+ #include <asm/bootinfo.h>
+ #include <asm/setup.h>
+@@ -43,10 +44,20 @@
+ #include <asm/io.h>
+
+ u_long atari_mch_cookie;
++EXPORT_SYMBOL(atari_mch_cookie);
++
+ u_long atari_mch_type;
++EXPORT_SYMBOL(atari_mch_type);
++
+ struct atari_hw_present atari_hw_present;
++EXPORT_SYMBOL(atari_hw_present);
++
+ u_long atari_switches;
++EXPORT_SYMBOL(atari_switches);
++
+ int atari_dont_touch_floppy_select;
++EXPORT_SYMBOL(atari_dont_touch_floppy_select);
++
+ int atari_rtc_year_offset;
+
+ /* local function prototypes */
+--- a/arch/m68k/atari/debug.c
++++ b/arch/m68k/atari/debug.c
+@@ -15,17 +15,23 @@
+ #include <linux/console.h>
+ #include <linux/init.h>
+ #include <linux/delay.h>
++#include <linux/module.h>
+
+ #include <asm/atarihw.h>
+ #include <asm/atariints.h>
+
+ /* Flag that Modem1 port is already initialized and used */
+ int atari_MFP_init_done;
++EXPORT_SYMBOL(atari_MFP_init_done);
++
+ /* Flag that Modem1 port is already initialized and used */
+ int atari_SCC_init_done;
++EXPORT_SYMBOL(atari_SCC_init_done);
++
+ /* Can be set somewhere, if a SCC master reset has already be done and should
+ * not be repeated; used by kgdb */
+ int atari_SCC_reset_done;
++EXPORT_SYMBOL(atari_SCC_reset_done);
+
+ static struct console atari_console_driver = {
+ .name = "debug",
+--- a/arch/m68k/atari/stdma.c
++++ b/arch/m68k/atari/stdma.c
+@@ -35,6 +35,7 @@
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/wait.h>
++#include <linux/module.h>
+
+ #include <asm/atari_stdma.h>
+ #include <asm/atariints.h>
+@@ -91,6 +92,7 @@ void stdma_lock(irq_handler_t handler, v
+ stdma_isr_data = data;
+ local_irq_restore(flags);
+ }
++EXPORT_SYMBOL(stdma_lock);
+
+
+ /*
+@@ -117,6 +119,7 @@ void stdma_release(void)
+
+ local_irq_restore(flags);
+ }
++EXPORT_SYMBOL(stdma_release);
+
+
+ /*
+@@ -134,6 +137,7 @@ int stdma_others_waiting(void)
+ {
+ return waitqueue_active(&stdma_wait);
+ }
++EXPORT_SYMBOL(stdma_others_waiting);
+
+
+ /*
+@@ -155,6 +159,7 @@ int stdma_islocked(void)
+ {
+ return stdma_locked;
+ }
++EXPORT_SYMBOL(stdma_islocked);
+
+
+ /*
+--- a/arch/m68k/atari/stram.c
++++ b/arch/m68k/atari/stram.c
+@@ -20,6 +20,7 @@
+ #include <linux/bootmem.h>
+ #include <linux/mount.h>
+ #include <linux/blkdev.h>
++#include <linux/module.h>
+
+ #include <asm/setup.h>
+ #include <asm/machdep.h>
+@@ -208,6 +209,7 @@ void *atari_stram_alloc(long size, const
+ }
+ return( addr );
+ }
++EXPORT_SYMBOL(atari_stram_alloc);
+
+ void atari_stram_free( void *addr )
+
+@@ -237,6 +239,7 @@ void atari_stram_free( void *addr )
+ printk( KERN_ERR "atari_stram_free: cannot free block at %p "
+ "(called from %p)\n", addr, __builtin_return_address(0) );
+ }
++EXPORT_SYMBOL(atari_stram_free);
+
+
+ /* ------------------------------------------------------------------------ */
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-hp300-ksyms-c.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-hp300-ksyms-c.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,35 @@
+Subject: m68k: kill arch/m68k/hp300/ksyms.c
+
+From: Adrian Bunk <bunk at kernel.org>
+
+m68k: kill arch/m68k/hp300/ksyms.c
+
+It was empty.
+
+Signed-off-by: Adrian Bunk <bunk at kernel.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/hp300/Makefile | 2 +-
+ arch/m68k/hp300/ksyms.c | 9 ---------
+ 2 files changed, 1 insertion(+), 10 deletions(-)
+
+--- a/arch/m68k/hp300/Makefile
++++ b/arch/m68k/hp300/Makefile
+@@ -2,4 +2,4 @@
+ # Makefile for Linux arch/m68k/hp300 source directory
+ #
+
+-obj-y := ksyms.o config.o time.o reboot.o
++obj-y := config.o time.o reboot.o
+--- a/arch/m68k/hp300/ksyms.c
++++ /dev/null
+@@ -1,9 +0,0 @@
+-/*
+- * linux/arch/m68k/hp300/ksyms.c
+- *
+- * Copyright (C) 1998 Philip Blundell <philb at gnu.org>
+- *
+- * This file contains the HP300-specific kernel symbols. None yet. :-)
+- */
+-
+-#include <linux/module.h>
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mac-mac_ksyms-c.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mac-mac_ksyms-c.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,56 @@
+Subject: m68k: kill arch/m68k/mac/mac_ksyms.c
+
+From: Adrian Bunk <bunk at kernel.org>
+
+m68k: kill arch/m68k/mac/mac_ksyms.c
+
+EXPORT_SYMBOL's belong to the actual code.
+
+Signed-off-by: Adrian Bunk <bunk at kernel.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/mac/Makefile | 2 +-
+ arch/m68k/mac/mac_ksyms.c | 8 --------
+ arch/m68k/mac/via.c | 5 ++++-
+ 3 files changed, 5 insertions(+), 10 deletions(-)
+
+--- a/arch/m68k/mac/Makefile
++++ b/arch/m68k/mac/Makefile
+@@ -3,4 +3,4 @@
+ #
+
+ obj-y := config.o bootparse.o macints.o iop.o via.o oss.o psc.o \
+- baboon.o macboing.o debug.o misc.o mac_ksyms.o
++ baboon.o macboing.o debug.o misc.o
+--- a/arch/m68k/mac/mac_ksyms.c
++++ /dev/null
+@@ -1,8 +0,0 @@
+-#include <linux/module.h>
+-#include <asm/ptrace.h>
+-#include <asm/traps.h>
+-
+-/* Says whether we're using A/UX interrupts or not */
+-extern int via_alt_mapping;
+-
+-EXPORT_SYMBOL(via_alt_mapping);
+--- a/arch/m68k/mac/via.c
++++ b/arch/m68k/mac/via.c
+@@ -28,6 +28,7 @@
+ #include <linux/delay.h>
+ #include <linux/init.h>
+ #include <linux/ide.h>
++#include <linux/module.h>
+
+ #include <asm/bootinfo.h>
+ #include <asm/macintosh.h>
+@@ -41,7 +42,9 @@ volatile __u8 *via1, *via2;
+ /* See note in mac_via.h about how this is possibly not useful */
+ volatile long *via_memory_bogon=(long *)&via_memory_bogon;
+ #endif
+-int rbv_present, via_alt_mapping;
++int rbv_present;
++int via_alt_mapping;
++EXPORT_SYMBOL(via_alt_mapping);
+ __u8 rbv_clear;
+
+ /*
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mvme16x-mvme16x_ksyms-c.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mvme16x-mvme16x_ksyms-c.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,51 @@
+Subject: m68k: kill arch/m68k/mvme16x/mvme16x_ksyms.c
+
+From: Adrian Bunk <bunk at kernel.org>
+
+m68k: kill arch/m68k/mvme16x/mvme16x_ksyms.c
+
+EXPORT_SYMBOL's belong to the actual code.
+
+Signed-off-by: Adrian Bunk <bunk at kernel.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/mvme16x/Makefile | 2 +-
+ arch/m68k/mvme16x/config.c | 2 ++
+ arch/m68k/mvme16x/mvme16x_ksyms.c | 6 ------
+ 3 files changed, 3 insertions(+), 7 deletions(-)
+
+--- a/arch/m68k/mvme16x/Makefile
++++ b/arch/m68k/mvme16x/Makefile
+@@ -2,4 +2,4 @@
+ # Makefile for Linux arch/m68k/mvme16x source directory
+ #
+
+-obj-y := config.o rtc.o mvme16x_ksyms.o
++obj-y := config.o rtc.o
+--- a/arch/m68k/mvme16x/config.c
++++ b/arch/m68k/mvme16x/config.c
+@@ -25,6 +25,7 @@
+ #include <linux/genhd.h>
+ #include <linux/rtc.h>
+ #include <linux/interrupt.h>
++#include <linux/module.h>
+
+ #include <asm/bootinfo.h>
+ #include <asm/system.h>
+@@ -58,6 +59,7 @@ static irq_handler_t tick_handler;
+
+
+ unsigned short mvme16x_config;
++EXPORT_SYMBOL(mvme16x_config);
+
+
+ int mvme16x_parse_bootinfo(const struct bi_record *bi)
+--- a/arch/m68k/mvme16x/mvme16x_ksyms.c
++++ /dev/null
+@@ -1,6 +0,0 @@
+-#include <linux/module.h>
+-#include <linux/types.h>
+-#include <asm/ptrace.h>
+-#include <asm/mvme16xhw.h>
+-
+-EXPORT_SYMBOL(mvme16x_config);
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-add-nubus-card-definitions-and-a-typo-fix.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-add-nubus-card-definitions-and-a-typo-fix.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,28 @@
+Subject: mac68k: add nubus card definitions and a typo fix
+
+From: Finn Thain <fthain at telegraphics.com.au>
+
+Add some new card definitions and fix a typo (from Eugen Paiuc).
+
+Signed-off-by: Finn Thain <fthain at telegraphics.com.au>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ include/linux/nubus.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/include/linux/nubus.h
++++ b/include/linux/nubus.h
+@@ -132,10 +132,12 @@ enum nubus_drhw {
+ NUBUS_DRHW_RDIUS_DCGX = 0x027C, /* Radius DirectColor/GX */
+ NUBUS_DRHW_RDIUS_PC8 = 0x0291, /* Radius PrecisionColor 8 */
+ NUBUS_DRHW_LAPIS_PCS8 = 0x0292, /* Lapis ProColorServer 8 */
+- NUBUS_DRHW_RASTER_24LXI = 0x02A0, /* RasterOps 8/24 XLi */
++ NUBUS_DRHW_RASTER_24XLI = 0x02A0, /* RasterOps 8/24 XLi */
+ NUBUS_DRHW_RASTER_PBPGT = 0x02A5, /* RasterOps PaintBoard Prism GT */
+ NUBUS_DRHW_EMACH_FSX = 0x02AE, /* E-Machines Futura SX */
++ NUBUS_DRHW_RASTER_24XLTV = 0x02B7, /* RasterOps 24XLTV */
+ NUBUS_DRHW_SMAC_THUND24 = 0x02CB, /* SuperMac Thunder/24 */
++ NUBUS_DRHW_SMAC_THUNDLGHT = 0x03D9, /* SuperMac ThunderLight */
+ NUBUS_DRHW_RDIUS_PC24XP = 0x0406, /* Radius PrecisionColor 24Xp */
+ NUBUS_DRHW_RDIUS_PC24X = 0x040A, /* Radius PrecisionColor 24X */
+ NUBUS_DRHW_RDIUS_PC8XJ = 0x040B, /* Radius PrecisionColor 8XJ */
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-macii-adb-comment-correction.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-macii-adb-comment-correction.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,23 @@
+Subject: mac68k: macii adb comment correction
+
+From: Finn Thain <fthain at telegraphics.com.au>
+
+Corrects a mistake I made in a comment.
+
+Signed-off-by: Finn Thain <fthain at telegraphics.com.au>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ drivers/macintosh/via-macii.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/macintosh/via-macii.c
++++ b/drivers/macintosh/via-macii.c
+@@ -111,7 +111,7 @@ static enum macii_state {
+ static struct adb_request *current_req; /* first request struct in the queue */
+ static struct adb_request *last_req; /* last request struct in the queue */
+ static unsigned char reply_buf[16]; /* storage for autopolled replies */
+-static unsigned char *reply_ptr; /* next byte in req->data or reply_buf */
++static unsigned char *reply_ptr; /* next byte in reply_buf or req->reply */
+ static int reading_reply; /* store reply in reply_buf else req->reply */
+ static int data_index; /* index of the next byte to send from req->data */
+ static int reply_len; /* number of bytes received in reply_buf or req->reply */
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-remove-dead-MAC_ADBKEYCODES.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-remove-dead-MAC_ADBKEYCODES.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,50 @@
+Subject: mac68k: remove dead MAC_ADBKEYCODES
+
+From: Stanislav Brabec <sbrabec at suse.cz>
+
+It seems, that current kernel source code contains no traces of
+MAC_ADBKEYCODES and no reference to keyboard_sends_linux_keycodes any
+more.
+
+Attached patch removes them from configuration files.
+
+Signed-off-by: Stanislav Brabec <sbrabec at suse.cz>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/Kconfig | 14 --------------
+ arch/m68k/configs/mac_defconfig | 1 -
+ 2 files changed, 15 deletions(-)
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -582,20 +582,6 @@ config MAC_HID
+ depends on INPUT_ADBHID
+ default y
+
+-config MAC_ADBKEYCODES
+- bool "Support for ADB raw keycodes"
+- depends on INPUT_ADBHID
+- help
+- This provides support for sending raw ADB keycodes to console
+- devices. This is the default up to 2.4.0, but in future this may be
+- phased out in favor of generic Linux keycodes. If you say Y here,
+- you can dynamically switch via the
+- /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes
+- sysctl and with the "keyboard_sends_linux_keycodes=" kernel
+- argument.
+-
+- If unsure, say Y here.
+-
+ config ADB_KEYBOARD
+ bool "Support for ADB keyboard (old driver)"
+ depends on MAC && !INPUT_ADBHID
+--- a/arch/m68k/configs/mac_defconfig
++++ b/arch/m68k/configs/mac_defconfig
+@@ -678,7 +678,6 @@ CONFIG_LOGO_MAC_CLUT224=y
+ #
+ CONFIG_MAC_SCC=y
+ CONFIG_MAC_HID=y
+-CONFIG_MAC_ADBKEYCODES=y
+ CONFIG_SERIAL_CONSOLE=y
+
+ #
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-remove-dead-code.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/mac68k-remove-dead-code.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,35 @@
+Subject: mac68k: remove dead code
+
+From: Finn Thain <fthain at telegraphics.com.au>
+
+Remove dead code.
+
+Signed-off-by: Finn Thain <fthain at telegraphics.com.au>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/mac/config.c | 2 --
+ include/asm-m68k/macintosh.h | 2 --
+ 2 files changed, 4 deletions(-)
+
+--- a/arch/m68k/mac/config.c
++++ b/arch/m68k/mac/config.c
+@@ -58,8 +58,6 @@ extern struct mem_info m68k_memory[NUM_M
+
+ extern struct mem_info m68k_ramdisk;
+
+-extern char m68k_command_line[CL_SIZE];
+-
+ void *mac_env; /* Loaded by the boot asm */
+
+ /* The phys. video addr. - might be bogus on some machines */
+--- a/include/asm-m68k/macintosh.h
++++ b/include/asm-m68k/macintosh.h
+@@ -14,8 +14,6 @@ extern void mac_init_IRQ(void);
+ extern int mac_irq_pending(unsigned int);
+ extern void mac_identify(void);
+ extern void mac_report_hardware(void);
+-extern void mac_debugging_penguin(int);
+-extern void mac_boom(int);
+
+ /*
+ * Floppy driver magic hook - probably shouldnt be here
Added: dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/nubus-kill-drivers-nubus-nubus_syms-c.diff
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/m68k/2.6.24/nubus-kill-drivers-nubus-nubus_syms-c.diff Tue Jan 8 22:54:40 2008
@@ -0,0 +1,188 @@
+Subject: nubus: kill drivers/nubus/nubus_syms.c
+
+From: Adrian Bunk <bunk at kernel.org>
+
+nubus: kill drivers/nubus/nubus_syms.c
+
+EXPORT_SYMBOL's belong to the actual code.
+
+Signed-off-by: Adrian Bunk <bunk at kernel.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ drivers/nubus/Makefile | 1 -
+ drivers/nubus/nubus.c | 13 +++++++++++++
+ drivers/nubus/nubus_syms.c | 28 ----------------------------
+ drivers/nubus/proc.c | 4 ++++
+ 4 files changed, 17 insertions(+), 29 deletions(-)
+
+--- a/drivers/nubus/Makefile
++++ b/drivers/nubus/Makefile
+@@ -4,5 +4,4 @@
+
+ obj-y := nubus.o
+
+-obj-$(CONFIG_MODULES) += nubus_syms.o
+ obj-$(CONFIG_PROC_FS) += proc.o
+--- a/drivers/nubus/nubus.c
++++ b/drivers/nubus/nubus.c
+@@ -14,6 +14,7 @@
+ #include <linux/errno.h>
+ #include <linux/init.h>
+ #include <linux/delay.h>
++#include <linux/module.h>
+ #include <asm/setup.h>
+ #include <asm/system.h>
+ #include <asm/page.h>
+@@ -186,6 +187,7 @@ void nubus_get_rsrc_mem(void *dest, cons
+ len--;
+ }
+ }
++EXPORT_SYMBOL(nubus_get_rsrc_mem);
+
+ void nubus_get_rsrc_str(void *dest, const struct nubus_dirent* dirent,
+ int len)
+@@ -200,6 +202,7 @@ void nubus_get_rsrc_str(void *dest, cons
+ len--;
+ }
+ }
++EXPORT_SYMBOL(nubus_get_rsrc_str);
+
+ int nubus_get_root_dir(const struct nubus_board* board,
+ struct nubus_dir* dir)
+@@ -209,6 +212,7 @@ int nubus_get_root_dir(const struct nubu
+ dir->mask = board->lanes;
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_get_root_dir);
+
+ /* This is a slyly renamed version of the above */
+ int nubus_get_func_dir(const struct nubus_dev* dev,
+@@ -219,6 +223,7 @@ int nubus_get_func_dir(const struct nubu
+ dir->mask = dev->board->lanes;
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_get_func_dir);
+
+ int nubus_get_board_dir(const struct nubus_board* board,
+ struct nubus_dir* dir)
+@@ -237,6 +242,7 @@ int nubus_get_board_dir(const struct nub
+ return -1;
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_get_board_dir);
+
+ int nubus_get_subdir(const struct nubus_dirent *ent,
+ struct nubus_dir *dir)
+@@ -246,6 +252,7 @@ int nubus_get_subdir(const struct nubus_
+ dir->mask = ent->mask;
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_get_subdir);
+
+ int nubus_readdir(struct nubus_dir *nd, struct nubus_dirent *ent)
+ {
+@@ -274,12 +281,14 @@ int nubus_readdir(struct nubus_dir *nd,
+ ent->mask = nd->mask;
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_readdir);
+
+ int nubus_rewinddir(struct nubus_dir* dir)
+ {
+ dir->ptr = dir->base;
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_rewinddir);
+
+ /* Driver interface functions, more or less like in pci.c */
+
+@@ -303,6 +312,7 @@ nubus_find_device(unsigned short categor
+ }
+ return NULL;
+ }
++EXPORT_SYMBOL(nubus_find_device);
+
+ struct nubus_dev*
+ nubus_find_type(unsigned short category,
+@@ -320,6 +330,7 @@ nubus_find_type(unsigned short category,
+ }
+ return NULL;
+ }
++EXPORT_SYMBOL(nubus_find_type);
+
+ struct nubus_dev*
+ nubus_find_slot(unsigned int slot,
+@@ -335,6 +346,7 @@ nubus_find_slot(unsigned int slot,
+ }
+ return NULL;
+ }
++EXPORT_SYMBOL(nubus_find_slot);
+
+ int
+ nubus_find_rsrc(struct nubus_dir* dir, unsigned char rsrc_type,
+@@ -346,6 +358,7 @@ nubus_find_rsrc(struct nubus_dir* dir, u
+ }
+ return -1;
+ }
++EXPORT_SYMBOL(nubus_find_rsrc);
+
+ /* Initialization functions - decide which slots contain stuff worth
+ looking at, and print out lots and lots of information from the
+--- a/drivers/nubus/nubus_syms.c
++++ /dev/null
+@@ -1,28 +0,0 @@
+-/* Exported symbols for NuBus services
+-
+- (c) 1999 David Huggins-Daines <dhd at debian.org> */
+-
+-#include <linux/module.h>
+-#include <linux/types.h>
+-#include <linux/nubus.h>
+-
+-#ifdef CONFIG_PROC_FS
+-EXPORT_SYMBOL(nubus_proc_attach_device);
+-EXPORT_SYMBOL(nubus_proc_detach_device);
+-#endif
+-
+-MODULE_LICENSE("GPL");
+-
+-EXPORT_SYMBOL(nubus_find_device);
+-EXPORT_SYMBOL(nubus_find_type);
+-EXPORT_SYMBOL(nubus_find_slot);
+-EXPORT_SYMBOL(nubus_get_root_dir);
+-EXPORT_SYMBOL(nubus_get_board_dir);
+-EXPORT_SYMBOL(nubus_get_func_dir);
+-EXPORT_SYMBOL(nubus_readdir);
+-EXPORT_SYMBOL(nubus_find_rsrc);
+-EXPORT_SYMBOL(nubus_rewinddir);
+-EXPORT_SYMBOL(nubus_get_subdir);
+-EXPORT_SYMBOL(nubus_get_rsrc_mem);
+-EXPORT_SYMBOL(nubus_get_rsrc_str);
+-
+--- a/drivers/nubus/proc.c
++++ b/drivers/nubus/proc.c
+@@ -22,6 +22,8 @@
+ #include <linux/nubus.h>
+ #include <linux/proc_fs.h>
+ #include <linux/init.h>
++#include <linux/module.h>
++
+ #include <asm/uaccess.h>
+ #include <asm/byteorder.h>
+
+@@ -140,6 +142,7 @@ int nubus_proc_attach_device(struct nubu
+
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_proc_attach_device);
+
+ /* FIXME: this is certainly broken! */
+ int nubus_proc_detach_device(struct nubus_dev *dev)
+@@ -154,6 +157,7 @@ int nubus_proc_detach_device(struct nubu
+ }
+ return 0;
+ }
++EXPORT_SYMBOL(nubus_proc_detach_device);
+
+ void __init proc_bus_nubus_add_devices(void)
+ {
Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1-extra
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1-extra (original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1-extra Tue Jan 8 22:54:40 2008
@@ -1,2 +1,22 @@
+ features/all/vserver/vs2.2.0-rc5.patch *_vserver *_xen-vserver
+ features/all/vserver/bindmount-dev.patch *_vserver *_xen-vserver
++ bugfix/m68k/2.6.24/m68k-cc-cross-prefix.diff
++ bugfix/m68k/2.6.24/m68k-initrd-fix.diff
++ bugfix/m68k/2.6.24/m68k-ARRAY_SIZE-cleanup.diff
++ bugfix/m68k/2.6.24/dio-ARRAY_SIZE-cleanup.diff
++ bugfix/m68k/2.6.24/atari-hades-pci-balance-iomap-and-iounmap.diff
++ bugfix/m68k/2.6.24/nubus-kill-drivers-nubus-nubus_syms-c.diff
++ bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mac-mac_ksyms-c.diff
++ bugfix/m68k/2.6.24/m68k-kill-arch-m68k-hp300-ksyms-c.diff
++ bugfix/m68k/2.6.24/m68k-kill-arch-m68k-amiga-amiga_ksyms-c.diff
++ bugfix/m68k/2.6.24/m68k-kill-arch-m68k-atari-atari_ksyms-c.diff
++ bugfix/m68k/2.6.24/m68k-kill-arch-m68k-mvme16x-mvme16x_ksyms-c.diff
++ bugfix/m68k/2.6.24/mac68k-macii-adb-comment-correction.diff
++ bugfix/m68k/2.6.24/mac68k-remove-dead-code.diff
++ bugfix/m68k/2.6.24/mac68k-add-nubus-card-definitions-and-a-typo-fix.diff
++ bugfix/m68k/2.6.24/mac68k-remove-dead-MAC_ADBKEYCODES.diff
++ bugfix/m68k/2.6.24/633-atari_scc.diff
++ bugfix/m68k/2.6.24/130-adbraw.diff
++ bugfix/m68k/2.6.24/133-arch.diff
++ bugfix/m68k/2.6.24/134-atari-fat.diff
++ bugfix/m68k/2.6.24/141-ide.diff
More information about the Kernel-svn-changes
mailing list