Commit ca693dcd authored by Okash Khawaja's avatar Okash Khawaja Committed by Greg Kroah-Hartman

staging: speakup: make input functionality swappable

This moves functions which take input from external synth, into struct
spk_io_ops. The calling code then uses serial implementation of those methods
through spk_io_ops. That way we can add a parallel TTY-based implementation and
simply replace serial with TTY. That is what the next patch in this series does.

speakup_decext.c has get_last_char function which reads the most recent
available character from the synth. This patch changes that by defining
read_buff_add callback method of spk_syth and letting that update the last_char
global character read from the synth. read_buff_add is called from ISR, so
there is a possibility for last_char to be stale. Therefore it is marked as
volatile. It also pulls a repeated get_index implementation into synth.c, to
be used as a utility function.
Signed-off-by: default avatarOkash Khawaja <okash.khawaja@gmail.com>
Reviewed-by: default avatarSamuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2a3e1437
...@@ -28,11 +28,15 @@ static int timeouts; ...@@ -28,11 +28,15 @@ static int timeouts;
static int spk_serial_out(struct spk_synth *in_synth, const char ch); 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_send_xchar(char ch);
static void spk_serial_tiocmset(unsigned int set, unsigned int clear); 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 = { struct spk_io_ops spk_serial_io_ops = {
.synth_out = spk_serial_out, .synth_out = spk_serial_out,
.send_xchar = spk_serial_send_xchar, .send_xchar = spk_serial_send_xchar,
.tiocmset = spk_serial_tiocmset, .tiocmset = spk_serial_tiocmset,
.synth_in = spk_serial_in,
.synth_in_nowait = spk_serial_in_nowait,
}; };
EXPORT_SYMBOL_GPL(spk_serial_io_ops); EXPORT_SYMBOL_GPL(spk_serial_io_ops);
...@@ -240,7 +244,7 @@ int spk_wait_for_xmitr(struct spk_synth *in_synth) ...@@ -240,7 +244,7 @@ int spk_wait_for_xmitr(struct spk_synth *in_synth)
return 1; return 1;
} }
unsigned char spk_serial_in(void) static unsigned char spk_serial_in(void)
{ {
int tmout = SPK_SERIAL_TIMEOUT; int tmout = SPK_SERIAL_TIMEOUT;
...@@ -253,9 +257,8 @@ unsigned char spk_serial_in(void) ...@@ -253,9 +257,8 @@ unsigned char spk_serial_in(void)
} }
return inb_p(speakup_info.port_tts + UART_RX); 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; unsigned char lsr;
...@@ -264,7 +267,6 @@ unsigned char spk_serial_in_nowait(void) ...@@ -264,7 +267,6 @@ unsigned char spk_serial_in_nowait(void)
return 0; return 0;
return inb_p(speakup_info.port_tts + UART_RX); 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) static int spk_serial_out(struct spk_synth *in_synth, const char ch)
{ {
......
...@@ -138,11 +138,11 @@ static void synth_version(struct spk_synth *synth) ...@@ -138,11 +138,11 @@ static void synth_version(struct spk_synth *synth)
char synth_id[40] = ""; char synth_id[40] = "";
synth->synth_immediate(synth, "\x05[Q]"); 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') { if (synth_id[test] == 'A') {
do { do {
/* read version string from synth */ /* 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); } while (synth_id[test] != '\n' && test < 32);
synth_id[++test] = 0x00; synth_id[++test] = 0x00;
} }
......
...@@ -30,20 +30,16 @@ ...@@ -30,20 +30,16 @@
#define DRV_VERSION "2.14" #define DRV_VERSION "2.14"
#define SYNTH_CLEAR 0x03 #define SYNTH_CLEAR 0x03
#define PROCSPEECH 0x0b #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; last_char = ch;
if (avail)
last_char = inb_p(speakup_info.port_tts + UART_RX);
return last_char;
} }
static inline bool synth_full(void) static inline bool synth_full(void)
{ {
return get_last_char() == 0x13; return last_char == 0x13;
} }
static void do_catch_up(struct spk_synth *synth); static void do_catch_up(struct spk_synth *synth);
...@@ -135,7 +131,7 @@ static struct spk_synth synth_decext = { ...@@ -135,7 +131,7 @@ static struct spk_synth synth_decext = {
.flush = synth_flush, .flush = synth_flush,
.is_alive = spk_synth_is_alive_restart, .is_alive = spk_synth_is_alive_restart,
.synth_adjust = NULL, .synth_adjust = NULL,
.read_buff_add = NULL, .read_buff_add = read_buff_add,
.get_index = NULL, .get_index = NULL,
.indexing = { .indexing = {
.command = NULL, .command = NULL,
......
...@@ -42,7 +42,7 @@ static inline int synth_full(void) ...@@ -42,7 +42,7 @@ static inline int synth_full(void)
static void do_catch_up(struct spk_synth *synth); static void do_catch_up(struct spk_synth *synth);
static void synth_flush(struct spk_synth *synth); static void synth_flush(struct spk_synth *synth);
static void read_buff_add(u_char c); 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 in_escape;
static int is_flushing; static int is_flushing;
...@@ -163,7 +163,7 @@ static int is_indnum(u_char *ch) ...@@ -163,7 +163,7 @@ static int is_indnum(u_char *ch)
static u_char lastind; static u_char lastind;
static unsigned char get_index(void) static unsigned char get_index(struct spk_synth *synth)
{ {
u_char rv; u_char rv;
......
...@@ -138,7 +138,7 @@ static struct spk_synth synth_dtlk = { ...@@ -138,7 +138,7 @@ static struct spk_synth synth_dtlk = {
.is_alive = spk_synth_is_alive_nop, .is_alive = spk_synth_is_alive_nop,
.synth_adjust = NULL, .synth_adjust = NULL,
.read_buff_add = NULL, .read_buff_add = NULL,
.get_index = spk_serial_in_nowait, .get_index = spk_synth_get_index,
.indexing = { .indexing = {
.command = "\x01%di", .command = "\x01%di",
.lowindex = 1, .lowindex = 1,
......
...@@ -120,7 +120,7 @@ static struct spk_synth synth_ltlk = { ...@@ -120,7 +120,7 @@ static struct spk_synth synth_ltlk = {
.is_alive = spk_synth_is_alive_restart, .is_alive = spk_synth_is_alive_restart,
.synth_adjust = NULL, .synth_adjust = NULL,
.read_buff_add = NULL, .read_buff_add = NULL,
.get_index = spk_serial_in_nowait, .get_index = spk_synth_get_index,
.indexing = { .indexing = {
.command = "\x01%di", .command = "\x01%di",
.lowindex = 1, .lowindex = 1,
...@@ -141,7 +141,7 @@ static void synth_interrogate(struct spk_synth *synth) ...@@ -141,7 +141,7 @@ static void synth_interrogate(struct spk_synth *synth)
synth->synth_immediate(synth, "\x18\x01?"); synth->synth_immediate(synth, "\x18\x01?");
for (i = 0; i < 50; i++) { for (i = 0; i < 50; i++) {
buf[i] = spk_serial_in(); buf[i] = synth->io_ops->synth_in();
if (i > 2 && buf[i] == 0x7f) if (i > 2 && buf[i] == 0x7f)
break; break;
} }
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
static int softsynth_probe(struct spk_synth *synth); static int softsynth_probe(struct spk_synth *synth);
static void softsynth_release(void); static void softsynth_release(void);
static int softsynth_is_alive(struct spk_synth *synth); 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 struct miscdevice synth_device, synthu_device;
static int init_pos; static int init_pos;
...@@ -340,7 +340,7 @@ static unsigned int softsynth_poll(struct file *fp, struct poll_table_struct *wa ...@@ -340,7 +340,7 @@ static unsigned int softsynth_poll(struct file *fp, struct poll_table_struct *wa
return ret; return ret;
} }
static unsigned char get_index(void) static unsigned char get_index(struct spk_synth *synth)
{ {
int rv; int rv;
......
...@@ -111,7 +111,7 @@ static struct spk_synth synth_spkout = { ...@@ -111,7 +111,7 @@ static struct spk_synth synth_spkout = {
.is_alive = spk_synth_is_alive_restart, .is_alive = spk_synth_is_alive_restart,
.synth_adjust = NULL, .synth_adjust = NULL,
.read_buff_add = NULL, .read_buff_add = NULL,
.get_index = spk_serial_in_nowait, .get_index = spk_synth_get_index,
.indexing = { .indexing = {
.command = "\x05[%c", .command = "\x05[%c",
.lowindex = 1, .lowindex = 1,
......
...@@ -43,8 +43,6 @@ ...@@ -43,8 +43,6 @@
const struct old_serial_port *spk_serial_init(int index); const struct old_serial_port *spk_serial_init(int index);
void spk_stop_serial_interrupt(void); void spk_stop_serial_interrupt(void);
int spk_wait_for_xmitr(struct spk_synth *in_synth); 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 spk_serial_release(void);
void synth_buffer_skip_nonlatin1(void); void synth_buffer_skip_nonlatin1(void);
...@@ -61,6 +59,7 @@ int spk_serial_synth_probe(struct spk_synth *synth); ...@@ -61,6 +59,7 @@ int spk_serial_synth_probe(struct spk_synth *synth);
const char *spk_serial_synth_immediate(struct spk_synth *synth, const char *buff); const char *spk_serial_synth_immediate(struct spk_synth *synth, const char *buff);
void spk_do_catch_up(struct spk_synth *synth); void spk_do_catch_up(struct spk_synth *synth);
void spk_synth_flush(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_nop(struct spk_synth *synth);
int spk_synth_is_alive_restart(struct spk_synth *synth); int spk_synth_is_alive_restart(struct spk_synth *synth);
__printf(1, 2) __printf(1, 2)
......
...@@ -152,6 +152,8 @@ struct spk_io_ops { ...@@ -152,6 +152,8 @@ struct spk_io_ops {
int (*synth_out)(struct spk_synth *synth, const char ch); int (*synth_out)(struct spk_synth *synth, const char ch);
void (*send_xchar)(char ch); void (*send_xchar)(char ch);
void (*tiocmset)(unsigned int set, unsigned int clear); void (*tiocmset)(unsigned int set, unsigned int clear);
unsigned char (*synth_in)(void);
unsigned char (*synth_in_nowait)(void);
}; };
struct spk_synth { struct spk_synth {
...@@ -182,7 +184,7 @@ struct spk_synth { ...@@ -182,7 +184,7 @@ struct spk_synth {
int (*is_alive)(struct spk_synth *synth); int (*is_alive)(struct spk_synth *synth);
int (*synth_adjust)(struct st_var_header *var); int (*synth_adjust)(struct st_var_header *var);
void (*read_buff_add)(u_char); void (*read_buff_add)(u_char);
unsigned char (*get_index)(void); unsigned char (*get_index)(struct spk_synth *synth);
struct synth_indexing indexing; struct synth_indexing indexing;
int alive; int alive;
struct attribute_group attributes; struct attribute_group attributes;
......
...@@ -124,6 +124,12 @@ void spk_synth_flush(struct spk_synth *synth) ...@@ -124,6 +124,12 @@ void spk_synth_flush(struct spk_synth *synth)
} }
EXPORT_SYMBOL_GPL(spk_synth_flush); 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) int spk_synth_is_alive_nop(struct spk_synth *synth)
{ {
synth->alive = 1; synth->alive = 1;
...@@ -249,7 +255,7 @@ void spk_reset_index_count(int sc) ...@@ -249,7 +255,7 @@ void spk_reset_index_count(int sc)
if (first) if (first)
first = 0; first = 0;
else else
synth->get_index(); synth->get_index(synth);
index_count = 0; index_count = 0;
sentence_count = sc; sentence_count = sc;
} }
...@@ -282,7 +288,7 @@ void synth_insert_next_index(int sent_num) ...@@ -282,7 +288,7 @@ void synth_insert_next_index(int sent_num)
void spk_get_index_count(int *linecount, int *sentcount) void spk_get_index_count(int *linecount, int *sentcount)
{ {
int ind = synth->get_index(); int ind = synth->get_index(synth);
if (ind) { if (ind) {
sentence_count = ind % 10; sentence_count = ind % 10;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment