aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2005-12-23 10:38:32 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2005-12-23 10:38:32 -0800
commit358ab939884962f98c4143756a8c42943e77be12 (patch)
tree4fbd563bd3e8bddaf9553a99c22aa9db4cedfb2a /driver
parentc0daf3a9bc6b3aaa611df9f6370fa493937fdf09 (diff)
downloadpatches-358ab939884962f98c4143756a8c42943e77be12.tar.gz
added new usb drivers, dropped speakup as I don't have the time for it now.
Diffstat (limited to 'driver')
-rw-r--r--driver/speakup-build-fix.patch31
-rw-r--r--driver/speakup-core.patch9124
-rw-r--r--driver/speakup-docs.patch411
-rw-r--r--driver/speakup-kconfig-fix.patch35
4 files changed, 0 insertions, 9601 deletions
diff --git a/driver/speakup-build-fix.patch b/driver/speakup-build-fix.patch
deleted file mode 100644
index aee4cda4c814e..0000000000000
--- a/driver/speakup-build-fix.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From akpm@osdl.org Fri Jul 8 23:55:58 2005
-Message-Id: <200507090653.j696rgG3020431@shell0.pdx.osdl.net>
-Subject: SPEAKUP: build fix
-To: akpm@osdl.org, greg@kroah.com, mm-commits@vger.kernel.org
-From: akpm@osdl.org
-Date: Fri, 08 Jul 2005 23:53:05 -0700
-
-
-From: Andrew Morton <akpm@osdl.org>
-
-drivers/char/speakup/speakup.c:81: error: static declaration of 'errno' follows non-static declaration
-include/linux/unistd.h:4: error: previous declaration of 'errno' was here
-
-Signed-off-by: Andrew Morton <akpm@osdl.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
-
----
- drivers/char/speakup/speakup.c | 1 -
- 1 file changed, 1 deletion(-)
-
---- gregkh-2.6.orig/drivers/char/speakup/speakup.c
-+++ gregkh-2.6/drivers/char/speakup/speakup.c
-@@ -78,7 +78,6 @@ extern short punc_masks[];
- static special_func special_handler = NULL;
- special_func help_handler = NULL;
-
--static int errno;
- int synth_file_inuse = 0;
- short pitch_shift = 0, synth_flags = 0;
- static char buf[256];
diff --git a/driver/speakup-core.patch b/driver/speakup-core.patch
deleted file mode 100644
index 52d85fe129147..0000000000000
--- a/driver/speakup-core.patch
+++ /dev/null
@@ -1,9124 +0,0 @@
-This still needs lots of work before it can hit mainline...
-
-
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
- MAINTAINERS | 7
- arch/arm/Kconfig | 1
- drivers/Kconfig | 2
- drivers/Makefile | 4
- drivers/char/Makefile | 1
- drivers/char/consolemap.c | 1
- drivers/char/keyboard.c | 44
- drivers/char/speakup/Kconfig | 211 ++
- drivers/char/speakup/Makefile | 36
- drivers/char/speakup/cvsversion.h | 1
- drivers/char/speakup/dtload.c | 554 +++++++
- drivers/char/speakup/dtload.h | 57
- drivers/char/speakup/dtpc_reg.h | 132 +
- drivers/char/speakup/genmap.c | 204 ++
- drivers/char/speakup/keyinfo.h | 119 +
- drivers/char/speakup/makemapdata.c | 156 ++
- drivers/char/speakup/mapdata.h | 238 +++
- drivers/char/speakup/mod_code.c | 25
- drivers/char/speakup/serialio.h | 18
- drivers/char/speakup/speakup.c | 2281 +++++++++++++++++++++++++++++++
- drivers/char/speakup/speakup_acnt.h | 16
- drivers/char/speakup/speakup_acntpc.c | 160 ++
- drivers/char/speakup/speakup_acntsa.c | 184 ++
- drivers/char/speakup/speakup_apollo.c | 195 ++
- drivers/char/speakup/speakup_audptr.c | 201 ++
- drivers/char/speakup/speakup_bns.c | 174 ++
- drivers/char/speakup/speakup_decext.c | 205 ++
- drivers/char/speakup/speakup_decpc.c | 242 +++
- drivers/char/speakup/speakup_dectlk.c | 221 +++
- drivers/char/speakup/speakup_drvcommon.c | 879 +++++++++++
- drivers/char/speakup/speakup_dtlk.c | 219 ++
- drivers/char/speakup/speakup_dtlk.h | 54
- drivers/char/speakup/speakup_keyhelp.c | 294 +++
- drivers/char/speakup/speakup_keypc.c | 189 ++
- drivers/char/speakup/speakup_ltlk.c | 215 ++
- drivers/char/speakup/speakup_sftsyn.c | 175 ++
- drivers/char/speakup/speakup_spkout.c | 188 ++
- drivers/char/speakup/speakup_txprt.c | 195 ++
- drivers/char/speakup/speakupconf | 51
- drivers/char/speakup/speakupmap.h | 64
- drivers/char/speakup/speakupmap.map | 91 +
- drivers/char/speakup/spk_con_module.h | 43
- drivers/char/speakup/spk_priv.h | 258 +++
- drivers/char/speakup/synthlist.h | 54
- drivers/char/vt.c | 16
- include/linux/keyboard.h | 2
- include/linux/speakup.h | 33
- 47 files changed, 8701 insertions(+), 9 deletions(-)
-
----
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/cvsversion.h
-@@ -0,0 +1 @@
-+#define CVSVERSION " CVS: Wed Mar 2 20:22:02 EST 2005 "
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/dtload.c
-@@ -0,0 +1,554 @@
-+/*
-+ * This is the DECtalk PC firmware loader for the Linux kernel, version 1.0
-+ *
-+ * Original 386BSD source:
-+ * Copyright ( c ) 1996 Brian Buhrow <buhrow@lothlorien.nfbcal.org>
-+ *
-+ * Adapted for Linux:
-+ * Copyright ( c ) 1997 Nicolas Pitre <nico@cam.org>
-+ *
-+ * Adapted for speakup:
-+ * Copyright ( c ) 2003 David Borowski <david575@golden.net>
-+ *
-+ * All rights reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * ( at your option ) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <malloc.h>
-+#include <sys/errno.h>
-+#include <asm/io.h>
-+#include "dtload.h"
-+#include "dtpc_reg.h"
-+
-+#define dt_delay(x) usleep(x)
-+int verbose = 0, intest = 0,infd = -1;
-+int image_len, total_paras;
-+int dt_stat, dma_state = 0, has_kernel = 0;
-+struct dos_reloc fixups[512];
-+char *read_buff = NULL;
-+struct dos_exe_header header;
-+u_short iobase = 0x350;
-+
-+static inline int dt_getstatus( )
-+{
-+ dt_stat = inb_p( iobase )|(inb_p( iobase+1 )<<8);
-+ return dt_stat;
-+}
-+
-+static void dt_sendcmd( u_int cmd )
-+{
-+ outb_p( cmd & 0xFF, iobase );
-+ outb_p( (cmd>>8) & 0xFF, iobase+1 );
-+}
-+
-+static int dt_waitbit( int bit )
-+{
-+ int timeout = 100;
-+ while ( --timeout > 0 ) {
-+ if( (dt_getstatus( ) & bit ) == bit ) return 1;
-+ usleep( 1000 );
-+ }
-+ return 0;
-+}
-+
-+static int dt_sendcmd_wait( u_int cmd, int bit )
-+{
-+ int timeout = 1000;
-+ outb_p( cmd & 0xFF, iobase );
-+ outb_p( (cmd>>8) & 0xFF, iobase+1 );
-+ while ( --timeout > 0 ) {
-+ if( (dt_getstatus( ) & bit ) == bit ) return 1;
-+ usleep( 1000 );
-+ }
-+ return 0;
-+}
-+
-+static int dt_waitmode( int pattern )
-+{
-+ int timeout = 1000;
-+ while ( --timeout > 0 ) {
-+ if( dt_getstatus( ) == pattern ) return 1;
-+ usleep( 1000 );
-+ }
-+ fprintf( stderr, "waitmode p=%x s = %x\n", pattern, dt_stat );
-+ return 0;
-+}
-+
-+static int dt_wait_dma( )
-+{
-+ int timeout = 1000, state = dma_state;
-+ if( !has_kernel ){
-+ dt_delay( 500 );
-+ return( dt_waitbit( STAT_dma_ready ) );
-+ }
-+ if( ! dt_waitbit( STAT_dma_ready ) ) return 0;
-+ while ( --timeout > 0 ) {
-+ if( (dt_getstatus()&STAT_dma_state) == state ) return 1;
-+ usleep( 1000 );
-+ }
-+ dma_state = dt_getstatus( ) & STAT_dma_state;
-+ return 1;
-+}
-+
-+dt_ctrl( u_int cmd )
-+{
-+ while ( ! dt_waitbit( STAT_cmd_ready ) ) dt_delay( 100 );
-+ outb_p( 0, iobase+2 );
-+ outb_p( 0, iobase+3 );
-+ dt_getstatus( );
-+ dt_sendcmd( CMD_control|cmd );
-+ outb_p( 0, iobase+6 );
-+ dt_delay( 100 );
-+ dt_sendcmd( CMD_null );
-+ while ( ! dt_waitbit( STAT_cmd_ready ) ) dt_delay( 100 );
-+}
-+
-+int dt_flush( void )
-+{
-+ dt_ctrl( CTRL_flush );
-+ dt_waitbit( STAT_dma_ready );
-+ outb_p( DMA_sync, iobase+4 );
-+ outb_p( 0, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ while( dt_getstatus( ) & STAT_flushing ) dt_delay( 100 );
-+ return 0;
-+}
-+
-+static int dt_sendbuff( char *src, int len )
-+{
-+ while( len-- ){
-+ if( ! dt_wait_dma( ) ) return -1;
-+ if( ! (dt_getstatus( ) & STAT_rr_char) ) break;
-+ outb_p( DMA_single_in, iobase+4 );
-+ outb_p( *src++, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ }
-+ return 0;
-+}
-+
-+unsigned long dt_allocmem( unsigned long paras )
-+{
-+ unsigned long addr;
-+ if( ! dt_wait_dma( ) ) return 0;
-+ outb_p( DMA_control, iobase+4 );
-+ outb_p( DT_MEM_ALLOC, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ if( ! dt_wait_dma( ) ) return 0;
-+ outb_p( paras & 0xFF, iobase+4 );
-+ outb_p( (paras>>8) & 0xFF, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ if( ! dt_wait_dma( ) ) return 0;
-+ addr = inb_p( iobase+4 );
-+ addr |= (inb_p( iobase+4 )<<8);
-+ addr += (inb_p( iobase+4 )<<4);
-+ addr += (inb_p( iobase+4 )<<12);
-+ dma_state ^= STAT_dma_state;
-+ return addr;
-+}
-+
-+static int testkernel( void )
-+{
-+ dt_sendcmd( CMD_sync );
-+ if( ! dt_waitbit( STAT_cmd_ready ) ) return -10;
-+ has_kernel = ( dt_stat&0x8000 ) ? 1 : 0;
-+ if ( verbose ) printf( "testkernel got %x\n", dt_stat );
-+ if ( has_kernel ) return 0;
-+ dt_delay( 100 );
-+ return 1;
-+}
-+
-+static int dt_loadmem( int addr, int len, char *src )
-+{
-+ char c;
-+ int l;
-+ if ( verbose ) printf( "dt_loadmem: addr = %08X size = %d\n", addr, len );
-+ do {
-+ l = len;
-+ if ( l >= 0xc000 ) l = 0xc000;
-+ len -= l;
-+ if( ! dt_wait_dma( ) ) return -1;
-+ outb_p( DMA_control, iobase+4 );
-+ outb_p( DT_LOAD_MEM, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ if( ! dt_wait_dma( ) ) return -2;
-+ outb_p( addr & 0xFF, iobase+4 );
-+ outb_p( (addr>>8) & 0xFF, iobase+4 );
-+ outb_p( (addr>>16) & 0xFF, iobase+4 );
-+ outb_p( (addr>>24) & 0xFF, iobase+4 );
-+ outb_p( l & 0xFF, iobase+4 );
-+ outb_p( (l>>8) & 0xFF, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ if( ! dt_wait_dma( ) ) return -3;
-+ addr += l;
-+ while( l-- ){
-+ c = *src++;
-+ outb_p( c, iobase+4 );
-+ }
-+ dma_state ^= STAT_dma_state;
-+ } while ( len > 0 );
-+ return 0;
-+}
-+
-+unsigned int loadfile ( char *filename )
-+{
-+ int i, header_size;
-+ unsigned int total_paras;
-+ long fix;
-+ infd = open ( filename, O_RDONLY );
-+ if ( infd == -1 ) {
-+ perror ( "Opening file: " );
-+ return 0;
-+ }
-+ read ( infd, &header, sizeof ( struct dos_exe_header ) );
-+ if ( header.id != 0x5a4d ) {
-+ fprintf ( stderr, "Invalid header file format\n" );
-+ fprintf ( stderr, "Want 0x5a4d, got 0x%x\n", header.id );
-+ return 0;
-+ }
-+ if ( header.relen > MAX_FIXUPS ) {
-+ fprintf ( stderr, "Too many fixups\n" );
-+ return 0;
-+ }
-+ lseek ( infd, ( long ) header.reloc, SEEK_SET );
-+ read ( infd, fixups, sizeof ( struct dos_reloc ) * header.relen );
-+ header_size = header.hsize * 16;
-+ lseek ( infd, ( long )header_size, SEEK_SET );
-+ image_len = ( ( header.pages-1 )*512 ) + ( header.rem- header_size );
-+ total_paras = ( image_len >> 4 ) + header.hmin + 16;
-+ read ( infd, read_buff, image_len );
-+ close( infd );
-+ return total_paras;
-+}
-+
-+static int loadkernel( char *filename )
-+{
-+ int segfix = 0x40, fix, i;
-+ int ipval, csval;
-+ if ( has_kernel ) return 0;
-+ if ( !loadfile( filename ) ) return -1;
-+ header.csval += segfix;
-+ header.ssval += segfix;
-+ if ( verbose ) {
-+ printf ( "Loading kernel of %ld bytes ( %d relocs )\n",
-+ image_len, header.relen );
-+ printf ( " cs:ip == %04x:%04x ss:sp == %04x:%04x\n",
-+ header.csval, header.ipval, header.ssval, header.spval );
-+ }
-+ for ( i = 0; i < header.relen; i++ ) {
-+ fix = ( fixups[i].segment << 4 ) + fixups[i].offset;
-+ ( *( unsigned int * ) &read_buff[fix] ) += segfix;
-+ }
-+ csval = header.csval;
-+ ipval = header.ipval;
-+ dt_sendcmd_wait( MODULE_reset, MODULE_init );
-+ dt_sendcmd( CMD_reset );
-+ if( dt_getstatus( ) == MODULE_self_test ){
-+ if( ! dt_waitmode( MODULE_init ) ) return -1;
-+ }
-+ if ( !dt_sendcmd_wait( CMD_reset, MODE_status ) ) return -2;
-+ if ( !dt_sendcmd_wait( CMD_sync, MODE_error ) ) return -3;
-+ if ( !dt_sendcmd_wait( CMD_reset, MODE_status ) ) return -4;
-+ if ( verbose ) printf( "card is ready\n" );
-+ dt_sendcmd( CMD_dma );
-+ if( ! dt_waitbit( STAT_dma_ready ) ) return -5;
-+ if( ( i = dt_loadmem( 0x00000400, image_len, read_buff ) ) ) {
-+ fprintf( stderr, "kernel load failed, status %d\n", i );
-+ return -6;
-+ }
-+ dt_delay( 100 );
-+ /* the kernel is loaded, start it */
-+ if ( !dt_sendcmd_wait( CMD_reset, MODE_status ) ) return -7;
-+ dt_sendcmd( CMD_dma+1 ); /**xxx**/
-+ dt_delay( 100 );
-+ if( ! dt_waitbit( STAT_dma_ready ) ) return-8;
-+ outb_p( DMA_control, iobase+4 );
-+ outb_p( DT_START_TASK, iobase+4 );
-+ dt_delay( 100 );
-+ outb_p( ipval & 0xFF, iobase+4 );
-+ outb_p( (ipval>>8) & 0xFF, iobase+4 );
-+ outb_p( csval & 0xFF, iobase+4 );
-+ outb_p( (csval>>8) & 0xFF, iobase+4 );
-+ if( ! dt_waitmode( 0xc001 ) ) return -9;
-+ if ( verbose ) {
-+ printf( "done loading kernel\n" );
-+ }
-+ return testkernel( );
-+}
-+
-+int loaddict ( char *filename, char *name, int type )
-+{
-+ int i, read_index, read_size, act_size;
-+ unsigned short *index_fix, seg_fix;
-+ unsigned long entries, index, dic_bytes, dic_addr;
-+ unsigned int total_paras;
-+ unsigned long param, l;
-+ infd = open ( filename, O_RDONLY );
-+ if ( infd == -1 ) {
-+ perror ( filename );
-+ return -1;
-+ }
-+/* read in the entry count and the actual entry size excluding the
-+ * index table ( which is entries * 4 ) ... */
-+ read ( infd, &entries, 4 );
-+ read ( infd, &dic_bytes, 4 );
-+ if ( verbose )
-+ printf ( "Loading %s dictionary of %lu entries, %lu bytes.\n",
-+ name, entries, dic_bytes );
-+ total_paras = ( ( ( entries * 4 ) + dic_bytes ) >> 4 ) + 2;
-+ if ( verbose )
-+ printf ( "Allocating %d paragraphs of free ram ...\n", total_paras );
-+ l = dt_allocmem( total_paras );
-+ if ( l == 0 ) {
-+ perror ( "Error requesting memory from speech device" );
-+ return -1;
-+ }
-+ seg_fix = ( l >> 4 ) & 0xffff;
-+ dic_addr = l;
-+ index = entries;
-+ index_fix = ( unsigned short * ) &read_buff[0];
-+ if ( verbose )
-+ printf ( "Index table starts at %lx\n", l );
-+ read_index = index*4;
-+ act_size = read ( infd, read_buff, read_index );
-+ if ( act_size != read_index ) {
-+ fprintf ( stderr, "\nError reading indexes\n" );
-+ fprintf ( stderr, " exp : %d act : %d\n", read_index * 4, act_size );
-+ return -1;
-+ }
-+ for ( i = 1; i < index * 2; i += 2 )
-+ index_fix[i] += seg_fix;
-+ if( ( i = dt_loadmem( l, read_index, read_buff ) ) ) {
-+ fprintf ( stderr, "\nError loading indexes at 0x%lX: i %d\n",
-+ l, i );
-+ return -1;
-+ }
-+ l += read_index;
-+/* now, load up the dictionary bytes ... */
-+ if ( verbose )
-+ printf ( "Dictionary text starts at %lx\n", l );
-+ read_size = dic_bytes;
-+ if ( ( act_size = read ( infd, read_buff, read_size ) ) != read_size ) {
-+ fprintf ( stderr, "\nError reading dictionary text!\n" );
-+ fprintf ( stderr, "asked : %d actual : %d\n", act_size, read_size );
-+ return -1;
-+ }
-+ if( ( i = dt_loadmem( l, read_size, read_buff ) ) ) {
-+ fprintf ( stderr, "\nError loading dictionary at 0x%lX: status %d\n",
-+ l, i );
-+ return -1;
-+ }
-+ if( ! dt_wait_dma( ) ) return -1;
-+ outb_p( DMA_control, iobase+4 );
-+ outb_p( DT_SET_DIC, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ if( ! dt_wait_dma( ) ) return -1;
-+ l = dic_addr;
-+ l = ((l << 12) & 0xFFFF0000) + (l & 0x0000000F);
-+ outb_p( l & 0xFF, iobase+4 );
-+ outb_p( (l>>8) & 0xFF, iobase+4 );
-+ outb_p( (l>>16) & 0xFF, iobase+4 );
-+ outb_p( (l>>24) & 0xFF, iobase+4 );
-+ l = entries;
-+ outb_p( l & 0xFF, iobase+4 );
-+ outb_p( (l>>8) & 0xFF, iobase+4 );
-+ outb_p( (l>>16) & 0xFF, iobase+4 );
-+ outb_p( (l>>24) & 0xFF, iobase+4 );
-+ l = type;
-+ outb_p( l & 0xFF, iobase+4 );
-+ outb_p( (l>>8) & 0xFF, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ close ( infd );
-+ if ( verbose ) printf( "dictionary load complete\n" );
-+ return 0;
-+}
-+
-+int loadexe ( char *filename )
-+{
-+ unsigned int load_addr = 0, seg_fix;
-+ int i, read_size;
-+ int ipval, csval;
-+ long fix;
-+ unsigned long total_paras;
-+ total_paras = loadfile ( filename );
-+ if ( total_paras == 0 ) return -1;
-+ load_addr = dt_allocmem( total_paras );
-+ if ( load_addr == 0 ) {
-+ fprintf ( stderr, "Error allocating memory on card: " );
-+ return -1;
-+ }
-+ seg_fix = ( load_addr >> 4 ) & 0xffff;
-+ if ( verbose ) {
-+ printf ( "Loading %s %ld bytes ( %d relocs )\n",
-+ filename, image_len, header.relen );
-+ printf ( "Allocating %ld bytes of free ram at %05x\n",
-+ ( long ) header.hmin * 16, load_addr );
-+ printf ( "Total memory taken is %ld bytes\n", ( long ) total_paras * 16 );
-+ printf ( " cs:ip == %04x:%04x ss:sp == %04x:%04x\n",
-+ header.csval + seg_fix, header.ipval, header.ssval + seg_fix, header.spval );
-+ }
-+ for ( i = 0; i < header.relen; i++ ) {
-+ fix = ( ( long ) fixups[i].segment << 4 ) + ( long ) fixups[i].offset;
-+ ( *( unsigned int * ) &read_buff[fix] ) += seg_fix;
-+ }
-+ if( ( i = dt_loadmem( load_addr, image_len, read_buff ) ) ) {
-+ fprintf ( stderr, "Error loading speech device at 0x%lX: status %d\n",
-+ load_addr, i );
-+ return -1;
-+ }
-+ csval = header.csval + seg_fix;
-+ ipval = header.ipval;
-+ if( ! dt_wait_dma( ) ) return -1;
-+ outb_p( DMA_control, iobase+4 );
-+ outb_p( DT_START_TASK, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ if( ! dt_wait_dma( ) ) return -1;
-+ outb_p( ipval & 0xFF, iobase+4 );
-+ outb_p( (ipval>>8) & 0xFF, iobase+4 );
-+ outb_p( csval & 0xFF, iobase+4 );
-+ outb_p( (csval>>8) & 0xFF, iobase+4 );
-+ dma_state ^= STAT_dma_state;
-+ return 0;
-+}
-+
-+void release_io( void )
-+{
-+ ioperm( (long)iobase, 8, 0 );
-+ ioperm( (long)0x0080, 1, 0 );
-+ if ( read_buff ) free( read_buff );
-+}
-+
-+parseparm( char *parm, char *value )
-+{
-+ char *cp = parm+strlen( parm );
-+ while ( --cp > parm ) if ( *cp > ' ' ) break;
-+ cp[1] = '\0';
-+ if ( !strcmp( parm, "io" ) ) {
-+ long io = strtol( value, 0, 0 );
-+ if ( io >= 0x100 && io <= 0x350 ) {
-+ iobase = (u_short)io;
-+ return;
-+ }
-+ fprintf( stderr, "invalid io value %s\n", value );
-+ exit( 1 );
-+ } else if ( !strcmp( parm,"verbose" ) ) {
-+ verbose = atoi( value );
-+ }
-+}
-+
-+do_test( void )
-+{
-+ char buffer[512];
-+ int len;
-+ dma_state = dt_getstatus( ) & STAT_dma_state;
-+ while ( fgets( buffer, 510, stdin ) ) {
-+ len = strlen( buffer );
-+ if ( len == 1 ) dt_flush( );
-+ else {
-+ if ( buffer[len-1] == '\n' ) buffer[len-1] = '\013';
-+ dt_sendbuff( buffer, len );
-+ }
-+ }
-+ *buffer = '\013';
-+ dt_sendbuff( buffer, 1 );
-+}
-+
-+int main ( int argc, char **argv )
-+{
-+ char name[80], *cp;
-+ char *dirname = 0, *confname = "dec_pc.conf";
-+ char *init_msg = "[:ra 360] dec pc initialized\011";
-+ FILE *confile;
-+ struct stat statbuf;
-+ int maxsize = 0, status = 0;
-+ while ( --argc > 0 ) {
-+ argv++;
-+ if ( !strcmp( *argv, "-v" ) ) verbose = 1;
-+ else if ( !strcmp( *argv, "-t" ) ) intest = 1;
-+ else dirname = *argv;
-+ }
-+ if ( !dirname ) dirname = "/usr/local/lib/dec_pc";
-+ if ( chdir( dirname ) != 0 ) {
-+ fprintf( stderr, "cannot chdir to %s\n", dirname );
-+ exit( 1 );
-+ }
-+ if ( !( confile = fopen( confname, "r" ) ) ) {
-+ fprintf( stderr, "could not open %s", confname );
-+ exit( 1 );
-+ }
-+ while ( fgets( name, 80, confile ) ) {
-+ cp = strchr( name, '\n' );
-+ if ( cp ) *cp = '\0';
-+ if ( ( cp = strchr( name, '=' ) ) ) {
-+ *cp++ = '\0';
-+ parseparm( name, cp );
-+ continue;
-+ }
-+ if ( stat( name, &statbuf ) != 0 ) {
-+ fprintf( stderr, "cannot stat %s\n", name );
-+ exit( 1 );
-+ }
-+ if ( statbuf.st_size > maxsize ) maxsize = statbuf.st_size;
-+ }
-+ rewind( confile );
-+ if ( ioperm( (long)0x0080, 1, 1 ) || ioperm( (long)iobase, 8, 1 ) ) {
-+ fprintf( stderr, "could not get ioperm\n" );
-+ exit( 1 );
-+ }
-+ atexit( release_io );
-+ if ( testkernel( ) == 0 ) {
-+ if ( intest ) do_test( );
-+ else fprintf( stderr, "kernel already loaded\n" );
-+ exit( 0 );
-+ }
-+ read_buff = malloc( maxsize );
-+ if ( !read_buff ) {
-+ fprintf( stderr, "cannot malloc %d bytes\n", maxsize );
-+ exit( 1 );
-+ }
-+ while ( fgets( name, 80, confile ) && !status ) {
-+ cp = strchr( name, '\n' );
-+ if ( cp ) *cp = '\0';
-+ if ( strchr( name, '=' ) ) continue; /* a parameter */
-+ if ( !( cp = strchr( name, '.' ) ) ) continue;
-+ cp++;
-+ if ( !strcmp ( cp, "dic" ) ) {
-+ status = loaddict ( name, "primary", PRIMARY_DIC );
-+ } else if ( !strcmp ( cp, "dtu" ) ) {
-+ status = loaddict ( name, "user", USER_DIC );
-+ } else if ( !strcmp ( cp, "dta" ) ) {
-+ status = loaddict ( name, "abbreviation file", ABBREV_DIC );
-+ } else if ( !strcmp ( cp, "exe" ) ) {
-+ status = loadexe ( name );
-+ } else if ( !strcmp ( cp, "sys" ) ) {
-+ status = loadkernel ( name );
-+ }
-+ }
-+ if ( status ) fprintf( stderr, "status %d\n", status );
-+ fclose( confile );
-+ if ( status ) exit( status );
-+ dt_sendbuff( init_msg, strlen( init_msg ) );
-+ sleep( 1 );
-+ if ( intest ) do_test( );
-+ exit( 0 );
-+}
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/dtload.h
-@@ -0,0 +1,57 @@
-+/*
-+ * This is the DECtalk PC firmware loader for the Linux kernel, version 1.0
-+ *
-+ * Original 386BSD source:
-+ * Copyright (c) 1996 Brian Buhrow <buhrow@lothlorien.nfbcal.org>
-+ *
-+ * Adapted for Linux:
-+ * Copyright (c) 1997 Nicolas Pitre <nico@cam.org>
-+ *
-+ * Adapted for speakup:
-+ * Copyright (c) 2003 David Borowski <david575@golden.net>
-+ *
-+ * All rights reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#define MAX_FIXUPS 512 /* maximum fixups per exe */
-+/*
-+ * msdos .exe files will look like ...
-+ */
-+
-+struct dos_exe_header {
-+ unsigned short id; /* Linker's signature, must be 0x5a4d */
-+ unsigned short rem; /* length of image mod 512 */
-+ unsigned short pages; /* length of image in pages of 512 bytes */
-+ unsigned short relen; /* number of relocation items */
-+ unsigned short hsize; /* header size in paragraphs of 16 bytes */
-+ unsigned short hmin; /* min # of paragraphs above prog end */
-+ unsigned short hmax;
-+ unsigned short ssval;
-+ unsigned short spval; /* to be loaded in sp */
-+ unsigned short checksum;
-+ unsigned short ipval; /* to be loaded in ip */
-+ unsigned short csval; /* segment offset to code */
-+ unsigned short reloc; /* location of relocation items */
-+ unsigned short ovrlay; /* overlay number */
-+};
-+
-+/* a dos relocation element looks like */
-+
-+struct dos_reloc {
-+ short int offset, segment;
-+};
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/dtpc_reg.h
-@@ -0,0 +1,132 @@
-+/*
-+ * This is the DECtalk PC register constants (from DEC's DOS driver)
-+ *
-+ * Original code:
-+ * Copyright (c) by Digital Equipment Corp.
-+ *
-+ * 386BSD DECtalk PC driver:
-+ * Copyright (c) 1996 Brian Buhrow <buhrow@lothlorien.nfbcal.org>
-+ *
-+ * Linux DECtalk PC driver:
-+ * Copyright (c) 1997 Nicolas Pitre <nico@cam.org>
-+ *
-+ * speakup DECtalk PC driver:
-+ * Copyright (c) 2003 David Borowski <david575@golden.net>
-+ *
-+ * All rights reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+/*
-+ * port interface defs ... used by dtpc.c
-+ */
-+
-+#define MODULE_init 0x0dec /* module in boot code */
-+#define MODULE_self_test 0x8800 /* module in self-test */
-+#define MODULE_reset 0xffff /* reinit the whole module */
-+
-+#define MODE_mask 0xf000 /* mode bits in high nibble */
-+#define MODE_null 0x0000
-+#define MODE_test 0x2000 /* in testing mode */
-+#define MODE_status 0x8000
-+#define STAT_int 0x0001 /* running in interrupt mode */
-+#define STAT_tr_char 0x0002 /* character data to transmit */
-+#define STAT_rr_char 0x0004 /* ready to receive char data */
-+#define STAT_cmd_ready 0x0008 /* ready to accept commands */
-+#define STAT_dma_ready 0x0010 /* dma command ready */
-+#define STAT_digitized 0x0020 /* spc in digitized mode */
-+#define STAT_new_index 0x0040 /* new last index ready */
-+#define STAT_new_status 0x0080 /* new status posted */
-+#define STAT_dma_state 0x0100 /* dma state toggle */
-+#define STAT_index_valid 0x0200 /* indexs are valid */
-+#define STAT_flushing 0x0400 /* flush in progress */
-+#define STAT_self_test 0x0800 /* module in self test */
-+#define MODE_ready 0xc000 /* module ready for next phase */
-+#define READY_boot 0x0000
-+#define READY_kernel 0x0001
-+#define MODE_error 0xf000
-+
-+#define CMD_mask 0xf000 /* mask for command nibble */
-+#define CMD_null 0x0000 /* post status */
-+#define CMD_control 0x1000 /* hard control command */
-+#define CTRL_mask 0x0F00 /* mask off control nibble */
-+#define CTRL_data 0x00FF /* madk to get data byte */
-+#define CTRL_null 0x0000 /* null control */
-+#define CTRL_vol_up 0x0100 /* increase volume */
-+#define CTRL_vol_down 0x0200 /* decrease volume */
-+#define CTRL_vol_set 0x0300 /* set volume */
-+#define CTRL_pause 0x0400 /* pause spc */
-+#define CTRL_resume 0x0500 /* resume spc clock */
-+#define CTRL_resume_spc 0x0001 /* resume spc soft pause */
-+#define CTRL_flush 0x0600 /* flush all buffers */
-+#define CTRL_int_enable 0x0700 /* enable status change ints */
-+#define CTRL_buff_free 0x0800 /* buffer remain count */
-+#define CTRL_buff_used 0x0900 /* buffer in use */
-+#define CTRL_speech 0x0a00 /* immediate speech change */
-+#define CTRL_SP_voice 0x0001 /* voice change */
-+#define CTRL_SP_rate 0x0002 /* rate change */
-+#define CTRL_SP_comma 0x0003 /* comma pause change */
-+#define CTRL_SP_period 0x0004 /* period pause change */
-+#define CTRL_SP_rate_delta 0x0005 /* delta rate change */
-+#define CTRL_SP_get_param 0x0006 /* return the desired parameter */
-+#define CTRL_last_index 0x0b00 /* get last index spoken */
-+#define CTRL_io_priority 0x0c00 /* change i/o priority */
-+#define CTRL_free_mem 0x0d00 /* get free paragraphs on module */
-+#define CTRL_get_lang 0x0e00 /* return bit mask of loaded languages */
-+#define CMD_test 0x2000 /* self-test request */
-+#define TEST_mask 0x0F00 /* isolate test field */
-+#define TEST_null 0x0000 /* no test requested */
-+#define TEST_isa_int 0x0100 /* assert isa irq */
-+#define TEST_echo 0x0200 /* make data in == data out */
-+#define TEST_seg 0x0300 /* set peek/poke segment */
-+#define TEST_off 0x0400 /* set peek/poke offset */
-+#define TEST_peek 0x0500 /* data out == *peek */
-+#define TEST_poke 0x0600 /* *peek == data in */
-+#define TEST_sub_code 0x00FF /* user defined test sub codes */
-+#define CMD_id 0x3000 /* return software id */
-+#define ID_null 0x0000 /* null id */
-+#define ID_kernel 0x0100 /* kernel code executing */
-+#define ID_boot 0x0200 /* boot code executing */
-+#define CMD_dma 0x4000 /* force a dma start */
-+#define CMD_reset 0x5000 /* reset module status */
-+#define CMD_sync 0x6000 /* kernel sync command */
-+#define CMD_char_in 0x7000 /* single character send */
-+#define CMD_char_out 0x8000 /* single character get */
-+#define CHAR_count_1 0x0100 /* one char in cmd_low */
-+#define CHAR_count_2 0x0200 /* the second in data_low */
-+#define CHAR_count_3 0x0300 /* the third in data_high */
-+#define CMD_spc_mode 0x9000 /* change spc mode */
-+#define CMD_spc_to_text 0x0100 /* set to text mode */
-+#define CMD_spc_to_digit 0x0200 /* set to digital mode */
-+#define CMD_spc_rate 0x0400 /* change spc data rate */
-+#define CMD_error 0xf000 /* severe error */
-+
-+enum { PRIMARY_DIC = 0, USER_DIC, COMMAND_DIC, ABBREV_DIC };
-+
-+#define DMA_single_in 0x01
-+#define DMA_single_out 0x02
-+#define DMA_buff_in 0x03
-+#define DMA_buff_out 0x04
-+#define DMA_control 0x05
-+#define DT_MEM_ALLOC 0x03
-+#define DT_SET_DIC 0x04
-+#define DT_START_TASK 0x05
-+#define DT_LOAD_MEM 0x06
-+#define DT_READ_MEM 0x07
-+#define DT_DIGITAL_IN 0x08
-+#define DMA_sync 0x06
-+#define DMA_sync_char 0x07
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/genmap.c
-@@ -0,0 +1,204 @@
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <libgen.h>
-+#include <string.h>
-+#include <linux/version.h>
-+#include <ctype.h>
-+
-+int get_define(void);
-+
-+#define MAXKEYS 512
-+#define MAXKEYVAL 160
-+#define HASHSIZE 101
-+#define is_shift -3
-+#define is_spk -2
-+#define is_input -1
-+typedef struct st_key_init t_key_init;
-+struct st_key_init {
-+ char *name;
-+ int value, shift;
-+};
-+typedef struct st_key t_key;
-+struct st_key {
-+ char *name;
-+ t_key *next;
-+ int value, shift;
-+};
-+unsigned char key_data[MAXKEYVAL][16], *kp;
-+
-+#include "mapdata.h"
-+t_key key_table[MAXKEYS];
-+t_key *extra_keys = key_table+HASHSIZE;
-+char buffer[256], filename[256];
-+FILE *infile;
-+char delims[] = "\t\n ";
-+char *def_name, *def_val, *cp;
-+int map_ver = 119; /* an arbitrary number so speakup can check */
-+int lc, shift_table[17];
-+int max_states = 1, flags = 0;
-+/* flags reserved for later, maybe for individual console maps */
-+
-+void open_input( char *name )
-+{
-+ strcpy( filename, name );
-+ if ( ( infile = fopen( filename, "r" ) ) == 0 ) {
-+ fprintf( stderr, "can't open %s, version %d\n", filename, LINUX_VERSION_CODE );
-+ exit( 1 );
-+ }
-+ lc = 0;
-+}
-+
-+int
-+oops( char *msg, char *info )
-+{
-+ if ( info == NULL ) info = " ";
-+ fprintf( stderr, "error: file %s line %d\n", filename, lc );
-+ fprintf( stderr, "%s %s\n", msg, info );
-+ exit( 1 );
-+}
-+
-+t_key *hash_name( char *name )
-+{
-+ u_char *pn = (u_char *)name;
-+ int hash = 0;
-+ while ( *pn ) {
-+ hash = ( hash * 17 ) & 0xfffffff;
-+ if ( isupper( *pn ) ) *pn = tolower( *pn );
-+ hash += ( int )*pn;
-+ pn++;
-+ }
-+ hash %= HASHSIZE;
-+ return &key_table[hash];
-+}
-+
-+t_key *find_key( char *name )
-+{
-+ t_key *this = hash_name( name );
-+ while ( this ) {
-+ if ( !strcmp( name, this->name ) ) return this;
-+ this = this->next;
-+ }
-+ return this;
-+}
-+
-+t_key *add_key( char *name, int value, int shift )
-+{
-+ t_key *this = hash_name( name );
-+ if ( extra_keys-key_table >= MAXKEYS )
-+ oops( "out of key table space, enlarge MAXKEYS", NULL );
-+ if ( this->name != NULL ) {
-+ while ( this->next ) {
-+ if ( !strcmp( name, this->name ) )
-+ oops( "attempt to add duplicate key", name );
-+ this = this->next;
-+ }
-+ this->next = extra_keys++;
-+ this = this->next;
-+ }
-+ this->name = strdup( name );
-+ this->value = value;
-+ this->shift = shift;
-+ return this;
-+}
-+
-+int get_shift_value( int state )
-+{
-+ int i;
-+ for ( i = 0; shift_table[i] != state; i++ ) {
-+ if ( shift_table[i] == -1 ) {
-+ if ( i >= 16 )
-+ oops( "too many shift states", NULL );
-+ shift_table[i] = state;
-+ max_states = i+1;
-+ break;
-+ }
-+ }
-+ return i;
-+}
-+
-+int
-+main( int argc, char *argv[] )
-+{
-+ int value, shift_state, i, spk_val = 0, lock_val = 0;
-+ int max_key_used = 0, num_keys_used = 0;
-+ t_key *this;
-+ t_key_init *p_init;
-+char *argpath, *argname, *argcopy;
-+
-+ bzero( key_table, sizeof( key_table ) );
-+ bzero( key_data, sizeof( key_data ) );
-+ shift_table[0] = 0;
-+ for ( i = 1; i <= 16; i++ ) shift_table[i] = -1;
-+ if ( argc < 2 ) {
-+ fputs( "usage: genmap filename\n", stderr );
-+ exit( 1 );
-+ }
-+ for ( p_init = init_key_data; p_init->name[0] != '.'; p_init++ )
-+ add_key( p_init->name, p_init->value, p_init->shift );
-+ open_input( argv[1] );
-+ while ( fgets( buffer, 250, infile ) ) {
-+ lc++;
-+ value = shift_state = 0;
-+ cp = strtok( buffer, delims );
-+ if ( *cp == '#' ) continue;
-+ while ( cp ) {
-+ if ( *cp == '=' ) break;
-+ this = find_key( cp );
-+ if ( this == NULL )
-+ oops( "unknown key/modifier", cp );
-+ if ( this->shift == is_shift ) {
-+ if ( value )
-+ oops( "modifiers must come first", cp );
-+ shift_state += this->value;
-+ } else if ( this->shift == is_input )
-+ value = this->value;
-+ else oops( "bad modifier or key", cp );
-+ cp = strtok( 0, delims );
-+ }
-+ if ( !cp ) oops( "no = found", NULL );
-+ cp = strtok( 0, delims );
-+ if ( !cp ) oops( "no speakup function after =", NULL );
-+ this = find_key( cp );
-+ if ( this == NULL || this->shift != is_spk )
-+ oops( "invalid speakup function", cp );
-+ i = get_shift_value( shift_state );
-+ if ( key_data[value][i] ) {
-+ while ( --cp > buffer )
-+ if ( !*cp ) *cp = ' ';
-+ oops( "two functions on same key combination", cp );
-+ }
-+ key_data[value][i] = (char)this->value;
-+ if ( value > max_key_used ) max_key_used = value;
-+ }
-+ fclose( infile );
-+ this = find_key( "spk_key" );
-+ if ( this ) spk_val = this->value;
-+ this = find_key( "spk_lock" );
-+ if ( this ) lock_val = this->value;
-+ for ( lc = 1; lc <= max_key_used; lc++ ) {
-+ kp = key_data[lc];
-+ if ( !memcmp( key_data[0], kp, 16 ) ) continue;
-+ num_keys_used++;
-+ for ( i = 0; i < max_states; i++ ) {
-+ if ( kp[i] != spk_val&& kp[i] != lock_val ) continue;
-+ shift_state = shift_table[i];
-+ if ( ( shift_state&16 ) ) continue;
-+ shift_state = get_shift_value( shift_state+16 );
-+ kp[shift_state] = kp[i];
-+/* fill in so we can process the key up, as spk bit will be set */
-+ }
-+ }
-+ printf( "\t%d, %d, %d,\n\t", map_ver, num_keys_used, max_states );
-+ for ( i = 0; i < max_states; i++ )
-+ printf( "%d, ", shift_table[i] );
-+ printf( "%d,", flags );
-+ for ( lc = 1; lc <= max_key_used; lc++ ) {
-+ kp = key_data[lc];
-+ if ( !memcmp( key_data[0], kp, 16 ) ) continue;
-+ printf( "\n\t%d,", lc );
-+ for ( i = 0; i < max_states; i++ )
-+ printf( " %d,", (unsigned int)kp[i] );
-+ }
-+ printf( "\n\t0, %d\n", map_ver );
-+ exit( 0 );
-+}
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/Kconfig
-@@ -0,0 +1,211 @@
-+menu "Speakup console speech"
-+config SPEAKUP
-+ tristate "Build speakup console speech"
-+ depends on !PPC64
-+ ---help---
-+
-+ This is the Speakup screen reader. Think of it as a
-+ video console for blind people. If built in to the
-+ kernel, it can speak evrything on the text console from
-+ boot up to shutdown. For more information on Speakup,
-+ point your browser at http://www.linux-speakup.org/.
-+ There is also a mailing list at the above url that you
-+ can subscribe to.
-+
-+ Supported synthesizers are accent sa, accent pc, appollo
-+ II., Auddapter, Braille 'n Speak, Dectalk external
-+ (old), Dectalk PC (full length isa board), Dectalk
-+ express, Doubletalk, Doubletalk LT or Litetalk,
-+ Keynote
-+ Gold internal PC, software synthesizers, Speakout, and transport.
-+
-+ Speakup can either be built in or compiled as a module
-+ by answering y or m. If you answer y here, then you
-+ must answer either y or m to at least one of the
-+ synthesizer drivers below. If you answer m here, then
-+ the synthesizer drivers below can only be built as
-+ modules.
-+
-+ These drivers are not standalone drivers, but must be
-+ used in conjunction with Speakup. Think of them as
-+ video cards for blind people.
-+
-+
-+ The Dectalk pc driver can only be built as a module, and
-+ requires software to be pre-loaded on to the card before
-+ the module can be loaded. See the decpc choice below
-+ for more details.
-+
-+ If you are not a blind person, or don't have access to
-+ one of the listed synthesizers, you should say n.
-+
-+config SPEAKUP_ACNTSA
-+ depends on SPEAKUP
-+ tristate "Accent SA, acntsa"
-+ ---help---
-+
-+ This is the Speakup driver for the accent sa
-+ synthesizer. You can say y to build it into the kernel,
-+ or m to build it as a module. See the configuration
-+ help on the Speakup choice above for more info.
-+
-+config SPEAKUP_ACNTPC
-+ depends on SPEAKUP
-+ tristate "Accent PC, acntpc"
-+ ---help---
-+
-+ This is the Speakup driver for the accent pc
-+ synthesizer. You can say y to build it into the kernel,
-+ or m to build it as a module. See the configuration
-+ help on the Speakup choice above for more info.
-+
-+config SPEAKUP_APOLLO
-+ depends on SPEAKUP
-+ tristate "Apollo, apollo"
-+ ---help---
-+
-+ This is the Speakup driver for the Apollo II
-+ synthesizer. You can say y to build it into the kernel,
-+ or m to build it as a module. See the configuration
-+ help on the Speakup choice above for more info.
-+
-+config SPEAKUP_AUDPTR
-+ depends on SPEAKUP
-+ tristate "Audapter, audptr"
-+ ---help---
-+
-+ This is the Speakup driver for the Audapter synthesizer.
-+ You can say y to build it into the kernel, or m to
-+ build it as a module. See the configuration help on the
-+ Speakup choice above for more info.
-+
-+config SPEAKUP_BNS
-+ depends on SPEAKUP
-+ tristate "Braille 'n' Speak, bns"
-+ ---help---
-+
-+ This is the Speakup driver for the Braille 'n' Speak
-+ synthesizer. You can say y to build it into the kernel,
-+ or m to build it as a module. See the configuration
-+ help on the Speakup choice above for more info.
-+
-+config SPEAKUP_DECTLK
-+ depends on SPEAKUP
-+ tristate "DECtalk Express, dectlk"
-+ ---help---
-+
-+ This is the Speakup driver for the DecTalk Express
-+ synthesizer. You can say y to build it into the kernel,
-+ or m to build it as a module. See the configuration
-+ help on the Speakup choice above for more info.
-+
-+config SPEAKUP_DECEXT
-+ depends on SPEAKUP
-+ tristate "DECtalk External (old), decext"
-+ ---help---
-+
-+ This is the Speakup driver for the DecTalk External
-+ (old) synthesizer. You can say y to build it into the
-+ kernel, or m to build it as a module. See the
-+ configuration help on the Speakup choice above for more
-+ info.
-+
-+config SPEAKUP_DECPC
-+ depends on SPEAKUP
-+ tristate "DECtalk PC (big ISA card), decpc"
-+ ---help---
-+
-+ This is the Speakup driver for the DecTalk PC (full
-+ length ISA) synthesizer. You can say m to build it as
-+ a module. See the configuration help on the Speakup
-+ choice above for more info.
-+
-+ In order to use the DecTalk PC driver, you must download
-+ the dec_pc.tgz file from linux-speakup.org. It is in
-+ the pub/linux/goodies directory. The dec_pc.tgz file
-+ contains the software which must be pre-loaded on to the
-+ DecTalk PC board in order to use it with this driver.
-+ This driver must be built as a module, and can not be
-+ loaded until the file system is mounted and the DecTalk
-+ PC software has been pre-loaded on to the board.
-+
-+ See the README file in the dec_pc.tgz file for more
-+ details.
-+
-+config SPEAKUP_DTLK
-+ depends on SPEAKUP
-+ tristate "DoubleTalk PC, dtlk"
-+ ---help---
-+
-+ This is the Speakup driver for the internal DoubleTalk
-+ PC synthesizer. You can say y to build it into the
-+ kernel, or m to build it as a module. See the
-+ configuration help on the Speakup choice above for more
-+ info.
-+
-+config SPEAKUP_KEYPC
-+ depends on SPEAKUP
-+ tristate "Keynote Gold PC, keypc"
-+ ---help---
-+
-+ This is the Speakup driver for the Keynote Gold
-+ PC synthesizer. You can say y to build it into the
-+ kernel, or m to build it as a module. See the
-+ configuration help on the Speakup choice above for more
-+ info.
-+
-+config SPEAKUP_LTLK
-+ depends on SPEAKUP
-+ tristate "DoubleTalk LT or LiteTalk, ltlk"
-+---help---
-+
-+ This is the Speakup driver for the LiteTalk/DoubleTalk
-+ LT synthesizer. You can say y to build it into the
-+ kernel, or m to build it as a module. See the
-+ configuration help on the Speakup choice above for more
-+ info.
-+
-+config SPEAKUP_SFTSYN
-+ depends on SPEAKUP
-+ tristate "Software synthesizers, sftsyn"
-+---help---
-+
-+ This is the software synthesizer device node. It will
-+ register a device /dev/sftsyn which midware programs
-+ and speech
-+ daemons may open and read to provide kernel output to
-+ software synths
-+ such as festival, flite, tuxtalk and so forth. You
-+ can select 'y' or
-+ 'm' to have it built-in to the kernel or loaded as a module.
-+
-+config SPEAKUP_SPKOUT
-+ depends on SPEAKUP
-+ tristate "Speak Out, spkout"
-+ ---help---
-+
-+ This is the Speakup driver for the Speakout synthesizer.
-+ You can say y to build it into the kernel, or m to
-+ build it as a module. See the configuration help on the
-+ Speakup choice above for more info.
-+
-+config SPEAKUP_TXPRT
-+ depends on SPEAKUP
-+ tristate "Transport, txprt"
-+ ---help---
-+
-+ This is the Speakup driver for the Transport
-+ synthesizer. You can say y to build it into the kernel,
-+ or m to build it as a module. See the configuration
-+ help on the Speakup choice above for more info.
-+
-+if SPEAKUP != n
-+ comment 'Enter the 3 to 6 character keyword from the list above, or none for no default synthesizer on boot up.'
-+ depends on SPEAKUP
-+endif
-+
-+config SPEAKUP_DEFAULT
-+ string "Choose Default synthesizer for Speakup"
-+ default "none"
-+
-+endmenu
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/keyinfo.h
-@@ -0,0 +1,119 @@
-+/* spk_priv.h
-+ review functions for the speakup screen review package.
-+ originally written by: Kirk Reiser and Andy Berdan.
-+
-+ extensively modified by David Borowski.
-+
-+ Copyright (C ) 1998 Kirk Reiser.
-+ Copyright (C ) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option ) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+*/
-+
-+enum { /* var_ids */
-+ VERSION = 0, SYNTH, SILENT, SYNTH_DIRECT,
-+ KEYMAP, CHARS,
-+ PUNC_SOME, PUNC_MOST, PUNC_ALL,
-+ DELIM, REPEATS, EXNUMBER,
-+ DELAY, TRIGGER, JIFFY, FULL, /* all timers must be together */
-+ BLEEP_TIME, CURSOR_TIME, BELL_POS,
-+SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO,
-+ SPELL_DELAY, PUNC_LEVEL, READING_PUNC,
-+ ATTRIB_BLEEP, BLEEPS,
-+ RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQ, LANG,
-+ CAPS_START, CAPS_STOP,
-+ MAXVARS
-+};
-+
-+#define FIRST_SYNTH_VAR RATE
-+/* 0 is reserved for no remap */
-+#define SPEAKUP_GOTO 0x01
-+#define SPEECH_KILL 0x02
-+#define SPEAKUP_QUIET 0x03
-+#define SPEAKUP_CUT 0x04
-+#define SPEAKUP_PASTE 0x05
-+#define SAY_FIRST_CHAR 0x06
-+#define SAY_LAST_CHAR 0x07
-+#define SAY_CHAR 0x08
-+#define SAY_PREV_CHAR 0x09
-+#define SAY_NEXT_CHAR 0x0a
-+#define SAY_WORD 0x0b
-+#define SAY_PREV_WORD 0x0c
-+#define SAY_NEXT_WORD 0x0d
-+#define SAY_LINE 0x0e
-+#define SAY_PREV_LINE 0x0f
-+#define SAY_NEXT_LINE 0x10
-+#define TOP_EDGE 0x11
-+#define BOTTOM_EDGE 0x12
-+#define LEFT_EDGE 0x13
-+#define RIGHT_EDGE 0x14
-+#define SPELL_PHONETIC 0x15
-+#define SPELL_WORD 0x16
-+#define SAY_SCREEN 0x17
-+#define SAY_POSITION 0x18
-+#define SAY_ATTRIBUTES 0x19
-+#define SPEAKUP_OFF 0x1a
-+#define SPEAKUP_PARKED 0x1b
-+#define SAY_LINE_INDENT 0x1c
-+#define SAY_FROM_TOP 0x1d
-+#define SAY_TO_BOTTOM 0x1e
-+#define SAY_FROM_LEFT 0x1f
-+#define SAY_TO_RIGHT 0x20
-+#define SAY_CHAR_NUM 0x21
-+#define EDIT_SOME 0x22
-+#define EDIT_MOST 0x23
-+#define SAY_PHONETIC_CHAR 0x24
-+#define EDIT_DELIM 0x25
-+#define EDIT_REPEAT 0x26
-+#define EDIT_EXNUM 0x27
-+#define SET_WIN 0x28
-+#define CLEAR_WIN 0x29
-+#define ENABLE_WIN 0x2a
-+#define SAY_WIN 0x2b
-+#define SPK_LOCK 0x2c
-+#define SPEAKUP_HELP 0x2d
-+#define TOGGLE_CURSORING 0x2e
-+#define SPKUP_MAX_FUNC 0x2f /* one greater than the last func handler */
-+
-+#define SPK_KEY 0x80
-+#define FIRST_EDIT_BITS 0x22
-+
-+#define FIRST_SET_VAR SPELL_DELAY
-+#define VAR_START 0x40 /* increase if adding more than 0x3f functions */
-+
-+/* keys for setting variables, must be ordered same as the enum for var_ids */
-+/* with dec being even and inc being 1 greater */
-+#define SPELL_DELAY_DEC VAR_START+0
-+#define SPELL_DELAY_INC SPELL_DELAY_DEC+1
-+#define PUNC_LEVEL_DEC SPELL_DELAY_DEC+2
-+#define PUNC_LEVEL_INC PUNC_LEVEL_DEC+1
-+#define READING_PUNC_DEC PUNC_LEVEL_DEC+2
-+#define READING_PUNC_INC READING_PUNC_DEC+1
-+#define ATTRIB_BLEEP_DEC READING_PUNC_DEC+2
-+#define ATTRIB_BLEEP_INC ATTRIB_BLEEP_DEC+1
-+#define BLEEPS_DEC ATTRIB_BLEEP_DEC+2
-+#define BLEEPS_INC BLEEPS_DEC+1
-+#define RATE_DEC BLEEPS_DEC+2
-+#define RATE_INC RATE_DEC+1
-+#define PITCH_DEC RATE_DEC+2
-+#define PITCH_INC PITCH_DEC+1
-+#define VOL_DEC PITCH_DEC+2
-+#define VOL_INC VOL_DEC+1
-+#define TONE_DEC VOL_DEC+2
-+#define TONE_INC TONE_DEC+1
-+#define PUNCT_DEC TONE_DEC+2
-+#define PUNCT_INC PUNCT_DEC+1
-+#define VOICE_DEC PUNCT_DEC+2
-+#define VOICE_INC VOICE_DEC+1
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/Makefile
-@@ -0,0 +1,36 @@
-+#
-+# Makefile for the speakup speech output system.
-+#
-+
-+obj-m = speakup_keyhelp.o
-+speakupmain-objs := speakup.o speakup_drvcommon.o
-+
-+obj-$(CONFIG_SPEAKUP) += speakupmain.o
-+obj-$(CONFIG_SPEAKUP_ACNTPC) += speakup_acntpc.o
-+obj-$(CONFIG_SPEAKUP_ACNTSA) += speakup_acntsa.o
-+obj-$(CONFIG_SPEAKUP_APOLLO) += speakup_apollo.o
-+obj-$(CONFIG_SPEAKUP_AUDPTR) += speakup_audptr.o
-+obj-$(CONFIG_SPEAKUP_BNS) += speakup_bns.o
-+obj-$(CONFIG_SPEAKUP_DECEXT) += speakup_decext.o
-+obj-$(CONFIG_SPEAKUP_DECPC) += speakup_decpc.o
-+obj-$(CONFIG_SPEAKUP_DECTLK) += speakup_dectlk.o
-+obj-$(CONFIG_SPEAKUP_DTLK) += speakup_dtlk.o
-+obj-$(CONFIG_SPEAKUP_KEYPC) += speakup_keypc.o
-+obj-$(CONFIG_SPEAKUP_LTLK) += speakup_ltlk.o
-+obj-$(CONFIG_SPEAKUP_SFTSYN) += speakup_sftsyn.o
-+obj-$(CONFIG_SPEAKUP_SPKOUT) += speakup_spkout.o
-+obj-$(CONFIG_SPEAKUP_TXPRT) += speakup_txprt.o
-+
-+#speakupmain.o:speakup.o speakup_drvcommon.o
-+# ld -r -o speakupmain.o speakup.o speakup_drvcommon.o
-+
-+$(obj)/speakupmap.h: $(src)/speakupmap.map $(src)/genmap
-+ $(src)/genmap $(src)/speakupmap.map >$@
-+
-+$(obj)/mapdata.h: $(src)/keyinfo.h $(src)/makemapdata
-+ $(src)/makemapdata >$@
-+
-+$(obj)/genmap: $(obj)/mapdata.h
-+
-+HOSTCFLAGS := -Iinclude -I/usr/include
-+hostprogs-y := makemapdata genmap
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/makemapdata.c
-@@ -0,0 +1,156 @@
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <libgen.h>
-+#include <string.h>
-+#include <linux/version.h>
-+#include <ctype.h>
-+
-+int get_define(void);
-+
-+#define MAXKEYS 512
-+#define MAXKEYVAL 160
-+#define HASHSIZE 101
-+#define is_shift -3
-+#define is_spk -2
-+#define is_input -1
-+typedef struct st_key t_key;
-+struct st_key {
-+ char *name;
-+ t_key *next;
-+ int value, shift;
-+};
-+
-+t_key key_table[MAXKEYS];
-+t_key *extra_keys = key_table+HASHSIZE;
-+char buffer[256], filename[256];
-+FILE *infile;
-+char delims[] = "\t\n ";
-+char *dir_name, *def_name, *def_val, *cp;
-+int lc;
-+
-+void open_input( char *name )
-+{
-+ sprintf( filename, "%s/%s", dir_name, name );
-+ if ( ( infile = fopen( filename, "r" ) ) == 0 ) {
-+ fprintf( stderr, "can't open %s\n", filename );
-+ exit( 1 );
-+ }
-+ lc = 0;
-+}
-+
-+int
-+oops( char *msg, char *info )
-+{
-+ if ( info == NULL ) info = " ";
-+ fprintf( stderr, "error: file %s line %d\n", filename, lc );
-+ fprintf( stderr, "%s %s\n", msg, info );
-+ exit( 1 );
-+}
-+
-+int get_define( )
-+{
-+ while ( fgets( buffer, 250, infile ) ) {
-+ lc++;
-+ if ( strncmp( buffer, "#define", 7 ) ) continue;
-+ strtok( buffer, delims );
-+ def_name = strtok( 0, delims );
-+ def_val = strtok( 0, delims );
-+ if ( def_val != NULL ) return 1;
-+ }
-+ fclose( infile );
-+ infile = 0;
-+ return 0;
-+}
-+
-+t_key *hash_name( char *name )
-+{
-+ u_char *pn = (u_char *)name;
-+ int hash = 0;
-+ while ( *pn ) {
-+ hash = ( hash * 17 ) & 0xfffffff;
-+ if ( isupper( *pn ) ) *pn = tolower( *pn );
-+ hash += ( int )*pn;
-+ pn++;
-+ }
-+ hash %= HASHSIZE;
-+ return &key_table[hash];
-+}
-+
-+t_key *find_key( char *name )
-+{
-+ t_key *this = hash_name( name );
-+ while ( this ) {
-+ if ( !strcmp( name, this->name ) ) return this;
-+ this = this->next;
-+ }
-+ return this;
-+}
-+
-+t_key *add_key( char *name, int value, int shift )
-+{
-+ t_key *this = hash_name( name );
-+ if ( extra_keys-key_table >= MAXKEYS )
-+ oops( "out of key table space, enlarge MAXKEYS", NULL );
-+ if ( this->name != NULL ) {
-+ while ( this->next ) {
-+ if ( !strcmp( name, this->name ) )
-+ oops( "attempt to add duplicate key", name );
-+ this = this->next;
-+ }
-+ this->next = extra_keys++;
-+ this = this->next;
-+ }
-+ this->name = strdup( name );
-+ this->value = value;
-+ this->shift = shift;
-+ return this;
-+}
-+
-+int
-+main( int argc, char *argv[] )
-+{
-+ int value, i;
-+ t_key *this;
-+ dir_name = getenv( "TOPDIR" );
-+ if ( !dir_name ) dir_name = "/usr/src/linux";
-+ bzero( key_table, sizeof( key_table ) );
-+ add_key( "shift", 1, is_shift );
-+ add_key( "altgr", 2, is_shift );
-+ add_key( "ctrl", 4, is_shift );
-+ add_key( "alt", 8, is_shift );
-+ add_key( "spk", 16, is_shift );
-+ add_key( "double", 32, is_shift );
-+ open_input( "include/linux/input.h" );
-+ while ( get_define( ) ) {
-+ if ( strncmp( def_name, "KEY_", 4 ) ) continue;
-+ value = atoi( def_val );
-+ if ( value > 0 && value < MAXKEYVAL )
-+ add_key( def_name, value, is_input );
-+ }
-+ open_input( "drivers/char/speakup/keyinfo.h" );
-+ while ( get_define( ) ) {
-+ if ( strlen( def_val ) > 5 ) {
-+ if ( !( cp = strchr( def_val, '+' ) ) ) continue;
-+ *cp++ = '\0';
-+ this = find_key( def_val );
-+ if ( !this || *cp < '0' || *cp > '9' ) continue;
-+ value = this->value+atoi( cp );
-+ } else if ( !strncmp( def_val, "0x", 2 ) )
-+ sscanf( def_val+2, "%x", &value );
-+ else if ( *def_val >= '0' && *def_val <= '9' )
-+ value = atoi( def_val );
-+ else continue;
-+ add_key( def_name, value, is_spk );
-+ }
-+ printf( "t_key_init init_key_data[] = {\n" );
-+ for ( i = 0; i < HASHSIZE; i++ ) {
-+ this = &key_table[i];
-+ if ( !this->name ) continue;
-+ do {
-+ printf( "\t\"%s\", %d, %d,\n", this->name, this->value, this->shift );
-+ this = this->next;
-+ } while ( this );
-+ }
-+ printf( "\t\".\", 0, 0\n};\n" );
-+ exit( 0 );
-+}
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/mapdata.h
-@@ -0,0 +1,238 @@
-+t_key_init init_key_data[] = {
-+ "key_s", 31, -1,
-+ "top_edge", 17, -2,
-+ "key_t", 20, -1,
-+ "say_first_char", 6, -2,
-+ "attrib_bleep_inc", 71, -2,
-+ "key_u", 22, -1,
-+ "key_grave", 41, -1,
-+ "key_v", 47, -1,
-+ "key_w", 17, -1,
-+ "key_kpasterisk", 55, -1,
-+ "key_minus", 12, -1,
-+ "key_x", 45, -1,
-+ "key_down", 108, -1,
-+ "key_y", 21, -1,
-+ "key_kpdot", 83, -1,
-+ "key_leftmeta", 125, -1,
-+ "key_z", 44, -1,
-+ "key_volumedown", 114, -1,
-+ "say_next_word", 13, -2,
-+ "clear_win", 41, -2,
-+ "key_rightbrace", 27, -1,
-+ "right_edge", 20, -2,
-+ "key_scrolllock", 70, -1,
-+ "key_comma", 51, -1,
-+ "altgr", 2, -3,
-+ "say_screen", 23, -2,
-+ "key_cut", 137, -1,
-+ "say_to_bottom", 30, -2,
-+ "edit_most", 35, -2,
-+ "key_sleep", 142, -1,
-+ "say_phonetic_char", 36, -2,
-+ "speakup_quiet", 3, -2,
-+ "key_hanja", 123, -1,
-+ "say_next_line", 16, -2,
-+ "vol_dec", 78, -2,
-+ "key_help", 138, -1,
-+ "key_xfer", 147, -1,
-+ "speakup_goto", 1, -2,
-+ "punct_inc", 83, -2,
-+ "key_rightctrl", 97, -1,
-+ "attrib_bleep_dec", 70, -2,
-+ "key_rightshift", 54, -1,
-+ "key_linefeed", 101, -1,
-+ "key_wakeup", 143, -1,
-+ "key_enter", 28, -1,
-+ "key_again", 129, -1,
-+ "key_file", 144, -1,
-+ "key_tab", 15, -1,
-+ "speakup_off", 26, -2,
-+ "set_win", 40, -2,
-+ "key_insert", 110, -1,
-+ "key_setup", 141, -1,
-+ "key_equal", 13, -1,
-+ "tone_inc", 81, -2,
-+ "key_hiragana", 91, -1,
-+ "key_kpjpcomma", 95, -1,
-+ "key_pause", 119, -1,
-+ "key_volumeup", 115, -1,
-+ "key_f1", 59, -1,
-+ "key_hanguel", 122, -1,
-+ "double", 32, -3,
-+ "key_f2", 60, -1,
-+ "key_computer", 157, -1,
-+ "key_back", 158, -1,
-+ "key_leftctrl", 29, -1,
-+ "key_f3", 61, -1,
-+ "key_f4", 62, -1,
-+ "key_0", 11, -1,
-+ "key_f5", 63, -1,
-+ "key_yen", 124, -1,
-+ "key_copy", 133, -1,
-+ "speakup_paste", 5, -2,
-+ "key_1", 2, -1,
-+ "key_f6", 64, -1,
-+ "toggle_cursoring", 46, -2,
-+ "key_esc", 1, -1,
-+ "key_2", 3, -1,
-+ "key_f7", 65, -1,
-+ "speakup_parked", 27, -2,
-+ "punct_dec", 82, -2,
-+ "key_3", 4, -1,
-+ "key_f8", 66, -1,
-+ "key_4", 5, -1,
-+ "key_f9", 67, -1,
-+ "key_5", 6, -1,
-+ "key_calc", 140, -1,
-+ "spell_phonetic", 21, -2,
-+ "key_6", 7, -1,
-+ "key_7", 8, -1,
-+ "key_coffee", 152, -1,
-+ "key_mail", 155, -1,
-+ "say_attributes", 25, -2,
-+ "say_to_right", 32, -2,
-+ "key_8", 9, -1,
-+ "key_mute", 113, -1,
-+ "key_9", 10, -1,
-+ "key_katakana", 90, -1,
-+ "key_zenkakuhankaku", 85, -1,
-+ "key_forward", 159, -1,
-+ "key_up", 103, -1,
-+ "tone_dec", 80, -2,
-+ "key_leftalt", 56, -1,
-+ "say_next_char", 10, -2,
-+ "reading_punc_inc", 69, -2,
-+ "rate_inc", 75, -2,
-+ "key_backspace", 14, -1,
-+ "bottom_edge", 18, -2,
-+ "key_kp0", 82, -1,
-+ "key_delete", 111, -1,
-+ "key_prog1", 148, -1,
-+ "say_char_num", 33, -2,
-+ "key_kp1", 79, -1,
-+ "key_end", 107, -1,
-+ "key_prog2", 149, -1,
-+ "key_kp2", 80, -1,
-+ "say_prev_word", 12, -2,
-+ "left_edge", 19, -2,
-+ "key_kp3", 81, -1,
-+ "key_katakanahiragana", 93, -1,
-+ "key_right", 106, -1,
-+ "key_kp4", 75, -1,
-+ "key_find", 136, -1,
-+ "key_kp5", 76, -1,
-+ "speakup_cut", 4, -2,
-+ "key_kp6", 77, -1,
-+ "key_kp7", 71, -1,
-+ "spkup_max_func", 47, -2,
-+ "key_kp8", 72, -1,
-+ "key_deletefile", 146, -1,
-+ "key_f10", 68, -1,
-+ "key_kp9", 73, -1,
-+ "key_f11", 87, -1,
-+ "key_sendfile", 145, -1,
-+ "say_word", 11, -2,
-+ "edit_repeat", 38, -2,
-+ "key_leftbrace", 26, -1,
-+ "key_f12", 88, -1,
-+ "say_prev_line", 15, -2,
-+ "say_from_top", 29, -2,
-+ "var_start", 64, -2,
-+ "reading_punc_dec", 68, -2,
-+ "rate_dec", 74, -2,
-+ "key_backslash", 43, -1,
-+ "edit_exnum", 39, -2,
-+ "key_kpslash", 98, -1,
-+ "key_pagedown", 109, -1,
-+ "key_kpplusminus", 118, -1,
-+ "key_stop", 128, -1,
-+ "key_props", 130, -1,
-+ "pitch_inc", 77, -2,
-+ "key_semicolon", 39, -1,
-+ "key_rightalt", 100, -1,
-+ "key_pageup", 104, -1,
-+ "key_kpplus", 78, -1,
-+ "say_line", 14, -2,
-+ "bleeps_inc", 73, -2,
-+ "key_leftshift", 42, -1,
-+ "key_kpminus", 74, -1,
-+ "key_paste", 135, -1,
-+ "spell_delay_inc", 65, -2,
-+ "punc_level_inc", 67, -2,
-+ "key_www", 150, -1,
-+ "edit_delim", 37, -2,
-+ "key_capslock", 58, -1,
-+ "key_muhenkan", 94, -1,
-+ "key_compose", 127, -1,
-+ "spk_key", 128, -2,
-+ "key_sysrq", 99, -1,
-+ "key_apostrophe", 40, -1,
-+ "key_left", 105, -1,
-+ "key_power", 116, -1,
-+ "key_menu", 139, -1,
-+ "voice_inc", 85, -2,
-+ "key_kpcomma", 121, -1,
-+ "spell_word", 22, -2,
-+ "enable_win", 42, -2,
-+ "key_a", 30, -1,
-+ "key_henkan", 92, -1,
-+ "key_bookmarks", 156, -1,
-+ "say_line_indent", 28, -2,
-+ "key_b", 48, -1,
-+ "key_space", 57, -1,
-+ "key_c", 46, -1,
-+ "edit_some", 34, -2,
-+ "key_d", 32, -1,
-+ "key_numlock", 69, -1,
-+ "key_home", 102, -1,
-+ "shift", 1, -3,
-+ "key_e", 18, -1,
-+ "key_msdos", 151, -1,
-+ "say_position", 24, -2,
-+ "pitch_dec", 76, -2,
-+ "key_f", 33, -1,
-+ "key_cyclewindows", 154, -1,
-+ "speakup_help", 45, -2,
-+ "first_edit_bits", 34, -2,
-+ "alt", 8, -3,
-+ "key_g", 34, -1,
-+ "key_kpenter", 96, -1,
-+ "key_macro", 112, -1,
-+ "bleeps_dec", 72, -2,
-+ "ctrl", 4, -3,
-+ "key_h", 35, -1,
-+ "key_direction", 153, -1,
-+ "key_i", 23, -1,
-+ "spk_lock", 44, -2,
-+ "spell_delay_dec", 64, -2,
-+ "punc_level_dec", 66, -2,
-+ "key_j", 36, -1,
-+ "say_prev_char", 9, -2,
-+ "key_k", 37, -1,
-+ "key_102nd", 86, -1,
-+ "key_l", 38, -1,
-+ "key_ro", 89, -1,
-+ "key_rightmeta", 126, -1,
-+ "key_m", 50, -1,
-+ "key_kpequal", 117, -1,
-+ "key_undo", 131, -1,
-+ "speech_kill", 2, -2,
-+ "key_n", 49, -1,
-+ "key_front", 132, -1,
-+ "key_o", 24, -1,
-+ "key_open", 134, -1,
-+ "voice_dec", 84, -2,
-+ "spk", 16, -3,
-+ "key_p", 25, -1,
-+ "say_last_char", 7, -2,
-+ "say_from_left", 31, -2,
-+ "key_q", 16, -1,
-+ "key_slash", 53, -1,
-+ "say_win", 43, -2,
-+ "key_r", 19, -1,
-+ "key_dot", 52, -1,
-+ "say_char", 8, -2,
-+ "vol_inc", 79, -2,
-+ ".", 0, 0
-+};
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/mod_code.c
-@@ -0,0 +1,25 @@
-+/* this code is to modularize a synth specific file, included at the end */
-+
-+static void __exit mod_synth_exit( void )
-+{
-+ if ( synth == &MY_SYNTH )
-+ synth_release( );
-+ synth_remove( &MY_SYNTH );
-+}
-+
-+static int __init mod_synth_init( void )
-+{
-+ int status = do_synth_init( &MY_SYNTH );
-+ if ( status != 0 ) return status;
-+ synth_add( &MY_SYNTH );
-+#if (LINUX_VERSION_CODE < 132419)
-+// MOD_INC_USE_COUNT;
-+#endif
-+ return 0;
-+}
-+
-+module_init( mod_synth_init );
-+module_exit( mod_synth_exit );
-+MODULE_AUTHOR("Kirk Reiser <kirk@braille.uwo.ca>");
-+MODULE_DESCRIPTION("Synthesizer driver module for speakup for the synth->long_name");
-+MODULE_LICENSE( "GPL" );
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/serialio.h
-@@ -0,0 +1,18 @@
-+#ifndef SSPK_SERIAL
-+#define SSPK_SERIAL
-+
-+#include <linux/serial.h> /* for rs_table, serial constants &
-+ serial_uart_config */
-+#include <linux/serial_reg.h> /* for more serial constants */
-+#include <linux/serialP.h> /* for struct serial_state */
-+#include <asm/serial.h>
-+
-+#define SPK_SERIAL_TIMEOUT 1000000 /* countdown values for serial timeouts */
-+#define SPK_XMITR_TIMEOUT 1000000 /* countdown values transmitter/dsr timeouts */
-+#define SPK_LO_TTY 0 /* check ttyS0 ... ttyS3 */
-+#define SPK_HI_TTY 3
-+#define NUM_DISABLE_TIMEOUTS 3 /* # of timeouts permitted before disable */
-+#define SPK_TIMEOUT 100 /* buffer timeout in ms */
-+#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
-+
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_acnt.h
-@@ -0,0 +1,16 @@
-+/* speakup_acntpc.h - header file for speakups Accent-PC driver. */
-+
-+#define SYNTH_IO_EXTENT 0x02
-+
-+#define SYNTH_CLEAR 0x18 /* stops speech */
-+
-+ /* Port Status Flags */
-+#define SYNTH_READABLE 0x01 /* mask for bit which is nonzero if a
-+ byte can be read from the data port */
-+#define SYNTH_WRITABLE 0x02 /* mask for RDY bit, which when set to
-+ 1, indicates the data port is ready
-+ to accept a byte of data. */
-+#define SYNTH_QUIET 'S' /* synth is not speaking */
-+#define SYNTH_FULL 'F' /* synth is full. */
-+#define SYNTH_ALMOST_EMPTY 'M' /* synth has les than 2 seconds of text left */
-+#define SYNTH_SPEAKING 's' /* synth is speaking and has a fare way to go */
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_acntpc.c
-@@ -0,0 +1,160 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "speakup_acnt.h" /* local header file for Accent values */
-+
-+#define MY_SYNTH synth_acntpc
-+#define synth_readable( ) ( inb_p( synth_port_control ) & SYNTH_READABLE )
-+#define synth_writable( ) ( inb_p( synth_port_control ) & SYNTH_WRITABLE )
-+#define synth_full( ) ( inb_p( synth_port_tts ) == 'F' )
-+#define PROCSPEECH '\r'
-+
-+
-+static int synth_port_control;
-+static unsigned int synth_portlist[] =
-+ { 0x2a8, 0 };
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( synth_full( ) )
-+ return buf;
-+ while ( synth_writable( ) );
-+ outb_p( ch, synth_port_tts );
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+ synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ if ( synth_full( ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ while ( synth_writable( ) );
-+ ch = *synth_buff_out++;
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ outb_p( ch, synth_port_tts );
-+ if ( jiffies >= jiff_max && ch == SPACE ) {
-+ while ( synth_writable( ) );
-+ outb_p( PROCSPEECH, synth_port_tts );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ while ( synth_writable( ) );
-+ outb_p( PROCSPEECH, synth_port_tts );
-+ synth_done( );
-+}
-+
-+static void synth_flush( void )
-+{
-+ outb_p( SYNTH_CLEAR, synth_port_tts );
-+}
-+
-+static int synth_probe( void )
-+{
-+ unsigned int port_val = 0;
-+ int i = 0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ if ( synth_port_forced ) {
-+ synth_port_tts = synth_port_forced;
-+ pr_info( "probe forced to %x by kernel command line\n", synth_port_tts );
-+ if ( synth_request_region( synth_port_tts-1, SYNTH_IO_EXTENT ) ) {
-+ pr_warn( "sorry, port already reserved\n" );
-+ return -EBUSY;
-+ }
-+ port_val = inw( synth_port_tts-1 );
-+ synth_port_control = synth_port_tts-1;
-+ } else {
-+ for( i=0; synth_portlist[i]; i++ ) {
-+ if ( synth_request_region( synth_portlist[i], SYNTH_IO_EXTENT ) ) {
-+ pr_warn( "request_region: failed with 0x%x, %d\n",
-+ synth_portlist[i], SYNTH_IO_EXTENT );
-+ continue;
-+ }
-+ port_val = inw( synth_portlist[i] );
-+ if ( ( port_val &= 0xfffc ) == 0x53fc ) { /* 'S' and out&input bits */
-+ synth_port_control = synth_portlist[i];
-+ synth_port_tts = synth_port_control+1;
-+ break;
-+ }
-+ }
-+ }
-+ if ( ( port_val &= 0xfffc ) != 0x53fc ) { /* 'S' and out&input bits */
-+ pr_info( "%s: not found\n", synth->long_name );
-+ synth_release_region( synth_portlist[i], SYNTH_IO_EXTENT );
-+ synth_port_control = 0;
-+ return -ENODEV;
-+ }
-+ pr_info( "%s: %03x-%03x, driver version %s,\n", synth->long_name,
-+ synth_port_control, synth_port_control+SYNTH_IO_EXTENT-1,
-+ synth->version );
-+ return 0;
-+}
-+
-+static void accent_release( void )
-+{
-+ if ( synth_port_tts )
-+ synth_release_region( synth_port_tts-1, SYNTH_IO_EXTENT );
-+ synth_port_tts = 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ synth_alive = 1;
-+ return 1;
-+}
-+
-+static const char init_string[] = "\033=X \033Oi\033T2\033=M\033N1\n";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\033P8" },
-+ { CAPS_STOP, "\033P5" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\033R%c", 9, 0, 17, 0, 0, "0123456789abcdefgh" },
-+ { PITCH, "\033P%d", 5, 0, 9, 0, 0, 0 },
-+ { VOL, "\033A%d", 5, 0, 9, 0, 0, 0 },
-+ { TONE, "\033V%d", 5, 0, 9, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_acntpc = {"acntpc", "1.1", "Accent PC",
-+ init_string, 500, 50, 50, 1000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, accent_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL };
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_acntsa.c
-@@ -0,0 +1,184 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+#include "speakup_acnt.h" /* local header file for Accent values */
-+
-+#define MY_SYNTH synth_acntsa
-+#define synth_full( ) ( inb_p( synth_port_tts ) == 'F' )
-+#define PROCSPEECH '\r'
-+
-+static int timeouts = 0; /* sequential number of timeouts */
-+
-+static int
-+wait_for_xmitr ( void )
-+{
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ return 0;
-+ }
-+ do { /* holding register empty? */
-+ check = inb_p ( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn ( "%s: timed out\n", synth->long_name );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do { /* CTS */
-+ check = inb_p ( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int
-+spk_serial_out ( const char ch )
-+{
-+ if ( synth_alive && wait_for_xmitr ( ) ) {
-+ outb_p ( ch, synth_port_tts );
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static void
-+do_catch_up ( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+ synth_stop_timer ( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == 0x0a ) ch = 0x0D;
-+ if ( !spk_serial_out ( ch ) ) {
-+ synth_delay ( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( jiffies >= jiff_max && ch == ' ' ) {
-+ spk_serial_out ( PROCSPEECH );
-+ synth_delay ( synth_delay_time );
-+ return;
-+ }
-+ }
-+ spk_serial_out ( PROCSPEECH );
-+ synth_done( );
-+}
-+
-+static char *synth_immediate ( char *buff )
-+{
-+ u_char ch;
-+ while ( ( ch = *buff ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buff;
-+ buff++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush ( void )
-+{
-+ spk_serial_out ( SYNTH_CLEAR );
-+}
-+
-+static int serprobe ( int index )
-+{
-+ struct serial_state *ser = spk_serial_init( index );
-+ if ( ser == NULL ) return -1;
-+ outb ( 0x0d, ser->port );
-+ // mdelay ( 1 );
-+ /* ignore any error results, if port was forced */
-+ if ( synth_port_forced ) return 0;
-+ /* check for accent s.a now... */
-+ if ( !synth_immediate( "\x18" ) )
-+ return 0;
-+ spk_serial_release( );
-+ timeouts = synth_alive = 0; /* not ignoring */
-+ return -1;
-+}
-+
-+static int synth_probe ( void )
-+{
-+ int i = 0, failed=0;
-+ pr_info ( "Probing for %s.\n", synth->long_name );
-+ for ( i = SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info ( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info ( "%s: %03x-%03x, Driver Version %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version );
-+ synth_immediate( "\033=R\r" );
-+ mdelay( 100 );
-+ return 0;
-+}
-+
-+static int
-+synth_is_alive ( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( !synth_alive && wait_for_xmitr ( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string ( synth->init );
-+ return 2;
-+ }
-+ pr_warn ( "%s: can't restart synth\n", synth->long_name );
-+ return 0;
-+}
-+
-+static const char init_string[] = "\033T2\033=M\033Oi\033N1\n";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\033P8" },
-+ { CAPS_STOP, "\033P5" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\033R%c", 9, 0, 17, 0, 0, "0123456789abcdefgh" },
-+ { PITCH, "\033P%d", 5, 0, 9, 0, 0, 0 },
-+ { VOL, "\033A%d", 9, 0, 9, 0, 0, 0 },
-+ { TONE, "\033V%d", 5, 0, 9, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_acntsa = { "acntsa", "1.1", "Accent-SA",
-+ init_string, 400, 5, 30, 1000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_apollo.c
-@@ -0,0 +1,195 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#define MY_SYNTH synth_apollo
-+#define SYNTH_CLEAR 0x18
-+#define PROCSPEECH '\r'
-+
-+static int timeouts = 0; /* sequential number of timeouts */
-+
-+static int wait_for_xmitr( void )
-+{
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do {
-+ check = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn( "APOLLO: timed out\n" );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do {
-+ check = inb( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out( const char ch )
-+{
-+ // int timer = 9000000;
-+ if ( synth_alive && wait_for_xmitr( ) ) {
-+ outb( ch, synth_port_tts );
-+ /*while ( inb( synth_port_tts+UART_MSR ) & UART_MSR_CTS ) if ( --timer == 0 ) break;*/
-+ /* outb( UART_MCR_DTR, synth_port_tts + UART_MCR );*/
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
-+static unsigned char spk_serial_in( void )
-+{
-+ int c, lsr, tmout = SPK_SERIAL_TIMEOUT;
-+ do {
-+ lsr = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) return 0xff;
-+ } while ( !( lsr & UART_LSR_DR ) );
-+ c = inb( synth_port_tts + UART_RX );
-+ return ( unsigned char ) c;
-+}
-+*/
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( !spk_serial_out( ch ) ) {
-+ outb( UART_MCR_DTR, synth_port_tts + UART_MCR );
-+ outb( UART_MCR_DTR | UART_MCR_RTS, synth_port_tts + UART_MCR );
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( jiffies >= jiff_max && synth_buff_out-synth_buffer > 10 ) {
-+ spk_serial_out( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ spk_serial_out( PROCSPEECH );
-+ synth_done( );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush ( void )
-+{
-+ spk_serial_out ( SYNTH_CLEAR );
-+}
-+
-+static int serprobe( int index )
-+{
-+ struct serial_state *ser = spk_serial_init( index );
-+ if ( ser == NULL ) return -1;
-+ outb( 0x0d, ser->port ); /* wake it up if older BIOS */
-+ mdelay( 1 );
-+ synth_port_tts = ser->port;
-+ if ( synth_port_forced ) return 0;
-+ /* check for apollo now... */
-+ if ( !synth_immediate( "\x18" ) ) return 0;
-+ pr_warn( "port %x failed\n", synth_port_tts );
-+ spk_serial_release( );
-+ timeouts = synth_alive = synth_port_tts = 0;
-+ return -1;
-+}
-+
-+static int synth_probe( void )
-+{
-+int i, failed=0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ for ( i=SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info( "%s: %03x-%03x, Driver version %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version );
-+ return 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( !synth_alive && wait_for_xmitr( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string( synth->init );
-+ return 2; /* reenabled */
-+ } else pr_warn( "%s: can't restart synth\n", synth->long_name );
-+ return 0;
-+}
-+
-+static const char init_string[] = "@R3@D0@K1\r";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "cap, " },
-+ { CAPS_STOP, "" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "@W%d", 6, 1, 9, 0, 0, 0 },
-+ { PITCH, "@F%x", 10, 0, 15, 0, 0, 0 },
-+ { VOL, "@A%x", 10, 0, 15, 0, 0, 0 },
-+ { VOICE, "@V%d", 1, 1, 6, 0, 0, 0 },
-+ { LANG, "@=%d,", 1, 1, 4, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_apollo = {"apollo", "1.2", "Apollo",
-+ init_string, 500, 50, 50, 5000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_audptr.c
-@@ -0,0 +1,201 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#define MY_SYNTH synth_audptr
-+#define SYNTH_CLEAR 0x18 /* flush synth buffer */
-+#define PROCSPEECH '\r' /* start synth processing speech char */
-+
-+static int timeouts = 0; /* sequential number of timeouts */
-+
-+static int wait_for_xmitr( void )
-+{
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do { /* holding register empty? */
-+ check = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn( "%s: timed out\n", synth->long_name );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do { /* CTS */
-+ check = inb( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out( const char ch )
-+{
-+ if ( synth_alive && wait_for_xmitr( ) ) {
-+ outb( ch, synth_port_tts );
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static unsigned char spk_serial_in( void )
-+{
-+ int c, lsr, tmout = SPK_SERIAL_TIMEOUT;
-+ do {
-+ lsr = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) return 0xff;
-+ } while ( !( lsr & UART_LSR_DR ) );
-+ c = inb( synth_port_tts + UART_RX );
-+ return ( unsigned char ) c;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( !spk_serial_out( ch ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( jiffies >= jiff_max && ch == SPACE ) {
-+ spk_serial_out( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ spk_serial_out( PROCSPEECH );
-+ synth_done( );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush( void )
-+{
-+ while ( ( inb( synth_port_tts + UART_LSR ) & BOTH_EMPTY ) != BOTH_EMPTY );
-+ outb( SYNTH_CLEAR, synth_port_tts );
-+ spk_serial_out( PROCSPEECH );
-+ }
-+
-+static char synth_id[40] = "";
-+
-+static int serprobe( int index )
-+{
-+ u_char test = 0;
-+ struct serial_state *ser = spk_serial_init( index );
-+ if ( ser == NULL ) return -1;
-+ /* ignore any error results, if port was forced */
-+ if ( synth_port_forced )
-+ return 0;
-+ synth_immediate( "\x05[Q]" );
-+ if ( ( synth_id[test] = spk_serial_in( ) ) == 'A' ) {
-+ do { /* read version string from synth */
-+ synth_id[++test] = spk_serial_in( );
-+ } while ( synth_id[test] != '\n' && test < 32 );
-+ synth_id[++test] = 0x00;
-+ if ( test != 32 )
-+ return 0;
-+ }
-+ spk_serial_release( );
-+ timeouts = synth_alive = 0; /* not ignoring */
-+ return -1;
-+}
-+
-+static int synth_probe( void )
-+{
-+int i=0, failed=0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ for ( i=SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info( "%s: %03x-%03x, Driver %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version );
-+ if ( synth_id[0] == 'A' )
-+ pr_info( "%s version: %s", synth->long_name, synth_id );
-+ return 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( !synth_alive && wait_for_xmitr( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string( synth->init );
-+ return 2;
-+ }
-+ return 0;
-+}
-+
-+static const char init_string[] = "\x05[D1]\x05[Ol]";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\x05[f99]" },
-+ { CAPS_STOP, "\x05[f80]" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\x05[r%d]", 10, 0, 20, -100, 10, 0 },
-+ { PITCH, "\x05[f%d]", 80, 39, 4500, 0, 0, 0 },
-+ { VOL, "\x05[g%d]", 21, 0, 40, 0, 0, 0 },
-+ { TONE, "\x05[s%d]", 9, 0,63, 0, 0, 0 },
-+ { PUNCT, "\x05[A%c]", 0, 0, 3, 0, 0, "nmsa" },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_audptr = {"audptr", "1.1", "Audapter",
-+ init_string, 400, 5, 30, 5000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_bns.c
-@@ -0,0 +1,174 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#define MY_SYNTH synth_bns
-+#define SYNTH_CLEAR 0x18
-+#define PROCSPEECH '\r'
-+
-+static int wait_for_xmitr( void )
-+{
-+ static int timeouts = 0; /* sequential number of timeouts */
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do {
-+ check = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn( "BNS: timed out\n" );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do {
-+ check = inb( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out( const char ch )
-+{
-+ if ( synth_alive && wait_for_xmitr( ) ) {
-+ outb( ch, synth_port_tts );
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+ synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == '\n' ) ch = PROCSPEECH;
-+ if ( !spk_serial_out( ch ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( jiffies >= jiff_max && ch == ' ' ) {
-+ spk_serial_out( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ spk_serial_out( PROCSPEECH );
-+ synth_done( );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush ( void )
-+{
-+ spk_serial_out ( SYNTH_CLEAR );
-+}
-+
-+static int serprobe( int index )
-+{
-+ struct serial_state *ser = spk_serial_init( index );
-+ if ( ser == NULL ) return -1;
-+ outb( '\r', ser->port );
-+ if ( synth_port_forced ) return 0;
-+ /* check for bns now... */
-+ if ( !synth_immediate( "\x18" ) ) return 0;
-+ spk_serial_release( );
-+ synth_alive = 0;
-+ return -1;
-+}
-+
-+static int synth_probe( void )
-+{
-+int i=0, failed=0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ for ( i=SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info( "%s: %03x-%03x, Driver version %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version );
-+ return 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( !synth_alive && wait_for_xmitr( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string( synth->init );
-+ return 2;
-+ }
-+ pr_warn( "%s: can't restart synth\n", synth->long_name );
-+ return 0;
-+}
-+
-+static const char init_string[] = "\x05Z\x05\x43";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\x05\x31\x32P" },
-+ { CAPS_STOP, "\x05\x38P" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\x05%dE", 8, 1, 16, 0, 0, 0 },
-+ { PITCH, "\x05%dP", 8, 0, 16, 0, 0, 0 },
-+ { VOL, "\x05%dV", 8, 0, 16, 0, 0, 0 },
-+ { TONE, "\x05%dT", 8, 0, 16, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_bns = {"bns", "1.1", "Braille 'N Speak",
-+ init_string, 500, 50, 50, 5000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup.c
-@@ -0,0 +1,2281 @@
-+/* speakup.c
-+ review functions for the speakup screen review package.
-+ originally written by: Kirk Reiser and Andy Berdan.
-+
-+ extensively modified by David Borowski.
-+
-+ Copyright (C ) 1998 Kirk Reiser.
-+ Copyright (C ) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option ) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+*/
-+
-+#define __KERNEL_SYSCALLS__
-+
-+#include <linux/kernel.h>
-+#include <linux/version.h>
-+#include <linux/vt.h>
-+#include <linux/tty.h>
-+#include <linux/mm.h> /* __get_free_page( ) and friends */
-+#include <linux/vt_kern.h>
-+#if (LINUX_VERSION_CODE < 132419)
-+#include <linux/console_struct.h>
-+#include <linux/kbd_ll.h>
-+#include <asm/keyboard.h>
-+#endif
-+#include <linux/ctype.h>
-+#include <linux/selection.h>
-+#include <asm/uaccess.h> /* copy_from|to|user( ) and others */
-+#include <linux/unistd.h>
-+
-+#include <linux/keyboard.h> /* for KT_SHIFT */
-+#include <linux/kbd_kern.h> /* for vc_kbd_* and friends */
-+#include <linux/vt_kern.h>
-+#include <linux/input.h>
-+#include <linux/kmod.h>
-+#include <linux/speakup.h>
-+
-+#include "cvsversion.h"
-+#include "spk_priv.h"
-+#include <linux/bootmem.h> /* for alloc_bootmem */
-+
-+/* speakup_*_selection */
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/types.h>
-+#include <asm/uaccess.h>
-+#include <linux/consolemap.h>
-+
-+#ifndef MIN
-+#define MIN(a,b) ((a) < (b) ? (a) : (b))
-+#endif
-+
-+#define SPEAKUP_VERSION "Speakup v-2.00" CVSVERSION
-+#define MAX_DELAY ( (500 * HZ ) / 1000 )
-+#define KEY_MAP_VER 119
-+#define MINECHOCHAR SPACE
-+
-+/* these are globals from the kernel code */
-+extern void *kmalloc (size_t, unsigned int );
-+extern void kfree (const void * );
-+extern struct kbd_struct * kbd;
-+extern int fg_console;
-+extern short punc_masks[];
-+
-+static special_func special_handler = NULL;
-+special_func help_handler = NULL;
-+
-+static int errno;
-+int synth_file_inuse = 0;
-+short pitch_shift = 0, synth_flags = 0;
-+static char buf[256];
-+short attrib_bleep = 0, bleeps = 0, bleep_time = 1;
-+short no_intr = 0, spell_delay = 0;
-+short key_echo = 0, cursor_timeout = 120, say_word_ctl = 0;
-+short say_ctrl = 0, bell_pos = 0;
-+short punc_mask = 0, punc_level = 0, reading_punc = 0;
-+char str_caps_start[MAXVARLEN+1] = "\0", str_caps_stop[MAXVARLEN+1] = "\0";
-+bits_data punc_info[] = {
-+ { "none", "", 0 },
-+ { "some", "/$%&@", SOME },
-+ { "most", "$%&#()=+*/@^<>|\\", MOST },
-+ { "all", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", PUNC },
-+ { "delimiters", "", B_WDLM },
-+ { "repeats", "()", CH_RPT },
-+ { "extended numeric", "", B_EXNUM },
-+ { "symbols", "", B_SYM },
-+ { 0, 0 }
-+};
-+char mark_cut_flag = 0;
-+u_short mark_x = 0, mark_y = 0;
-+static char synth_name[10] = CONFIG_SPEAKUP_DEFAULT;
-+#define MAX_KEY 160
-+u_char *our_keys[MAX_KEY], *shift_table;
-+static u_char key_buf[600];
-+static u_char key_defaults[] = {
-+#include "speakupmap.h"
-+};
-+
-+#if (LINUX_VERSION_CODE < 132419)
-+extern struct tty_struct *tty;
-+typedef void (*k_handler_fn)(unsigned char value, char up_flag);
-+#define KBD_PROTO u_char value, char up_flag
-+#define KBD_ARGS value, up_flag
-+#else
-+struct tty_struct *tty;
-+#define key_handler k_handler
-+typedef void (*k_handler_fn)(struct vc_data *vc, unsigned char value,
-+ char up_flag, struct pt_regs *regs);
-+#define KBD_PROTO struct vc_data *vc, u_char value, char up_flag, struct pt_regs *regs
-+#define KBD_ARGS vc, value, up_flag, regs
-+#endif
-+extern k_handler_fn key_handler[16];
-+static k_handler_fn do_shift, do_spec, do_latin, do_cursor;
-+EXPORT_SYMBOL( help_handler );
-+EXPORT_SYMBOL( special_handler );
-+EXPORT_SYMBOL( our_keys );
-+
-+static void speakup_date (struct vc_data *vc );
-+static void spkup_write (const char *in_buf, int count );
-+int set_mask_bits( const char *input, const int which, const int how );
-+
-+char str_ctl[] = "control-";
-+char *colors[] = {
-+ "black", "blue", "green", "cyan", "red", "magenta", "yellow", "white",
-+ "grey"
-+};
-+
-+char *phonetic[] = {
-+ "alpha", "beta", "charley", "delta", "echo", "fox", "gamma", "hotel",
-+ "india", "juleiet", "keelo", "leema", "mike", "november", "oscar",
-+ "papa",
-+ "quebec", "romeo", "seeara", "tango", "uniform", "victer", "wiskey",
-+ "x ray", "yankee", "zooloo"
-+};
-+
-+// array of 256 char pointers (one for each ASCII character description )
-+// initialized to default_chars and user selectable via /proc/speakup/characters
-+char *characters[256];
-+
-+char *default_chars[256] = {
-+ "null", "^a", "^b", "^c", "^d", "^e", "^f", "^g",
-+ "^h", "^i", "^j", "^k", "^l", "^m", "^n", "^o",
-+ "^p", "^q", "^r", "^s", "^t", "^u", "^v", "^w",
-+ "^x", "^y", "^z", NULL, NULL, NULL, NULL, NULL,
-+ "space", "bang!", "quote", "number", "dollar", "percent", "and",
-+ "tick",
-+ "left paren", "right paren", "star", "plus", "comma", "dash", "dot",
-+ "slash",
-+ "zero", "one", "two", "three", "four", "five", "six", "seven",
-+ "eight", "nine",
-+ "colon", "semmy", "less", "equals", "greater", "question", "at",
-+ "eigh", "b", "c", "d", "e", "f", "g",
-+ "h", "i", "j", "k", "l", "m", "n", "o",
-+ "p", "q", "r", "s", "t", "u", "v", "w", "x",
-+ "y", "zehd", "left bracket", "backslash", "right bracket", "caret",
-+ "line",
-+ "accent", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+ NULL, NULL, NULL, "left brace", "bar", "right brace", "tihlduh",
-+ "delta", "see cedilla", "u oomlout", "e acute", /* 128 */
-+ "eigh circumflex", "eigh oomlout", "eigh grave", "eigh ring", /* 132 */
-+ "see cedilla", "e circumflex", "e oomlout", "e grave", /* 136 */
-+ "i oomlout", "i circumflex", "i grave", "eigh oomlout", /* 140 */
-+ "eigh ring", "e acute", "eigh e dipthong", "eigh e dipthong", /* 144 */
-+ "o circumflex", "o oomlout", "o grave", "u circumflex", /* 148 */
-+ "u grave", "y oomlout", "o oomlout", "u oomlout", /* 152 */
-+ "cents", "pounds", "yen", "peseta", /* 156 */
-+ "florin", "eigh acute", "i acute", "o acute", /* 160 */
-+ "u acute", "n tilde", "n tilde", "feminine ordinal", /* 164 */
-+ "masculin ordinal", "inverted question", "reversed not", "not", /* 168 */
-+ "half", "quarter", "inverted bang", "much less than", /* 172 */
-+ "much greater than", "dark shading", "medium shading", /* 176 */
-+ "light shading", "verticle line", "left tee", /* 179 */
-+ "double left tee", "left double tee", "double top right", /* 182 */
-+ "top double right", "double left double tee", /* 185 */
-+ "double vertical line", "double top double right", /* 187 */
-+ "double bottom double right", "double bottom right", /* 189 */
-+ "bottom double right", "top right", "left bottom", /* 191 */
-+ "up tee", "tee down", "tee right", "horizontal line", /* 194 */
-+ "cross bars", "tee double right", "double tee right", /* 198 */
-+ "double left double bottom", "double left double top", /* 201 */
-+ "double up double tee", "double tee double down", /* 203 */
-+ "double tee double right", "double horizontal line", /* 205 */
-+ "double cross bars", "up double tee", "double up tee", /* 207 */
-+ "double tee down", "tee double down", /* 210 */
-+ "double left bottom", "left double bottom", /* 212 */
-+ "double left top", "left double top", /* 214 */
-+ "double vertical cross", "double horizontal cross", /* 216 */
-+ "bottom right", "left top", "solid square", /* 218 */
-+ "solid lower half", "solid left half", "solid right half", /* 221 */
-+ "solid upper half", "alpha", "beta", "gamma", /* 224 */
-+ "pie", "sigma", "sigma", "mu", /* 228 */
-+ "tou", "phigh", "thayta", "ohmega", /* 232 */
-+ "delta", "infinity", "phigh", "epsilaun", /* 236 */
-+"intersection", "identical to", "plus or minus", "equal grater than", /* 240 */
-+ "less than equal", "upper integral", "lower integral", /* 244 */
-+ "divided by", "almost equal", "degrees", /* 247 */
-+ "centre dot", "bullet", "square root", /* 250 */
-+ "power", "squared", "black square", "white space" /* 252 */
-+};
-+
-+u_short spk_chartab[256] = {
-+ B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /* 0-7 */
-+ B_CTL, B_CTL, A_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /* 8-15 */
-+ B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /*16-23 */
-+ B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /* 24-31 */
-+WDLM, A_PUNC, PUNC, PUNC, PUNC, PUNC, PUNC, A_PUNC, /* !"#$%&' */
-+PUNC, PUNC, PUNC, PUNC, A_PUNC, A_PUNC, A_PUNC, PUNC, /* ( )*+, -./ */
-+NUM, NUM, NUM, NUM, NUM, NUM, NUM, NUM, /* 01234567 */
-+NUM, NUM, A_PUNC, PUNC, PUNC, PUNC, PUNC, A_PUNC, /* 89:;<=>? */
-+PUNC, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, /* @ABCDEFG */
-+A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, /* HIJKLMNO */
-+A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, /* PQRSTUVW */
-+A_CAP, A_CAP, A_CAP, PUNC, PUNC, PUNC, PUNC, PUNC, /* XYZ[\]^_ */
-+PUNC, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, /* `abcdefg */
-+ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, /* hijklmno */
-+ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, /* pqrstuvw */
-+ALPHA, ALPHA, ALPHA, PUNC, PUNC, PUNC, PUNC, 0, /* xyz{|}~ */
-+B_CAPSYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 128-135 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_CAPSYM, /* 136-143 */
-+B_CAPSYM, B_CAPSYM, B_SYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 144-151 */
-+B_SYM, B_SYM, B_CAPSYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 152-159 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_CAPSYM, B_SYM, /* 160-167 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 168-175 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 176-183 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 184-191 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 192-199 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 200-207 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 208-215 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 216-223 */
-+B_SYM, B_SYM, B_SYM, B_CAPSYM, B_SYM, B_CAPSYM, B_SYM, B_SYM, /* 224-231 */
-+B_SYM, B_CAPSYM, B_CAPSYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 232-239 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 240-247 */
-+B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM /* 248-255 */
-+};
-+
-+int spk_keydown = 0;
-+static u_char spk_lastkey = 0, spk_close_press = 0, keymap_flags = 0;
-+static u_char last_keycode = 0, this_speakup_key = 0;
-+static u_long last_spk_jiffy = 0;
-+
-+spk_t *speakup_console[MAX_NR_CONSOLES];
-+
-+int spk_setup (char *str )
-+{
-+ int ints[4];
-+ str = get_options (str, ARRAY_SIZE (ints ), ints );
-+ if (ints[0] > 0 && ints[1] >= 0 )
-+ synth_port_forced = ints[1];
-+ return 1;
-+}
-+
-+int spk_ser_setup (char *str )
-+{
-+ int lookup[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
-+ int ints[4];
-+ str = get_options (str, ARRAY_SIZE (ints ), ints );
-+ if (ints[0] > 0 && ints[1] >= 0 )
-+ synth_port_forced = lookup[ints[1]];
-+ return 1;
-+}
-+
-+int spk_synth_setup (char *str )
-+{
-+ size_t len = MIN (strlen (str ), 9 );
-+ memcpy (synth_name, str, len );
-+ synth_name[len] = '\0';
-+ return 1;
-+}
-+
-+__setup ("speakup_port=", spk_setup );
-+__setup ("speakup_ser=", spk_ser_setup );
-+__setup ("speakup_synth=", spk_synth_setup );
-+
-+char *
-+strlwr (char *s )
-+{
-+ char *p;
-+ for (p = s; *p; p++ ) {
-+ if (*p >= CAP_A && *p <= CAP_Z ) *p |= 32;
-+ }
-+ return s;
-+}
-+
-+static void
-+bleep (u_short val )
-+{
-+ static short vals[] = { 350, 370, 392, 414, 440, 466, 491, 523,
-+554, 587, 619, 659 };
-+ short freq;
-+ int time = bleep_time;
-+ freq = vals[val%12];
-+ if (val > 11 )
-+ freq *= (1<<(val/12 ) );
-+ kd_mksound (freq, time );
-+}
-+
-+void
-+speakup_shut_up (struct vc_data *vc )
-+{
-+ if (spk_killed ) return;
-+ spk_shut_up |= 0x01;
-+ spk_parked &= 0xfe;
-+ speakup_date (vc );
-+ if (synth == NULL ) return;
-+ do_flush( );
-+}
-+
-+void
-+speech_kill (struct vc_data *vc )
-+{
-+ char val = synth->is_alive ( );
-+ if (val == 0 ) return;
-+ /* re-enables synth, if disabled */
-+ if (val == 2 || spk_killed ) { /* dead */
-+ spk_shut_up &= ~0x40;
-+ synth_write_msg ("Eyem a Lighve!" );
-+ } else {
-+ synth_write_msg ("You killed speak up!" );
-+ spk_shut_up |= 0x40;
-+ }
-+}
-+
-+static void
-+speakup_off (struct vc_data *vc )
-+{
-+ if (spk_shut_up & 0x80 ) {
-+ spk_shut_up &= 0x7f;
-+ synth_write_msg ("hey. That's better!" );
-+ } else {
-+ spk_shut_up |= 0x80;
-+ synth_write_msg ("You turned me off!" );
-+ }
-+ speakup_date (vc );
-+}
-+
-+static void
-+speakup_parked (struct vc_data *vc )
-+{
-+ if (spk_parked & 0x80 ) {
-+ spk_parked = 0;
-+ synth_write_msg ("unparked!" );
-+ } else {
-+ spk_parked |= 0x80;
-+ synth_write_msg ("parked!" );
-+ }
-+}
-+
-+/* ------ cut and paste ----- */
-+/* Don't take this from <ctype.h>: 011-015 on the screen aren't spaces */
-+#undef isspace
-+#define isspace(c) ((c) == ' ')
-+/* Variables for selection control. */
-+struct vc_data *spk_sel_cons; /* defined in selection.c must not be disallocated */
-+static volatile int sel_start = -1; /* cleared by clear_selection */
-+static int sel_end;
-+static int sel_buffer_lth;
-+static char *sel_buffer;
-+
-+static unsigned char
-+sel_pos(int n)
-+{
-+ return inverse_translate(spk_sel_cons, screen_glyph(spk_sel_cons, n));
-+}
-+
-+static void
-+speakup_clear_selection(void)
-+{
-+ sel_start = -1;
-+}
-+
-+/* does screen address p correspond to character at LH/RH edge of screen? */
-+static inline int atedge(const int p, int size_row)
-+{
-+ return (!(p % size_row) || !((p + 2) % size_row));
-+}
-+
-+/* constrain v such that v <= u */
-+static inline unsigned short limit(const unsigned short v, const unsigned short u)
-+{
-+ return (v > u) ? u : v;
-+}
-+
-+unsigned short xs, ys, xe, ye; /* our region points */
-+
-+static int
-+speakup_set_selection( struct tty_struct *tty)
-+{
-+ int new_sel_start, new_sel_end;
-+ char *bp, *obp;
-+ int i, ps, pe;
-+ struct vc_data *vc = vc_cons[fg_console].d;
-+
-+ xs = limit(xs, vc->vc_cols - 1);
-+ ys = limit(ys, vc->vc_rows - 1);
-+ xe = limit(xe, vc->vc_cols - 1);
-+ ye = limit(ye, vc->vc_rows - 1);
-+ ps = ys * vc->vc_size_row + (xs << 1);
-+ pe = ye * vc->vc_size_row + (xe << 1);
-+
-+ if (ps > pe) { /* make sel_start <= sel_end */
-+ int tmp = ps;
-+ ps = pe;
-+ pe = tmp;
-+ }
-+
-+ if (spk_sel_cons != vc_cons[fg_console].d) {
-+ speakup_clear_selection();
-+ spk_sel_cons = vc_cons[fg_console].d;
-+ printk(KERN_WARNING "Selection: mark console not the same as cut\n");
-+ return -EINVAL;
-+ }
-+
-+ new_sel_start = ps;
-+ new_sel_end = pe;
-+
-+ /* select to end of line if on trailing space */
-+ if (new_sel_end > new_sel_start &&
-+ !atedge(new_sel_end, vc->vc_size_row) &&
-+ isspace(sel_pos(new_sel_end))) {
-+ for (pe = new_sel_end + 2; ; pe += 2)
-+ if (!isspace(sel_pos(pe)) ||
-+ atedge(pe, vc->vc_size_row))
-+ break;
-+ if (isspace(sel_pos(pe)))
-+ new_sel_end = pe;
-+ }
-+ if ((new_sel_start == sel_start)
-+ && (new_sel_end == sel_end)) /* no action required */
-+ return 0;
-+
-+ sel_start = new_sel_start;
-+ sel_end = new_sel_end;
-+ /* Allocate a new buffer before freeing the old one ... */
-+ bp = kmalloc((sel_end-sel_start)/2+1, GFP_ATOMIC);
-+ if (!bp) {
-+ printk(KERN_WARNING "selection: kmalloc() failed\n");
-+ speakup_clear_selection();
-+ return -ENOMEM;
-+ }
-+ if (sel_buffer)
-+ kfree(sel_buffer);
-+ sel_buffer = bp;
-+
-+ obp = bp;
-+ for (i = sel_start; i <= sel_end; i += 2) {
-+ *bp = sel_pos(i);
-+ if (!isspace(*bp++))
-+ obp = bp;
-+ if (! ((i + 2) % vc->vc_size_row)) {
-+ /* strip trailing blanks from line and add newline,
-+ unless non-space at end of line. */
-+ if (obp != bp) {
-+ bp = obp;
-+ *bp++ = '\r';
-+ }
-+ obp = bp;
-+ }
-+ }
-+ sel_buffer_lth = bp - sel_buffer;
-+ return 0;
-+}
-+
-+static int
-+speakup_paste_selection(struct tty_struct *tty)
-+{
-+ struct vc_data *vc = (struct vc_data *) tty->driver_data;
-+ int pasted = 0, count;
-+ DECLARE_WAITQUEUE(wait, current);
-+ add_wait_queue(&vc->paste_wait, &wait);
-+ while (sel_buffer && sel_buffer_lth > pasted) {
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ if (test_bit(TTY_THROTTLED, &tty->flags)) {
-+ schedule();
-+ continue;
-+ }
-+ count = sel_buffer_lth - pasted;
-+ count = MIN(count, tty->ldisc.receive_room(tty));
-+ tty->ldisc.receive_buf(tty, sel_buffer + pasted, 0, count);
-+ pasted += count;
-+ }
-+ remove_wait_queue(&vc->paste_wait, &wait);
-+ current->state = TASK_RUNNING;
-+ return 0;
-+}
-+
-+static void
-+speakup_cut (struct vc_data *vc )
-+{
-+ static const char err_buf[] = "set selection failed";
-+ int ret;
-+
-+ if (!mark_cut_flag ) {
-+ mark_cut_flag = 1;
-+ xs = spk_x;
-+ ys = spk_y;
-+ spk_sel_cons = vc;
-+ synth_write_msg ("mark" );
-+ return;
-+ }
-+ xe = (u_short ) spk_x;
-+ ye = (u_short )spk_y;
-+ mark_cut_flag = 0;
-+ synth_write_msg ("cut" );
-+
-+ speakup_clear_selection( );
-+ ret = speakup_set_selection ( tty );
-+
-+ switch (ret ) {
-+ case 0:
-+ break; /* no error */
-+ case -EFAULT :
-+ pr_warn( "%sEFAULT\n", err_buf );
-+ break;
-+ case -EINVAL :
-+ pr_warn( "%sEINVAL\n", err_buf );
-+ break;
-+ case -ENOMEM :
-+ pr_warn( "%sENOMEM\n", err_buf );
-+ break;
-+ }
-+}
-+
-+static void
-+speakup_paste (struct vc_data *vc )
-+{
-+ if (mark_cut_flag ) {
-+ mark_cut_flag = 0;
-+ synth_write_msg ("mark, cleared" );
-+ } else {
-+ synth_write_msg ("paste" );
-+ speakup_paste_selection (tty );
-+ }
-+}
-+
-+static void
-+say_attributes (struct vc_data *vc )
-+{
-+ int fg= spk_attr&0x0f, bg = spk_attr>>4;
-+ if (fg > 8 ) {
-+ synth_write_string("bright " );
-+ fg -= 8;
-+ }
-+ synth_write_string(colors[fg] );
-+ if (bg > 7 ) {
-+ synth_write_string(" on blinking " );
-+ bg -= 8;
-+ } else
-+ synth_write_string(" on " );
-+ synth_write_msg(colors[bg] );
-+}
-+
-+static char *blank_msg = "blank";
-+static char *edges[] = { "top, ", "bottom, ", "left, ", "right, ", "" };
-+enum { edge_top = 1, edge_bottom, edge_left, edge_right, edge_quiet };
-+
-+static void
-+announce_edge (struct vc_data *vc, int msg_id )
-+{
-+ if (bleeps&1 )
-+ bleep (spk_y );
-+ if (bleeps&2 )
-+ synth_write_msg (edges[msg_id-1] );
-+}
-+
-+static void
-+speak_char( u_char ch )
-+{
-+ char *cp = characters[ ch];
-+ synth_buffer_add( SPACE );
-+ if (IS_CHAR(ch, B_CAP ) ) {
-+ pitch_shift++;
-+ synth_write_string(str_caps_start );
-+ synth_write_string(cp );
-+ synth_write_string(str_caps_stop );
-+ } else {
-+ if (*cp == '^' ) {
-+ synth_write_string(str_ctl );
-+ cp++;
-+ }
-+ synth_write_string(cp );
-+ }
-+ synth_buffer_add( SPACE );
-+}
-+
-+static void
-+say_char (struct vc_data *vc )
-+{
-+ u_short ch;
-+ spk_old_attr = spk_attr;
-+ ch = scr_readw ((u_short * ) spk_pos );
-+ spk_attr = ((ch & 0xff00 ) >> 8 );
-+ if (spk_attr != spk_old_attr ) {
-+ if ( attrib_bleep&1 ) bleep (spk_y );
-+ if ( attrib_bleep&2 ) say_attributes( vc );
-+ }
-+ speak_char( ch&0xff );
-+}
-+
-+static void
-+say_phonetic_char (struct vc_data *vc )
-+{
-+ u_short ch;
-+ spk_old_attr = spk_attr;
-+ ch = scr_readw ((u_short * ) spk_pos );
-+ spk_attr = ((ch & 0xff00 ) >> 8 );
-+ if ( IS_CHAR(ch, B_ALPHA ) ) {
-+ ch &= 0x1f;
-+ synth_write_msg(phonetic[--ch] );
-+ } else {
-+ if ( IS_CHAR(ch, B_NUM ) )
-+ synth_write_string( "number " );
-+ speak_char( ch );
-+ }
-+}
-+
-+static void
-+say_prev_char (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ if (spk_x == 0 ) {
-+ announce_edge(vc, edge_left );
-+ return;
-+ }
-+ spk_x--;
-+ spk_pos -= 2;
-+ say_char (vc );
-+}
-+
-+static void
-+say_next_char (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ if (spk_x == vc->vc_cols - 1 ) {
-+ announce_edge(vc, edge_right );
-+ return;
-+ }
-+ spk_x++;
-+ spk_pos += 2;
-+ say_char (vc );
-+}
-+
-+/* get_word - will first check to see if the character under the
-+ reading cursor is a space and if say_word_ctl is true it will
-+ return the word space. If say_word_ctl is not set it will check to
-+ see if there is a word starting on the next position to the right
-+ and return that word if it exists. If it does not exist it will
-+ move left to the beginning of any previous word on the line or the
-+ beginning off the line whichever comes first.. */
-+
-+static u_long
-+get_word (struct vc_data *vc )
-+{
-+ u_long cnt = 0, tmpx = spk_x, tmp_pos = spk_pos;
-+ char ch;
-+ u_short attr_ch;
-+ spk_old_attr = spk_attr;
-+ ch = (char ) scr_readw ((u_short * ) tmp_pos );
-+
-+/* decided to take out the sayword if on a space (mis-information */
-+ if ( say_word_ctl && ch == SPACE ) {
-+ *buf = '\0';
-+ synth_write_msg( "space" );
-+ return 0;
-+ } else if ((tmpx < vc->vc_cols-2 )
-+ && (ch == SPACE || IS_WDLM(ch ))
-+ && ((char) scr_readw ((u_short * ) tmp_pos+1 ) > SPACE)) {
-+ tmp_pos += 2;
-+ tmpx++;
-+ } else
-+ while (tmpx > 0 ) {
-+ if (((ch = (char ) scr_readw ((u_short * ) tmp_pos-1 )) == SPACE
-+ || IS_WDLM(ch ))
-+ && ((char) scr_readw ((u_short * ) tmp_pos ) > SPACE))
-+ break;
-+ tmp_pos -= 2;
-+ tmpx--;
-+ }
-+ attr_ch = scr_readw ((u_short * ) tmp_pos );
-+ spk_attr = attr_ch >> 8;
-+ buf[cnt++] = attr_ch&0xff;
-+ while (tmpx < vc->vc_cols-1 ) {
-+ tmp_pos += 2;
-+ tmpx++;
-+ ch = (char ) scr_readw ((u_short * ) tmp_pos );
-+ if ((ch == SPACE )
-+ || (IS_WDLM(buf[cnt-1] ) && ( ch > SPACE )))
-+ break;
-+ buf[cnt++] = ch;
-+ }
-+ buf[cnt] = '\0';
-+ return cnt;
-+}
-+
-+static void
-+say_word (struct vc_data *vc )
-+{
-+ u_long cnt = get_word(vc );
-+ u_short saved_punc_mask = punc_mask;
-+ if ( cnt == 0 ) return;
-+ punc_mask = PUNC;
-+ buf[cnt++] = SPACE;
-+ spkup_write (buf, cnt );
-+ punc_mask = saved_punc_mask;
-+}
-+
-+static void
-+say_prev_word (struct vc_data *vc )
-+{
-+ char ch;
-+ u_short edge_said = 0, last_state = 0, state = 0;
-+ spk_parked |= 0x01;
-+ if (spk_x == 0 ) {
-+ if ( spk_y == 0 ) {
-+ announce_edge(vc, edge_top );
-+ return;
-+ }
-+ spk_y--;
-+ spk_x = vc->vc_cols;
-+ edge_said = edge_quiet;
-+ }
-+ while ( 1 ) {
-+ if (spk_x == 0 ) {
-+ if (spk_y == 0 ) {
-+ edge_said = edge_top;
-+ break;
-+ }
-+ if ( edge_said != edge_quiet ) edge_said = edge_left;
-+ if ( state > 0 ) break;
-+ spk_y--;
-+ spk_x = vc->vc_cols-1;
-+ } else spk_x--;
-+ spk_pos -= 2;
-+ ch = (char ) scr_readw ((u_short * ) spk_pos );
-+ if ( ch == SPACE ) state = 0;
-+ else if (IS_WDLM(ch ) ) state = 1;
-+ else state = 2;
-+ if (state < last_state ) {
-+ spk_pos += 2;
-+ spk_x++;
-+ break;
-+ }
-+ last_state = state;
-+ }
-+ if ( spk_x == 0 && edge_said == edge_quiet )
-+ edge_said = edge_left;
-+ if ( edge_said > 0 && edge_said < edge_quiet )
-+ announce_edge( vc, edge_said );
-+ say_word (vc );
-+}
-+
-+static void
-+say_next_word (struct vc_data *vc )
-+{
-+ char ch;
-+ u_short edge_said = 0, last_state = 2, state = 0;
-+ spk_parked |= 0x01;
-+ if ( spk_x == vc->vc_cols - 1 && spk_y == vc->vc_rows-1 ) {
-+ announce_edge(vc, edge_bottom );
-+ return;
-+ }
-+ while ( 1 ) {
-+ ch = (char ) scr_readw ((u_short * ) spk_pos );
-+ if ( ch == SPACE ) state = 0;
-+ else if (IS_WDLM(ch ) ) state = 1;
-+ else state = 2;
-+ if ( state > last_state ) break;
-+ if (spk_x >= vc->vc_cols-1 ) {
-+ if (spk_y == vc->vc_rows-1 ) {
-+ edge_said = edge_bottom;
-+ break;
-+ }
-+ state = 0;
-+ spk_y++;
-+ spk_x = 0;
-+ edge_said = edge_right;
-+ } else spk_x++;
-+ spk_pos += 2;
-+ last_state = state;
-+ }
-+ if ( edge_said > 0 )
-+ announce_edge( vc, edge_said );
-+ say_word (vc );
-+}
-+
-+static void
-+spell_word (struct vc_data *vc )
-+{
-+ static char *delay_str[] = { " ", ", ", ". ", ". . ", ". . . " };
-+ char *cp = buf, *str_cap= str_caps_stop;
-+ char *cp1, *last_cap = str_caps_stop;
-+ u_char ch;
-+ if ( !get_word(vc ) ) return;
-+ while ((ch = (u_char )*cp ) ) {
-+ if ( cp != buf )
-+ synth_write_string (delay_str[spell_delay] );
-+ if (IS_CHAR(ch, B_CAP ) ) {
-+ str_cap = str_caps_start;
-+ if ( *str_caps_stop ) pitch_shift++;
-+ else last_cap = str_caps_stop; /* synth has no pitch */
-+ } else str_cap = str_caps_stop;
-+ if ( str_cap !=last_cap ) {
-+ synth_write_string( str_cap );
-+ last_cap = str_cap;
-+ }
-+ if ( this_speakup_key == SPELL_PHONETIC && ( IS_CHAR( ch, B_ALPHA ) ) ) {
-+ ch &= 31;
-+ cp1 = phonetic[--ch];
-+ } else {
-+ cp1 = characters[ch];
-+ if (*cp1 == '^' ) {
-+ synth_write_string(str_ctl );
-+ cp1++;
-+ }
-+ }
-+ synth_write_string(cp1 );
-+ cp++;
-+ }
-+ if ( str_cap != str_caps_stop )
-+ synth_write_string( str_caps_stop );
-+}
-+
-+static int
-+get_line (struct vc_data *vc )
-+{
-+ u_long tmp = spk_pos - (spk_x * 2 );
-+ int i = 0;
-+ spk_old_attr = spk_attr;
-+ spk_attr = (u_char ) (scr_readw ((u_short * ) spk_pos ) >> 8 );
-+ for (i = 0; i < vc->vc_cols; i++ ) {
-+ buf[i] = (u_char ) scr_readw ((u_short * ) tmp );
-+ tmp += 2;
-+ }
-+ for (--i; i >= 0; i-- )
-+ if (buf[i] != SPACE ) break;
-+ return ++i;
-+}
-+
-+static void
-+say_line (struct vc_data *vc )
-+{
-+ int i = get_line( vc );
-+ char *cp;
-+ char num_buf[8];
-+ u_short saved_punc_mask = punc_mask;
-+ if (i == 0 ) {
-+ synth_write_msg (blank_msg );
-+ return;
-+ }
-+ buf[i++] = '\n';
-+ if ( this_speakup_key == SAY_LINE_INDENT ) {
-+ for ( cp = buf; *cp == SPACE; cp++ );
-+ sprintf( num_buf, "%d, ", ( cp-buf )+1 );
-+ synth_write_string( num_buf );
-+ }
-+ punc_mask = punc_masks[reading_punc];
-+ spkup_write (buf, i );
-+ punc_mask = saved_punc_mask;
-+}
-+
-+static void
-+say_prev_line (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ if (spk_y == 0 ) {
-+ announce_edge (vc, edge_top );
-+ return;
-+ }
-+ spk_y--;
-+ spk_pos -= vc->vc_size_row;
-+ say_line (vc );
-+}
-+
-+static void
-+say_next_line (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ if (spk_y == vc->vc_rows - 1 ) {
-+ announce_edge (vc, edge_bottom );
-+ return;
-+ }
-+ spk_y++;
-+ spk_pos += vc->vc_size_row;
-+ say_line (vc );
-+}
-+
-+static int
-+say_from_to (struct vc_data *vc, u_long from, u_long to, int read_punc )
-+{
-+ int i = 0;
-+ u_short saved_punc_mask = punc_mask;
-+ spk_old_attr = spk_attr;
-+ spk_attr = (u_char ) (scr_readw ((u_short * ) from ) >> 8 );
-+ while (from < to ) {
-+ buf[i++] = (char ) scr_readw ((u_short * ) from );
-+ from += 2;
-+ if ( i >= vc->vc_size_row ) break;
-+ }
-+ for (--i; i >= 0; i-- )
-+ if (buf[i] != SPACE ) break;
-+ buf[++i] = SPACE;
-+ buf[++i] = '\0';
-+ if ( i < 1 ) return i;
-+ if ( read_punc ) punc_mask = punc_info[reading_punc].mask;
-+ spkup_write (buf, i );
-+ if ( read_punc ) punc_mask = saved_punc_mask;
-+ return i-1;
-+}
-+
-+static void
-+say_line_from_to (struct vc_data *vc, u_long from, u_long to, int read_punc )
-+{
-+ u_long start = vc->vc_origin+(spk_y*vc->vc_size_row );
-+ u_long end = start+( to * 2 );
-+ start += from*2;
-+ if ( say_from_to( vc, start, end, read_punc ) <= 0 )
-+ synth_write_msg (blank_msg );
-+}
-+
-+static void
-+say_screen_from_to (struct vc_data *vc, u_long from, u_long to )
-+{
-+ u_long start = vc->vc_origin, end;
-+ if ( from > 0 ) start += from * vc->vc_size_row;
-+ if ( to > vc->vc_rows ) to = vc->vc_rows;
-+ end = vc->vc_origin + ( to * vc->vc_size_row);
-+ for ( from = start; from < end; from = to ) {
-+ to = from + vc->vc_size_row;
-+ say_from_to( vc, from, to, 1 );
-+ }
-+}
-+
-+static void
-+say_screen (struct vc_data *vc )
-+{
-+ say_screen_from_to( vc, 0, vc->vc_rows );
-+}
-+
-+static void
-+speakup_win_say (struct vc_data *vc )
-+{
-+ u_long start, end, from, to;
-+ if ( win_start < 2 ) {
-+ synth_write_msg( "no window" );
-+ return;
-+ }
-+ start = vc->vc_origin + ( win_top * vc->vc_size_row );
-+ end = vc->vc_origin + ( win_bottom * vc->vc_size_row );
-+ while ( start <= end ) {
-+ from = start + ( win_left * 2 );
-+ to = start + ( win_right * 2 );
-+ say_from_to( vc, from, to, 1 );
-+ start += vc->vc_size_row;
-+ }
-+}
-+
-+static void
-+top_edge (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ spk_pos = vc->vc_origin + 2 * spk_x;
-+ spk_y = 0;
-+ say_line (vc );
-+}
-+
-+static void
-+bottom_edge (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ spk_pos += (vc->vc_rows - spk_y - 1 ) * vc->vc_size_row;
-+ spk_y = vc->vc_rows - 1;
-+ say_line (vc );
-+}
-+
-+static void
-+left_edge (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ spk_pos -= spk_x * 2;
-+ spk_x = 0;
-+ say_char (vc );
-+}
-+
-+static void
-+right_edge (struct vc_data *vc )
-+{
-+ spk_parked |= 0x01;
-+ spk_pos += (vc->vc_cols - spk_x - 1 ) * 2;
-+ spk_x = vc->vc_cols - 1;
-+ say_char (vc );
-+}
-+
-+static void
-+say_first_char (struct vc_data *vc )
-+{
-+ int i, len = get_line( vc );
-+ u_char ch;
-+ spk_parked |= 0x01;
-+ if ( len == 0 ) {
-+ synth_write_msg( blank_msg );
-+ return;
-+ }
-+ for ( i = 0; i < len; i++ ) if ( buf[i] != SPACE ) break;
-+ ch = buf[i];
-+ spk_pos -= ( spk_x-i ) * 2;
-+ spk_x = i;
-+ sprintf (buf, "%d, ", ++i );
-+ synth_write_string (buf );
-+ speak_char( ch );
-+}
-+
-+static void
-+say_last_char (struct vc_data *vc )
-+{
-+ int len = get_line( vc );
-+ u_char ch;
-+ spk_parked |= 0x01;
-+ if ( len == 0 ) {
-+ synth_write_msg( blank_msg );
-+ return;
-+ }
-+ ch = buf[--len];
-+ spk_pos -= ( spk_x-len ) * 2;
-+ spk_x = len;
-+ sprintf (buf, "%d, ", ++len );
-+ synth_write_string (buf );
-+ speak_char( ch );
-+}
-+
-+static void
-+say_position (struct vc_data *vc )
-+{
-+ sprintf (buf, "line %ld, col %ld, t t y %d\n", spk_y + 1,
-+ spk_x + 1, vc->vc_num + 1 );
-+ synth_write_string (buf );
-+}
-+
-+// Added by brianb
-+static void
-+say_char_num (struct vc_data *vc )
-+{
-+ u_short ch = scr_readw ((u_short * ) spk_pos );
-+ ch &= 0x0ff;
-+ sprintf (buf, "hex %02x, decimal %d", ch, ch );
-+ synth_write_msg (buf );
-+}
-+
-+/* these are stub functions to keep keyboard.c happy. */
-+
-+static void
-+say_from_top (struct vc_data *vc )
-+{
-+ say_screen_from_to (vc, 0, spk_y );
-+}
-+
-+static void
-+say_to_bottom (struct vc_data *vc )
-+{
-+ say_screen_from_to (vc, spk_y, vc->vc_rows );
-+}
-+
-+static void
-+say_from_left (struct vc_data *vc )
-+{
-+ say_line_from_to (vc, 0, spk_x, 1 );
-+}
-+
-+static void
-+say_to_right (struct vc_data *vc )
-+{
-+ say_line_from_to (vc, spk_x, vc->vc_cols, 1 );
-+}
-+
-+/* end of stub functions. */
-+
-+static void
-+spkup_write (const char *in_buf, int count )
-+{
-+ static int rep_count = 0;
-+ static u_char ch = '\0', old_ch = '\0';
-+ static u_short char_type = 0, last_type = 0;
-+ static u_char *exn_ptr = NULL;
-+ int in_count = count;
-+ char rpt_buf[32];
-+ spk_keydown = 0;
-+ while ( count-- ) {
-+ ch = (u_char )*in_buf++;
-+ char_type = spk_chartab[ch];
-+ if (ch == old_ch && !(char_type&B_NUM ) ) {
-+ if (++rep_count > 2 ) continue;
-+ } else {
-+ if ( (last_type&CH_RPT) && rep_count > 2 ) {
-+ sprintf (rpt_buf, " times %d . ", ++rep_count );
-+ synth_write_string (rpt_buf );
-+ }
-+ rep_count = 0;
-+ }
-+ if ( !( char_type&B_NUM ) )
-+ exn_ptr = NULL;
-+ if (ch == spk_lastkey ) {
-+ rep_count = 0;
-+ if ( key_echo == 1 && ch >= MINECHOCHAR )
-+ speak_char( ch );
-+ } else if ( ( char_type&B_ALPHA ) ) {
-+ if ( (synth_flags&SF_DEC) && (last_type&PUNC) )
-+ synth_buffer_add ( SPACE );
-+ synth_write( &ch, 1 );
-+ } else if ( ( char_type&B_NUM ) ) {
-+ rep_count = 0;
-+ if ( (last_type&B_EXNUM) && synth_buff_in == exn_ptr+1 ) {
-+ synth_buff_in--;
-+ synth_buffer_add( old_ch );
-+ exn_ptr = NULL;
-+ }
-+ synth_write( &ch, 1 );
-+ } else if ( (char_type&punc_mask) ) {
-+ speak_char( ch );
-+ char_type &= ~PUNC; /* for dec nospell processing */
-+ } else if ( ( char_type&SYNTH_OK ) ) {
-+/* these are usually puncts like . and , which synth needs for expression.
-+ * suppress multiple to get rid of long pausesand clear repeat count so if
-+ *someone has repeats on you don't get nothing repeated count */
-+ if ( ch != old_ch )
-+ synth_write( &ch, 1 );
-+ else rep_count = 0;
-+ } else {
-+ if ( ( char_type&B_EXNUM ) )
-+ exn_ptr = (u_char *)synth_buff_in;
-+/* send space and record position, if next is num overwrite space */
-+ if ( old_ch != ch ) synth_buffer_add ( SPACE );
-+ else rep_count = 0;
-+ }
-+ old_ch = ch;
-+ last_type = char_type;
-+ }
-+ spk_lastkey = 0;
-+ if (in_count > 2 && rep_count > 2 ) {
-+ if ( (last_type&CH_RPT) ) {
-+ sprintf (rpt_buf, " repeated %d . ", ++rep_count );
-+ synth_write_string (rpt_buf );
-+ }
-+ rep_count = 0;
-+ }
-+}
-+
-+static char *ctl_key_ids[] = {
-+ "shift", "altgr", "control", "ault", "l shift", "speakup",
-+"l control", "r control"
-+};
-+#define NUM_CTL_LABELS 8
-+
-+static void
-+handle_shift( KBD_PROTO )
-+{
-+ (*do_shift)( KBD_ARGS );
-+ if ( synth == NULL || up_flag || spk_killed ) return;
-+ spk_shut_up &= 0xfe;
-+ do_flush( );
-+ if ( say_ctrl && value < NUM_CTL_LABELS )
-+ synth_write_string ( ctl_key_ids[value] );
-+}
-+
-+static void
-+handle_latin( KBD_PROTO )
-+{
-+ (*do_latin)( KBD_ARGS );
-+ if ( up_flag ) {
-+ spk_lastkey = spk_keydown = 0;
-+ return;
-+ }
-+ if ( synth == NULL || spk_killed ) return;
-+ spk_shut_up &= 0xfe;
-+ spk_lastkey = value;
-+ spk_keydown++;
-+ spk_parked &= 0xfe;
-+ if ( key_echo == 2 && value >= MINECHOCHAR )
-+ speak_char( value );
-+}
-+
-+static int
-+set_key_info( u_char *key_info, u_char *k_buffer )
-+{
-+ int i = 0, states, key_data_len;
-+ u_char *cp = key_info, *cp1 = k_buffer;
-+ u_char ch, version, num_keys;
-+ version = *cp++;
-+ if ( version != KEY_MAP_VER ) return -1;
-+ num_keys = *cp;
-+ states = (int)cp[1];
-+ key_data_len = ( states+1 ) * ( num_keys+1 );
-+ if ( key_data_len+SHIFT_TBL_SIZE+4 >= sizeof(key_buf ) ) return -2;
-+ memset( k_buffer, 0, SHIFT_TBL_SIZE );
-+ memset( our_keys, 0, sizeof( our_keys ) );
-+ shift_table = k_buffer;
-+ our_keys[0] = shift_table;
-+ cp1 += SHIFT_TBL_SIZE;
-+ memcpy( cp1, cp, key_data_len+3 );
-+/* get num_keys, states and data*/
-+ cp1 += 2; /* now pointing at shift states */
-+ for ( i = 1; i <= states; i++ ) {
-+ ch = *cp1++;
-+ if ( ch >= SHIFT_TBL_SIZE ) return -3;
-+ shift_table[ch] = i;
-+ }
-+ keymap_flags = *cp1++;
-+ while ( ( ch = *cp1 ) ) {
-+ if ( ch >= MAX_KEY ) return -4;
-+ our_keys[ch] = cp1;
-+ cp1 += states+1;
-+ }
-+ return 0;
-+}
-+
-+num_var spk_num_vars[] = { /* bell must be first to set high limit */
-+ { BELL_POS, 0, 0, 0, 0, 0, 0, 0 },
-+ { SPELL_DELAY, 0, 0, 0, 5, 0, 0, 0 },
-+ { ATTRIB_BLEEP, 0, 1, 0, 3, 0, 0, 0 },
-+ { BLEEPS, 0, 3, 0, 3, 0, 0, 0 },
-+ { BLEEP_TIME, 0, 4, 1, 20, 0, 0, 0 },
-+ { PUNC_LEVEL, 0, 1, 0, 4, 0, 0, 0 },
-+ { READING_PUNC, 0, 1, 0, 4, 0, 0, 0 },
-+ { CURSOR_TIME, 0, 120, 50, 600, 0, 0, 0 },
-+ { SAY_CONTROL, TOGGLE_0 },
-+ { SAY_WORD_CTL, TOGGLE_0 },
-+ { NO_INTERRUPT, TOGGLE_0 },
-+ { KEY_ECHO, 0, 1, 0, 2, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+static int cursor_track = 1;
-+static char *cursor_msgs[] = { "cursoring off", "cursoring on",
-+ "attribute cursor" };
-+#define MAXCURSORTRACK 1
-+/* increase when we add more cursor modes */
-+/* attribute cursor code coming soon */
-+
-+static void
-+toggle_cursoring( struct vc_data *vc )
-+{
-+ cursor_track++;
-+ if ( cursor_track > MAXCURSORTRACK )
-+ cursor_track = 0;
-+ synth_write_msg (cursor_msgs[cursor_track] );
-+}
-+
-+static void
-+reset_default_chars (void )
-+{
-+ int i;
-+ if (default_chars[(int )'a'] == NULL ) { /* lowers are null first time */
-+ for (i = (int )'a'; default_chars[i] == NULL; i++ )
-+ default_chars[i] = default_chars[i-32];
-+ } else { /* free any non-default */
-+ for (i = 0; i < 256; i++ ) {
-+ if (characters[i] != default_chars[i] )
-+ kfree (characters[i] );
-+ }
-+ }
-+ memcpy( characters, default_chars, sizeof( default_chars ) );
-+}
-+
-+static void
-+handle_cursor( KBD_PROTO );
-+static void
-+handle_spec( KBD_PROTO );
-+static void
-+cursor_done(u_long data );
-+declare_timer( cursor_timer );
-+
-+void __init speakup_open (struct vc_data *vc, spk_t *first_console )
-+{
-+ int i;
-+ num_var *n_var;
-+ reset_default_chars ( );
-+ memset( speakup_console, 0, sizeof( speakup_console ) );
-+ if ( first_console == NULL ) return;
-+ memset( first_console, 0, spk_size );
-+ speakup_console[vc->vc_num] = first_console;
-+ speakup_date( vc);
-+ pr_info ("%s: initialized\n", SPEAKUP_VERSION );
-+ init_timer (&cursor_timer );
-+#if (LINUX_VERSION_CODE >= 132419)
-+ cursor_timer.entry.prev=NULL;
-+#endif
-+ cursor_timer.function = cursor_done;
-+ init_sleeper ( synth_sleeping_list );
-+ strlwr (synth_name );
-+ synth_init ( synth_name );
-+ spk_num_vars[0].high = vc->vc_cols;
-+ for ( n_var = spk_num_vars; n_var->var_id >= 0; n_var++ )
-+ speakup_register_var( n_var );
-+ for (i = 1; punc_info[i].mask != 0; i++ )
-+ set_mask_bits( 0, i, 2 );
-+ do_latin = key_handler[KT_LATIN];
-+ key_handler[KT_LATIN] = handle_latin;
-+ do_spec = key_handler[KT_SPEC];
-+ key_handler[KT_SPEC] = handle_spec;
-+ do_cursor = key_handler[KT_CUR];
-+ key_handler[KT_CUR] = handle_cursor;
-+ do_shift = key_handler[KT_SHIFT];
-+ key_handler[KT_SHIFT] = handle_shift;
-+ set_key_info( key_defaults, key_buf );
-+}
-+
-+#ifdef CONFIG_PROC_FS
-+
-+// speakup /proc interface code
-+
-+/* Usage:
-+cat /proc/speakup/version
-+
-+cat /proc/speakup/characters > foo
-+less /proc/speakup/characters
-+vi /proc/speakup/characters
-+
-+cat foo > /proc/speakup/characters
-+cat > /proc/speakup/characters
-+echo 39 apostrophe > /proc/speakup/characters
-+echo 87 w > /proc/speakup/characters
-+echo 119 w > /proc/speakup/characters
-+echo defaults > /proc/speakup/characters
-+echo reset > /proc/speakup/characters
-+*/
-+
-+// keymap handlers
-+
-+static int
-+keys_read_proc (PROC_READ_PROTOTYPE )
-+{
-+ char *cp = page;
-+ int i, n, num_keys, nstates;
-+ u_char *cp1 = key_buf + SHIFT_TBL_SIZE, ch;
-+ num_keys = (int)(*cp1);
-+ nstates = (int)cp1[1];
-+ cp += sprintf( cp, "%d, %d, %d,\n", KEY_MAP_VER, num_keys, nstates );
-+ cp1 += 2; /* now pointing at shift states */
-+/* dump num_keys+1 as first row is shift states + flags,
-+ each subsequent row is key + states */
-+ for ( n = 0; n <= num_keys; n++ ) {
-+ for ( i = 0; i <= nstates; i++ ) {
-+ ch = *cp1++;
-+ cp += sprintf( cp, "%d,", (int)ch );
-+ *cp++ = ( i < nstates ) ? SPACE : '\n';
-+ }
-+ }
-+ cp += sprintf( cp, "0, %d\n", KEY_MAP_VER );
-+ *start = 0;
-+ *eof = 1;
-+ return (int)(cp-page);
-+}
-+
-+static char *
-+s2uchar ( char *start, char *dest )
-+{
-+ int val = 0;
-+ while ( *start && *start <= SPACE ) start++;
-+ while ( *start >= '0' && *start <= '9' ) {
-+ val *= 10;
-+ val += ( *start ) - '0';
-+ start++;
-+ }
-+ if ( *start == ',' ) start++;
-+ *dest = (u_char)val;
-+ return start;
-+}
-+
-+static int
-+keys_write_proc (PROC_WRITE_PROTOTYPE )
-+{
-+ int i, ret = count;
-+ char *in_buff, *cp;
-+ u_char *cp1;
-+ if (count < 1 || count > 1800 )
-+ return -EINVAL;
-+ in_buff = ( char * ) __get_free_page ( GFP_KERNEL );
-+ if ( !in_buff ) return -ENOMEM;
-+ if (copy_from_user (in_buff, buffer, count ) ) {
-+ free_page ( ( unsigned long ) in_buff );
-+ return -EFAULT;
-+ }
-+ if (in_buff[count - 1] == '\n' ) count--;
-+ in_buff[count] = '\0';
-+ if ( count == 1 && *in_buff == 'd' ) {
-+ free_page ( ( unsigned long ) in_buff );
-+ set_key_info( key_defaults, key_buf );
-+ return ret;
-+ }
-+ cp = in_buff;
-+ cp1 = (u_char *)in_buff;
-+ for ( i = 0; i < 3; i++ ) {
-+ cp = s2uchar( cp, cp1 );
-+ cp1++;
-+ }
-+ i = (int)cp1[-2]+1;
-+ i *= (int)cp1[-1]+1;
-+ i+= 2; /* 0 and last map ver */
-+ if ( cp1[-3] != KEY_MAP_VER || cp1[-1] > 10 ||
-+ i+SHIFT_TBL_SIZE+4 >= sizeof(key_buf ) ) {
-+pr_warn( "i %d %d %d %d\n", i, (int)cp1[-3], (int)cp1[-2], (int)cp1[-1] );
-+ free_page ( ( unsigned long ) in_buff );
-+ return -EINVAL;
-+ }
-+ while ( --i >= 0 ) {
-+ cp = s2uchar( cp, cp1 );
-+ cp1++;
-+ if ( !(*cp) ) break;
-+ }
-+ if ( i != 0 || cp1[-1] != KEY_MAP_VER || cp1[-2] != 0 ) {
-+ ret = -EINVAL;
-+pr_warn( "end %d %d %d %d\n", i, (int)cp1[-3], (int)cp1[-2], (int)cp1[-1] );
-+ } else {
-+ if ( set_key_info( in_buff, key_buf ) ) {
-+ set_key_info( key_defaults, key_buf );
-+ ret = -EINVAL;
-+pr_warn( "set key failed\n" );
-+ }
-+ }
-+ free_page ( ( unsigned long ) in_buff );
-+ return ret;
-+}
-+
-+// this is the handler for /proc/speakup/version
-+static int
-+version_read_proc (PROC_READ_PROTOTYPE )
-+{
-+ int len = sprintf (page, "%s\n", SPEAKUP_VERSION );
-+ if ( synth != NULL )
-+ len += sprintf( page+len, "synth %s version %s\n",
-+ synth->name, synth->version );
-+ *start = 0;
-+ *eof = 1;
-+ return len;
-+}
-+
-+// this is the read handler for /proc/speakup/characters
-+static int
-+chars_read_proc (PROC_READ_PROTOTYPE )
-+{
-+ int i, len = 0;
-+ off_t begin = 0;
-+ char *cp;
-+ for (i = 0; i < 256; i++ ) {
-+ cp = (characters[i] ) ? characters[i] : "NULL";
-+ len += sprintf (page + len, "%d\t%s\n", i, cp );
-+ if (len + begin > off + count )
-+ break;
-+ if (len + begin < off ) {
-+ begin += len;
-+ len = 0;
-+ }
-+ }
-+ if (i >= 256 )
-+ *eof = 1;
-+ if (off >= len + begin )
-+ return 0;
-+ *start = page + (off - begin );
-+ return ((count < begin + len - off ) ? count : begin + len - off );
-+}
-+
-+static volatile int chars_timer_active = 0; // indicates when timer is set
-+static declare_timer( chars_timer );
-+
-+static inline void
-+chars_stop_timer (void )
-+{
-+ if (chars_timer_active )
-+ stop_timer ( chars_timer );
-+}
-+
-+static int strings, rejects, updates;
-+
-+static void
-+show_char_results (u_long data )
-+{
-+ int len;
-+ char buf[80];
-+ chars_stop_timer ( );
-+ len = sprintf (buf, " updated %d of %d character descriptions\n",
-+ updates, strings );
-+ if (rejects )
-+ sprintf (buf + (len-1), " with %d reject%s\n",
-+ rejects, rejects > 1 ? "s" : "" );
-+ printk( buf );
-+}
-+
-+/* this is the write handler for /proc/speakup/silent */
-+static int
-+silent_write_proc (PROC_WRITE_PROTOTYPE )
-+{
-+ struct vc_data *vc = vc_cons[fg_console].d;
-+ char ch = 0, shut;
-+ if (count > 0 || count < 3 ) {
-+ get_user (ch, buffer );
-+ if ( ch == '\n' ) ch = '0';
-+ }
-+ if ( ch < '0' || ch > '7' ) {
-+ pr_warn ( "silent value not in range (0,7)\n" );
-+ return count;
-+ }
-+ if ( (ch&2) ) {
-+ shut = 1;
-+ do_flush( );
-+ } else shut = 0;
-+ if ( (ch&4) ) shut |= 0x40;
-+ if ( (ch&1) )
-+ spk_shut_up |= shut;
-+ else spk_shut_up &= ~shut;
-+ return count;
-+}
-+
-+// this is the write handler for /proc/speakup/characters
-+static int
-+chars_write_proc (PROC_WRITE_PROTOTYPE )
-+{
-+#define max_desc_len 72
-+ static int cnt = 0, state = 0;
-+ static char desc[max_desc_len + 1];
-+ static u_long jiff_last = 0;
-+ short i = 0, num;
-+ int len;
-+ char ch, *cp, *p_new;
-+ // reset certain vars if enough time has elapsed since last called
-+ if (jiffies - jiff_last > 10 ) {
-+ cnt = state = strings = rejects = updates = 0;
-+ }
-+ jiff_last = jiffies;
-+get_more:
-+ desc[cnt] = '\0';
-+ state = 0;
-+ for (; i < count && state < 2; i++ ) {
-+ get_user (ch, buffer + i );
-+ if ( ch == '\n' ) {
-+ desc[cnt] = '\0';
-+ state = 2;
-+ } else if (cnt < max_desc_len )
-+ desc[cnt++] = ch;
-+ }
-+ if (state < 2 ) return count;
-+ cp = desc;
-+ while ( *cp && *cp <= SPACE ) cp++;
-+ if ((!cnt ) || strchr ("dDrR", *cp ) ) {
-+ reset_default_chars ( );
-+ pr_info( "character descriptions reset to defaults\n" );
-+ cnt = 0;
-+ return count;
-+ }
-+ cnt = 0;
-+ if (*cp == '#' ) goto get_more;
-+ num = -1;
-+ cp = speakup_s2i(cp, &num );
-+ while ( *cp && *cp <= SPACE ) cp++;
-+ if (num < 0 || num > 255 ) { // not in range
-+ rejects++;
-+ strings++;
-+ goto get_more;
-+ }
-+ if (num >= 27 && num <= 31 ) goto get_more;
-+ if (!strcmp(cp, characters[num] ) ) {
-+ strings++;
-+ goto get_more;
-+ }
-+ len = strlen(cp );
-+ if (characters[num] == default_chars[num] )
-+ p_new = (char * ) kmalloc (sizeof (char ) * len+1, GFP_KERNEL );
-+ else if ( strlen(characters[num] ) >= len )
-+ p_new = characters[num];
-+ else {
-+ kfree(characters[num] );
-+ characters[num] = default_chars[num];
-+ p_new = (char * ) kmalloc (sizeof (char ) * len+1, GFP_KERNEL );
-+ }
-+ if (!p_new ) return -ENOMEM;
-+ strcpy ( p_new, cp );
-+ characters[num] = p_new;
-+ updates++;
-+ strings++;
-+ if (i < count ) goto get_more;
-+ chars_stop_timer ( );
-+ init_timer (&chars_timer );
-+ chars_timer.function = show_char_results;
-+ chars_timer.expires = jiffies + 5;
-+ start_timer (chars_timer );
-+ chars_timer_active++;
-+ return count;
-+}
-+
-+static int
-+bits_read_proc (PROC_READ_PROTOTYPE )
-+{
-+ int i;
-+ var_header *p_header = (var_header * )data;
-+ proc_var *var = p_header->data;
-+ bits_data *pb = &punc_info[var->value];
-+ short mask = pb->mask;
-+ char *cp = page;
-+ *start = 0;
-+ *eof = 1;
-+ for ( i = 33; i < 128; i++ ) {
-+ if ( !(spk_chartab[i]&mask ) ) continue;
-+ *cp++ = (char )i;
-+ }
-+ *cp++ = '\n';
-+ return cp-page;
-+}
-+
-+/* set_mask_bits sets or clears the punc/delim/repeat bits,
-+ * if input is null uses the defaults.
-+ * values for how: 0 clears bits of chars supplied,
-+ * 1 clears allk, 2 sets bits for chars */
-+
-+int
-+set_mask_bits( const char *input, const int which, const int how )
-+{
-+ u_char *cp;
-+ short mask = punc_info[which].mask;
-+ if ( how&1 ) {
-+ for ( cp = (u_char * )punc_info[3].value; *cp; cp++ )
-+ spk_chartab[*cp] &= ~mask;
-+ }
-+ cp = (u_char * )input;
-+ if ( cp == 0 ) cp = punc_info[which].value;
-+ else {
-+ for ( ; *cp; cp++ ) {
-+ if ( *cp < SPACE ) break;
-+ if ( mask < PUNC ) {
-+ if ( !(spk_chartab[*cp]&PUNC) ) break;
-+ } else if ( (spk_chartab[*cp]&B_NUM) ) break;
-+ }
-+ if ( *cp ) return -EINVAL;
-+ cp = (u_char * )input;
-+ }
-+ if ( how&2 ) {
-+ for ( ; *cp; cp++ )
-+ if ( *cp > SPACE ) spk_chartab[*cp] |= mask;
-+ } else {
-+ for ( ; *cp; cp++ )
-+ if ( *cp > SPACE ) spk_chartab[*cp] &= ~mask;
-+ }
-+ return 0;
-+}
-+
-+static bits_data *pb_edit = NULL;
-+
-+static int edit_bits (struct vc_data *vc, u_char type, u_char ch, u_short key )
-+{
-+ short mask = pb_edit->mask, ch_type = spk_chartab[ch];
-+ if ( type != KT_LATIN || (ch_type&B_NUM ) || ch < SPACE ) return -1;
-+ if ( ch == SPACE ) {
-+ synth_write_msg( "edit done" );
-+ special_handler = NULL;
-+ return 1;
-+ }
-+ if ( mask < PUNC && !(ch_type&PUNC) ) return -1;
-+ spk_chartab[ch] ^= mask;
-+ speak_char( ch );
-+ synth_write_msg( (spk_chartab[ch]&mask ) ? " on" : " off" );
-+ return 1;
-+}
-+
-+static int
-+bits_write_proc (PROC_WRITE_PROTOTYPE )
-+{
-+ var_header *p_header = (var_header * )data;
-+ proc_var *var = p_header->data;
-+ int ret = count;
-+ char punc_buf[100];
-+ if (count < 1 || count > 99 )
-+ return -EINVAL;
-+ if (copy_from_user (punc_buf, buffer, count ) )
-+ return -EFAULT;
-+ if (punc_buf[count - 1] == '\n' )
-+ count--;
-+ punc_buf[count] = '\0';
-+ if ( *punc_buf == 'd' || *punc_buf == 'r' )
-+ count = set_mask_bits( 0, var->value, 3 );
-+ else
-+ count = set_mask_bits( punc_buf, var->value, 3 );
-+ if ( count < 0 ) return count;
-+ return ret;
-+}
-+
-+// this is the read handler for /proc/speakup/synth
-+static int
-+synth_read_proc (PROC_READ_PROTOTYPE )
-+{
-+ int len;
-+ if ( synth == NULL ) strcpy( synth_name, "none" );
-+ else strcpy( synth_name, synth->name );
-+ len = sprintf (page, "%s\n", synth_name );
-+ *start = 0;
-+ *eof = 1;
-+ return len;
-+}
-+
-+// this is the write handler for /proc/speakup/synth
-+static int
-+synth_write_proc (PROC_WRITE_PROTOTYPE )
-+{
-+ int ret = count;
-+ char new_synth_name[10];
-+ const char *old_name = ( synth != NULL ) ? synth->name : "none";
-+ if (count < 2 || count > 9 )
-+ return -EINVAL;
-+ if (copy_from_user (new_synth_name, buffer, count ) )
-+ return -EFAULT;
-+ if (new_synth_name[count - 1] == '\n' )
-+ count--;
-+ new_synth_name[count] = '\0';
-+ strlwr (new_synth_name );
-+ if (!strcmp (new_synth_name, old_name ) ) {
-+ pr_warn ( "%s already in use\n", new_synth_name );
-+ return ret;
-+ }
-+ if ( synth_init( new_synth_name ) == 0 ) return ret;
-+ pr_warn( "failed to init synth %s\n", new_synth_name );
-+ return -ENODEV;
-+}
-+
-+proc_var spk_proc_vars[] = {
-+ { VERSION, version_read_proc, 0, 0 },
-+ { SILENT, 0, silent_write_proc, 0 },
-+ { CHARS, chars_read_proc, chars_write_proc, 0 },
-+ { SYNTH, synth_read_proc, synth_write_proc, 0 },
-+ { KEYMAP, keys_read_proc, keys_write_proc, 0 },
-+ { PUNC_SOME, bits_read_proc, bits_write_proc, 1 },
-+ { PUNC_MOST, bits_read_proc, bits_write_proc, 2 },
-+ { PUNC_ALL, bits_read_proc, 0, 3 },
-+ { DELIM, bits_read_proc, bits_write_proc, 4 },
-+ { REPEATS, bits_read_proc, bits_write_proc, 5 },
-+ { EXNUMBER, bits_read_proc, bits_write_proc, 6 },
-+ { -1, 0, 0, 0 }
-+};
-+
-+#endif // CONFIG_PROC_FS
-+
-+#ifdef CONFIG_SPEAKUP
-+
-+void __init
-+speakup_init (struct vc_data *vc )
-+{
-+ spk_t *first_console = (spk_t *) alloc_bootmem (spk_size+1 );
-+ speakup_open( vc, first_console );
-+}
-+
-+#endif
-+
-+void
-+speakup_allocate (struct vc_data *vc )
-+{
-+ int vc_num = vc->vc_num;
-+ if ( speakup_console[vc_num] == NULL ) {
-+ speakup_console[vc_num] = (spk_t *) kmalloc (spk_size + 1,
-+ GFP_KERNEL );
-+ if ( speakup_console[vc_num] == NULL ) return;
-+ memset( speakup_console[vc_num], 0, spk_size );
-+ speakup_date( vc);
-+ } else if ( !spk_parked ) speakup_date( vc);
-+}
-+
-+static void
-+speakup_date (struct vc_data *vc )
-+{
-+ spk_x = spk_cx = vc->vc_x;
-+ spk_y = spk_cy = vc->vc_y;
-+ spk_pos = spk_cp = vc->vc_pos;
-+ spk_old_attr = spk_attr;
-+ spk_attr = ((scr_readw ((u_short * ) spk_pos ) & 0xff00 ) >> 8 );
-+}
-+
-+static u_char is_cursor = 0;
-+static u_long old_cursor_pos, old_cursor_x, old_cursor_y;
-+static int cursor_con;
-+volatile int cursor_timer_active = 0;
-+
-+void
-+cursor_stop_timer(void )
-+{
-+ if (!cursor_timer_active ) return;
-+ stop_timer ( cursor_timer );
-+ cursor_timer_active = 0;
-+}
-+
-+static void
-+handle_cursor( KBD_PROTO )
-+{
-+ (*do_cursor)( KBD_ARGS );
-+ spk_parked &= 0xfe;
-+ if ( synth == NULL || up_flag || spk_shut_up || cursor_track == 0 )
-+ return;
-+ spk_shut_up &= 0xfe;
-+ if ( no_intr ) do_flush( );
-+/* the key press flushes if !no_inter but we want to flush on cursor
-+ * moves regardless of no_inter state */
-+ is_cursor = value+1;
-+ old_cursor_pos = vc->vc_pos;
-+ old_cursor_x = vc->vc_x;
-+ old_cursor_y = vc->vc_y;
-+ cursor_con = vc->vc_num;
-+ cursor_stop_timer( );
-+ cursor_timer.expires = jiffies + cursor_timeout;
-+ start_timer (cursor_timer );
-+ cursor_timer_active++;
-+}
-+
-+static void
-+cursor_done (u_long data )
-+{
-+ struct vc_data *vc = vc_cons[cursor_con].d;
-+ cursor_stop_timer( );
-+ if (cursor_con != fg_console ) {
-+ is_cursor = 0;
-+ return;
-+ }
-+ speakup_date (vc );
-+ if ( win_enabled ) {
-+ if ( vc->vc_x >= win_left && vc->vc_x <= win_right &&
-+ vc->vc_y >= win_top && vc->vc_y <= win_bottom ) {
-+ spk_keydown = is_cursor = 0;
-+ return;
-+ }
-+ }
-+ if ( is_cursor == 1 || is_cursor == 4 )
-+ say_line_from_to (vc, 0, vc->vc_cols, 0 );
-+ else say_char ( vc );
-+ spk_keydown = is_cursor = 0;
-+}
-+
-+/* These functions are the interface to speakup from the actual kernel code. */
-+
-+void
-+speakup_bs (struct vc_data *vc )
-+{
-+ if (!spk_parked )
-+ speakup_date (vc );
-+ if ( spk_shut_up || synth == NULL ) return;
-+ if ( vc->vc_num == fg_console && spk_keydown ) {
-+ spk_keydown = 0;
-+ if (!is_cursor ) say_char (vc );
-+ }
-+}
-+
-+void
-+speakup_con_write (struct vc_data *vc, const char *str, int len )
-+{
-+ if (spk_shut_up || (vc->vc_num != fg_console ) )
-+ return;
-+ if (bell_pos && spk_keydown && (vc->vc_x == bell_pos - 1 ) )
-+ bleep(3 );
-+ if (synth == NULL || is_cursor ) return;
-+ if ( win_enabled ) {
-+ if ( vc->vc_x >= win_left && vc->vc_x <= win_right &&
-+ vc->vc_y >= win_top && vc->vc_y <= win_bottom ) return;
-+ }
-+ spkup_write (str, len );
-+}
-+
-+void
-+speakup_con_update (struct vc_data *vc )
-+{
-+ if ( speakup_console[vc->vc_num] == NULL || spk_parked )
-+ return;
-+ speakup_date (vc );
-+}
-+
-+static void
-+handle_spec( KBD_PROTO )
-+{
-+ int on_off = 2;
-+ char *label;
-+static const char *lock_status[] = { " off", " on", "" };
-+ (*do_spec)( KBD_ARGS );
-+ if ( synth == NULL || up_flag || spk_killed ) return;
-+ spk_shut_up &= 0xfe;
-+ if ( no_intr ) do_flush( );
-+ switch (value ) {
-+ case KVAL( K_CAPS ):
-+ label = "caps lock";
-+ on_off = (vc_kbd_led(kbd , VC_CAPSLOCK ) );
-+ break;
-+ case KVAL( K_NUM ):
-+ label = "num lock";
-+ on_off = (vc_kbd_led(kbd , VC_NUMLOCK ) );
-+ break;
-+ case KVAL( K_HOLD ):
-+ label = "scroll lock";
-+ on_off = (vc_kbd_led(kbd , VC_SCROLLOCK ) );
-+ break;
-+ default:
-+ spk_parked &= 0xfe;
-+ return;
-+ }
-+ synth_write_string ( label );
-+ synth_write_msg ( lock_status[on_off] );
-+}
-+
-+static int
-+inc_dec_var( u_char value )
-+{
-+ var_header *p_header;
-+ num_var *var_data;
-+ char num_buf[32];
-+ char *cp = num_buf, *pn;
-+ int var_id = (int)value - VAR_START;
-+ int how = (var_id&1) ? E_INC : E_DEC;
-+ var_id = var_id/2+FIRST_SET_VAR;
-+ p_header = get_var_header( var_id );
-+ if ( p_header == NULL ) return -1;
-+ if ( p_header->var_type != VAR_NUM ) return -1;
-+ var_data = p_header->data;
-+ if ( set_num_var( 1, p_header, how ) != 0 )
-+ return -1;
-+ if ( !spk_close_press ) {
-+ for ( pn = p_header->name; *pn; pn++ ) {
-+ if ( *pn == '_' ) *cp = SPACE;
-+ else *cp++ = *pn;
-+ }
-+ }
-+ sprintf( cp, " %d ", (int)var_data->value );
-+ synth_write_string( num_buf );
-+ return 0;
-+}
-+
-+static void
-+speakup_win_set (struct vc_data *vc )
-+{
-+ char info[40];
-+ if ( win_start > 1 ) {
-+ synth_write_msg( "window already set, clear then reset" );
-+ return;
-+ }
-+ if ( spk_x < win_left || spk_y < win_top ) {
-+ synth_write_msg( "error end before start" );
-+ return;
-+ }
-+ if ( win_start && spk_x == win_left && spk_y == win_top ) {
-+ win_left = 0;
-+ win_right = vc->vc_cols-1;
-+ win_bottom = spk_y;
-+ sprintf( info, "window is line %d", (int)win_top+1 );
-+ } else {
-+ if ( !win_start ) {
-+ win_top = spk_y;
-+ win_left = spk_x;
-+ } else {
-+ win_bottom = spk_y;
-+ win_right = spk_x;
-+ }
-+ sprintf( info, "%s at line %d, column %d",
-+ (win_start) ? "end" : "start",
-+ (int)spk_y+1, (int)spk_x+1 );
-+ }
-+ synth_write_msg( info );
-+ win_start++;
-+}
-+
-+static void
-+speakup_win_clear (struct vc_data *vc )
-+{
-+ win_top = win_bottom = 0;
-+ win_left = win_right = 0;
-+ win_start = 0;
-+ synth_write_msg( "window cleared" );
-+}
-+
-+static void
-+speakup_win_enable (struct vc_data *vc )
-+{
-+ if ( win_start < 2 ) {
-+ synth_write_msg( "no window" );
-+ return;
-+ }
-+ win_enabled ^= 1;
-+ if ( win_enabled ) synth_write_msg( "window silenced" );
-+ else synth_write_msg( "window silence disabled" );
-+}
-+
-+static void
-+speakup_bits (struct vc_data *vc )
-+{
-+ int val = this_speakup_key - ( FIRST_EDIT_BITS - 1 );
-+ if ( special_handler != NULL || val < 1 || val > 6 ) {
-+ synth_write_msg( "error" );
-+ return;
-+ }
-+ pb_edit = &punc_info[val];
-+ sprintf( buf, "edit %s, press space when done", pb_edit->name );
-+ synth_write_msg( buf );
-+ special_handler = edit_bits;
-+}
-+
-+static int handle_goto (struct vc_data *vc, u_char type, u_char ch, u_short key )
-+{
-+ static u_char *goto_buf = "\0\0\0\0\0\0";
-+ static int num = 0;
-+ short maxlen, go_pos;
-+ char *cp;
-+ if ( type == KT_SPKUP && ch == SPEAKUP_GOTO ) goto do_goto;
-+ if ( type == KT_LATIN && ch == '\n' ) goto do_goto;
-+ if ( type != 0 ) goto oops;
-+ if (ch == 8 ) {
-+ if ( num == 0 ) return -1;
-+ ch = goto_buf[--num];
-+ goto_buf[num] = '\0';
-+ spkup_write( &ch, 1 );
-+ return 1;
-+}
-+ if ( ch < '+' || ch > 'y' ) goto oops;
-+ goto_buf[num++] = ch;
-+ goto_buf[num] = '\0';
-+ spkup_write( &ch, 1 );
-+ maxlen = ( *goto_buf >= '0' ) ? 3 : 4;
-+ if ((ch == '+' || ch == '-' ) && num == 1 ) return 1;
-+ if (ch >= '0' && ch <= '9' && num < maxlen ) return 1;
-+ if ( num < maxlen-1 || num > maxlen ) goto oops;
-+ if ( ch < 'x' || ch > 'y' ) {
-+oops:
-+ if (!spk_killed )
-+ synth_write_msg (" goto canceled" );
-+ goto_buf[num = 0] = '\0';
-+ special_handler = NULL;
-+ return 1;
-+ }
-+ cp = speakup_s2i (goto_buf, &go_pos );
-+ goto_pos = (u_long)go_pos;
-+ if (*cp == 'x' ) {
-+ if (*goto_buf < '0' ) goto_pos += spk_x;
-+ else goto_pos--;
-+ if (goto_pos < 0 ) goto_pos = 0;
-+ if (goto_pos >= vc->vc_cols )
-+ goto_pos = vc->vc_cols-1;
-+ goto_x = 1;
-+ } else {
-+ if (*goto_buf < '0' ) goto_pos += spk_y;
-+ else goto_pos--;
-+ if (goto_pos < 0 ) goto_pos = 0;
-+ if (goto_pos >= vc->vc_rows ) goto_pos = vc->vc_rows-1;
-+ goto_x = 0;
-+ }
-+ goto_buf[num = 0] = '\0';
-+do_goto:
-+ special_handler = NULL;
-+ spk_parked |= 0x01;
-+ if ( goto_x ) {
-+ spk_pos -= spk_x * 2;
-+ spk_x = goto_pos;
-+ spk_pos += goto_pos * 2;
-+ say_word( vc );
-+ } else {
-+ spk_y = goto_pos;
-+ spk_pos = vc->vc_origin + ( goto_pos * vc->vc_size_row );
-+ say_line( vc );
-+ }
-+ return 1;
-+}
-+
-+static void
-+speakup_goto (struct vc_data *vc )
-+{
-+ if ( special_handler != NULL ) {
-+ synth_write_msg( "error" );
-+ return;
-+ }
-+ synth_write_msg( "go to?" );
-+ special_handler = handle_goto;
-+ return;
-+}
-+
-+static void
-+load_help ( void *dummy )
-+{
-+ request_module( "speakup_keyhelp" );
-+ if ( help_handler ) {
-+ (*help_handler)(0, KT_SPKUP, SPEAKUP_HELP, 0 );
-+ } else synth_write_string( "help module not found" );
-+}
-+
-+#if (LINUX_VERSION_CODE >= 132419)
-+static DECLARE_WORK(ld_help, load_help, NULL);
-+#define schedule_help schedule_work
-+#else
-+static struct tq_struct ld_help = { routine: load_help, };
-+#define schedule_help schedule_task
-+#endif
-+
-+static void
-+speakup_help (struct vc_data *vc )
-+{
-+ if ( help_handler == NULL ) {
-+/* we can't call request_module from this context so schedule it*/
-+/* **** note kernel hangs and my wrath will be on you */
-+ schedule_help (&ld_help);
-+ return;
-+ }
-+ (*help_handler)(vc, KT_SPKUP, SPEAKUP_HELP, 0 );
-+}
-+
-+static void
-+do_nothing (struct vc_data *vc )
-+{
-+ return; /* flush done in do_spkup */
-+}
-+static u_char key_speakup = 0, spk_key_locked = 0;
-+
-+static void
-+speakup_lock (struct vc_data *vc )
-+{
-+ if ( !spk_key_locked )
-+ spk_key_locked = key_speakup = 16;
-+ else spk_key_locked = key_speakup = 0;
-+}
-+
-+typedef void (*spkup_hand )(struct vc_data * );
-+spkup_hand spkup_handler[] = { /* must be ordered same as defines in speakup.h */
-+ do_nothing, speakup_goto, speech_kill, speakup_shut_up,
-+ speakup_cut, speakup_paste, say_first_char, say_last_char,
-+ say_char, say_prev_char, say_next_char,
-+ say_word, say_prev_word, say_next_word,
-+ say_line, say_prev_line, say_next_line,
-+ top_edge, bottom_edge, left_edge, right_edge,
-+ spell_word, spell_word, say_screen,
-+ say_position, say_attributes,
-+ speakup_off, speakup_parked, say_line, // this is for indent
-+ say_from_top, say_to_bottom,
-+ say_from_left, say_to_right,
-+ say_char_num, speakup_bits, speakup_bits, say_phonetic_char,
-+ speakup_bits, speakup_bits, speakup_bits,
-+ speakup_win_set, speakup_win_clear, speakup_win_enable, speakup_win_say,
-+ speakup_lock, speakup_help, toggle_cursoring, NULL
-+};
-+
-+void do_spkup( struct vc_data *vc,u_char value )
-+{
-+ if (spk_killed && value != SPEECH_KILL ) return;
-+ spk_keydown = 0;
-+ spk_lastkey = 0;
-+ spk_shut_up &= 0xfe;
-+ this_speakup_key = value;
-+ if (value < SPKUP_MAX_FUNC && spkup_handler[value] ) {
-+ do_flush( );
-+ (*spkup_handler[value] )(vc );
-+ } else {
-+ if ( inc_dec_var( value ) < 0 )
-+ bleep( 9 );
-+ }
-+}
-+
-+ static const char *pad_chars = "0123456789+-*/\015,.?()";
-+
-+int
-+#if (LINUX_VERSION_CODE < 132419)
-+speakup_key ( int shift_state, u_char keycode, u_short keysym, u_char up_flag )
-+#else
-+speakup_key (struct vc_data *vc, int shift_state, int keycode, u_short keysym, int up_flag, struct pt_regs *regs )
-+#endif
-+{
-+ u_char *key_info;
-+ u_char type = KTYP( keysym ), value = KVAL( keysym ), new_key = 0;
-+ u_char shift_info, offset;
-+#if (LINUX_VERSION_CODE >= 132419)
-+ tty = vc->vc_tty;
-+#endif
-+ if ( synth == NULL ) return 0;
-+ if ( type >= 0xf0 ) type -= 0xf0;
-+ if ( type == KT_PAD && (vc_kbd_led(kbd , VC_NUMLOCK ) ) ) {
-+ if ( up_flag ) {
-+ spk_keydown = 0;
-+ return 0;
-+ }
-+ value = spk_lastkey = pad_chars[value];
-+ spk_keydown++;
-+ spk_parked &= 0xfe;
-+ goto no_map;
-+ }
-+ if ( keycode >= MAX_KEY ) goto no_map;
-+ if ( ( key_info = our_keys[keycode] ) == 0 ) goto no_map;
-+ shift_info = ( shift_state&0x0f ) + key_speakup;
-+ offset = shift_table[shift_info];
-+ if ( offset && ( new_key = key_info[offset] ) ) {
-+ if ( new_key == SPK_KEY ) {
-+ if ( !spk_key_locked )
-+ key_speakup = ( up_flag ) ? 0 : 16;
-+ if ( up_flag || spk_killed ) return 1;
-+ spk_shut_up &= 0xfe;
-+ do_flush( );
-+ return 1;
-+ }
-+ if ( up_flag ) return 1;
-+ if ( last_keycode == keycode && last_spk_jiffy+MAX_DELAY > jiffies ) {
-+ spk_close_press = 1;
-+ offset = shift_table[shift_info+32];
-+/* double press? */
-+ if ( offset && key_info[offset] )
-+ new_key = key_info[offset];
-+ }
-+ last_keycode = keycode;
-+ last_spk_jiffy = jiffies;
-+ type = KT_SPKUP;
-+ value = new_key;
-+ }
-+no_map:
-+ if ( type == KT_SPKUP && special_handler == NULL ) {
-+ do_spkup( vc, new_key );
-+ spk_close_press = 0;
-+ return 1;
-+ }
-+ if ( up_flag || spk_killed || type == KT_SHIFT ) return 0;
-+ spk_shut_up &= 0xfe;
-+ if (!no_intr ) do_flush( );
-+ if ( special_handler ) {
-+ int status;
-+ if ( type == KT_SPEC && value == 1 ) {
-+ value = '\n';
-+ type = KT_LATIN;
-+ } else if ( type == KT_LETTER ) type = KT_LATIN;
-+ else if ( value == 0x7f ) value = 8; /* make del = backspace */
-+ status = (*special_handler)(vc, type, value, keycode );
-+ spk_close_press = 0;
-+ if ( status < 0 ) bleep( 9 );
-+ return status;
-+ }
-+ last_keycode = 0;
-+ return 0;
-+}
-+
-+#ifdef MODULE
-+
-+extern void proc_speakup_init( void );
-+extern void proc_speakup_remove( void );
-+extern void speakup_set_addresses ( spk_con_func, spk_con_func, spk_write_func, spk_con_func, spk_key_func);
-+
-+static void __exit mod_speakup_exit( void )
-+{
-+ int i;
-+ key_handler[KT_LATIN] = do_latin;
-+ key_handler[KT_SPEC] = do_spec;
-+ key_handler[KT_CUR] = do_cursor;
-+ key_handler[KT_SHIFT] = do_shift;
-+ speakup_set_addresses( NULL, NULL, NULL, NULL, NULL );
-+ synth_release( );
-+ proc_speakup_remove( );
-+ for (i = 0; i < 256; i++ ) {
-+ if (characters[i] != default_chars[i] )
-+ kfree (characters[i] );
-+ }
-+ for ( i = 0; speakup_console[i]; i++) {
-+ kfree( speakup_console[i] );
-+ speakup_console[i] = NULL;
-+ }
-+}
-+
-+static int __init mod_speakup_init( void )
-+{
-+int i;
-+ spk_t *first_console = (spk_t *) kmalloc (spk_size + 1, GFP_KERNEL );
-+ speakup_open( vc_cons[fg_console].d, first_console );
-+for ( i = 0; vc_cons[i].d; i++)
-+ speakup_allocate(vc_cons[i].d);
-+ speakup_set_addresses( speakup_allocate, speakup_bs,
-+ speakup_con_write, speakup_con_update, speakup_key );
-+ proc_speakup_init( );
-+ return 0;
-+}
-+
-+module_init( mod_speakup_init );
-+module_exit( mod_speakup_exit );
-+
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakupconf
-@@ -0,0 +1,51 @@
-+#!/bin/sh
-+# script to load/save all the vars in speakup
-+# speakupconf save or speakupconf load
-+# if root saves in /etc/speakup/<synth_name> else in $HOME/.speakup/<synth_name>
-+if [ $UID -eq "0" ]; then
-+ SAVEDIR="/etc/speakup"
-+else
-+ SAVEDIR="$HOME/.speakup"
-+fi
-+if [ ! -d /proc/speakup ]; then
-+ echo "no directory /proc/speakup"
-+ exit 0
-+fi
-+SYNTH=`cat /proc/speakup/synth_name`
-+case "$1" in
-+*save)
-+ if [ ! -d $SAVEDIR ] ; then
-+ echo creating $SAVEDIR
-+ mkdir $SAVEDIR
-+ fi
-+ if [ ! -d $SAVEDIR/$SYNTH ] ; then
-+ echo creating $SAVEDIR/$SYNTH
-+ mkdir $SAVEDIR/$SYNTH
-+ fi
-+ cd /proc/speakup
-+ SAVELIST=` find . -perm -6 |sed 's/..//' |fgrep -v synth`
-+ for f in $SAVELIST; do
-+ cp $f $SAVEDIR/$SYNTH/$f
-+ done
-+;;
-+*load)
-+ if [ ! -d $SAVEDIR ] ; then
-+ echo no directory $SAVEDIR
-+ exit 1
-+ fi
-+ if [ ! -d $SAVEDIR/$SYNTH ] ; then
-+ echo no directory $SAVEDIR/$SYNTH
-+ exit 1
-+ fi
-+ cd $SAVEDIR/$SYNTH
-+ for f in *; do
-+ if [ -w /proc/speakup/$f ]; then
-+ cat $f >/proc/speakup/$f
-+ fi
-+ done
-+;;
-+*)
-+ echo "usage: speakupconf load/save"
-+ exit 1
-+;;
-+esac
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_decext.c
-@@ -0,0 +1,205 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#define MY_SYNTH synth_decext
-+#define SYNTH_CLEAR 0x03
-+#define PROCSPEECH 0x0b
-+#define synth_full( ) ( inb_p( synth_port_tts ) == 0x13 )
-+
-+static int timeouts = 0;
-+static int in_escape = 0;
-+
-+static int wait_for_xmitr ( void )
-+{
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do { /* holding register empty? */
-+ check = inb_p( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn ( "%s: timed out\n", synth->long_name );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do { /* CTS */
-+ check = inb_p ( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out ( const char ch )
-+{
-+ if ( synth_alive && wait_for_xmitr ( ) ) {
-+ outb_p ( ch, synth_port_tts );
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static u_char
-+spk_serial_in ( void )
-+{
-+ int lsr, tmout = SPK_SERIAL_TIMEOUT, c;
-+ do {
-+ lsr = inb_p ( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 )
-+ return 0xff;
-+ } while ( !( lsr & UART_LSR_DR ) );
-+ c = inb_p ( synth_port_tts + UART_RX );
-+ return ( u_char ) c;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+static u_char last='\0';
-+ synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == '\n' ) ch = 0x0D;
-+ if ( synth_full( ) || !spk_serial_out( ch ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( ch == '[' ) in_escape = 1;
-+ else if ( ch == ']' ) in_escape = 0;
-+ else if ( ch <= SPACE ) {
-+ if ( !in_escape && strchr( ",.!?;:", last ) )
-+ spk_serial_out( PROCSPEECH );
-+ if ( jiffies >= jiff_max ) {
-+ if ( !in_escape )
-+ spk_serial_out( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ last = ch;
-+ }
-+ if ( synth_done( ) || !in_escape )
-+ spk_serial_out( PROCSPEECH );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush( void )
-+{
-+ in_escape = 0;
-+ synth_immediate( "\033P;10z\033\\" );
-+}
-+
-+static int serprobe( int index )
-+{
-+ u_char test=0;
-+ struct serial_state *ser = spk_serial_init( index );
-+ if ( ser == NULL ) return -1;
-+ /* ignore any error results, if port was forced */
-+ if ( synth_port_forced )
-+ return 0;
-+ synth_immediate( "\033[;5n\033\\" );
-+ if ( ( test = spk_serial_in( ) ) == '\033' )
-+ return 0;
-+ spk_serial_release( );
-+ timeouts = synth_alive = synth_port_tts = 0; /* not ignoring */
-+ return -1;
-+}
-+
-+static int synth_probe( void )
-+{
-+ int i=0, failed=0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ /* check ttyS0-ttyS3 */
-+ for ( i=SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info( "%s: %03x-%03x, Driver Version %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts+7, synth->version );
-+ return 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( !synth_alive&& wait_for_xmitr( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string( synth->init );
-+ return 2;
-+ }
-+ pr_warn( "%s: can't restart synth\n", synth->long_name );
-+ return 0;
-+}
-+
-+static const char init_string[] = "[:pe -380]";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "[:dv ap 222]" },
-+ { CAPS_STOP, "[:dv ap 100]" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "[:ra %d]", 7, 0, 9, 150, 25, 0 },
-+ { PITCH, "[:dv ap %d]", 100, 0, 100, 0, 0, 0 },
-+ { VOL, "[:dv gv %d]", 13, 0, 16, 0, 5, 0 },
-+ { PUNCT, "[:pu %c]", 0, 0, 2, 0, 0, "nsa" },
-+ { VOICE, "[:n%c]", 0, 0, 9, 0, 0, "phfdburwkv" },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_decext = {"decext", "1.1", "Dectalk External",
-+ init_string, 500, 50, 50, 1000, 0, SF_DEC, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_decpc.c
-@@ -0,0 +1,242 @@
-+/*
-+* written by David Borowski, david575@golden.net
-+
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "dtpc_reg.h"
-+
-+#define MY_SYNTH synth_dec_pc
-+#define PROCSPEECH 0x0b
-+#define SYNTH_IO_EXTENT 8
-+
-+static int synth_portlist[] = { 0x340, 0x350, 0x240, 0x250, 0 };
-+static int in_escape = 0, is_flushing = 0;
-+static int dt_stat, dma_state = 0;
-+
-+static inline int dt_getstatus( void )
-+{
-+ dt_stat = inb_p( synth_port_tts )|(inb_p( synth_port_tts+1 )<<8);
-+ return dt_stat;
-+}
-+
-+static inline void dt_sendcmd( u_int cmd )
-+{
-+ outb_p( cmd & 0xFF, synth_port_tts );
-+ outb_p( (cmd>>8) & 0xFF, synth_port_tts+1 );
-+}
-+
-+static int dt_waitbit( int bit )
-+{
-+ int timeout = 100;
-+ while ( --timeout > 0 ) {
-+ if( (dt_getstatus( ) & bit ) == bit ) return 1;
-+ udelay( 50 );
-+ }
-+ return 0;
-+}
-+
-+static int dt_wait_dma( void )
-+{
-+ int timeout = 100, state = dma_state;
-+ if( ! dt_waitbit( STAT_dma_ready ) ) return 0;
-+ while ( --timeout > 0 ) {
-+ if( (dt_getstatus()&STAT_dma_state) == state ) return 1;
-+ udelay( 50 );
-+ }
-+ dma_state = dt_getstatus( ) & STAT_dma_state;
-+ return 1;
-+}
-+
-+int dt_ctrl( u_int cmd )
-+{
-+ int timeout = 10;
-+ if ( !dt_waitbit( STAT_cmd_ready ) ) return -1;
-+ outb_p( 0, synth_port_tts+2 );
-+ outb_p( 0, synth_port_tts+3 );
-+ dt_getstatus( );
-+ dt_sendcmd( CMD_control|cmd );
-+ outb_p( 0, synth_port_tts+6 );
-+ while ( dt_getstatus( ) & STAT_cmd_ready ) {
-+ udelay( 20 );
-+ if ( --timeout == 0 ) break;
-+ }
-+ dt_sendcmd( CMD_null );
-+ return 0;
-+}
-+
-+static void synth_flush( void )
-+{
-+ int timeout = 10;
-+ if ( is_flushing ) return;
-+ is_flushing = 4;
-+ in_escape = 0;
-+ while ( dt_ctrl( CTRL_flush ) ) {
-+ if ( --timeout == 0 ) break;
-+udelay( 50 );
-+ }
-+ for ( timeout = 0; timeout < 10; timeout++ ) {
-+ if ( dt_waitbit( STAT_dma_ready ) ) break;
-+udelay( 50 );
-+ }
-+ outb_p( DMA_sync, synth_port_tts+4 );
-+ outb_p( 0, synth_port_tts+4 );
-+ udelay( 100 );
-+ for ( timeout = 0; timeout < 10; timeout++ ) {
-+ if ( !( dt_getstatus( ) & STAT_flushing ) ) break;
-+udelay( 50 );
-+ }
-+ dma_state = dt_getstatus( ) & STAT_dma_state;
-+ dma_state ^= STAT_dma_state;
-+ is_flushing = 0;
-+}
-+
-+static int dt_sendchar( char ch )
-+{
-+ if( ! dt_wait_dma( ) ) return -1;
-+ if( ! (dt_stat & STAT_rr_char) ) return -2;
-+ outb_p( DMA_single_in, synth_port_tts+4 );
-+ outb_p( ch, synth_port_tts+4 );
-+ dma_state ^= STAT_dma_state;
-+ return 0;
-+}
-+
-+static int testkernel( void )
-+{
-+ int status = 0;
-+ if ( dt_getstatus( ) == 0xffff ) {
-+ status = -1;
-+ goto oops;
-+ }
-+ dt_sendcmd( CMD_sync );
-+ if( ! dt_waitbit( STAT_cmd_ready ) ) status = -2;
-+ else if ( ( dt_stat&0x8000 ) ) {
-+ return 0;
-+ } else if ( dt_stat == 0x0dec )
-+ pr_warn( "dec_pc at 0x%x, software not loaded\n", synth_port_tts );
-+ status = -3;
-+oops: synth_release_region( synth_port_tts, SYNTH_IO_EXTENT );
-+ synth_port_tts = 0;
-+ return status;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+static u_char last='\0';
-+ synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == '\n' ) ch = 0x0D;
-+ if ( dt_sendchar( ch ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( ch == '[' ) in_escape = 1;
-+ else if ( ch == ']' ) in_escape = 0;
-+ else if ( ch <= SPACE ) {
-+ if ( !in_escape && strchr( ",.!?;:", last ) )
-+ dt_sendchar( PROCSPEECH );
-+ if ( jiffies >= jiff_max ) {
-+ if ( !in_escape )
-+ dt_sendchar( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ last = ch;
-+ }
-+ if ( synth_done( ) || !in_escape )
-+ dt_sendchar( PROCSPEECH );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( dt_sendchar ( ch ) )
-+ return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static int synth_probe ( void )
-+{
-+ int i=0, failed=0;
-+ pr_info ( "Probing for %s.\n", synth->long_name );
-+ for( i=0; synth_portlist[i]; i++ ) {
-+ if ( synth_request_region( synth_portlist[i], SYNTH_IO_EXTENT ) ) {
-+ pr_warn( "request_region: failed with 0x%x, %d\n",
-+ synth_portlist[i], SYNTH_IO_EXTENT );
-+ continue;
-+ }
-+ synth_port_tts = synth_portlist[i];
-+ if (( failed = testkernel( )) == 0 ) break;
-+ }
-+ if ( failed ) {
-+ pr_info ( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info ( "%s: %03x-%03x, Driver Version %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version );
-+ return 0;
-+}
-+
-+static void dtpc_release( void )
-+{
-+ if ( synth_port_tts )
-+ synth_release_region( synth_port_tts, SYNTH_IO_EXTENT );
-+ synth_port_tts = 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ synth_alive = 1;
-+ return 1;
-+}
-+
-+static const char init_string[] = "[:pe -380]";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "[:dv ap 200]" },
-+ { CAPS_STOP, "[:dv ap 100]" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "[:ra %d]", 9, 0, 18, 150, 25, 0 },
-+ { PITCH, "[:dv ap %d]", 80, 0, 100, 20, 0, 0 },
-+ { VOL, "[:vo se %d]", 5, 0, 9, 5, 10, 0 },
-+ { PUNCT, "[:pu %c]", 0, 0, 2, 0, 0, "nsa" },
-+ { VOICE, "[:n%c]", 0, 0, 9, 0, 0, "phfdburwkv" },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_dec_pc = { "decpc", "1.1", "Dectalk PC",
-+ init_string, 500, 50, 50, 1000, 0, SF_DEC, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, dtpc_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_dectlk.c
-@@ -0,0 +1,221 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#define MY_SYNTH synth_dectlk
-+#define SYNTH_CLEAR 0x03
-+#define PROCSPEECH 0x0b
-+#define synth_full( ) ( inb_p( synth_port_tts ) == 0x13 )
-+
-+static int timeouts = 0;
-+static int in_escape = 0, is_flushing = 0;
-+
-+static int wait_for_xmitr ( void )
-+{
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do { /* holding register empty? */
-+ check = inb_p( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn ( "%s: timed out\n", synth->long_name );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do { /* CTS */
-+ check = inb_p ( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out ( const char ch )
-+{
-+ if ( synth_alive && wait_for_xmitr ( ) ) {
-+ outb_p ( ch, synth_port_tts );
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static u_char
-+spk_serial_in ( void )
-+{
-+ int lsr, tmout = SPK_SERIAL_TIMEOUT, c;
-+ do {
-+ lsr = inb_p ( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 )
-+ return 0xff;
-+ } while ( !( lsr & UART_LSR_DR ) );
-+ c = inb_p ( synth_port_tts + UART_RX );
-+ return ( u_char ) c;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+static u_char last='\0';
-+ synth_stop_timer( );
-+ if ( is_flushing ) {
-+ ch = spk_serial_in( );
-+ if ( ch != '\001' ) {
-+ if ( --is_flushing == 0 )
-+ pr_warn ( "flush timeout\n" );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ is_flushing = 0;
-+ }
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == '\n' ) ch = 0x0D;
-+ if ( synth_full( ) || !spk_serial_out( ch ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( ch == '[' ) in_escape = 1;
-+ else if ( ch == ']' ) in_escape = 0;
-+ else if ( ch <= SPACE ) {
-+ if ( !in_escape && strchr( ",.!?;:", last ) )
-+ spk_serial_out( PROCSPEECH );
-+ if ( jiffies >= jiff_max ) {
-+ if ( !in_escape )
-+ spk_serial_out( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ last = ch;
-+ }
-+ if ( synth_done( ) || !in_escape )
-+ spk_serial_out( PROCSPEECH );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush( void )
-+{
-+ in_escape = 0;
-+ spk_serial_out ( SYNTH_CLEAR );
-+ is_flushing = 4; /* if no ctl-a in 4, send data anyway */
-+}
-+
-+static int serprobe ( int index )
-+{
-+ struct serial_state *ser = spk_serial_init( index );
-+ u_char test, timeout = 20;
-+ if ( ser == NULL ) return -1;
-+ outb ( 0x0d, ser->port );
-+ /* ignore any error results, if port was forced */
-+ if ( synth_port_forced ) return 0;
-+ /* check for dectalk express now... */
-+ if ( !synth_immediate ( "\x03" ) ) {
-+ do {
-+ test = spk_serial_in ( );
-+ if ( test == 0x01 ) return 0;
-+ } while ( --timeout > 0 );
-+ }
-+ spk_serial_release( );
-+ timeouts = synth_alive = synth_port_tts = 0; /* not ignoring */
-+ return -1;
-+}
-+
-+static int synth_probe ( void )
-+{
-+ int i = 0, failed=0;
-+ pr_info ( "Probing for %s.\n", synth->long_name );
-+ /* check ttyS0-ttyS3 */
-+ for ( i = SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info ( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info ( "%s: %03x-%03x, Driver Version %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version );
-+ return 0;
-+}
-+
-+static int
-+synth_is_alive ( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( !synth_alive && wait_for_xmitr ( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string ( synth->init );
-+ return 2;
-+ } else
-+ pr_warn ( "%s: can't restart synth\n", synth->long_name );
-+ return 0;
-+}
-+
-+static const char init_string[] = "[:pe -380][:dv ap 100]";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "[:dv ap 200]" },
-+ { CAPS_STOP, "[:dv ap 100]" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "[:ra %d]", 9, 0, 18, 150, 25, 0 },
-+ { PITCH, "[:dv ap %d]", 80, 0, 100, 20, 0, 0 },
-+ { VOL, "[:dv gv %d]", 13, 0, 14, 0, 5, 0 },
-+ { PUNCT, "[:pu %c]", 0, 0, 2, 0, 0, "nsa" },
-+ { VOICE, "[:n%c]", 0, 0, 9, 0, 0, "phfdburwkv" },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_dectlk = { "dectlk", "1.3", "Dectalk Express",
-+ init_string, 500, 50, 50, 1000, 0, SF_DEC, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_drvcommon.c
-@@ -0,0 +1,879 @@
-+#define KERNEL
-+#include <linux/config.h>
-+#include <linux/version.h>
-+#include <linux/types.h>
-+#include <linux/ctype.h> /* for isdigit( ) and friends */
-+#include <linux/fs.h>
-+#include <linux/mm.h> /* for verify_area */
-+#include <linux/errno.h> /* for -EBUSY */
-+#include <linux/ioport.h> /* for check_region, request_region */
-+#include <linux/delay.h> /* for loops_per_sec */
-+#include <asm/segment.h> /* for put_user_byte */
-+#include <asm/semaphore.h>
-+#include <linux/wait.h> /* for wait_queue */
-+#include <linux/miscdevice.h> /* for misc_register */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+#include <linux/kmod.h>
-+
-+#define SYNTH_MINOR 25
-+
-+static struct serial_state rs_table[] = {
-+ SERIAL_PORT_DFNS
-+};
-+
-+#include "synthlist.h"
-+static struct spk_synth *synths[16] = {
-+#include "synthlist.h"
-+ NULL };
-+
-+#define synthBufferSize 8192 /* currently 8K bytes */
-+struct spk_synth *synth = NULL;
-+struct spk_synth *module_synth = NULL;
-+int synth_port_tts = 0, synth_port_forced = 0;
-+volatile int synth_timer_active = 0; /* indicates when a timer is set */
-+ static struct miscdevice synth_device;
-+static int misc_registered = 0;
-+static char pitch_buff[32] = "";
-+static char module_name[32] = "";
-+static struct semaphore sem; /* no mo races */
-+declare_sleeper( synth_sleeping_list );
-+static int module_status = 0;
-+declare_timer( synth_timer );
-+short synth_delay_time = 500, synth_trigger_time = 50;
-+short synth_jiffy_delta = 50, synth_full_time = 1000;
-+int synth_alive = 0;
-+u_char synth_buffer[synthBufferSize]; /* guess what this is for! */
-+u_char *buffer_highwater = synth_buffer+synthBufferSize-100;
-+u_char *buffer_end = synth_buffer+synthBufferSize-1;
-+volatile u_char *synth_buff_in = synth_buffer, *synth_buff_out = synth_buffer;
-+
-+struct serial_state *spk_serial_init( int index )
-+{
-+ int baud = 9600, quot = 0;
-+ unsigned int cval = 0;
-+ int i, cflag = CREAD | HUPCL | CLOCAL | B9600 | CS8;
-+ struct serial_state *ser = NULL;
-+ if ( synth_port_forced ) {
-+ if ( index > 0 ) return NULL;
-+ pr_info ( "probe forced to 0x%x by kernel command line\n",
-+ synth_port_forced );
-+ for ( i=0; i <= SPK_HI_TTY; i++ )
-+ if ( ( rs_table+i )->port == synth_port_forced ) {
-+ ser = rs_table+i;
-+ break;
-+ }
-+ } else ser = rs_table + index;
-+ /* Divisor, bytesize and parity */
-+ quot = ser->baud_base / baud;
-+ cval = cflag & ( CSIZE | CSTOPB );
-+#if defined( __powerpc__ ) || defined( __alpha__ )
-+ cval >>= 8;
-+#else /* !__powerpc__ && !__alpha__ */
-+ cval >>= 4;
-+#endif /* !__powerpc__ && !__alpha__ */
-+ if ( cflag & PARENB )
-+ cval |= UART_LCR_PARITY;
-+ if ( !( cflag & PARODD ) )
-+ cval |= UART_LCR_EPAR;
-+ if ( synth_request_region( ser->port, 8 ) ) { // try to take it back.
-+ __release_region(&ioport_resource, ser->port, 8 );
-+ if ( synth_request_region( ser->port, 8 ) ) return NULL;
-+ }
-+ /* Disable UART interrupts, set DTR and RTS high
-+ * and set speed. */
-+ outb( cval | UART_LCR_DLAB, ser->port + UART_LCR ); /* set DLAB */
-+ outb( quot & 0xff, ser->port + UART_DLL ); /* LS of divisor */
-+ outb( quot >> 8, ser->port + UART_DLM ); /* MS of divisor */
-+ outb( cval, ser->port + UART_LCR ); /* reset DLAB */
-+ outb( 0, ser->port + UART_IER );
-+ outb( UART_MCR_DTR | UART_MCR_RTS, ser->port + UART_MCR );
-+ /* If we read 0xff from the LSR, there is no UART here. */
-+ if ( inb ( ser->port + UART_LSR ) == 0xff ) {
-+ synth_release_region( ser->port, 8 );
-+ return NULL;
-+ }
-+ mdelay( 1 );
-+ synth_port_tts = ser->port;
-+ return ser;
-+}
-+
-+void spk_serial_release( void )
-+{
-+ if ( synth_port_tts == 0 ) return;
-+ synth_release_region( synth_port_tts, 8 );
-+ synth_port_tts = 0;
-+}
-+
-+/* sleep for ms milliseconds */
-+void
-+synth_delay ( int val )
-+{
-+ if (val == 0) return;
-+ synth_timer.expires = jiffies + val;
-+ start_timer( synth_timer );
-+ synth_timer_active++;
-+}
-+
-+void
-+synth_dummy_catchup( unsigned long data )
-+{
-+ synth_stop_timer( );
-+ synth_done( );
-+ return;
-+} /* a bogus catchup if no synth */
-+
-+void
-+synth_stop_timer ( void )
-+{
-+ if ( synth_timer_active )
-+ stop_timer ( synth_timer );
-+ synth_timer_active = 0;
-+}
-+
-+int synth_done( void )
-+{
-+ synth_buff_out = synth_buff_in = synth_buffer;
-+ if (waitqueue_active(&synth_sleeping_list)) {
-+ wake_up_interruptible(&synth_sleeping_list);
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+static inline void synth_start( void )
-+{
-+ if ( !synth_alive )
-+ synth_done( );
-+ else if ( synth->start )
-+ synth->start( );
-+ else if (synth_timer_active == 0)
-+ synth_delay( synth_trigger_time );
-+}
-+
-+void do_flush( void )
-+{
-+ synth_stop_timer( );
-+ synth_buff_out = synth_buff_in = synth_buffer;
-+ if ( synth_alive ) {
-+ synth->flush( );
-+ if ( synth->flush_wait )
-+ synth_delay( ( synth->flush_wait * HZ ) / 1000 );
-+ if ( pitch_shift ) {
-+ synth_write_string( pitch_buff );
-+ pitch_shift = 0;
-+ }
-+ }
-+ if (waitqueue_active(&synth_sleeping_list))
-+ wake_up_interruptible(&synth_sleeping_list);
-+}
-+
-+void
-+synth_buffer_add ( char ch )
-+{
-+ if ( synth_buff_in >= buffer_highwater ) {
-+ synth_start ( );
-+ if ( !waitqueue_active ( &synth_sleeping_list ) )
-+ interruptible_sleep_on ( &synth_sleeping_list );
-+ if ( synth_buff_in >= buffer_end ) return;
-+ }
-+ *synth_buff_in++ = ch;
-+}
-+
-+void
-+synth_write ( const char *buf, size_t count )
-+{
-+ while ( count-- )
-+ synth_buffer_add ( *buf++ );
-+ synth_start ( );
-+}
-+
-+void
-+synth_write_string ( const char *buf )
-+{
-+ while ( *buf )
-+ synth_buffer_add ( *buf++ );
-+ synth_start ( );
-+}
-+
-+void
-+synth_write_msg ( const char *buf )
-+{
-+ while ( *buf )
-+ synth_buffer_add ( *buf++ );
-+ synth_buffer_add ( '\n' );
-+ synth_start ( );
-+}
-+
-+static struct resource synth_res;
-+
-+int synth_request_region ( unsigned long start, unsigned long n )
-+{
-+ struct resource *parent = &ioport_resource;
-+ memset ( &synth_res, 0, sizeof ( synth_res ) );
-+ synth_res.name = synth->name;
-+ synth_res.start = start;
-+ synth_res.end = start + n - 1;
-+ synth_res.flags = IORESOURCE_BUSY;
-+ return request_resource ( parent, &synth_res );
-+}
-+
-+int synth_release_region ( unsigned long start, unsigned long n )
-+{
-+ return release_resource ( &synth_res );
-+}
-+
-+#ifdef CONFIG_PROC_FS
-+
-+// /proc/synth-specific code
-+
-+#include <asm/uaccess.h>
-+#include <linux/limits.h>
-+
-+// this is the write handler for /proc/speakup/synth-specific/direct
-+static int
-+spk_direct_write_proc ( PROC_WRITE_PROTOTYPE )
-+{
-+ u_char buf[256];
-+ int ret = count, bytes;
-+ const char *ptr = buffer;
-+ if ( synth == NULL ) return -EPERM;
-+ while ( count > 0 ) {
-+ bytes = MIN ( count, 250 );
-+ if ( copy_from_user ( buf, ptr, bytes ) )
-+ return -EFAULT;
-+ buf[bytes] = '\0';
-+ xlate ( buf );
-+ synth_write_string ( buf );
-+ ptr += bytes;
-+ count -= bytes;
-+ }
-+ return ret;
-+}
-+
-+proc_var synth_direct = { SYNTH_DIRECT, 0, spk_direct_write_proc, 0 };
-+
-+#endif
-+
-+static num_var synth_time_vars[] = {
-+ { DELAY, 0, 100, 100, 2000, 0, 0, 0 },
-+ { TRIGGER, 0, 20, 10, 200, 0, 0, 0 },
-+ { JIFFY, 0, 50, 20, 200, 0, 0, 0 },
-+ { FULL, 0, 400, 200, 10000, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+int synth_init ( char *synth_name )
-+{
-+ int i;
-+ if ( synth_name == NULL ) return 0;
-+ sema_init ( &sem, 1 ); /* not sure where else to put this. */
-+ if ( strcmp (synth_name, "none" ) == 0 ){
-+ synth_release( );
-+ return 0;
-+ }
-+ for (i = 0; synths[i] != NULL; i++ ) {
-+ if (strcmp (synths[i]->name, synth_name ) == 0 )
-+ return do_synth_init( synths[i] );
-+ }
-+ if ( strcmp (synth_name, "reload" ) == 0 ) {
-+ if ( module_status == 0 ) return 0;
-+ goto try_reload;
-+ }
-+ sprintf( module_name, "speakup_%s", synth_name );
-+try_reload:
-+ pr_warn ( "Speakup: loading module \"%s\"\n", module_name );
-+ module_status = request_module( module_name );
-+ return module_status;
-+}
-+
-+int do_synth_init ( struct spk_synth *in_synth )
-+{
-+ num_var *n_var;
-+ string_var *s_var;
-+ synth_release( );
-+ if ( in_synth->checkval != SYNTH_CHECK ) return -EINVAL;
-+ synth = in_synth;
-+ if ( synth->probe ( ) < 0 ) {
-+ pr_warn ( "%s: device probe failed\n", in_synth->name );
-+ synth = NULL;
-+ return -ENODEV;
-+ }
-+ synth_time_vars[0].default_val = synth->delay;
-+ synth_time_vars[1].default_val = synth->trigger;
-+ synth_time_vars[2].default_val = synth->jiffies;
-+ synth_time_vars[3].default_val = synth->full;
-+ synth_timer.function = synth->catch_up;
-+#if (LINUX_VERSION_CODE >= 132419)
-+ synth_timer.entry.prev = NULL;
-+#endif
-+ init_timer ( &synth_timer );
-+ for ( n_var = synth_time_vars; n_var->var_id >= 0; n_var++ )
-+ speakup_register_var( n_var );
-+ synth_alive = 1;
-+ synth_write_string( synth->init );
-+ for ( s_var = synth->string_vars; s_var->var_id >= 0; s_var++ )
-+ speakup_register_var( ( num_var * ) s_var );
-+ for ( n_var = synth->num_vars; n_var->var_id >= 0; n_var++ )
-+ speakup_register_var( n_var );
-+ synth_write_string( synth->long_name );
-+ synth_write_msg( " found" );
-+#ifdef CONFIG_PROC_FS
-+ speakup_register_var( (num_var *)&synth_direct );
-+#endif
-+ synth_flags = synth->flags;
-+ return 0;
-+}
-+
-+void
-+synth_release ( void )
-+{
-+ num_var *n_var;
-+ string_var *s_var;
-+ if ( synth == NULL ) return;
-+ if (down_interruptible ( &sem )) return;
-+ pr_info ( "releasing synth %s\n", synth->name );
-+ for ( s_var = synth->string_vars; s_var->var_id >= 0; s_var++ )
-+ speakup_unregister_var( s_var->var_id );
-+ for ( n_var = synth_time_vars; n_var->var_id >= 0; n_var++ )
-+ speakup_unregister_var( n_var->var_id );
-+ for ( n_var = synth->num_vars; n_var->var_id >= 0; n_var++ )
-+ speakup_unregister_var( n_var->var_id );
-+#ifdef CONFIG_PROC_FS
-+ speakup_unregister_var( SYNTH_DIRECT );
-+#endif
-+ synth_dummy_catchup((unsigned long) NULL );
-+ synth_timer.function = synth_dummy_catchup;
-+ synth->release( );
-+ synth = NULL;
-+ up( &sem );
-+}
-+
-+void synth_add ( struct spk_synth *in_synth )
-+{
-+ int i;
-+ for (i = 0; synths[i] != NULL; i++ )
-+ if ( in_synth == synths[i] ) return;
-+ synths[i++] = in_synth;
-+ synths[i] = NULL;
-+}
-+
-+void synth_remove ( struct spk_synth *in_synth )
-+{
-+ int i;
-+ for (i = 0; synths[i] != NULL; i++ ) {
-+ if ( in_synth == synths[i] ) break;
-+ }
-+for ( ;synths[i] != NULL; i++ ) /* compress table */
-+ synths[i] = synths[i+1];
-+ module_status = 0;
-+}
-+
-+var_header var_headers[] = {
-+ { "version", VERSION, VAR_PROC, USER_R, 0, 0, 0 },
-+ { "synth_name", SYNTH, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "keymap", KEYMAP, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "silent", SILENT, VAR_PROC, USER_W, 0, 0, 0 },
-+ { "punc_some", PUNC_SOME, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "punc_most", PUNC_MOST, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "punc_all", PUNC_ALL, VAR_PROC, USER_R, 0, 0, 0 },
-+ { "delimiters", DELIM, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "repeats", REPEATS, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "ex_num", EXNUMBER, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "characters", CHARS, VAR_PROC, USER_RW, 0, 0, 0 },
-+ { "synth_direct", SYNTH_DIRECT, VAR_PROC, USER_W, 0, 0, 0 },
-+ { "caps_start", CAPS_START, VAR_STRING, USER_RW, 0, str_caps_start, 0 },
-+ { "caps_stop", CAPS_STOP, VAR_STRING, USER_RW, 0, str_caps_stop, 0 },
-+ { "delay_time", DELAY, VAR_TIME, ROOT_W, 0, &synth_delay_time, 0 },
-+ { "trigger_time", TRIGGER, VAR_TIME, ROOT_W, 0, &synth_trigger_time, 0 },
-+ { "jiffy_delta", JIFFY, VAR_TIME, ROOT_W, 0, &synth_jiffy_delta, 0 },
-+ { "full_time", FULL, VAR_TIME, ROOT_W, 0, &synth_full_time, 0 },
-+ { "spell_delay", SPELL_DELAY, VAR_NUM, USER_RW, 0, &spell_delay, 0 },
-+ { "bleeps", BLEEPS, VAR_NUM, USER_RW, 0, &bleeps, 0 },
-+ { "attrib_bleep", ATTRIB_BLEEP, VAR_NUM, USER_RW, 0, &attrib_bleep, 0 },
-+ { "bleep_time", BLEEP_TIME, VAR_NUM, USER_RW, 0, &bleep_time, 0 },
-+ { "cursor_time", CURSOR_TIME, VAR_TIME, USER_RW, 0, &cursor_timeout, 0 },
-+ { "punc_level", PUNC_LEVEL, VAR_NUM, USER_RW, 0, &punc_level, 0 },
-+ { "reading_punc", READING_PUNC, VAR_NUM, USER_RW, 0, &reading_punc, 0 },
-+ { "say_control", SAY_CONTROL, VAR_NUM, USER_RW, 0, &say_ctrl, 0 },
-+ { "say_word_ctl", SAY_WORD_CTL, VAR_NUM, USER_RW, 0, &say_word_ctl, 0 },
-+ { "no_interrupt", NO_INTERRUPT, VAR_NUM, USER_RW, 0, &no_intr, 0 },
-+ { "key_echo", KEY_ECHO, VAR_NUM, USER_RW, 0, &key_echo, 0 },
-+ { "bell_pos", BELL_POS, VAR_NUM, USER_RW, 0, &bell_pos, 0 },
-+ { "rate", RATE, VAR_NUM, USER_RW, 0, 0, 0 },
-+ { "pitch", PITCH, VAR_NUM, USER_RW, 0, 0, 0 },
-+ { "vol", VOL, VAR_NUM, USER_RW, 0, 0, 0 },
-+ { "tone", TONE, VAR_NUM, USER_RW, 0, 0, 0 },
-+ { "punct", PUNCT, VAR_NUM, USER_RW, 0, 0, 0 },
-+ { "voice", VOICE, VAR_NUM, USER_RW, 0, 0, 0 },
-+ { "freq", FREQ, VAR_NUM, USER_RW, 0, 0, 0 },
-+ { "lang", LANG, VAR_NUM, USER_RW, 0, 0, 0 }
-+};
-+
-+var_header *var_ptrs[MAXVARS] = { 0, 0, 0 };
-+
-+char *
-+speakup_s2i ( char *start, short *dest )
-+{
-+ int val;
-+ char ch = *start;
-+ if ( ch == '-' || ch == '+' ) start++;
-+ if ( *start < '0' || *start > '9' ) return start;
-+ val = ( *start ) - '0';
-+ start++;
-+ while ( *start >= '0' && *start <= '9' ) {
-+ val *= 10;
-+ val += ( *start ) - '0';
-+ start++;
-+ }
-+ if ( ch == '-' ) *dest = -val;
-+ else *dest = val;
-+ return start;
-+}
-+
-+short punc_masks[] = { 0, SOME, MOST, PUNC, PUNC|B_SYM };
-+
-+// handlers for setting vars
-+int
-+set_num_var( short input, var_header *var, int how )
-+{
-+ short val, ret = 0;
-+ short *p_val = var->p_val;
-+ int l;
-+ char buf[32], *cp;
-+ num_var *var_data = var->data;
-+ if ( var_data == NULL ) return E_UNDEF;
-+ if ( how == E_DEFAULT ) {
-+ val = var_data->default_val;
-+ ret = SET_DEFAULT;
-+ } else {
-+ if ( how == E_SET ) val = input;
-+ else val = var_data->value;
-+ if ( how == E_INC ) val += input;
-+ else if ( how == E_DEC ) val -= input;
-+ if ( val < var_data->low || val > var_data->high )
-+ return E_RANGE;
-+ }
-+ var_data->value = val;
-+ if ( var->var_type == VAR_TIME && p_val != 0 ) {
-+ *p_val = ( val * HZ + 1000 - HZ ) / 1000;
-+ return ret;
-+ }
-+ if ( p_val != 0 ) *p_val = val;
-+ if ( var->var_id == PUNC_LEVEL ) {
-+ punc_mask = punc_masks[val];
-+ return ret;
-+ }
-+ if ( var_data->multiplier != 0 )
-+ val *= var_data->multiplier;
-+ val += var_data->offset;
-+ if ( var->var_id < FIRST_SYNTH_VAR || synth == NULL ) return ret;
-+ if ( synth->synth_adjust != NULL ) {
-+ int status = synth->synth_adjust( var );
-+ return ( status != 0 ) ? status : ret;
-+ }
-+ if ( !var_data->synth_fmt ) return ret;
-+ if ( var->var_id == PITCH ) cp = pitch_buff;
-+ else cp = buf;
-+ if ( !var_data->out_str )
-+ l = sprintf( cp, var_data->synth_fmt, (int)val );
-+ else l = sprintf( cp, var_data->synth_fmt, var_data->out_str[val] );
-+ synth_write_string( cp );
-+ return ret;
-+}
-+
-+static int
-+set_string_var( char *page, var_header *var, int len )
-+{
-+ int ret = 0;
-+ string_var *var_data = var->data;
-+ if ( var_data == NULL ) return E_UNDEF;
-+ if ( len > MAXVARLEN )
-+ return -E_TOOLONG;
-+ if ( !len ) {
-+ if ( !var_data->default_val ) return 0;
-+ ret = SET_DEFAULT;
-+ if ( !var->p_val ) var->p_val = var_data->default_val;
-+ if ( var->p_val != var_data->default_val )
-+ strcpy( (char *)var->p_val, var_data->default_val );
-+ } else if ( var->p_val )
-+ strcpy( (char *)var->p_val, page );
-+ else return -E_TOOLONG;
-+ return ret;
-+}
-+
-+ var_header * get_var_header( short var_id )
-+{
-+ var_header *p_header;
-+ if ( var_id < 0 || var_id >= MAXVARS ) return NULL;
-+ p_header = var_ptrs[var_id];
-+ if ( p_header->data == NULL ) return NULL;
-+ return p_header;
-+}
-+
-+#ifdef CONFIG_PROC_FS
-+// this is the write handler for /proc/speakup vars
-+static int
-+speakup_vars_write_proc ( PROC_WRITE_PROTOTYPE )
-+{
-+ var_header *p_header = data;
-+ int len = count, ret = 0;
-+ char *page = ( char * ) __get_free_page ( GFP_KERNEL );
-+ char *v_name = p_header->name, *cp;
-+ num_var *var_data;
-+ short value;
-+ if ( !page ) return -ENOMEM;
-+ if ( copy_from_user ( page, buffer, count ) ) {
-+ ret = -EFAULT;
-+ goto out;
-+ }
-+ if ( page[len - 1] == '\n' ) --len;
-+ page[len] = '\0';
-+ cp = xlate( page );
-+ switch( p_header->var_type ) {
-+ case VAR_NUM:
-+ case VAR_TIME:
-+ if ( *cp == 'd' || *cp == 'r' || *cp == '\0' )
-+ len = E_DEFAULT;
-+ else if ( *cp == '+' || *cp == '-' ) len = E_INC;
-+ else len = E_SET;
-+ speakup_s2i( cp, &value );
-+ ret = set_num_var( value, p_header, len );
-+ if ( ret != E_RANGE ) break;
-+ var_data = p_header->data;
-+ pr_warn( "value for %s out of range, expect %d to %d\n",
-+ v_name, (int)var_data->low, (int)var_data->high );
-+ break;
-+ case VAR_STRING:
-+ len = strlen( page );
-+ ret = set_string_var( page, p_header, len );
-+ if ( ret != E_TOOLONG ) break;
-+ pr_warn( "value too long for %s\n", v_name );
-+ break;
-+ default:
-+ pr_warn( "%s unknown type %d\n",
-+ p_header->name, ( int )p_header->var_type );
-+ break;
-+ }
-+out:
-+ if ( ret == SET_DEFAULT )
-+ pr_info( "%s reset to default value\n", v_name );
-+ free_page ( ( unsigned long ) page );
-+ return count;
-+}
-+
-+// this is the read handler for /proc/speakup vars
-+static int
-+speakup_vars_read_proc ( PROC_READ_PROTOTYPE )
-+{
-+ var_header *var = ( var_header * )data;
-+ num_var *n_var = var->data;
-+ char ch, *cp, *cp1;
-+ *start = 0;
-+ *eof = 1;
-+ switch( var->var_type ) {
-+ case VAR_NUM:
-+ case VAR_TIME:
-+ return sprintf( page, "%d\n", ( int )n_var->value );
-+ break;
-+ case VAR_STRING:
-+ cp1 = page;
-+ *cp1++ = '"';
-+ for ( cp = (char *)var->p_val; ( ch = *cp ); cp++ ) {
-+ if ( ch >= ' ' && ch < '~' )
-+ *cp1++ = ch;
-+ else
-+ cp1 += sprintf( cp1, "\\""x%02x", ch );
-+ }
-+ *cp1++ = '"';
-+ *cp1++ = '\n';
-+ *cp1 = '\0';
-+ return cp1-page;
-+ break;
-+ default:
-+ return sprintf( page, "oops bad type %d\n",
-+ ( int )var->var_type );
-+ }
-+ return 0;
-+}
-+
-+static const char spk_dir[] = "speakup";
-+static struct proc_dir_entry *dir_ent = 0;
-+
-+static int
-+spk_make_proc( var_header *p_header )
-+{
-+ struct proc_dir_entry *ent = p_header->proc_entry;
-+ char *name = p_header->name;
-+ proc_var *p_var;
-+ if ( dir_ent == 0 || p_header->proc_mode == 0 || ent != 0 ) return 0;
-+ ent = create_proc_entry ( name, p_header->proc_mode, dir_ent );
-+ if ( !ent ) {
-+ pr_warn( "Unable to create /proc/%s/%s entry.\n",
-+ spk_dir, name );
-+ return -1;
-+ }
-+ if ( p_header->var_type == VAR_PROC ) {
-+ p_var = ( proc_var * )p_header->data;
-+ if ( p_header->proc_mode&S_IRUSR )
-+ ent->read_proc = p_var->read_proc;
-+ if ( p_header->proc_mode&S_IWUSR )
-+ ent->write_proc = p_var->write_proc;
-+ } else {
-+ if ( p_header->proc_mode&S_IRUSR )
-+ ent->read_proc = speakup_vars_read_proc;
-+ if ( p_header->proc_mode&S_IWUSR )
-+ ent->write_proc = speakup_vars_write_proc;
-+ }
-+ ent->data = ( void * )p_header;
-+ p_header->proc_entry = ( void * ) ent;
-+ return 0;
-+}
-+
-+#endif
-+
-+int
-+speakup_register_var( num_var *var )
-+{
-+ static char nothing[2] = "\0";
-+ int i, var_id = var->var_id;
-+ var_header *p_header;
-+ string_var *s_var;
-+ if ( var_id < 0 || var_id >= MAXVARS ) return -1;
-+ if ( var_ptrs[0] == 0 ) {
-+ for ( i = 0; i < MAXVARS; i++ ) {
-+ p_header = &var_headers[i];
-+ var_ptrs[p_header->var_id] = p_header;
-+ p_header->data = 0;
-+ }
-+ }
-+ p_header = var_ptrs[var_id];
-+ if ( p_header->data != 0 ) return 0;
-+ p_header->data = var;
-+ switch ( p_header->var_type ) {
-+ case VAR_STRING:
-+ s_var = ( string_var * )var;
-+ set_string_var( nothing, p_header, 0 );
-+ break;
-+ case VAR_NUM:
-+ case VAR_TIME:
-+ set_num_var( 0, p_header, E_DEFAULT );
-+ break;
-+ }
-+#ifdef CONFIG_PROC_FS
-+ return spk_make_proc( p_header );
-+#else
-+ return 0;
-+#endif
-+}
-+
-+void
-+speakup_unregister_var( short var_id )
-+{
-+ var_header *p_header;
-+ if ( var_id < 0 || var_id >= MAXVARS ) return;
-+ p_header = var_ptrs[var_id];
-+ p_header->data = 0;
-+#ifdef CONFIG_PROC_FS
-+ if ( dir_ent != 0 && p_header->proc_entry != 0 )
-+ remove_proc_entry( p_header->name, dir_ent );
-+ p_header->proc_entry = 0;
-+#endif
-+}
-+
-+// called by proc_root_init( ) to initialize the /proc/speakup subtree
-+void __init
-+proc_speakup_init ( void )
-+{
-+ int i;
-+ var_header *p_header;
-+ proc_var *pv = spk_proc_vars;
-+/* if we requested a module at startup it will not load as root not mounted
-+ * so let's try to load here as root should be mounted now */
-+ speakup_register_devsynth ( );
-+#ifdef CONFIG_PROC_FS
-+ dir_ent = create_proc_entry ( spk_dir, S_IFDIR, 0 );
-+ if ( !dir_ent ) {
-+ pr_warn( "Unable to create /proc/%s entry.\n", spk_dir );
-+ return;
-+ }
-+ while ( pv->var_id >= 0 ) {
-+ speakup_register_var( ( void * )pv );
-+ pv++;
-+ }
-+ for ( i = 0; i < MAXVARS; i++ ) {
-+ p_header = &var_headers[i];
-+ if ( p_header->data != 0 ) spk_make_proc( p_header );
-+ }
-+#endif
-+}
-+
-+void
-+proc_speakup_remove ( void )
-+{
-+ int i;
-+ for ( i = 0; i < MAXVARS; i++ )
-+ speakup_unregister_var( i );
-+ pr_info( "speakup: unregistering synth device /dev/synth\n" );
-+ misc_deregister( &synth_device );
-+ misc_registered = 0;
-+#ifdef CONFIG_PROC_FS
-+ if ( dir_ent != 0 )
-+ remove_proc_entry( spk_dir, NULL );
-+#endif
-+}
-+
-+// provide a file to users, so people can send to /dev/synth
-+
-+static ssize_t
-+speakup_file_write ( struct file *fp, const char *buffer,
-+ size_t nbytes, loff_t * ppos )
-+{
-+ size_t count = nbytes;
-+ const char *ptr = buffer;
-+ int bytes;
-+ u_char buf[256];
-+ if ( synth == NULL ) return -ENODEV;
-+ while ( count > 0 ) {
-+ bytes = MIN ( count, sizeof ( buf ) );
-+ if ( copy_from_user ( buf, ptr, bytes ) )
-+ return -EFAULT;
-+ count -= bytes;
-+ ptr += bytes;
-+ synth_write ( buf, bytes );
-+ }
-+ return ( ssize_t ) nbytes;
-+}
-+
-+static int
-+speakup_file_ioctl ( struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg )
-+{
-+ return 0; // silently ignore
-+}
-+
-+static ssize_t
-+speakup_file_read ( struct file *fp, char *buf, size_t nbytes, loff_t * ppos )
-+{
-+ return 0;
-+}
-+
-+static int synth_file_inuse = 0;
-+
-+static int
-+speakup_file_open ( struct inode *ip, struct file *fp )
-+{
-+ if ( synth_file_inuse )
-+ return -EBUSY;
-+ else if ( synth == NULL )
-+ return -ENODEV;
-+ synth_file_inuse++;
-+ return 0;
-+}
-+
-+static int
-+speakup_file_release ( struct inode *ip, struct file *fp )
-+{
-+ synth_file_inuse = 0;
-+ return 0;
-+}
-+
-+static struct file_operations synth_fops = {
-+ read:speakup_file_read,
-+ write:speakup_file_write,
-+ ioctl:speakup_file_ioctl,
-+ open:speakup_file_open,
-+ release:speakup_file_release,
-+};
-+
-+void
-+speakup_register_devsynth ( void ) {
-+ if ( misc_registered != 0 ) return;
-+ misc_registered = 1;
-+ memset( &synth_device, 0, sizeof( synth_device ) );
-+/* zero it so if register fails, deregister will not ref invalid ptrs */
-+ synth_device.minor = SYNTH_MINOR;
-+ synth_device.name = "synth";
-+ synth_device.fops = &synth_fops;
-+ if ( misc_register ( &synth_device ) )
-+ pr_warn(
-+ "Couldn't initialize miscdevice /dev/synth.\n" );
-+ else
-+ pr_info(
-+ "initialized device: /dev/synth, node ( MAJOR 10, MINOR 25 )\n" );
-+}
-+
-+char *
-+xlate ( char *s )
-+{
-+static const char finds[] = "nrtvafe";
-+static const char subs[] = "\n\r\t\013\001\014\033";
-+static const char hx[] = "0123456789abcdefABCDEF";
-+ char *p = s, *p1, *p2, c;
-+ int num;
-+ while ( ( p = strchr ( p, '\\' ) ) ) {
-+ p1 = p+1;
-+ p2 = strchr( finds, *p1 );
-+ if ( p2 ) {
-+ *p++ = subs[p2-finds];
-+ p1++;
-+ } else if ( *p1 >= '0' && *p1 <= '7' ) {
-+ num = ( *p1++ )&7;
-+ while ( num < 256 && *p1 >= '0' && *p1 <= '7' ) {
-+ num <<= 3;
-+ num = ( *p1++ )&7;
-+ }
-+ *p++ = num;
-+ } else if ( *p1 == 'x'&& strchr( hx, p1[1] ) && strchr( hx, p1[2] ) ) {
-+ p1++;
-+ c = *p1++;
-+ if ( c > '9' )
-+ c = ( c-'7' )&0x0f;
-+ else
-+ c -= '0';
-+ num = c<<4;
-+ c = *p1++;
-+ if ( c > '9' )
-+ c = ( c-'7' )&0x0f;
-+ else
-+ c -= '0';
-+ num += c;
-+ *p++ = num;
-+ } else
-+ *p++ = *p1++;
-+ p2 = p;
-+ while ( *p1 ) *p2++ = *p1++;
-+ *p2 = '\0';
-+ }
-+ return s;
-+}
-+
-+/* exported symbols needed by synth modules */
-+EXPORT_SYMBOL(synth_init);
-+EXPORT_SYMBOL(do_synth_init);
-+EXPORT_SYMBOL(spk_serial_init);
-+EXPORT_SYMBOL(spk_serial_release);
-+EXPORT_SYMBOL(synth);
-+EXPORT_SYMBOL(synth_alive);
-+EXPORT_SYMBOL(synth_buffer);
-+EXPORT_SYMBOL(synth_buff_in);
-+EXPORT_SYMBOL(synth_buff_out);
-+EXPORT_SYMBOL(synth_delay);
-+EXPORT_SYMBOL(synth_delay_time);
-+EXPORT_SYMBOL(synth_done);
-+EXPORT_SYMBOL(synth_full_time);
-+EXPORT_SYMBOL(synth_jiffy_delta);
-+EXPORT_SYMBOL(synth_port_forced);
-+EXPORT_SYMBOL(synth_port_tts);
-+EXPORT_SYMBOL(synth_request_region);
-+EXPORT_SYMBOL(synth_release_region);
-+EXPORT_SYMBOL(synth_release);
-+EXPORT_SYMBOL(synth_add);
-+EXPORT_SYMBOL(synth_remove);
-+EXPORT_SYMBOL(synth_stop_timer);
-+EXPORT_SYMBOL(synth_write_string);
-+EXPORT_SYMBOL(synth_write_msg);
-+EXPORT_SYMBOL(synth_write);
-+MODULE_AUTHOR("Kirk Reiser <kirk@braille.uwo.ca>");
-+MODULE_DESCRIPTION("Speakup module required by all synthesizer specific modules");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_dtlk.c
-@@ -0,0 +1,219 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "speakup_dtlk.h" /* local header file for DoubleTalk values */
-+
-+#define MY_SYNTH synth_dtlk
-+#define PROCSPEECH 0x00
-+#define synth_readable() ((synth_status = inb_p(synth_port_tts)) & TTS_READABLE)
-+#define synth_full() ((synth_status = inb_p(synth_port_tts)) & TTS_ALMOST_FULL)
-+
-+static int synth_lpc;
-+static unsigned int synth_portlist[] =
-+ { 0x25e, 0x29e, 0x2de, 0x31e, 0x35e, 0x39e, 0 };
-+static u_char synth_status = 0;
-+
-+static inline void spk_out(const char ch)
-+{
-+ int tmout = 100000;
-+ while (((synth_status = inb_p(synth_port_tts)) & TTS_WRITABLE) == 0);
-+ outb_p(ch, synth_port_tts);
-+ while ((((synth_status = inb_p(synth_port_tts)) & TTS_WRITABLE) != 0)
-+ && (--tmout != 0) );
-+}
-+
-+static void do_catch_up(unsigned long data)
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+ synth_stop_timer();
-+ synth_status = inb_p(synth_port_tts);
-+ while (synth_buff_out < synth_buff_in) {
-+ if (synth_status & TTS_ALMOST_FULL) {
-+ synth_delay(synth_full_time);
-+ return;
-+ }
-+ ch = *synth_buff_out++;
-+ if (ch == 0x0a) ch = PROCSPEECH;
-+ spk_out( ch );
-+ if (jiffies >= jiff_max && ch == SPACE) {
-+ spk_out(PROCSPEECH);
-+ synth_delay(synth_delay_time);
-+ return;
-+ }
-+ }
-+ spk_out(PROCSPEECH);
-+ synth_done( );
-+}
-+
-+static char *synth_immediate(char *buf )
-+{
-+ u_char ch;
-+ synth_status = inb_p(synth_port_tts);
-+ while ( (ch = (u_char)*buf ) ) {
-+ if (synth_status & TTS_ALMOST_FULL)
-+ return buf;
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ spk_out(ch);
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush(void)
-+{
-+ outb_p(SYNTH_CLEAR, synth_port_tts);
-+ while (((synth_status = inb_p(synth_port_tts)) & TTS_WRITABLE) != 0);
-+ }
-+
-+static char synth_read_tts(void)
-+{
-+ u_char ch;
-+ while (((synth_status = inb_p(synth_port_tts)) & TTS_READABLE) == 0);
-+ ch = synth_status & 0x7f;
-+ outb_p(ch, synth_port_tts);
-+ while ((inb_p(synth_port_tts) & TTS_READABLE) != 0);
-+return (char) ch;
-+}
-+
-+/* interrogate the DoubleTalk PC and return its settings */
-+static struct synth_settings * synth_interrogate(void)
-+{
-+ u_char *t;
-+static char buf[sizeof(struct synth_settings) + 1];
-+int total, i;
-+static struct synth_settings status;
-+ synth_immediate("\x18\x01?");
-+ for (total = 0, i = 0; i < 50; i++) {
-+ buf[total] = synth_read_tts();
-+ if (total > 2 && buf[total] == 0x7f) break;
-+ if (total < sizeof(struct synth_settings)) total++;
-+ }
-+ t = buf;
-+ status.serial_number = t[0] + t[1]*256; /* serial number is little endian */
-+ t += 2;
-+ for ( i = 0; *t != '\r'; t++ ) {
-+ status.rom_version[i] = *t;
-+ if (i < sizeof(status.rom_version)-1) i++;
-+ }
-+ status.rom_version[i] = 0;
-+ t++;
-+ status.mode = *t++;
-+ status.punc_level = *t++;
-+ status.formant_freq = *t++;
-+ status.pitch = *t++;
-+ status.speed = *t++;
-+ status.volume = *t++;
-+ status.tone = *t++;
-+ status.expression = *t++;
-+ status.ext_dict_loaded = *t++;
-+ status.ext_dict_status = *t++;
-+ status.free_ram = *t++;
-+ status.articulation = *t++;
-+ status.reverb = *t++;
-+ status.eob = *t++;
-+ return &status;
-+}
-+
-+static int synth_probe(void)
-+{
-+ unsigned int port_val = 0;
-+ int i = 0;
-+ struct synth_settings *sp;
-+ pr_info("Probing for DoubleTalk.\n");
-+ if (synth_port_forced) {
-+ synth_port_tts = synth_port_forced;
-+ pr_info("probe forced to %x by kernel command line\n", synth_port_tts);
-+ if (synth_request_region(synth_port_tts-1, SYNTH_IO_EXTENT)) {
-+ pr_warn("sorry, port already reserved\n");
-+ return -EBUSY;
-+ }
-+ port_val = inw(synth_port_tts-1);
-+ synth_lpc = synth_port_tts-1;
-+ } else {
-+ for(i=0; synth_portlist[i]; i++) {
-+ if (synth_request_region(synth_portlist[i], SYNTH_IO_EXTENT))
-+ continue;
-+ port_val = inw(synth_portlist[i]);
-+ if ((port_val &= 0xfbff) == 0x107f) {
-+ synth_lpc = synth_portlist[i];
-+ synth_port_tts = synth_lpc+1;
-+ break;
-+ }
-+ synth_release_region(synth_portlist[i], SYNTH_IO_EXTENT);
-+ }
-+ }
-+ if ((port_val &= 0xfbff) != 0x107f) {
-+ pr_info("DoubleTalk PC: not found\n");
-+ return -ENODEV;
-+ }
-+ while (inw_p(synth_lpc) != 0x147f ); /* wait until it's ready */
-+ sp = synth_interrogate();
-+ pr_info("%s: %03x-%03x, ROM ver %s, s/n %u, driver: %s\n",
-+ synth->long_name, synth_lpc, synth_lpc+SYNTH_IO_EXTENT - 1,
-+ sp->rom_version, sp->serial_number, synth->version);
-+ // synth_alive = 1;
-+ return 0;
-+}
-+
-+static int synth_is_alive(void)
-+{
-+ return 1; /* I'm *INVINCIBLE* */
-+}
-+
-+static void
-+dtlk_release( void )
-+{
-+ if ( synth_port_tts )
-+ synth_release_region(synth_port_tts-1, SYNTH_IO_EXTENT);
-+ synth_port_tts = 0;
-+}
-+
-+static const char init_string[] = "\x01@\x01\x31y";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\x01+35p" },
-+ { CAPS_STOP, "\x01-35p" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\x01%ds", 8, 0, 9, 0, 0, 0 },
-+ { PITCH, "\x01%dp", 50, 0, 99, 0, 0, 0 },
-+ { VOL, "\x01%dv", 5, 0, 9, 0, 0, 0 },
-+ { TONE, "\x01%dx", 1, 0, 2, 0, 0, 0 },
-+ { PUNCT, "\x01%db", 7, 0, 15, 0, 0, 0 },
-+ { VOICE, "\x01%do", 0, 0, 7, 0, 0, 0 },
-+ { FREQ, "\x01%df", 5, 0, 9, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_dtlk = {"dtlk", "1.1", "DoubleTalk PC",
-+ init_string, 500, 30, 50, 1000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, dtlk_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_dtlk.h
-@@ -0,0 +1,54 @@
-+/* speakup_dtlk.h - header file for speakups DoubleTalk driver. */
-+
-+#define SYNTH_IO_EXTENT 0x02
-+#define SYNTH_CLEAR 0x18 /* stops speech */
-+ /* TTS Port Status Flags */
-+#define TTS_READABLE 0x80 /* mask for bit which is nonzero if a
-+ byte can be read from the TTS port */
-+#define TTS_SPEAKING 0x40 /* mask for SYNC bit, which is nonzero
-+ while DoubleTalk is producing
-+ output with TTS, PCM or CVSD
-+ synthesizers or tone generators
-+ (that is, all but LPC) */
-+#define TTS_SPEAKING2 0x20 /* mask for SYNC2 bit,
-+ which falls to zero up to 0.4 sec
-+ before speech stops */
-+#define TTS_WRITABLE 0x10 /* mask for RDY bit, which when set to
-+ 1, indicates the TTS port is ready
-+ to accept a byte of data. The RDY
-+ bit goes zero 2-3 usec after
-+ writing, and goes 1 again 180-190
-+ usec later. */
-+#define TTS_ALMOST_FULL 0x08 /* mask for AF bit: When set to 1,
-+ indicates that less than 300 bytes
-+ are available in the TTS input
-+ buffer. AF is always 0 in the PCM,
-+ TGN and CVSD modes. */
-+#define TTS_ALMOST_EMPTY 0x04 /* mask for AE bit: When set to 1,
-+ indicates that less than 300 bytes
-+ are remaining in DoubleTalk's input
-+ (TTS or PCM) buffer. AE is always 1
-+ in the TGN and CVSD modes. */
-+
-+ /* data returned by Interrogate command */
-+struct synth_settings {
-+ u_short serial_number; /* 0-7Fh:0-7Fh */
-+ u_char rom_version[24]; /* null terminated string */
-+ u_char mode; /* 0=Character; 1=Phoneme; 2=Text */
-+ u_char punc_level; /* nB; 0-7 */
-+ u_char formant_freq; /* nF; 0-9 */
-+ u_char pitch; /* nP; 0-99 */
-+ u_char speed; /* nS; 0-9 */
-+ u_char volume; /* nV; 0-9 */
-+ u_char tone; /* nX; 0-2 */
-+ u_char expression; /* nE; 0-9 */
-+ u_char ext_dict_loaded; /* 1=exception dictionary loaded */
-+ u_char ext_dict_status; /* 1=exception dictionary enabled */
-+ u_char free_ram; /* # pages (truncated) remaining for
-+ text buffer */
-+ u_char articulation; /* nA; 0-9 */
-+ u_char reverb; /* nR; 0-9 */
-+ u_char eob; /* 7Fh value indicating end of
-+ parameter block */
-+ u_char has_indexing; /* nonzero if indexing is implemented */
-+};
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_keyhelp.c
-@@ -0,0 +1,294 @@
-+/* speakup_keyhelp.c
-+ help module for speakup
-+
-+ written by David Borowski.
-+
-+ Copyright (C ) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option ) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+*/
-+
-+#include <linux/version.h>
-+#include <linux/keyboard.h>
-+#include "spk_priv.h"
-+
-+extern u_char *our_keys[];
-+extern special_func special_handler;
-+extern special_func help_handler;
-+#define MAXFUNCS 130
-+#define MAXKEYS 256
-+static u_short key_offsets[MAXFUNCS], key_buf[MAXKEYS];
-+static u_short masks[] = { 32, 16, 8, 4, 2, 1 };
-+static char help_info[] =
-+ "press space to leav help, cursor up or down to scroll, or a letter to go to commands in list";
-+static char *statenames[] = {
-+ " double", " speakup", " alt",
-+ " ctrl", " altgr", " shift"
-+};
-+static char *keynames[] = {
-+ "escape", "1", "2", "3", "4",
-+ "5", "6", "7", "8", "9",
-+ "0", "minus", "equal", "back space", "tab",
-+ "q", "w", "e", "r", "t",
-+ "y", "u", "i", "o", "p",
-+ "left brace", "right brace", "enter", "left control", "a",
-+ "s", "d", "f", "g", "h",
-+ "j", "k", "l", "semicolon", "apostrophe",
-+ "accent", "left shift", "back slash", "z", "x",
-+ "c", "v", "b", "n", "m",
-+ "comma", "dot", "slash", "right shift", "keypad asterisk",
-+ "left alt", "space", "caps lock", "f1", "f2",
-+ "f3", "f4", "f5", "f6", "f7",
-+ "f8", "f9", "f10", "num lock", "scroll lock",
-+ "keypad 7", "keypad 8", "keypad 9", "keypad minus", "keypad 4",
-+ "keypad 5", "keypad 6", "keypad plus", "keypad 1", "keypad 2",
-+ "keypad 3", "keypad 0", "keypad dot", "103rd", "f13",
-+ "102nd", "f11", "f12", "f14", "f15",
-+ "f16", "f17", "f18", "f19", "f20",
-+ "keypad enter", "right control", "keypad slash", "sysrq", "right alt",
-+ "line feed", "home", "up", "page up", "left",
-+ "right", "end", "down", "page down", "insert",
-+ "delete", "macro", "mute", "volume down", "volume up",
-+ "power", "keypad equal", "keypad plusminus", "pause", "f21",
-+ "f22", "f23", "f24", "keypad comma", "left meta",
-+ "right meta", "compose", "stop", "again", "props",
-+ "undo", "front", "copy", "open", "paste",
-+ "find", "cut", "help", "menu", "calc",
-+ "setup", "sleep", "wakeup", "file", "send file",
-+ "delete file", "transfer", "prog1", "prog2", "www",
-+ "msdos", "coffee", "direction", "cycle windows", "mail",
-+ "bookmarks", "computer", "back", "forward", "close cd",
-+ "eject cd", "eject close cd", "next song", "play pause", "previous song",
-+ "stop cd", "record", "rewind", "phone", "iso",
-+ "config", "home page", "refresh", "exit", "move",
-+ "edit", "scroll up", "scroll down", "keypad left paren", "keypad right paren",
-+};
-+
-+static short letter_offsets[26];
-+
-+static u_char funcvals[] = {
-+ ATTRIB_BLEEP_DEC, ATTRIB_BLEEP_INC, BLEEPS_DEC, BLEEPS_INC,
-+ SAY_FIRST_CHAR, SAY_LAST_CHAR, SAY_CHAR, SAY_CHAR_NUM,
-+ SAY_NEXT_CHAR, SAY_PHONETIC_CHAR, SAY_PREV_CHAR, SPEAKUP_PARKED,
-+ SPEAKUP_CUT, EDIT_DELIM, EDIT_EXNUM, EDIT_MOST,
-+ EDIT_REPEAT, EDIT_SOME, SPEAKUP_GOTO, BOTTOM_EDGE,
-+ LEFT_EDGE, RIGHT_EDGE, TOP_EDGE, SPEAKUP_HELP,
-+ SAY_LINE, SAY_NEXT_LINE, SAY_PREV_LINE, SAY_LINE_INDENT,
-+ SPEAKUP_PASTE, PITCH_DEC, PITCH_INC, PUNCT_DEC,
-+ PUNCT_INC, PUNC_LEVEL_DEC, PUNC_LEVEL_INC, SPEAKUP_QUIET,
-+ RATE_DEC, RATE_INC, READING_PUNC_DEC, READING_PUNC_INC,
-+ SAY_ATTRIBUTES, SAY_FROM_LEFT, SAY_FROM_TOP, SAY_POSITION,
-+ SAY_SCREEN, SAY_TO_BOTTOM, SAY_TO_RIGHT, SPK_KEY,
-+ SPK_LOCK, SPEAKUP_OFF, SPEECH_KILL, SPELL_DELAY_DEC,
-+ SPELL_DELAY_INC, SPELL_WORD, SPELL_PHONETIC, TONE_DEC,
-+ TONE_INC, VOICE_DEC, VOICE_INC, VOL_DEC,
-+ VOL_INC, CLEAR_WIN, SAY_WIN, SET_WIN,
-+ ENABLE_WIN, SAY_WORD, SAY_NEXT_WORD, SAY_PREV_WORD, 0
-+};
-+
-+static char *funcnames[] = {
-+ "attribute bleep decrement", "attribute bleep increment",
-+ "bleeps decrement", "bleeps increment",
-+ "character, first", "character, last",
-+ "character, say current",
-+ "character, say hex and decimal", "character, say next",
-+ "character, say phonetic", "character, say previous",
-+ "cursor park", "cut",
-+ "edit delimiters", "edit exnum",
-+ "edit most", "edit repeats", "edit some",
-+ "go to", "go to bottom edge", "go to left edge",
-+ "go to right edge", "go to top edge", "help",
-+ "line, say current", "line, say next",
-+ "line, say previous", "line, say with indent",
-+ "paste", "pitch decrement", "pitch increment",
-+ "punctuation decrement", "punctuation increment",
-+ "punc level decrement", "punc level increment",
-+ "quiet",
-+ "rate decrement", "rate increment",
-+ "reading punctuation decrement", "reading punctuation increment",
-+ "say attributes",
-+ "say from left", "say from top",
-+ "say position", "say screen",
-+ "say to bottom", "say to right",
-+ "speakup", "speakup lock",
-+ "speakup off", "speech kill",
-+ "spell delay decrement", "spell delay increment",
-+ "spell word", "spell word phoneticly",
-+ "tone decrement", "tone increment",
-+ "voice decrement", "voice increment",
-+ "volume decrement", "volume increment",
-+ "window, clear", "window, say",
-+ "window, set", "window, silence",
-+ "word, say current", "word, say next",
-+ "word, say previous", 0
-+};
-+
-+static u_char *state_tbl;
-+static int cur_item = 0, nstates = 0;
-+
-+static void build_key_data( void )
-+{
-+ u_char *kp, counters[MAXFUNCS], ch, ch1;
-+ u_short *p_key = key_buf, key;
-+ int i, offset = 1;
-+ nstates = (int)( state_tbl[-1] );
-+ memset( counters, 0, sizeof( counters ) );
-+ memset( key_offsets, 0, sizeof( key_offsets ) );
-+ kp = state_tbl + nstates + 1;
-+ while ( *kp++ ) { /* count occurrances of each function */
-+ for ( i = 0; i < nstates; i++, kp++ ) {
-+ if ( !*kp ) continue;
-+ if ( (state_tbl[i]&16) != 0 && *kp == SPK_KEY )
-+ continue;
-+ counters[*kp]++;
-+ }
-+ }
-+ for ( i = 0; i < MAXFUNCS; i++ ) {
-+ if ( counters[i] == 0 ) continue;
-+ key_offsets[i] = offset;
-+ offset += ( counters[i]+1 );
-+ if ( offset >= MAXKEYS ) break;
-+ }
-+/* leave counters set so high keycodes come first.
-+ this is done so num pad and other extended keys maps are spoken before
-+ the alpha with speakup type mapping. */
-+ kp = state_tbl + nstates + 1;
-+ while ( ( ch = *kp++ ) ) {
-+ for ( i = 0; i < nstates; i++ ) {
-+ ch1 = *kp++;
-+ if ( !ch1 ) continue;
-+ if ( (state_tbl[i]&16) != 0 && ch1 == SPK_KEY )
-+ continue;
-+ key = ( state_tbl[i]<<8 ) + ch;
-+ counters[ch1]--;
-+ if ( !(offset = key_offsets[ch1]) ) continue;
-+ p_key = key_buf + offset + counters[ch1];
-+ *p_key = key;
-+ }
-+ }
-+}
-+
-+static void say_key( int key )
-+{
-+ int i, state = key>>8;
-+ key &= 0xff;
-+ for ( i = 0; i < 6; i++ ) {
-+ if ( ( state & masks[i] ) )
-+ synth_write_string( statenames[i] );
-+ }
-+ synth_write_string( " " );
-+ synth_write_msg( keynames[--key] );
-+}
-+
-+static int handle_help ( struct vc_data *vc, u_char type, u_char ch, u_short key )
-+{
-+ int i, n;
-+ char *name;
-+ u_char func, *kp;
-+ u_short *p_keys, val;
-+ if ( type == KT_LATIN ) {
-+ if ( ch == SPACE ) {
-+ special_handler = NULL;
-+#if (LINUX_VERSION_CODE < 132419)
-+ MOD_DEC_USE_COUNT;
-+#endif
-+ synth_write_msg( "leaving help" );
-+ return 1;
-+ }
-+ ch |= 32; /* lower case */
-+ if ( ch < 'a' || ch > 'z' ) return -1;
-+ if ( letter_offsets[ch-'a'] == -1 ) {
-+ synth_write_string( "no commands for " );
-+ synth_write( &ch, 1 );
-+ synth_write( "\n", 1 );
-+ return 1;
-+ }
-+ cur_item = letter_offsets[ch-'a'];
-+ } else if ( type == KT_CUR ) {
-+ if ( ch == 0 && funcnames[cur_item+1] != NULL )
-+ cur_item++;
-+ else if ( ch == 3 && cur_item > 0 )
-+ cur_item--;
-+ else return -1;
-+ } else if (type == KT_SPKUP && ch == SPEAKUP_HELP && !special_handler) {
-+ special_handler = help_handler;
-+#if (LINUX_VERSION_CODE < 132419)
-+ MOD_INC_USE_COUNT;
-+#endif
-+ synth_write_msg( help_info );
-+ build_key_data( ); /* rebuild each time in case new mapping */
-+ return 1;
-+ } else {
-+ name = NULL;
-+ if ( type != KT_SPKUP ) {
-+ synth_write_msg( keynames[key-1] );
-+ return 1;
-+ }
-+ for ( i = 0; funcvals[i] != 0 && !name; i++ ) {
-+ if ( ch == funcvals[i] )
-+ name = funcnames[i];
-+ }
-+ if ( !name ) return -1;
-+ kp = our_keys[key]+1;
-+ for ( i = 0; i < nstates; i++ ) {
-+ if ( ch == kp[i] ) break;
-+ }
-+ key += ( state_tbl[i]<<8 );
-+ say_key( key );
-+ synth_write_string( "is " );
-+ synth_write_msg( name );
-+ return 1;
-+ }
-+ name = funcnames[cur_item];
-+ func = funcvals[cur_item];
-+ synth_write_string( name );
-+ if ( key_offsets[func] == 0 ) {
-+ synth_write_msg( " is unassigned" );
-+ return 1;
-+ }
-+ p_keys = key_buf + key_offsets[func];
-+ for ( n = 0; p_keys[n]; n++ ) {
-+ val = p_keys[n];
-+ if ( n > 0 ) synth_write_string( "or " );
-+ say_key( val );
-+ }
-+ return 1;
-+}
-+
-+static void __exit mod_help_exit( void )
-+{
-+ help_handler = 0;
-+}
-+
-+static int __init mod_help_init( void )
-+{
-+ char start = SPACE;
-+ int i;
-+state_tbl = our_keys[0]+SHIFT_TBL_SIZE+2;
-+ for (i = 0; i < 26; i++ ) letter_offsets[i] = -1;
-+ for ( i = 0; funcnames[i]; i++ ) {
-+ if ( start == *funcnames[i] ) continue;
-+ start = *funcnames[i];
-+ letter_offsets[(start&31)-1] = i;
-+ }
-+ help_handler = handle_help;
-+ return 0;
-+}
-+
-+module_init( mod_help_init );
-+module_exit( mod_help_exit );
-+MODULE_AUTHOR("David Borowski");
-+MODULE_DESCRIPTION("Speakup keyboard help MODULE");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_keypc.c
-@@ -0,0 +1,189 @@
-+/*
-+* written by David Borowski
-+
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+
-+#define MY_SYNTH synth_keypc
-+#define SYNTH_IO_EXTENT 0x04
-+#define SWAIT udelay( 70 )
-+#define synth_writable( ) ( inb_p( synth_port ) & 0x10 )
-+#define synth_readable( ) ( inb_p( synth_port ) & 0x10 )
-+#define synth_full( ) ( ( inb_p( synth_port ) & 0x80 ) == 0 )
-+#define PROCSPEECH 0x1f
-+#define SYNTH_CLEAR 0x03
-+
-+static int synth_port;
-+static unsigned int synth_portlist[] =
-+ { 0x2a8, 0 };
-+
-+static int
-+oops( void )
-+{
-+ int s1, s2, s3, s4;
-+ s1 = inb_p( synth_port );
-+ s2 = inb_p( synth_port+1 );
-+ s3 = inb_p( synth_port+2 );
-+ s4 = inb_p( synth_port+3 );
-+ pr_warn( "synth timeout %d %d %d %d\n", s1, s2, s3, s4 );
-+ return 0;
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ int timeout;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( synth_full( ) )
-+ return buf;
-+ timeout = 1000;
-+ while ( synth_writable( ) )
-+ if ( --timeout <= 0 ) return (char *) oops( );
-+ outb_p( ch, synth_port );
-+ SWAIT;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+ int timeout;
-+ synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ if ( synth_full( ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ timeout = 1000;
-+ while ( synth_writable( ) )
-+ if ( --timeout <= 0 ) break;
-+ if ( timeout <= 0 ) {
-+ oops( );
-+ break;
-+ }
-+ ch = *synth_buff_out++;
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ outb_p( ch, synth_port );
-+ SWAIT;
-+ if ( jiffies >= jiff_max && ch == SPACE ) {
-+ timeout = 1000;
-+ while ( synth_writable( ) )
-+ if ( --timeout <= 0 ) break;
-+ if ( timeout <= 0 ) {
-+ oops( );
-+ break;
-+ }
-+ outb_p( PROCSPEECH, synth_port );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ timeout = 1000;
-+ while ( synth_writable( ) )
-+ if ( --timeout <= 0 ) break;
-+ if ( timeout <= 0 ) oops( );
-+ else
-+ outb_p( PROCSPEECH, synth_port );
-+ synth_done( );
-+}
-+
-+static void synth_flush( void )
-+{
-+ outb_p( SYNTH_CLEAR, synth_port );
-+}
-+
-+static int synth_probe( void )
-+{
-+ unsigned int port_val = 0;
-+ int i = 0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ if ( synth_port_forced ) {
-+ synth_port = synth_port_forced;
-+ pr_info( "probe forced to %x by kernel command line\n", synth_port );
-+ if ( synth_request_region( synth_port-1, SYNTH_IO_EXTENT ) ) {
-+ pr_warn( "sorry, port already reserved\n" );
-+ return -EBUSY;
-+ }
-+ port_val = inb( synth_port );
-+ } else {
-+ for( i=0; synth_portlist[i]; i++ ) {
-+ if ( synth_request_region( synth_portlist[i], SYNTH_IO_EXTENT ) ) {
-+ pr_warn( "request_region: failed with 0x%x, %d\n",
-+ synth_portlist[i], SYNTH_IO_EXTENT );
-+ continue;
-+ }
-+ port_val = inb( synth_portlist[i] );
-+ if ( port_val == 0x80 ) {
-+ synth_port = synth_portlist[i];
-+ break;
-+ }
-+ }
-+ }
-+ if ( port_val != 0x80 ) {
-+ pr_info( "%s: not found\n", synth->long_name );
-+ synth_release_region( synth_portlist[i], SYNTH_IO_EXTENT );
-+ synth_port = 0;
-+ return -ENODEV;
-+ }
-+ pr_info( "%s: %03x-%03x, driver version %s,\n", synth->long_name,
-+ synth_port, synth_port+SYNTH_IO_EXTENT-1,
-+ synth->version );
-+ return 0;
-+}
-+
-+static void keynote_release( void )
-+{
-+ if ( synth_port )
-+ synth_release_region( synth_port, SYNTH_IO_EXTENT );
-+ synth_port = 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ synth_alive = 1;
-+ return 1;
-+}
-+
-+static const char init_string[] = "[t][n7,1][n8,0]";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "[f130]" },
-+ { CAPS_STOP, "[f90]" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\04%c ", 8, 0, 10, 81, -8, 0 },
-+ { PITCH, "[f%d]", 5, 0, 9, 40, 10, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_keypc = {"keypc", "1.1", "Keynote PC",
-+ init_string, 500, 50, 50, 1000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, keynote_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL };
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_ltlk.c
-@@ -0,0 +1,215 @@
-+/*
-+ * originally written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#include "speakup_dtlk.h" /* local header file for LiteTalk values */
-+
-+#define MY_SYNTH synth_ltlk
-+#define PROCSPEECH 0x0d
-+#define synth_full( ) ( !( inb( synth_port_tts + UART_MSR ) & UART_MSR_CTS ) )
-+
-+static inline int wait_for_xmitr( void )
-+{
-+ static int timeouts = 0; /* sequential number of timeouts */
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do { /* holding register empty? */
-+ check = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn( "%s: register timed out\n", synth->long_name );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do { /* CTS */
-+ check = inb( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out( const char ch )
-+{
-+ if ( synth_alive && wait_for_xmitr( ) ) {
-+ outb( ch, synth_port_tts );
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static unsigned char spk_serial_in( void )
-+{
-+ int c, lsr, tmout = SPK_SERIAL_TIMEOUT;
-+ do {
-+ lsr = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn( "time out while waiting for input.\n" );
-+ return 0xff;
-+ }
-+ } while ( ( lsr & UART_LSR_DR ) != UART_LSR_DR );
-+ c = inb( synth_port_tts + UART_RX );
-+ return ( unsigned char ) c;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+ synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( !spk_serial_out( ch ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( jiffies >= jiff_max && ch == SPACE ) {
-+ spk_serial_out( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ spk_serial_out( PROCSPEECH );
-+ synth_done ( );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush( void )
-+{
-+ spk_serial_out( SYNTH_CLEAR );
-+}
-+
-+/* interrogate the LiteTalk and print its settings */
-+static void synth_interrogate( void )
-+{
-+ unsigned char *t, i;
-+ unsigned char buf[50], rom_v[20];
-+ synth_immediate( "\x18\x01?" );
-+ for ( i = 0; i < 50; i++ ) {
-+ buf[i] = spk_serial_in( );
-+ if ( i > 2 && buf[i] == 0x7f ) break;
-+ }
-+ t = buf+2;
-+ for ( i = 0; *t != '\r'; t++ ) {
-+ rom_v[i] = *t;
-+ if (i++ > 48) break;
-+ }
-+ rom_v[i] = 0;
-+ pr_info( "%s: ROM version: %s\n", synth->long_name, rom_v );
-+}
-+
-+static int serprobe( int index )
-+{
-+ struct serial_state *ser = spk_serial_init( index );
-+ if ( ser == NULL ) return -1;
-+ outb( 0, ser->port );
-+ mdelay( 1 );
-+ outb( '\r', ser->port );
-+ /* ignore any error results, if port was forced */
-+ if ( synth_port_forced ) return 0;
-+ /* check for device... */
-+ if ( !synth_immediate( "\x18" ) ) return 0;
-+ spk_serial_release( );
-+ synth_alive = 0; /* try next port */
-+ return -1;
-+}
-+
-+static int synth_probe( void )
-+{
-+ int i, failed=0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ for ( i=SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ synth_interrogate( );
-+ pr_info( "%s: at %03x-%03x, driver %s\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version );
-+ return 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( !synth_alive && wait_for_xmitr( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string( synth->init );
-+ return 2;
-+ } else pr_warn( "%s: can't restart synth\n", synth->long_name );
-+ return 0;
-+}
-+
-+static const char init_string[] = "\01@\x01\x31y\n\0";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\x01+35p" },
-+ { CAPS_STOP, "\x01-35p" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\x01%ds", 8, 0, 9, 0, 0, 0 },
-+ { PITCH, "\x01%dp", 50, 0, 99, 0, 0, 0 },
-+ { VOL, "\x01%dv", 5, 0, 9, 0, 0, 0 },
-+ { TONE, "\x01%dx", 1, 0, 2, 0, 0, 0 },
-+ { PUNCT, "\x01%db", 7, 0, 15, 0, 0, 0 },
-+ { VOICE, "\x01%do", 0, 0, 7, 0, 0, 0 },
-+ { FREQ, "\x01%df", 5, 0, 9, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_ltlk = { "ltlk", "1.1", "LiteTalk",
-+ init_string, 500, 50, 50, 5000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakupmap.h
-@@ -0,0 +1,64 @@
-+ 119, 61, 6,
-+ 0, 16, 17, 32, 20, 48, 0,
-+ 2, 0, 78, 0, 0, 0, 0,
-+ 3, 0, 79, 0, 0, 0, 0,
-+ 4, 0, 76, 0, 0, 0, 0,
-+ 5, 0, 77, 0, 0, 0, 0,
-+ 6, 0, 74, 0, 0, 0, 0,
-+ 7, 0, 75, 0, 0, 0, 0,
-+ 9, 0, 5, 0, 0, 0, 0,
-+ 10, 0, 4, 0, 0, 0, 0,
-+ 11, 0, 0, 0, 0, 1, 0,
-+ 12, 0, 27, 33, 0, 0, 0,
-+ 21, 0, 29, 0, 0, 17, 0,
-+ 22, 0, 15, 0, 0, 0, 0,
-+ 23, 0, 14, 0, 0, 0, 28,
-+ 24, 0, 16, 0, 0, 0, 0,
-+ 25, 0, 30, 0, 0, 18, 0,
-+ 28, 0, 3, 0, 0, 26, 0,
-+ 35, 0, 31, 0, 0, 0, 0,
-+ 36, 0, 12, 0, 0, 0, 0,
-+ 37, 0, 11, 0, 0, 0, 22,
-+ 38, 0, 13, 0, 0, 0, 0,
-+ 39, 0, 32, 0, 0, 7, 0,
-+ 40, 0, 23, 0, 0, 0, 0,
-+ 44, 0, 44, 0, 0, 0, 0,
-+ 49, 0, 24, 0, 0, 0, 0,
-+ 50, 0, 9, 6, 0, 19, 0,
-+ 51, 0, 8, 0, 0, 0, 36,
-+ 52, 0, 10, 0, 0, 20, 0,
-+ 53, 0, 25, 0, 0, 0, 0,
-+ 55, 46, 1, 0, 0, 0, 0,
-+ 58, 128, 128, 0, 0, 0, 0,
-+ 59, 0, 45, 0, 0, 0, 0,
-+ 60, 0, 40, 0, 0, 0, 0,
-+ 61, 0, 41, 0, 0, 0, 0,
-+ 62, 0, 42, 0, 0, 0, 0,
-+ 63, 0, 34, 0, 0, 0, 0,
-+ 64, 0, 35, 0, 0, 0, 0,
-+ 65, 0, 37, 0, 0, 0, 0,
-+ 66, 0, 38, 0, 0, 0, 0,
-+ 67, 0, 66, 39, 0, 0, 0,
-+ 68, 0, 67, 0, 0, 0, 0,
-+ 71, 15, 19, 0, 0, 0, 0,
-+ 72, 14, 29, 0, 28, 0, 0,
-+ 73, 16, 17, 0, 0, 0, 0,
-+ 74, 27, 33, 0, 0, 0, 0,
-+ 75, 12, 31, 0, 0, 0, 0,
-+ 76, 11, 21, 0, 22, 0, 0,
-+ 77, 13, 32, 0, 0, 0, 0,
-+ 78, 23, 43, 0, 0, 0, 0,
-+ 79, 9, 20, 0, 0, 0, 0,
-+ 80, 8, 30, 0, 36, 0, 0,
-+ 81, 10, 18, 0, 0, 0, 0,
-+ 82, 128, 128, 0, 0, 0, 0,
-+ 83, 24, 25, 0, 0, 0, 0,
-+ 87, 0, 68, 0, 0, 0, 0,
-+ 88, 0, 69, 0, 0, 0, 0,
-+ 96, 3, 26, 0, 0, 0, 0,
-+ 98, 4, 5, 0, 0, 0, 0,
-+ 99, 2, 0, 0, 0, 0, 0,
-+ 104, 0, 6, 0, 0, 0, 0,
-+ 109, 0, 7, 0, 0, 0, 0,
-+ 125, 128, 128, 0, 0, 0, 0,
-+ 0, 119
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakupmap.map
-@@ -0,0 +1,91 @@
-+spk key_f9 = punc_level_dec
-+spk key_f10 = punc_level_inc
-+spk key_f11 = reading_punc_dec
-+spk key_f12 = reading_punc_inc
-+spk key_1 = vol_dec
-+spk key_2 = vol_inc
-+spk key_3 = pitch_dec
-+spk key_4 = pitch_inc
-+spk key_5 = rate_dec
-+spk key_6 = rate_inc
-+key_kpasterisk = toggle_cursoring
-+spk key_kpasterisk = speakup_goto
-+spk key_f1 = speakup_help
-+spk key_f2 = set_win
-+spk key_f3 = clear_win
-+spk key_f4 = enable_win
-+spk key_f5 = edit_some
-+spk key_f6 = edit_most
-+spk key_f7 = edit_delim
-+spk key_f8 = edit_repeat
-+shift spk key_f9 = edit_exnum
-+ key_kp7 = say_prev_line
-+spk key_kp7 = left_edge
-+ key_kp8 = say_line
-+double key_kp8 = say_line_indent
-+spk key_kp8 = say_from_top
-+ key_kp9 = say_next_line
-+spk key_kp9 = top_edge
-+ key_kpminus = speakup_parked
-+spk key_kpminus = say_char_num
-+ key_kp4 = say_prev_word
-+spk key_kp4 = say_from_left
-+ key_kp5 = say_word
-+double key_kp5 = spell_word
-+spk key_kp5 = spell_phonetic
-+ key_kp6 = say_next_word
-+spk key_kp6 = say_to_right
-+ key_kpplus = say_screen
-+spk key_kpplus = say_win
-+ key_kp1 = say_prev_char
-+spk key_kp1 = right_edge
-+ key_kp2 = say_char
-+spk key_kp2 = say_to_bottom
-+double key_kp2 = say_phonetic_char
-+ key_kp3 = say_next_char
-+spk key_kp3 = bottom_edge
-+ key_kp0 = spk_key
-+ key_kpdot = say_position
-+spk key_kpdot = say_attributes
-+key_kpenter = speakup_quiet
-+spk key_kpenter = speakup_off
-+key_sysrq = speech_kill
-+ key_kpslash = speakup_cut
-+spk key_kpslash = speakup_paste
-+spk key_pageup = say_first_char
-+spk key_pagedown = say_last_char
-+key_capslock = spk_key
-+ spk key_z = spk_lock
-+key_leftmeta = spk_key
-+ctrl spk key_0 = speakup_goto
-+spk key_u = say_prev_line
-+spk key_i = say_line
-+double spk key_i = say_line_indent
-+spk key_o = say_next_line
-+spk key_minus = speakup_parked
-+shift spk key_minus = say_char_num
-+spk key_j = say_prev_word
-+spk key_k = say_word
-+double spk key_k = spell_word
-+spk key_l = say_next_word
-+spk key_m = say_prev_char
-+spk key_comma = say_char
-+double spk key_comma = say_phonetic_char
-+spk key_dot = say_next_char
-+spk key_n = say_position
-+ ctrl spk key_m = left_edge
-+ ctrl spk key_y = top_edge
-+ ctrl spk key_dot = right_edge
-+ctrl spk key_p = bottom_edge
-+spk key_apostrophe = say_screen
-+spk key_h = say_from_left
-+spk key_y = say_from_top
-+spk key_semicolon = say_to_right
-+spk key_p = say_to_bottom
-+spk key_slash = say_attributes
-+ spk key_enter = speakup_quiet
-+ ctrl spk key_enter = speakup_off
-+ spk key_9 = speakup_cut
-+spk key_8 = speakup_paste
-+shift spk key_m = say_first_char
-+ ctrl spk key_semicolon = say_last_char
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_sftsyn.c
-@@ -0,0 +1,175 @@
-+/* speakup_sftsynth.c - speakup driver to register and make available
-+ * a user space device for software synthesizers. written by: Kirk
-+ * Reiser <kirk@braille.uwo.ca>
-+
-+ Copyright (C) 2003 Kirk Reiser.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver. */
-+
-+#include <asm/semaphore.h>
-+#include <linux/miscdevice.h> /* for misc_register, and SYNTH_MINOR */
-+#include <linux/poll.h> // for poll_wait()
-+#include "spk_priv.h"
-+
-+#define MY_SYNTH synth_sftsyn
-+#define SOFTSYNTH_MINOR 26 // might as well give it one more than /dev/synth
-+#define PROCSPEECH 0x0d
-+#define CLEAR_SYNTH 0x18
-+
-+static struct miscdevice synth_device;
-+static int misc_registered = 0;
-+static int dev_opened = 0;
-+static struct semaphore sem;
-+DECLARE_WAIT_QUEUE_HEAD ( wait_on_output );
-+
-+
-+static int softsynth_open (struct inode *inode, struct file *fp)
-+{
-+ if (dev_opened) return -EBUSY;
-+ if ((fp->f_flags && O_ACCMODE) != O_RDONLY ) return -EPERM;
-+ sema_init( &sem, 1 );
-+ dev_opened++;
-+ return 0;
-+}
-+
-+static int softsynth_close (struct inode *inode, struct file *fp)
-+{
-+ fp->f_op = NULL;
-+ dev_opened = 0;
-+ return 0;
-+}
-+
-+static ssize_t softsynth_read (struct file *fp, char *buf, size_t count, loff_t *pos)
-+{
-+int chars_sent=0;
-+
-+ if (down_interruptible( &sem )) return -ERESTARTSYS;
-+ while (synth_buff_in == synth_buff_out) {
-+ up ( &sem );
-+ if (fp->f_flags & O_NONBLOCK)
-+ return -EAGAIN;
-+ if (wait_event_interruptible( wait_on_output, (synth_buff_in > synth_buff_out)))
-+ return -ERESTARTSYS;
-+ if (down_interruptible( &sem )) return -ERESTARTSYS;
-+ }
-+
-+ chars_sent = (count > synth_buff_in-synth_buff_out)
-+ ? synth_buff_in-synth_buff_out : count;
-+ if (copy_to_user(buf, (char *) synth_buff_out, chars_sent)) {
-+ up ( &sem);
-+ return -EFAULT;
-+ }
-+ synth_buff_out += chars_sent;
-+ *pos += chars_sent;
-+ if (synth_buff_out >= synth_buff_in) {
-+ synth_done();
-+ *pos = 0;
-+ }
-+ up ( &sem );
-+ return chars_sent;
-+}
-+
-+static unsigned int softsynth_poll (struct file *fp, struct poll_table_struct *wait)
-+{
-+ poll_wait(fp, &wait_on_output, wait);
-+
-+ if (synth_buff_out < synth_buff_in)
-+ return (POLLIN | POLLRDNORM);
-+ return 0;
-+}
-+
-+static void
-+softsynth_flush( void )
-+{
-+ synth_write( "\x18", 1 );
-+}
-+
-+static struct file_operations softsynth_fops = {
-+ poll:softsynth_poll,
-+ read:softsynth_read,
-+ open:softsynth_open,
-+ release:softsynth_close,
-+};
-+
-+
-+static int
-+softsynth_probe( void )
-+{
-+
-+ if ( misc_registered != 0 ) return 0;
-+ memset( &synth_device, 0, sizeof( synth_device ) );
-+ synth_device.minor = SOFTSYNTH_MINOR;
-+ synth_device.name = "softsynth";
-+ synth_device.fops = &softsynth_fops;
-+ if ( misc_register ( &synth_device ) ) {
-+ pr_warn("Couldn't initialize miscdevice /dev/softsynth.\n" );
-+ return -ENODEV;
-+ }
-+
-+ misc_registered = 1;
-+ pr_info("initialized device: /dev/softsynth, node (MAJOR 10, MINOR 26)\n" );
-+ return 0;
-+}
-+
-+static void
-+softsynth_release(void)
-+{
-+ misc_deregister( &synth_device );
-+ misc_registered = 0;
-+ pr_info("unregistered /dev/softsynth\n");
-+}
-+
-+static void
-+softsynth_start ( void )
-+{
-+ wake_up_interruptible ( &wait_on_output );
-+}
-+
-+static int
-+softsynth_is_alive( void )
-+{
-+ if ( synth_alive ) return 1;
-+ return 0;
-+}
-+
-+static const char init_string[] = "\01@\x01\x31y\n";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\x01+3p" },
-+ { CAPS_STOP, "\x01-3p" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\x01%ds", 5, 0, 9, 0, 0, 0 },
-+ { PITCH, "\x01%dp", 5, 0, 9, 0, 0, 0 },
-+ { VOL, "\x01%dv", 5, 0, 9, 0, 0, 0 },
-+ { TONE, "\x01%dx", 1, 0, 2, 0, 0, 0 },
-+ { PUNCT, "\x01%db", 7, 0, 15, 0, 0, 0 },
-+ { VOICE, "\x01%do", 0, 0, 7, 0, 0, 0 },
-+ { FREQ, "\x01%df", 5, 0, 9, 0, 0, 0 },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_sftsyn = { "sftsyn", "0.3", "software synth",
-+ init_string, 0, 0, 0, 0, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, softsynth_probe, softsynth_release, NULL,
-+ NULL, softsynth_start, softsynth_flush, softsynth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_spkout.c
-@@ -0,0 +1,188 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#define MY_SYNTH synth_spkout
-+#define SYNTH_CLEAR 0x18
-+#define PROCSPEECH '\r'
-+
-+static int wait_for_xmitr(void)
-+{
-+ static int timeouts = 0; /* sequential number of timeouts */
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ((synth_alive) && (timeouts >= NUM_DISABLE_TIMEOUTS)) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do {
-+ check = inb(synth_port_tts + UART_LSR);
-+ if (--tmout == 0) {
-+ pr_warn("SpeakOut: timed out\n");
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ((check & BOTH_EMPTY) != BOTH_EMPTY);
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do {
-+ check = inb(synth_port_tts + UART_MSR);
-+ if (--tmout == 0) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ((check & UART_MSR_CTS) != UART_MSR_CTS);
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out(const char ch)
-+{
-+ if (synth_alive && wait_for_xmitr()) {
-+ outb(ch, synth_port_tts);
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static unsigned char spk_serial_in(void)
-+{
-+ int c, lsr, tmout = SPK_SERIAL_TIMEOUT;
-+ do {
-+ lsr = inb(synth_port_tts + UART_LSR);
-+ if (--tmout == 0) return 0xff;
-+ } while (!(lsr & UART_LSR_DR));
-+ c = inb(synth_port_tts + UART_RX);
-+ return (unsigned char) c;
-+}
-+
-+static void do_catch_up(unsigned long data)
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+synth_stop_timer();
-+ while (synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if (ch == 0x0a) ch = PROCSPEECH;
-+ if (!spk_serial_out(ch )) {
-+ synth_delay(synth_full_time);
-+ return;
-+ }
-+ synth_buff_out++;
-+ if (jiffies >= jiff_max && ch == SPACE ) {
-+ spk_serial_out(PROCSPEECH);
-+ synth_delay(synth_delay_time);
-+ return;
-+ }
-+ }
-+spk_serial_out(PROCSPEECH);
-+ synth_done( );
-+}
-+
-+static char *synth_immediate (char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if (ch == 0x0a) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush(void)
-+{
-+ while ((inb(synth_port_tts + UART_LSR) & BOTH_EMPTY) != BOTH_EMPTY);
-+ outb(SYNTH_CLEAR, synth_port_tts);
-+}
-+
-+static int serprobe(int index)
-+{
-+ struct serial_state *ser = spk_serial_init(index);
-+ if ( ser == NULL ) return -1;
-+ /* ignore any error results, if port was forced */
-+ if (synth_port_forced) return 0;
-+ /* check for speak out now... */
-+ synth_immediate( "\x05[\x0f\r" );
-+ mdelay( 10 ); //failed with no delay
-+ if (spk_serial_in() == 0x0f) return 0;
-+ synth_release_region(ser->port,8);
-+ synth_alive = 0;
-+ return -1;
-+}
-+
-+static int synth_probe(void)
-+{
-+int i=0, failed=0;
-+ pr_info("Probing for %s.\n", synth->long_name);
-+ for (i=SPK_LO_TTY; i <= SPK_HI_TTY; i++) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info("%s Out: not found\n", synth->long_name);
-+ return -ENODEV;
-+ }
-+ pr_info("%s Out: %03x-%03x, Driver version %s,\n", synth->long_name,
-+ synth_port_tts, synth_port_tts + 7, synth->version);
-+ return 0;
-+}
-+
-+static int synth_is_alive(void)
-+{
-+ if (synth_alive) return 1;
-+ if (wait_for_xmitr() > 0) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string(synth->init );
-+ return 2;
-+ } else pr_warn("%s Out: can't restart synth\n", synth->long_name);
-+ return 0;
-+}
-+
-+static const char init_string[] = "\005W1\005I2\005C3";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\x05P+" },
-+ { CAPS_STOP, "\x05P-" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\x05R%d", 7, 0, 9, 0, 0, 0 },
-+ { PITCH, "\x05P%d", 3, 0, 9, 0, 0, 0 },
-+ { VOL, "\x05V%d", 9, 0, 9, 0, 0, 0 },
-+ { TONE, "\x05T%c", 8, 0, 25, 65, 0, 0 },
-+ { PUNCT, "\x05M%c", 0, 0, 3, 0, 0, "nsma" },
-+ V_LAST_NUM
-+};
-+
-+struct spk_synth synth_spkout = {"spkout", "1.1", "Speakout",
-+ init_string, 500, 50, 50, 5000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/speakup_txprt.c
-@@ -0,0 +1,195 @@
-+/*
-+ * originially written by: Kirk Reiser <kirk@braille.uwo.ca>
-+* this version considerably modified by David Borowski, david575@rogers.com
-+
-+ Copyright (C) 1998-99 Kirk Reiser.
-+ Copyright (C) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ * this code is specificly written as a driver for the speakup screenreview
-+ * package and is not a general device driver.
-+ */
-+#include "spk_priv.h"
-+#include "serialio.h"
-+
-+#define MY_SYNTH synth_txprt
-+#define DRV_VERSION "1.2"
-+#define SYNTH_CLEAR 0x18
-+#define PROCSPEECH '\r' /* process speech char */
-+
-+static int timeouts = 0; /* sequential number of timeouts */
-+
-+static int wait_for_xmitr( void )
-+{
-+ int check, tmout = SPK_XMITR_TIMEOUT;
-+ if ( ( synth_alive ) && ( timeouts >= NUM_DISABLE_TIMEOUTS ) ) {
-+ synth_alive = 0;
-+ timeouts = 0;
-+ return 0;
-+ }
-+ do {
-+ check = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) {
-+ pr_warn( "TXPRT: timed out\n" );
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & BOTH_EMPTY ) != BOTH_EMPTY );
-+ tmout = SPK_XMITR_TIMEOUT;
-+ do {
-+ check = inb( synth_port_tts + UART_MSR );
-+ if ( --tmout == 0 ) {
-+ timeouts++;
-+ return 0;
-+ }
-+ } while ( ( check & UART_MSR_CTS ) != UART_MSR_CTS );
-+ timeouts = 0;
-+ return 1;
-+}
-+
-+static inline int spk_serial_out( const char ch )
-+{
-+ if ( synth_alive && wait_for_xmitr( ) ) {
-+ outb( ch, synth_port_tts );
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static unsigned char spk_serial_in( void )
-+{
-+ int c, lsr, tmout = SPK_SERIAL_TIMEOUT;
-+ do {
-+ lsr = inb( synth_port_tts + UART_LSR );
-+ if ( --tmout == 0 ) return 0xff;
-+ } while ( !( lsr & UART_LSR_DR ) );
-+ c = inb( synth_port_tts + UART_RX );
-+ return ( unsigned char ) c;
-+}
-+
-+static void do_catch_up( unsigned long data )
-+{
-+ unsigned long jiff_max = jiffies+synth_jiffy_delta;
-+ u_char ch;
-+
-+ synth_stop_timer( );
-+ while ( synth_buff_out < synth_buff_in ) {
-+ ch = *synth_buff_out;
-+ if ( ch == '\n' ) ch = PROCSPEECH;
-+ if ( !spk_serial_out( ch ) ) {
-+ synth_delay( synth_full_time );
-+ return;
-+ }
-+ synth_buff_out++;
-+ if ( jiffies >= jiff_max && ch == ' ' ) {
-+ spk_serial_out( PROCSPEECH );
-+ synth_delay( synth_delay_time );
-+ return;
-+ }
-+ }
-+ spk_serial_out( PROCSPEECH );
-+ synth_done( );
-+}
-+
-+static char *synth_immediate ( char *buf )
-+{
-+ u_char ch;
-+ while ( ( ch = *buf ) ) {
-+ if ( ch == 0x0a ) ch = PROCSPEECH;
-+ if ( wait_for_xmitr( ) )
-+ outb( ch, synth_port_tts );
-+ else return buf;
-+ buf++;
-+ }
-+ return 0;
-+}
-+
-+static void synth_flush ( void )
-+{
-+ spk_serial_out ( SYNTH_CLEAR );
-+}
-+
-+static int serprobe( int index )
-+{
-+ u_char test=0;
-+ struct serial_state *ser = spk_serial_init( index );
-+ if ( ser == NULL ) return -1;
-+ if ( synth_port_forced ) return 0;
-+ /* check for txprt now... */
-+ if (synth_immediate( "\x05$" ))
-+ pr_warn("synth_immediate could not unload\n");
-+ if (synth_immediate( "\x05Ik" ))
-+ pr_warn("synth_immediate could not unload again\n");
-+ if (synth_immediate( "\x05Q\r" ))
-+ pr_warn("synth_immediate could not unload a third time\n");
-+ if ( ( test = spk_serial_in( ) ) == 'k' ) return 0;
-+ else pr_warn( "synth returned %x on port %03lx\n", test, ser->port );
-+ synth_release_region( ser->port,8 );
-+ timeouts = synth_alive = 0;
-+ return -1;
-+}
-+
-+static int synth_probe( void )
-+{
-+ int i, failed=0;
-+ pr_info( "Probing for %s.\n", synth->long_name );
-+ for ( i=SPK_LO_TTY; i <= SPK_HI_TTY; i++ ) {
-+ if (( failed = serprobe( i )) == 0 ) break; /* found it */
-+ }
-+ if ( failed ) {
-+ pr_info( "%s: not found\n", synth->long_name );
-+ return -ENODEV;
-+ }
-+ pr_info( "%s: %03x-%03x..\n", synth->long_name, (int) synth_port_tts, (int) synth_port_tts+7 );
-+ pr_info( "%s: driver version %s.\n", synth->long_name, synth->version);
-+ return 0;
-+}
-+
-+static int synth_is_alive( void )
-+{
-+ if ( synth_alive ) return 1;
-+ if ( wait_for_xmitr( ) > 0 ) { /* restart */
-+ synth_alive = 1;
-+ synth_write_string( synth->init );
-+ return 2;
-+ }
-+ pr_warn( "%s: can't restart synth\n", synth->long_name );
-+ return 0;
-+}
-+
-+static const char init_string[] = "\x05N1";
-+
-+static string_var stringvars[] = {
-+ { CAPS_START, "\x05P8" },
-+ { CAPS_STOP, "\x05P5" },
-+ V_LAST_STRING
-+};
-+static num_var numvars[] = {
-+ { RATE, "\x05R%d", 5, 0, 9, 0, 0, 0 },
-+ { PITCH, "\x05P%d", 5, 0, 9, 0, 0, 0 },
-+ { VOL, "\x05V%d", 5, 0, 9, 0, 0, 0 },
-+ { TONE, "\x05T%c", 12, 0, 25, 61, 0, 0 },
-+ V_LAST_NUM
-+ };
-+
-+struct spk_synth synth_txprt = {"txprt", DRV_VERSION, "Transport",
-+ init_string, 500, 50, 50, 5000, 0, 0, SYNTH_CHECK,
-+ stringvars, numvars, synth_probe, spk_serial_release, synth_immediate,
-+ do_catch_up, NULL, synth_flush, synth_is_alive, NULL};
-+
-+#ifdef MODULE
-+#include "mod_code.c"
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/spk_con_module.h
-@@ -0,0 +1,43 @@
-+/* written bby David Borowski.
-+ Copyright (C ) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option ) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+*/
-+
-+/* included by ../console.c for speakup modularization */
-+
-+static spk_con_func addr_spk_allocate = NULL;
-+static spk_con_func addr_spk_bs = NULL;
-+static spk_write_func addr_spk_con_write = NULL;
-+static spk_con_func addr_spk_con_update = NULL;
-+
-+#define speakup_allocate(c) if (addr_spk_allocate) (*addr_spk_allocate)(c)
-+#define speakup_bs(c) if (addr_spk_bs) (*addr_spk_bs)(c)
-+#define speakup_con_write(c,s,l) if (addr_spk_con_write) (*addr_spk_con_write)(c,s,l)
-+#define speakup_con_update(c) if (addr_spk_con_update) (*addr_spk_con_update)(c)
-+
-+extern spk_key_func addr_spk_key;
-+
-+void speakup_set_addresses( spk_con_func allocate, spk_con_func bs,
-+ spk_write_func con_write, spk_con_func con_update, spk_key_func key )
-+{
-+ addr_spk_allocate = allocate;
-+ addr_spk_bs = bs;
-+ addr_spk_con_write = con_write;
-+ addr_spk_con_update = con_update;
-+ addr_spk_key = key;
-+}
-+
-+EXPORT_SYMBOL(speakup_set_addresses);
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/spk_priv.h
-@@ -0,0 +1,258 @@
-+/* spk_priv.h
-+ review functions for the speakup screen review package.
-+ originally written by: Kirk Reiser and Andy Berdan.
-+
-+ extensively modified by David Borowski.
-+
-+ Copyright (C ) 1998 Kirk Reiser.
-+ Copyright (C ) 2003 David Borowski.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option ) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+*/
-+#ifndef __SPEAKUP_PRIVATE_H
-+#define __SPEAKUP_PRIVATE_H
-+
-+#define KERNEL
-+#include <linux/version.h>
-+#include <linux/config.h>
-+#include <linux/types.h>
-+#include <linux/fs.h>
-+#include <linux/errno.h>
-+#include <asm/io.h> /* for inb_p, outb_p, inb, outb, etc... */
-+#include <linux/delay.h>
-+#include <linux/wait.h> /* for wait_queue */
-+#include <linux/init.h> /* for __init */
-+#include <linux/module.h>
-+#ifdef CONFIG_PROC_FS
-+#include <linux/proc_fs.h>
-+#endif
-+#include <linux/speakup.h>
-+#include "keyinfo.h"
-+
-+#define SHIFT_TBL_SIZE 64
-+/* proc permissions */
-+#define USER_R ( S_IFREG|S_IRUGO )
-+#define USER_W ( S_IFREG|S_IWUGO )
-+#define USER_RW ( S_IFREG|S_IRUGO|S_IWUGO )
-+#define ROOT_W ( S_IFREG|S_IRUGO|S_IWUSR )
-+
-+#define V_LAST_STRING { -1, 0 }
-+#define V_LAST_NUM { -1, 0, 0, 0, 0, 0, 0, 0 }
-+#define TOGGLE_0 0, 0, 0, 1, 0, 0, 0
-+#define TOGGLE_1 0, 1, 0, 1, 0, 0, 0
-+#define MAXVARLEN 15
-+#define TAB 0x9
-+#define SPACE 0x20
-+#define CAP_A 'A'
-+#define CAP_Z 'Z'
-+#define SYNTH_OK 0x0001
-+#define B_ALPHA 0x0002
-+#define ALPHA 0x0003
-+#define B_CAP 0x0004
-+#define A_CAP 0x0007
-+#define B_NUM 0x0008
-+#define NUM 0x0009
-+#define ALPHANUM ( B_ALPHA|B_NUM )
-+#define SOME 0x0010
-+#define MOST 0x0020
-+#define PUNC 0x0040
-+#define A_PUNC 0x0041
-+#define B_WDLM 0x0080
-+#define WDLM 0x0081
-+#define B_EXNUM 0x0100
-+#define CH_RPT 0x0200
-+#define B_CTL 0x0400
-+#define A_CTL B_CTL+SYNTH_OK
-+#define B_SYM 0x0800
-+#define B_CAPSYM B_CAP|B_SYM
-+#define IS_WDLM( x ) ( spk_chartab[( ( u_char )x )]&B_WDLM )
-+#define IS_CHAR( x, type ) ( spk_chartab[( ( u_char )x )]&type )
-+#define SET_DEFAULT -4
-+#define E_RANGE -3
-+#define E_TOOLONG -2
-+#define E_UNDEF -1
-+enum { VAR_NUM = 0, VAR_TIME, VAR_STRING, VAR_PROC };
-+enum { E_DEFAULT = 0, E_SET, E_INC, E_DEC };
-+
-+#define PROC_READ_PROTOTYPE char *page, char **start, off_t off, \
-+ int count, int *eof, void *data
-+#define PROC_WRITE_PROTOTYPE struct file *file, const char *buffer, \
-+ u_long count, void *data
-+
-+#ifndef MIN
-+#define MIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
-+#endif
-+
-+typedef int (*special_func)( struct vc_data *vc, u_char type, u_char ch, u_short key );
-+typedef struct st_var_header var_header;
-+typedef struct st_num_var num_var;
-+typedef struct st_string_var string_var;
-+typedef struct st_proc_var proc_var;
-+
-+struct st_var_header {
-+ char *name;
-+ short var_id, var_type, proc_mode;
-+ void *proc_entry;
-+ void *p_val; /* ptr to programs variable to store value */
-+ void *data; /* ptr to the vars data */
-+};
-+
-+/* next are data for different var types */
-+struct st_num_var {
-+ short var_id;
-+ char *synth_fmt;
-+ short default_val, low, high;
-+ short offset, multiplier; /* for fiddling rates etc. */
-+ char *out_str; /* if synth needs char representation of number */
-+ short value; /* current value */
-+};
-+struct st_string_var {
-+ short var_id;
-+ char *default_val;
-+};
-+struct st_proc_var {
-+ short var_id;
-+ int ( *read_proc )( PROC_READ_PROTOTYPE );
-+ int ( *write_proc )( PROC_WRITE_PROTOTYPE );
-+ short value;
-+};
-+
-+typedef struct st_bits_data bits_data;
-+struct st_bits_data { /* punc, repeats, word delim bits */
-+ char *name;
-+ char *value;
-+ short mask;
-+};
-+
-+extern var_header *var_ptrs[MAXVARS];
-+extern proc_var spk_proc_vars[];
-+char *xlate( char * );
-+char *speakup_s2i( char *, short * );
-+int speakup_register_var( num_var *var );
-+void speakup_unregister_var( short var_id );
-+extern var_header *get_var_header( short var_id );
-+extern int set_num_var( short val, var_header *var, int how );
-+
-+/* let's develop a structure for keeping our goodies in. */
-+typedef struct st_spk_t spk_t;
-+#define spk_size (sizeof( spk_t))
-+struct st_spk_t {
-+ u_long reading_x, cursor_x;
-+ u_long reading_y, cursor_y;
-+ u_long reading_pos, cursor_pos;
-+ u_long go_x, go_pos;
-+ u_long w_top, w_bottom, w_left, w_right;
-+ u_char w_start, w_enabled;
-+ u_char reading_attr, old_attr;
-+ char parked, shut_up;
-+};
-+
-+/* now some defines to make these easier to use. */
-+#define spk_shut_up speakup_console[vc->vc_num]->shut_up
-+#define spk_killed ( speakup_console[vc->vc_num]->shut_up & 0x40 )
-+#define spk_x speakup_console[vc->vc_num]->reading_x
-+#define spk_cx speakup_console[vc->vc_num]->cursor_x
-+#define spk_y speakup_console[vc->vc_num]->reading_y
-+#define spk_cy speakup_console[vc->vc_num]->cursor_y
-+#define spk_pos ( speakup_console[vc->vc_num]->reading_pos )
-+#define spk_cp speakup_console[vc->vc_num]->cursor_pos
-+#define goto_pos ( speakup_console[vc->vc_num]->go_pos )
-+#define goto_x ( speakup_console[vc->vc_num]->go_x )
-+#define win_top ( speakup_console[vc->vc_num]->w_top )
-+#define win_bottom ( speakup_console[vc->vc_num]->w_bottom )
-+#define win_left ( speakup_console[vc->vc_num]->w_left )
-+#define win_right ( speakup_console[vc->vc_num]->w_right )
-+#define win_start ( speakup_console[vc->vc_num]->w_start )
-+#define win_enabled ( speakup_console[vc->vc_num]->w_enabled )
-+#define spk_attr speakup_console[vc->vc_num]->reading_attr
-+#define spk_old_attr speakup_console[vc->vc_num]->old_attr
-+#define spk_parked speakup_console[vc->vc_num]->parked
-+#define SYNTH_CHECK 20030716 /* today's date ought to do for check value */
-+/* synth flags, for odd synths */
-+#define SF_DEC 1 /* to fiddle puncs in alpha strings so it doesn't spell */
-+
-+struct spk_synth {
-+ const char *name;
-+ const char *version;
-+ const char *long_name;
-+ const char *init;
-+ short delay, trigger, jiffies, full, flush_wait, flags;
-+ const int checkval; /* for validating a proper synth module */
-+ string_var *string_vars;
-+ num_var *num_vars;
-+ int ( *probe )( void );
-+ void ( *release )( void );
-+ char *( *synth_immediate )( char *buff );
-+ void ( *catch_up )( u_long data );
-+ void ( *start )( void );
-+ void ( *flush )( void );
-+ int ( *is_alive )( void );
-+ int ( *synth_adjust )( var_header *var );
-+};
-+
-+extern struct spk_synth *synth;
-+int synth_request_region( u_long, u_long );
-+int synth_release_region( u_long, u_long );
-+void spk_serial_release( void );
-+extern int synth_port_tts, synth_port_forced;
-+extern volatile int synth_timer_active;
-+#define declare_timer( name ) struct timer_list name;
-+#if (LINUX_VERSION_CODE >= 132419)
-+#define start_timer( name ) if ( ! name.entry.prev ) add_timer ( & name )
-+#define stop_timer( name ) del_timer ( & name ); name.entry.prev = NULL
-+#else
-+#define start_timer( name ) if ( ! name.list.prev ) add_timer ( & name )
-+#define stop_timer( name ) del_timer ( & name )
-+#endif
-+#define declare_sleeper( name ) wait_queue_head_t name
-+#define init_sleeper( name ) init_waitqueue_head ( &name )
-+extern declare_sleeper( synth_sleeping_list );
-+extern declare_timer( synth_timer );
-+extern char str_caps_start[], str_caps_stop[];
-+extern short no_intr, say_ctrl, say_word_ctl, punc_level;
-+extern short reading_punc, attrib_bleep, bleeps;
-+extern short bleep_time, bell_pos;
-+extern short spell_delay, key_echo, punc_mask;
-+extern short synth_jiffy_delta, synth_delay_time;
-+extern short synth_trigger_time, synth_full_time;
-+extern short cursor_timeout, pitch_shift, synth_flags;
-+extern int synth_alive;
-+extern u_char synth_buffer[]; /* guess what this is for! */
-+extern u_char *buffer_highwater;
-+extern volatile u_char *synth_buff_in, *synth_buff_out;
-+int synth_init( char *name );
-+int do_synth_init( struct spk_synth *in_synth );
-+void synth_release( void );
-+void synth_add( struct spk_synth *in_synth );
-+void synth_remove( struct spk_synth *in_synth );
-+struct serial_state * spk_serial_init( int index );
-+void synth_delay( int ms );
-+void synth_stop_timer( void );
-+int synth_done( void );
-+void do_flush( void );
-+void synth_buffer_add( char ch );
-+void synth_write( const char *buf, size_t count );
-+void synth_write_string( const char *buf );
-+void synth_write_msg( const char *buf );
-+void speakup_register_devsynth ( void );
-+
-+#ifndef pr_info
-+#define pr_info(fmt,arg...) printk(KERN_INFO fmt,##arg)
-+#endif
-+#ifndef pr_warn
-+#define pr_warn(fmt,arg...) printk(KERN_WARNING fmt,##arg)
-+#endif
-+
-+#endif
---- /dev/null
-+++ gregkh-2.6/drivers/char/speakup/synthlist.h
-@@ -0,0 +1,54 @@
-+/* this is included two times */
-+#if defined(PASS2)
-+/* table of built in synths */
-+#define SYNTH_DECL(who) &synth_##who,
-+#define CFG_TEST(name) (name)
-+#else
-+/* declare extern built in synths */
-+#define SYNTH_DECL(who) extern struct spk_synth synth_##who;
-+#define PASS2
-+#define CFG_TEST(name) (name)
-+#endif
-+
-+#if CFG_TEST(CONFIG_SPEAKUP_ACNTPC)
-+SYNTH_DECL(acntpc)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_ACNTSA)
-+SYNTH_DECL(acntsa)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_APOLLO)
-+SYNTH_DECL(apollo)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_AUDPTR)
-+SYNTH_DECL(audptr)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_BNS)
-+SYNTH_DECL(bns)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_DECEXT)
-+SYNTH_DECL(decext)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_DECTLK)
-+SYNTH_DECL(dectlk)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_DTLK)
-+SYNTH_DECL(dtlk)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_KEYPC)
-+SYNTH_DECL(keypc)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_LTLK)
-+SYNTH_DECL(ltlk)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_SFTSYN)
-+SYNTH_DECL(sftsyn)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_SPKOUT)
-+SYNTH_DECL(spkout)
-+#endif
-+#if CFG_TEST(CONFIG_SPEAKUP_TXPRT)
-+SYNTH_DECL(txprt)
-+#endif
-+
-+#undef SYNTH_DECL
-+#undef CFG_TEST
---- /dev/null
-+++ gregkh-2.6/include/linux/speakup.h
-@@ -0,0 +1,33 @@
-+#ifndef __SPEAKUP_H
-+#define __SPEAKUP_H
-+
-+#include <linux/version.h>
-+
-+struct kbd_struct;
-+struct vc_data;
-+
-+/* how about some prototypes! */
-+extern int do_spk_ioctl(int,unsigned char *data,int,void *);
-+
-+#if defined(CONFIG_SPEAKUP)
-+extern void speakup_init(struct vc_data *);
-+extern void speakup_allocate(struct vc_data *);
-+extern void speakup_bs(struct vc_data *);
-+extern void speakup_con_write(struct vc_data *, const char *, int);
-+extern void speakup_con_update(struct vc_data *);
-+extern int speakup_key(struct vc_data*, int, int, u_short, int, struct pt_regs *);
-+#elif defined(CONFIG_SPEAKUP_MODULE)
-+typedef void (*spk_con_func)(struct vc_data * );
-+typedef void (*spk_write_func)(struct vc_data *, const char *, int);
-+typedef int (*spk_key_func)(struct vc_data*, int, int, u_short, int, struct pt_regs *);
-+extern void spk_set_addresses( spk_con_func allocate, spk_con_func bs,
-+ spk_write_func con_write, spk_con_func con_update, spk_key_func key );
-+static inline void speakup_init(struct vc_data *vc) { }
-+#else
-+static inline void speakup_allocate(struct vc_data *vc) { }
-+static inline void speakup_bs(struct vc_data *vc) { }
-+static inline void speakup_con_write(struct vc_data *vc, const char *str, int len) { }
-+static inline void speakup_con_update(struct vc_data *vc) { }
-+static inline void speakup_init(struct vc_data *vc) { }
-+#endif
-+#endif
---- gregkh-2.6.orig/arch/arm/Kconfig
-+++ gregkh-2.6/arch/arm/Kconfig
-@@ -741,6 +741,7 @@ source "drivers/mfd/Kconfig"
- source "drivers/media/Kconfig"
-
- source "drivers/video/Kconfig"
-+source "drivers/char/speakup/Kconfig"
-
- source "sound/Kconfig"
-
---- gregkh-2.6.orig/drivers/char/consolemap.c
-+++ gregkh-2.6/drivers/char/consolemap.c
-@@ -668,3 +668,4 @@ console_map_init(void)
- }
-
- EXPORT_SYMBOL(con_copy_unimap);
-+EXPORT_SYMBOL(inverse_translate);
---- gregkh-2.6.orig/drivers/char/keyboard.c
-+++ gregkh-2.6/drivers/char/keyboard.c
-@@ -40,6 +40,13 @@
- #include <linux/sysrq.h>
- #include <linux/input.h>
-
-+
-+#include <linux/speakup.h>
-+
-+#ifdef CONFIG_SPEAKUP_MODULE
-+spk_key_func addr_spk_key = NULL;
-+#endif
-+
- static void kbd_disconnect(struct input_handle *handle);
- extern void ctrl_alt_del(void);
-
-@@ -64,6 +71,10 @@ extern void ctrl_alt_del(void);
-
- #define KBD_DEFLOCK 0
-
-+/* Key types processed even in raw modes */
-+
-+#define TYPES_ALLOWED_IN_RAW_MODE ((1 << KT_SPEC) | (1 << KT_SHIFT) | (1 << KT_SPKUP))
-+
- void compute_shiftstate(void);
-
- /*
-@@ -79,7 +90,7 @@ void compute_shiftstate(void);
- typedef void (k_handler_fn)(struct vc_data *vc, unsigned char value,
- char up_flag, struct pt_regs *regs);
- static k_handler_fn K_HANDLERS;
--static k_handler_fn *k_handler[16] = { K_HANDLERS };
-+k_handler_fn *k_handler[16] = { K_HANDLERS };
-
- #define FN_HANDLERS\
- fn_null, fn_enter, fn_show_ptregs, fn_show_mem,\
-@@ -100,15 +111,18 @@ static fn_handler_fn *fn_handler[] = { F
- const int max_vals[] = {
- 255, ARRAY_SIZE(func_table) - 1, ARRAY_SIZE(fn_handler) - 1, NR_PAD - 1,
- NR_DEAD - 1, 255, 3, NR_SHIFT - 1, 255, NR_ASCII - 1, NR_LOCK - 1,
-- 255, NR_LOCK - 1, 255
-+ 255, NR_LOCK - 1, 255, 255
- };
-
- const int NR_TYPES = ARRAY_SIZE(max_vals);
-
- struct kbd_struct kbd_table[MAX_NR_CONSOLES];
--static struct kbd_struct *kbd = kbd_table;
-+struct kbd_struct *kbd = kbd_table;
- static struct kbd_struct kbd0;
-
-+EXPORT_SYMBOL(kbd);
-+EXPORT_SYMBOL(k_handler);
-+
- int spawnpid, spawnsig;
-
- /*
-@@ -255,12 +269,14 @@ void kd_mksound(unsigned int hz, unsigne
- }
- }
- }
-- if (ticks)
-- mod_timer(&kd_mksound_timer, jiffies + ticks);
-+ if (ticks)
-+ mod_timer(&kd_mksound_timer, jiffies + ticks);
- } else
- kd_nosound(0);
- }
-
-+EXPORT_SYMBOL(kd_mksound);
-+
- /*
- * Setting the keyboard rate.
- */
-@@ -602,6 +618,7 @@ static void k_spec(struct vc_data *vc, u
- if (up_flag)
- return;
- if (value >= ARRAY_SIZE(fn_handler))
-+ if (up_flag || (value >= ARRAY_SIZE(fn_handler)))
- return;
- if ((kbd->kbdmode == VC_RAW ||
- kbd->kbdmode == VC_MEDIUMRAW) &&
-@@ -1119,6 +1136,13 @@ static void kbd_keycode(unsigned int key
- key_map = key_maps[shift_final];
-
- if (!key_map) {
-+#ifdef CONFIG_SPEAKUP
-+ if (speakup_key(vc, shift_final, keycode, K(KT_SHIFT,0), !down, regs ))
-+ return;
-+#elif defined(CONFIG_SPEAKUP_MODULE)
-+ if ( addr_spk_key && (*addr_spk_key)(vc, shift_final,
-+ keycode, K(KT_SHIFT,0), !down, regs) ) return;
-+#endif
- compute_shiftstate();
- kbd->slockstate = 0;
- return;
-@@ -1137,8 +1161,15 @@ static void kbd_keycode(unsigned int key
- }
-
- type -= 0xf0;
-+#ifdef CONFIG_SPEAKUP
-+ if (speakup_key(vc, shift_final, keycode, keysym, !down, regs ))
-+ return;
-+#elif defined(CONFIG_SPEAKUP_MODULE)
-+ if ( addr_spk_key && (*addr_spk_key)(vc, shift_final,
-+ keycode, keysym, !down, regs) ) return;
-+#endif
-
-- if (raw_mode && type != KT_SPEC && type != KT_SHIFT)
-+ if (raw_mode && type != KT_SPEC && type != KT_SHIFT )
- return;
-
- if (type == KT_LETTER) {
-@@ -1149,7 +1180,6 @@ static void kbd_keycode(unsigned int key
- keysym = key_map[keycode];
- }
- }
--
- (*k_handler[type])(vc, keysym & 0xff, !down, regs);
-
- if (type != KT_SLOCK)
---- gregkh-2.6.orig/drivers/char/Makefile
-+++ gregkh-2.6/drivers/char/Makefile
-@@ -84,6 +84,7 @@ obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.
- obj-$(CONFIG_TANBAC_TB0219) += tb0219.o
- obj-$(CONFIG_TELCLOCK) += tlclk.o
-
-+obj-$(CONFIG_SPEAKUP) += speakup/
- obj-$(CONFIG_WATCHDOG) += watchdog/
- obj-$(CONFIG_MWAVE) += mwave/
- obj-$(CONFIG_AGP) += agp/
---- gregkh-2.6.orig/drivers/char/vt.c
-+++ gregkh-2.6/drivers/char/vt.c
-@@ -98,6 +98,10 @@
- #include <asm/system.h>
- #include <asm/uaccess.h>
-
-+#include <linux/speakup.h>
-+#ifdef CONFIG_SPEAKUP_MODULE
-+#include "speakup/spk_con_module.h"
-+#endif
-
- const struct consw *conswitchp;
-
-@@ -725,6 +729,7 @@ int vc_allocate(unsigned int currcons) /
- }
- vc->vc_kmalloced = 1;
- vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
-+ speakup_allocate(vc);
- }
- return 0;
- }
-@@ -978,6 +983,7 @@ static void lf(struct vc_data *vc)
- vc->vc_pos += vc->vc_size_row;
- }
- vc->vc_need_wrap = 0;
-+ speakup_con_write(vc, "\n",1);
- }
-
- static void ri(struct vc_data *vc)
-@@ -1006,6 +1012,7 @@ static inline void bs(struct vc_data *vc
- vc->vc_pos -= 2;
- vc->vc_x--;
- vc->vc_need_wrap = 0;
-+ speakup_bs(vc);
- }
- }
-
-@@ -1543,6 +1550,7 @@ static void do_con_trol(struct tty_struc
- break;
- }
- vc->vc_pos += (vc->vc_x << 1);
-+ speakup_con_write(vc, " ", 1);
- return;
- case 10: case 11: case 12:
- lf(vc);
-@@ -2073,6 +2081,7 @@ static int do_con_write(struct tty_struc
- }
- if (vc->vc_decim)
- insert_char(vc, 1);
-+ speakup_con_write(vc, (char *) &tc, 1);
- scr_writew(himask ?
- ((vc->vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
- (vc->vc_attr << 8) + tc,
-@@ -2098,6 +2107,7 @@ static int do_con_write(struct tty_struc
- release_console_sem();
-
- out:
-+ speakup_con_update(vc);
- return n;
- #undef FLUSH
- }
-@@ -2123,6 +2133,7 @@ static void console_callback(void *ignor
- /* we only changed when the console had already
- been allocated - a new console is not created
- in an interrupt routine */
-+ speakup_con_update(vc_cons[want_console].d);
- }
- want_console = -1;
- }
-@@ -2141,6 +2152,7 @@ static void console_callback(void *ignor
- do_blank_screen(0);
- blank_timer_expired = 0;
- }
-+ speakup_con_update(vc_cons[fg_console].d);
-
- release_console_sem();
- }
-@@ -2198,6 +2210,7 @@ static void vt_console_print(struct cons
-
- /* Contrived structure to try to emulate original need_wrap behaviour
- * Problems caused when we have need_wrap set on '\n' character */
-+ speakup_con_write(vc, b, count);
- while (count--) {
- c = *b++;
- if (c == 10 || c == 13 || c == 8 || vc->vc_need_wrap) {
-@@ -2242,6 +2255,7 @@ static void vt_console_print(struct cons
- }
- }
- set_cursor(vc);
-+ speakup_con_update(vc);
-
- quit:
- clear_bit(0, &printing);
-@@ -2587,6 +2601,7 @@ static int __init con_init(void)
- master_display_fg = vc = vc_cons[currcons].d;
- set_origin(vc);
- save_screen(vc);
-+ speakup_init(vc);
- gotoxy(vc, vc->vc_x, vc->vc_y);
- csi_J(vc, 0);
- update_screen(vc);
-@@ -3279,3 +3294,4 @@ EXPORT_SYMBOL(vc_cons);
- EXPORT_SYMBOL(take_over_console);
- EXPORT_SYMBOL(give_up_console);
- #endif
-+EXPORT_SYMBOL(screen_glyph);
---- gregkh-2.6.orig/drivers/Kconfig
-+++ gregkh-2.6/drivers/Kconfig
-@@ -56,6 +56,8 @@ source "drivers/media/Kconfig"
-
- source "drivers/video/Kconfig"
-
-+source "drivers/char/speakup/Kconfig"
-+
- source "sound/Kconfig"
-
- source "drivers/usb/Kconfig"
---- gregkh-2.6.orig/drivers/Makefile
-+++ gregkh-2.6/drivers/Makefile
-@@ -1,4 +1,3 @@
--#
- # Makefile for the Linux kernel device drivers.
- #
- # 15 Sep 2000, Christoph Hellwig <hch@infradead.org>
-@@ -28,6 +27,8 @@ obj-$(CONFIG_FB_INTEL) += video
- # serial drivers start registering their serio ports
- obj-$(CONFIG_SERIO) += input/serio/
- obj-y += serial/
-+# load keyboard early so speakup can be quieted
-+obj-$(CONFIG_INPUT) += input/
- obj-$(CONFIG_PARPORT) += parport/
- obj-y += base/ block/ misc/ mfd/ net/ media/
- obj-$(CONFIG_NUBUS) += nubus/
-@@ -52,7 +53,6 @@ obj-$(CONFIG_USB) += usb/
- obj-$(CONFIG_PCI) += usb/
- obj-$(CONFIG_USB_GADGET) += usb/gadget/
- obj-$(CONFIG_GAMEPORT) += input/gameport/
--obj-$(CONFIG_INPUT) += input/
- obj-$(CONFIG_I2O) += message/
- obj-$(CONFIG_I2C) += i2c/
- obj-$(CONFIG_W1) += w1/
---- gregkh-2.6.orig/include/linux/keyboard.h
-+++ gregkh-2.6/include/linux/keyboard.h
-@@ -44,6 +44,7 @@ extern unsigned short plain_map[NR_KEYS]
- #define KT_ASCII 9
- #define KT_LOCK 10
- #define KT_SLOCK 12
-+#define KT_SPKUP 14
-
- #define K(t,v) (((t)<<8)|(v))
- #define KTYP(x) ((x) >> 8)
-@@ -426,6 +427,7 @@ extern unsigned short plain_map[NR_KEYS]
- #define K_CTRLR_SLOCK K(KT_SLOCK,KG_CTRLR)
-
- #define NR_LOCK 8
-+#define NR_SPKUP 0x45
-
- #define MAX_DIACR 256
- #endif
---- gregkh-2.6.orig/MAINTAINERS
-+++ gregkh-2.6/MAINTAINERS
-@@ -2437,6 +2437,13 @@ M: wli@holomorphy.com
- L: sparclinux@vger.kernel.org
- S: Maintained
-
-+SPEAKUP Console speech output
-+P: Kirk Reiser
-+M: kirk@braille.uwo.ca
-+L: speakup@braille.uwo.ca
-+W: http://www.linux-speakup.org
-+S: Maintained
-+
- SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
- P: Roger Wolff
- M: R.E.Wolff@BitWizard.nl
diff --git a/driver/speakup-docs.patch b/driver/speakup-docs.patch
deleted file mode 100644
index 9b1fe23d34779..0000000000000
--- a/driver/speakup-docs.patch
+++ /dev/null
@@ -1,411 +0,0 @@
----
- Documentation/speakup/DefaultKeyAssignments | 46 +++++++++
- Documentation/speakup/INSTALLATION | 108 +++++++++++++++++++++
- Documentation/speakup/README | 98 +++++++++++++++++++
- Documentation/speakup/keymap-tutorial | 140 ++++++++++++++++++++++++++++
- 4 files changed, 392 insertions(+)
-
---- /dev/null
-+++ gregkh-2.6/Documentation/speakup/DefaultKeyAssignments
-@@ -0,0 +1,46 @@
-+This file is intended to give you an overview of the default keys used
-+by speakup for it's review functions. You may change them to be
-+anything you want but that will take some familiarity with key
-+mapping.
-+
-+We have remapped the insert or zero key on the keypad to act as a
-+shift key. Well, actually as an altgr key. So in the following list
-+InsKeyPad-period means hold down the insert key like a shift key and
-+hit the keypad period.
-+
-+KeyPad-8 Say current Line
-+InsKeyPad-8 say from top of screen to reading cursor.
-+KeyPad-7 Say Previous Line (UP one line)
-+KeyPad-9 Say Next Line (down one line)
-+KeyPad-5 Say Current Word
-+InsKeyPad-5 Spell Current Word
-+KeyPad-4 Say Previous Word (left one word)
-+InsKeyPad-4 say from left edge of line to reading cursor.
-+KeyPad-6 Say Next Word (right one word)
-+InsKeyPad-6 Say from reading cursor to right edge of line.
-+KeyPad-2 Say Current Letter
-+InsKeyPad-2 say current letter phonetically
-+KeyPad-1 Say Previous Character (left one letter)
-+KeyPad-3 Say Next Character (right one letter)
-+KeyPad-plus Say Entire Screen
-+InsKeyPad-plus Say from reading cursor line to bottom of screen.
-+KeyPad-Minus Park reading cursor (toggle)
-+InsKeyPad-minus Say character hex and decimal value.
-+KeyPad-period Say Position (current line, position and console)
-+InsKeyPad-period say colour attributes of current position.
-+InsKeyPad-9 Move reading cursor to top of screen (insert pgup)
-+InsKeyPad-3 Move reading cursor to bottom of screen (insert pgdn)
-+InsKeyPad-7 Move reading cursor to left edge of screen (insert home)
-+InsKeyPad-1 Move reading cursor to right edge of screen (insert end)
-+ControlKeyPad-1 Move reading cursor to last character on current line.
-+KeyPad-Enter Shut Up (until another key is hit) and sync reading cursor
-+InsKeyPad-Enter Shut Up (until toggled back on).
-+InsKeyPad-star n<x|y> go to line (y) or column (x). Where 'n' is any
-+ allowed value for the row or column for your current screen.
-+KeyPad-/ Mark and Cut screen region.
-+InsKeyPad-/ Paste screen region into any console.
-+
-+Hitting any key while speakup is outputting speech will quiet the
-+synth until it has caught up with what is being printed on the
-+console.
-+
---- /dev/null
-+++ gregkh-2.6/Documentation/speakup/INSTALLATION
-@@ -0,0 +1,108 @@
-+This document assumes you have had some experience with kernel
-+compilation and installation. If you have not, I recommend you get
-+the kernel source and read the README and various documents in the
-+linux/Documentation directory. In particular the Changes file to make
-+sure you have the appropriate utilities needed for installing a 2.2.xx
-+or 2.4xx kernel. It isn't as difficult as you might think. The
-+kernel README is intimidating the first time but once you get the
-+steps down, it's really pretty easy. Getting through the "make
-+config" is the tedious bit.
-+
-+The first thing to do is to place a copy of the tarball in the /usr/src
-+directory which is the directory the linux tree is located in as well.
-+Next untar speakup by typing:
-+
-+tar zxf speakup-1.00.tar.gz
-+cd speakup-1.00
-+./install
-+
-+Note the dot-slash before the install. This will copy the speakup
-+directory to the kernel tree and apply the various patches and
-+components to the appropriate kernel files. Depending on how
-+experienced you are with kernel compiling and hacking will determine
-+whether you should bother looking at any failed patches. If this
-+happens, you should probably write to the speakup mailing list for
-+help or myself.
-+
-+If all of the patch hunks apply successfully then just continue with
-+the standard steps to compile the kernel with:
-+
-+make mrproper
-+make config
-+
-+When you get to the section console speech output, answer 'y' to the
-+CONFIG_SPEAKUP prompt. You will be given a submenu with the list of
-+synthesizers which are currently supported. You can include as many
-+synths in the kernel as you wish but remember each one takes up kernel
-+space. You can only choose one of the synths as the default or none,
-+so just type dtlk or whatever is the correct string for the
-+synthesizer you have. You will also be asked if you wish to build-in
-+a speakup key map. If you do not say 'y' to this option you will need
-+to load a speakup map at boot time with whichever mechanism your
-+distribution uses for loading key maps.
-+
-+We have placed the speakup configuration options in make config just
-+after the vga console choice. For the DoubleTalk PC driver included
-+by Jim Van Zandt. I recommend you say no to that option. I have not
-+tried configuring them both in, but I wouldn't be at all surprised if
-+it didn't work.
-+
-+If all goes well up to this point you can continue with the compiling
-+process by doing:
-+
-+make dep >dep.file 2>&1 &
-+make bzImage >cc.file 2>&1 &
-+make modules >mod.file 2>&1 &
-+
-+I always redirect output to the files dep.file and cc.file so I can
-+look over the compilation record to make sure there are no errors and
-+warnings.
-+
-+Okay, you are ready to install the newly compiled kernel. Make sure
-+you make an linux.old entry in your lilo.conf file so you can recover
-+if it blows up. next as root run "make modules_install" to install
-+whatever modules you compiled and move the bzImage from
-+/usr/src/linux/arch/i386/boot to wherever your kernel lives. Also
-+move the System.map from /usr/src/linux to where your System.map
-+lives. On our systems we use debian so we create an vmlinuz-speakup
-+and System.map-speakup in our /boot directory and set the symbolic
-+links vmlinuz and System.map in the root (/) directory to point to the
-+images. Now type lilo to tell lilo to build the new booter file and
-+install it.
-+
-+As of version 0.07, the keymap for speakup is automatically built in
-+at compile time. If you have other keymaps installed at boot time,
-+you might want to consider removing them before you reboot the system.
-+
-+If everything has gone OK up until now, cross your fingers and type:
-+
-+shutdown -r now
-+
-+Your system should start talking to you as soon as it starts booting.
-+It will talk and talk and ... well, you might want to hit the
-+keypad-enter key to tell it to shut up. You should also read the
-+DefaultKeyAssignments file to learn the various review functions
-+available.
-+
-+As of v-0.10 the speakup configuration options are in the
-+/proc/speakup subtree. The individual options should be fairly
-+obvious by their names such as rate, volume, punc_level and so forth.
-+You can manipulate them by cat'ing or echoing new values to them such
-+as:
-+
-+echo 9 >/proc/speakup/rate
-+
-+You can see what the current values are by cat'ing those files to the console:
-+
-+cat /proc/speakup/rate
-+
-+I have probably managed to overlook a whole whack of things because
-+this is the, enter version number here, draft. Don't worry we'll get
-+it right eventually. If you like the package you really should get on
-+the mailing list and start participating in it's development.
-+
-+ Kirk
-+
-+email: kirk@braille.uwo.ca
-+phone: (519) 679-6845 (home)
-+
---- /dev/null
-+++ gregkh-2.6/Documentation/speakup/keymap-tutorial
-@@ -0,0 +1,140 @@
-+ Speakup Keymap Tutorial
-+
-+This is meant to be a basic tutorial on how to change the Linux keymap
-+file to assign speakup review functions to desired keys. It is not
-+intended to be a replacement for the loadkeys(8) or keymap(5) man
-+pages.
-+
-+The basic lay-out of the keymap file is a series of lines with the
-+following fields. The keyword keycode indicates this is the start of
-+a new key assignment. It is then followed by a number which
-+represents the actual key on the keyboard. That number is followed by
-+the equals '=' operator and finally a list of keywords representing
-+key names such as keypad5. Each line can have quite a few key
-+functions on it. They are interpreted by loadkeys in order and
-+assigned to key shift states depending on the order they are
-+encountered. So for example, the first value after the equals is the
-+keys unshifted state, while the second is the keys shifted state. If
-+you wish to learn the order they are interpreted in read the
-+loadkeys(8) and keymap(5) man pages.
-+
-+You can have subsequent lines which are indented and start with
-+another keyword for the various shifted states. This way you can
-+assign some of the states without having to specify them all in order
-+up until you get to the one you want to assign.
-+
-+In speakup, we have assigned the insert key on the number pad to the
-+altgr keyword. This is not required; you could choose any other
-+shifted state keyword. We used altgr because it typically represents
-+the right hand alt key. In Linux each shift key is separate and
-+independent, so the left shift and the right shift keys are not
-+necessarily the same. The altgr key is not really used for anything
-+important, so we steel it.
-+
-+Here are the default key assignments for the number eight on the
-+keypad:
-+
-+keycode 72 = KP_8
-+ alt keycode 72 = Ascii_8
-+
-+As you can see, the first line starts with keycode followed by 72
-+which is the actual number assigned to the key when the keyboard port
-+is read. The KP_8 after the equal sign, is the symbolic representation
-+of the function called when that key is hit.
-+
-+The second line is the same format except it starts with the keyword
-+alt which is indented. That means that the function at the end of
-+that line Ascii_8 is applied to the alt-shifted eight key.
-+
-+Now here are the speakup assignments for that key:
-+
-+keycode 72 = 0x0d0a
-+ altgr keycode 72 = 0x0d20
-+#keycode 72 = KP_8
-+ alt keycode 72 = Ascii_8
-+
-+Notice that the only thing which has changed on the first line is the
-+function called when the key is struck. It is a hexadecimal number
-+identifying the function called in a look up table. It is not a
-+symbolic representation yet because that means we need to change the
-+loadkeys program to understand our symbolic names. We will do this in
-+the future but for now it is more expedient to just use the table
-+indices. You will find a table at the bottom of this document
-+listing the review functions and their corresponding hex lookups.
-+
-+The 0x0d0a in the first line above is speakup's say line function.
-+The second line ends with 0x0d20 which is speakup's read from top of
-+screen to reading cursor line.
-+
-+The third line is the original key assignment commented out with a
-+number-sign '#' at the beginning. I do that so I can easily find the
-+keys I want to affect by symbolic name. Otherwise I would need to
-+keep a look up table for all the keycodes. I recommend you do this as
-+well or you'll be very sorry at some point in the future.
-+
-+The forth line is just the standard key assignment for the left hand
-+alt key.
-+
-+Now let's say we want to design a different keyboard layout. I'll use
-+an example for the JAWS style keypad because I've specifically been
-+asked to help with that. JAWS uses the eight on the keypad to move up
-+a line or the speakup function to read previous line. JAWS also uses
-+the keypad_8 key in a shifted mode to read the current line. I
-+apologize if these are not quite right. It has been a long time since
-+I used JAWS. So we would have the following two lines:
-+
-+keycode 72 = 0x0d0b
-+ altgr keycode 72 = 0x0d0a
-+
-+The hex value 0x0d0b in the first line is speakup's SAY_PREVIOUS_LINE
-+function. The 0x0d0a in the second line is the same say_line function
-+as we had earlier. So when the number eight is hit on the keypad
-+speakup will read the previous line and when the number eight is
-+shifted with the insert key on the keypad it will read the current
-+line.
-+
-+As you can tell, it is not really very difficult to reassign the keys
-+to different review functions.
-+
-+Once you have carefully edited the keymap file, called default.map in
-+the speakup distribution, you copy it into the /etc/kbd directory.
-+Make sure you back up the original default.map from that directory
-+first, if there is one. Then you run loadkeys to load the new map
-+into the kernel:
-+
-+loadkeys /etc/kbd/default.map
-+
-+If you wish to build your new keyboard lay-out into the kernel, after
-+testing it, copy the default.map file into the drivers/char directory,
-+with the name defkeymap.map, of your Linux source tree. Then rm the
-+defkeymap.c file and recompile the kernel. Because there is no
-+defkeymap.c `make' will rebuild it on the next compile.
-+
-+Here is a list of the available speakup review functions at this point
-+in time.
-+
-+SAY_CHAR 0x0d04 /* say this character */
-+SAY_PREV_CHAR 0x0d05 /* say character left of this char */
-+SAY_NEXT_CHAR 0x0d06 /* say char right of this char */
-+SAY_WORD 0x0d07 /* say this word under reading cursor */
-+SAY_PREV_WORD 0x0d08
-+SAY_NEXT_WORD 0x0d09
-+SAY_LINE 0x0d0a /* say this line */
-+SAY_PREV_LINE 0x0d0b /* say line above this line */
-+SAY_NEXT_LINE 0x0d0c
-+TOP_EDGE 0x0d0d /* move to top edge of screen */
-+BOTTOM_EDGE 0x0d0e
-+LEFT_EDGE 0x0d0f
-+RIGHT_EDGE 0x0d10
-+SAY_PHONETIC_CHAR 0x0d11 /* say this character phonetically */
-+SPELL_WORD 0x0d12 /* spell this word letter by letter */
-+SAY_SCREEN 0x0d14
-+SAY_POSITION 0x0d1b
-+SPEECH_OFF 0x0d1c
-+SAY_ATTRIBUTES 0x0d1d
-+SPEAKUP_PARKED 0x0d1e
-+SAY_FROM_TOP 0x0d20
-+SAY_TO_BOTTOM 0x0d21
-+SAY_FROM_LEFT 0x0d22
-+SAY_TO_RIGHT 0x0d23
-+
---- /dev/null
-+++ gregkh-2.6/Documentation/speakup/README
-@@ -0,0 +1,98 @@
-+Welcome to the speakup project for the Speakup speech package for Linux.
-+
-+Speakup is written by Kirk Reiser and Andy Berdan. It is licensed
-+under the GPL. If you don't already know, the GPL stands for the GNU
-+General Public License. Which basically states that this code is free to
-+copy, modify and distribute to anyone interested in playing with it.
-+The one thing you may not do is turn any part of it into proprietary
-+or commercial code without the permission of the author. That's me.
-+
-+If you are interested in being involved with the development of speech
-+output for Linux you can subscribe to the Speakup mailing list by
-+sending a message to speakup-request@braille.uwo.ca with the line: subscribe. You can also subscribe by going to the speakup web page and following the links at http://www.linux-speakup.org.
-+
-+We are at a very early stage in the development of this package.
-+Hopefully changes will happen often and many. The current files in
-+this directory are:
-+
-+DefaultKeyAssignments # speakup's default review keys
-+INSTALLATION # for installing speakup from the tar ball.
-+README # this file
-+keymap-tutorial # a tutorial on how to layout the keyboard
-+
-+Read the INSTALLATION file to learn how to apply the patches and the
-+default.map for the keyboard. You should also read the Changes file.
-+It really has any new things I've added since last time.
-+
-+There is no documentation in any of these files to instruct you what
-+to do if something goes wrong with the patching or compilation. If
-+you would like that information you will need to subscribe to the
-+mailing list and ask for help, or write me kirk@braille.uwo.ca for
-+help. I suggest the mailing list because I will probably tire quickly
-+of answering the same questions over and over. You could always
-+decide to dig-in and take on the task, and write documentation to help
-+others.
-+
-+There also is a speakup reflector for the Speak Freely package, which
-+many of us hang out on and discuss all sorts of topics from speakup
-+problems to ALSA driver installation and just about anything else
-+you'd like to talk about. The reflector is at lwl.braille.uwo.ca:4074
-+with it's lwl page at lwl.braille.uwo.ca/speakup.html. Come and join
-+us, it's fun!
-+
-+Acknowledgements:
-+
-+I am really very new at kernel hacking and screen review package
-+writing, so I have depended heavily on other folks kindness to help me
-+a long. No doubt I will continue to abuse them freely and others
-+before this is a really good speech solution for Linux. (Oh Well!,
-+somebody's got to do it.)
-+
-+Theodore Ts'o. He gave me a good discussion of unicode and UTF and
-+the like. He doesn't even remember writing me about it.
-+
-+Alan Cox. He has answered many questions about scheduling and wait
-+queues and timers along with code fragments and so on. I just wish I
-+understood it all totally. He has also helped immensely in moving
-+this package toward inclusion in the standard kernel tree. (Maybe next
-+release!)
-+
-+Martin Mares. He pointed me in the right direction to figuring out
-+the colour attributes and other useful tidbits.
-+
-+Paul McDermott. He really is the catalyst for me to actually get
-+this all working. Besides I like seeing him bounce around and get all
-+excited every time I have something new working.
-+
-+John Covici, He was the first person to actually attempt writing
-+another synthesizer driver for speakup. It was the Speakout driver so
-+it was also the first serial driver.
-+
-+Brian Borowski, he was the first person to actually write a speakup
-+function other than Andy and I.
-+
-+Jim Danley, he has more or less become my main man in helping test
-+code, add new features, bounce ideas off and generally become a good
-+friend.
-+
-+Matt Campbell, he basically rewrote the drivers to be able to include
-+all synths in the kernel at the same time. The distribution
-+maintainers appreciate him a lot as well.
-+
-+Gene Collins, he was very helpful debugging the current release prior
-+to its public showing. He has also worked hard educating others on
-+the list and writing the ALSA mini howto.
-+
-+I would also like to really thank the folks that handle the
-+distribution packages. I and many other people would not find access
-+to speakup nearly so convenient without their efforts. They include
-+Bill Acker, Tom Moore, Matt Campbell, Joe Norton and Joshua Lambert.
-+
-+There are probably many more I am forgetting right now. I guess I'll
-+just have to add you all later.
-+
-+
-+Happy Hacking!
-+
-+ Kirk
-+
diff --git a/driver/speakup-kconfig-fix.patch b/driver/speakup-kconfig-fix.patch
deleted file mode 100644
index 4f0a0f54b0691..0000000000000
--- a/driver/speakup-kconfig-fix.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From akpm@osdl.org Sat Jul 16 21:13:51 2005
-Date: Sat, 16 Jul 2005 21:07:02 -0700
-From: Andrew Morton <akpm@osdl.org>
-Cc: Jesper Juhl <jesper.juhl@gmail.com>
-To: Greg KH <greg@kroah.com>
-Subject: SPEAKUP: make SPEAKUP_DEFAULT depend on SPEAKUP
-Message-Id: <20050716210702.496b401d.akpm@osdl.org>
-
-
-When running `make oldconfig' with my 2.6.13-rc3 config on
-2.6.13-rc3-mm1 I got a bit surprised when I answered `N'o to
-CONFIG_SPEAKUP but then still got prompted for CONFIG_SPEAKUP_DEFAULT -
-that didn't make sense, why would I want to select a default synthesizer
-for speakup if I have disabled speakup alltogether in the first place?
-The patch below makes SPEAKUP_DEFAULT depend on SPEAKUP. I believe
-that's the sane thing to do :)
-
-
-Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- drivers/char/speakup/Kconfig | 1 +
- 1 file changed, 1 insertion(+)
-
---- gregkh-2.6.orig/drivers/char/speakup/Kconfig
-+++ gregkh-2.6/drivers/char/speakup/Kconfig
-@@ -205,6 +205,7 @@ if SPEAKUP != n
- endif
-
- config SPEAKUP_DEFAULT
-+ depends on SPEAKUP
- string "Choose Default synthesizer for Speakup"
- default "none"
-