static int spk_serial_out(struct spk_synth *in_synth, const char ch);
 static void spk_serial_send_xchar(char ch);
 static void spk_serial_tiocmset(unsigned int set, unsigned int clear);
+static unsigned char spk_serial_in(void);
+static unsigned char spk_serial_in_nowait(void);
 
 struct spk_io_ops spk_serial_io_ops = {
        .synth_out = spk_serial_out,
        .send_xchar = spk_serial_send_xchar,
        .tiocmset = spk_serial_tiocmset,
+       .synth_in = spk_serial_in,
+       .synth_in_nowait = spk_serial_in_nowait,
 };
 EXPORT_SYMBOL_GPL(spk_serial_io_ops);
 
        return 1;
 }
 
-unsigned char spk_serial_in(void)
+static unsigned char spk_serial_in(void)
 {
        int tmout = SPK_SERIAL_TIMEOUT;
 
        }
        return inb_p(speakup_info.port_tts + UART_RX);
 }
-EXPORT_SYMBOL_GPL(spk_serial_in);
 
-unsigned char spk_serial_in_nowait(void)
+static unsigned char spk_serial_in_nowait(void)
 {
        unsigned char lsr;
 
                return 0;
        return inb_p(speakup_info.port_tts + UART_RX);
 }
-EXPORT_SYMBOL_GPL(spk_serial_in_nowait);
 
 static int spk_serial_out(struct spk_synth *in_synth, const char ch)
 {
 
        char synth_id[40] = "";
 
        synth->synth_immediate(synth, "\x05[Q]");
-       synth_id[test] = spk_serial_in();
+       synth_id[test] = synth->io_ops->synth_in();
        if (synth_id[test] == 'A') {
                do {
                        /* read version string from synth */
-                       synth_id[++test] = spk_serial_in();
+                       synth_id[++test] = synth->io_ops->synth_in();
                } while (synth_id[test] != '\n' && test < 32);
                synth_id[++test] = 0x00;
        }
 
 #define DRV_VERSION "2.14"
 #define SYNTH_CLEAR 0x03
 #define PROCSPEECH 0x0b
-static unsigned char last_char;
+static volatile unsigned char last_char;
 
-static inline u_char get_last_char(void)
+static void read_buff_add(u_char ch)
 {
-       u_char avail = inb_p(speakup_info.port_tts + UART_LSR) & UART_LSR_DR;
-
-       if (avail)
-               last_char = inb_p(speakup_info.port_tts + UART_RX);
-       return last_char;
+       last_char = ch;
 }
 
 static inline bool synth_full(void)
 {
-       return get_last_char() == 0x13;
+       return last_char == 0x13;
 }
 
 static void do_catch_up(struct spk_synth *synth);
        .flush = synth_flush,
        .is_alive = spk_synth_is_alive_restart,
        .synth_adjust = NULL,
-       .read_buff_add = NULL,
+       .read_buff_add = read_buff_add,
        .get_index = NULL,
        .indexing = {
                .command = NULL,
 
 static void do_catch_up(struct spk_synth *synth);
 static void synth_flush(struct spk_synth *synth);
 static void read_buff_add(u_char c);
-static unsigned char get_index(void);
+static unsigned char get_index(struct spk_synth *synth);
 
 static int in_escape;
 static int is_flushing;
 
 static u_char lastind;
 
-static unsigned char get_index(void)
+static unsigned char get_index(struct spk_synth *synth)
 {
        u_char rv;
 
 
        .is_alive = spk_synth_is_alive_nop,
        .synth_adjust = NULL,
        .read_buff_add = NULL,
-       .get_index = spk_serial_in_nowait,
+       .get_index = spk_synth_get_index,
        .indexing = {
                .command = "\x01%di",
                .lowindex = 1,
 
        .is_alive = spk_synth_is_alive_restart,
        .synth_adjust = NULL,
        .read_buff_add = NULL,
-       .get_index = spk_serial_in_nowait,
+       .get_index = spk_synth_get_index,
        .indexing = {
                .command = "\x01%di",
                .lowindex = 1,
 
        synth->synth_immediate(synth, "\x18\x01?");
        for (i = 0; i < 50; i++) {
-               buf[i] = spk_serial_in();
+               buf[i] = synth->io_ops->synth_in();
                if (i > 2 && buf[i] == 0x7f)
                        break;
        }
 
 static int softsynth_probe(struct spk_synth *synth);
 static void softsynth_release(void);
 static int softsynth_is_alive(struct spk_synth *synth);
-static unsigned char get_index(void);
+static unsigned char get_index(struct spk_synth *synth);
 
 static struct miscdevice synth_device, synthu_device;
 static int init_pos;
        return ret;
 }
 
-static unsigned char get_index(void)
+static unsigned char get_index(struct spk_synth *synth)
 {
        int rv;
 
 
        .is_alive = spk_synth_is_alive_restart,
        .synth_adjust = NULL,
        .read_buff_add = NULL,
-       .get_index = spk_serial_in_nowait,
+       .get_index = spk_synth_get_index,
        .indexing = {
                .command = "\x05[%c",
                .lowindex = 1,
 
 const struct old_serial_port *spk_serial_init(int index);
 void spk_stop_serial_interrupt(void);
 int spk_wait_for_xmitr(struct spk_synth *in_synth);
-unsigned char spk_serial_in(void);
-unsigned char spk_serial_in_nowait(void);
 void spk_serial_release(void);
 
 void synth_buffer_skip_nonlatin1(void);
 const char *spk_serial_synth_immediate(struct spk_synth *synth, const char *buff);
 void spk_do_catch_up(struct spk_synth *synth);
 void spk_synth_flush(struct spk_synth *synth);
+unsigned char spk_synth_get_index(struct spk_synth *synth);
 int spk_synth_is_alive_nop(struct spk_synth *synth);
 int spk_synth_is_alive_restart(struct spk_synth *synth);
 __printf(1, 2)
 
        int (*synth_out)(struct spk_synth *synth, const char ch);
        void (*send_xchar)(char ch);
        void (*tiocmset)(unsigned int set, unsigned int clear);
+       unsigned char (*synth_in)(void);
+       unsigned char (*synth_in_nowait)(void);
 };
 
 struct spk_synth {
        int (*is_alive)(struct spk_synth *synth);
        int (*synth_adjust)(struct st_var_header *var);
        void (*read_buff_add)(u_char);
-       unsigned char (*get_index)(void);
+       unsigned char (*get_index)(struct spk_synth *synth);
        struct synth_indexing indexing;
        int alive;
        struct attribute_group attributes;
 
 }
 EXPORT_SYMBOL_GPL(spk_synth_flush);
 
+unsigned char spk_synth_get_index(struct spk_synth *synth)
+{
+       return synth->io_ops->synth_in_nowait();
+}
+EXPORT_SYMBOL_GPL(spk_synth_get_index);
+
 int spk_synth_is_alive_nop(struct spk_synth *synth)
 {
        synth->alive = 1;
        if (first)
                first = 0;
        else
-               synth->get_index();
+               synth->get_index(synth);
        index_count = 0;
        sentence_count = sc;
 }
 
 void spk_get_index_count(int *linecount, int *sentcount)
 {
-       int ind = synth->get_index();
+       int ind = synth->get_index(synth);
 
        if (ind) {
                sentence_count = ind % 10;